MongoDB日志切换(Rotate Log Files)方法及注意事项

简介:

MongoDB日志切换(Rotate Log Files)方法及注意事项

 

转载自:http://duoyun.org/topic/512047a5cd0cc40a0a04c381

 

MongoDB日志默认不会切换,生产系统尤其是压力大的系统,日志滚动速度非常快,我们上线系统最大的一个mongod进程的log每天增长5G多。目前采取策略是每天切换一次,保存一周的日志。


目前采取的方法:

· SIGUSR1 方法

killall -SIGUSR1 mongod   
每天0点定时执行来达切换日志。


大部分情况下并无问题,但近期集中出现了两台服务器日志切换时出现问题,0点到0点20分左右,日志是空的。mongod 或者config报警,进程重启(自动),该bug至少要到2.5.x才修复。MongoDB的稳定性目前确实不尽人意。

 

· 采取mongo shell logRotate 来避免该bug

use admin   
db.runCommand( { logRotate : 1 } )    
此方法需要在mongos,mongod,config server运行,不能一次性切换所有日志。

 

logRotate命令也有‘bug’,这两天出现了两次(版本2.2.2):

Sat May 4 00:01:02 [conn96028478] ERROR: Failed to rename /export/data/mongodb/log/mongod.log to /export/data/mongodb/log/mongod.log.2013-05-03T16-01-02 Fatal Assertion 16175

0xaffd31 0xac5323 0x70f4f1 0x6e8d71 0x6ea5e2 0x6eb59c 0x832c68 0x8363b0 0x7b072d 0x7b3a53 0x5703f2 0xaedfc1 0x32ad2077f1 0x32acee570d

/export/servers/mongodb/bin/mongod(_ZN5mongo15printStackTraceERSo+0x21) [0xaffd31]

/export/servers/mongodb/bin/mongod(_ZN5mongo13fassertFailedEi+0xa3) [0xac5323]

/export/servers/mongodb/bin/mongod() [0x70f4f1]

/export/servers/mongodb/bin/mongod(_ZN5mongo12_execCommandEPNS_7CommandERKSsRNS_7BSONObjEiRNS_14BSONObjBuilderEb+0x51) [0x6e8d71]

/export/servers/mongodb/bin/mongod(_ZN5mongo11execCommandEPNS_7CommandERNS_6ClientEiPKcRNS_7BSONObjERNS_14BSONObjBuilderEb+0xd52) [0x6ea5e2]

/export/servers/mongodb/bin/mongod(_ZN5mongo12_runCommandsEPKcRNS_7BSONObjERNS_11_BufBuilderINS_16TrivialAllocatorEEERNS_14BSONObjBuilderEbi+0x2ac) [0x6eb59c]

/export/servers/mongodb/bin/mongod(_ZN5mongo11runCommandsEPKcRNS_7BSONObjERNS_5CurOpERNS_11_BufBuilderINS_16TrivialAllocatorEEERNS_14BSONObjBuilderEbi+0x38) [0x832c68]

/export/servers/mongodb/bin/mongod(_ZN5mongo8runQueryERNS_7MessageERNS_12QueryMessageERNS_5CurOpES1_+0xc10) [0x8363b0]

/export/servers/mongodb/bin/mongod() [0x7b072d]

/export/servers/mongodb/bin/mongod(_ZN5mongo16assembleResponseERNS_7MessageERNS_10DbResponseERKNS_11HostAndPortE+0x3a3) [0x7b3a53]

/export/servers/mongodb/bin/mongod(_ZN5mongo16MyMessageHandler7processERNS_7MessageEPNS_21AbstractMessagingPortEPNS_9LastErrorE+0x82) [0x5703f2]

/export/servers/mongodb/bin/mongod(_ZN5mongo3pms9threadRunEPNS_13MessagingPortE+0x411) [0xaedfc1]

/lib64/libpthread.so.0() [0x32ad2077f1]

/lib64/libc.so.6(clone+0x6d) [0x32acee570d]

Sat May 4 00:01:02 [conn96028478]

***aborting after fassert() failure

Sat May 4 00:01:02 Got signal: 6 (Aborted).

Sat May 4 00:01:02 Backtrace:

0xaffd31 0x558bb9 0x32ace32900 0x32ace32885 0x32ace34065 0xac535e 0x70f4f1 0x6e8d71 0x6ea5e2 0x6eb59c 0x832c68 0x8363b0 0x7b072d 0x7b3a53 0x5703f2 0xaedfc1 0x32ad2077f1 0x32acee570d

/export/servers/mongodb/bin/mongod(_ZN5mongo15printStackTraceERSo+0x21) [0xaffd31]

/export/servers/mongodb/bin/mongod(_ZN5mongo10abruptQuitEi+0x399) [0x558bb9]

/lib64/libc.so.6() [0x32ace32900]

/lib64/libc.so.6(gsignal+0x35) [0x32ace32885]

/lib64/libc.so.6(abort+0x175) [0x32ace34065]

/export/servers/mongodb/bin/mongod(_ZN5mongo13fassertFailedEi+0xde) [0xac535e]

/export/servers/mongodb/bin/mongod() [0x70f4f1]

/export/servers/mongodb/bin/mongod(_ZN5mongo12_execCommandEPNS_7CommandERKSsRNS_7BSONObjEiRNS_14BSONObjBuilderEb+0x51) [0x6e8d71]

/export/servers/mongodb/bin/mongod(_ZN5mongo11execCommandEPNS_7CommandERNS_6ClientEiPKcRNS_7BSONObjERNS_14BSONObjBuilderEb+0xd52) [0x6ea5e2]

/export/servers/mongodb/bin/mongod(_ZN5mongo12_runCommandsEPKcRNS_7BSONObjERNS_11_BufBuilderINS_16TrivialAllocatorEEERNS_14BSONObjBuilderEbi+0x2ac) [0x6eb59c]

/export/servers/mongodb/bin/mongod(_ZN5mongo11runCommandsEPKcRNS_7BSONObjERNS_5CurOpERNS_11_BufBuilderINS_16TrivialAllocatorEEERNS_14BSONObjBuilderEbi+0x38) [0x832c68]

/export/servers/mongodb/bin/mongod(_ZN5mongo8runQueryERNS_7MessageERNS_12QueryMessageERNS_5CurOpES1_+0xc10) [0x8363b0]

/export/servers/mongodb/bin/mongod() [0x7b072d]

/export/servers/mongodb/bin/mongod(_ZN5mongo16assembleResponseERNS_7MessageERNS_10DbResponseERKNS_11HostAndPortE+0x3a3) [0x7b3a53]

/export/servers/mongodb/bin/mongod(_ZN5mongo16MyMessageHandler7processERNS_7MessageEPNS_21AbstractMessagingPortEPNS_9LastErrorE+0x82) [0x5703f2]

/export/servers/mongodb/bin/mongod(_ZN5mongo3pms9threadRunEPNS_13MessagingPortE+0x411) [0xaedfc1]

/lib64/libpthread.so.0() [0x32ad2077f1]

/lib64/libc.so.6(clone+0x6d) [0x32acee570d]

对应源码:

class LogRotateCmd : public Command {

public:

LogRotateCmd() : Command( "logRotate" ) {}

virtual LockType locktype() const { return NONE; }

virtual bool slaveOk() const { return true; }

virtual bool adminOnly() const { return true; }

virtual bool run(const string& ns, BSONObj& cmdObj, int, string& errmsg, BSONObjBuilder& result, bool fromRepl) {

fassert(16175, rotateLogs());

return 1;

}

} logRotateCmd;

 

rotateLogs()返回结果不对。

 

bool rotateLogs() {

return loggingManager.rotate();

}

rotateLogs()->rotate()

bool rotate() {

if ( ! _enabled ) {

cout << "LoggingManager not enabled" << endl;

return true;

}

if ( _file ) {

#ifdef POSIX_FADV_DONTNEED

posix_fadvise(fileno(_file), 0, 0, POSIX_FADV_DONTNEED);

#endif

// Rename the (open) existing log file to a timestamped name

stringstream ss;

ss << _path << "." << terseCurrentTime( false );

string s = ss.str();

if (0 != rename(_path.c_str(), s.c_str())) {

error() << "Failed to rename " << _path << " to " << s;

return false;

}

}

...

return true;

}

 

显然是rename函数运行出来问题。rename应该是boost::filesystem::rename函数,而filesystem/v3 有个bug ,rename文件时如果存在相同的目标文件名,会抛异常:   
boost::filesystem::rename throw exception when target file exists, but documentation tell us that it must be replaced    
https://svn.boost.org/trac/boost/ticket/2866    
MongoDB 2.2.2恰恰就是用的该版本。


那么mongod down的原因只能是还有别的进程在切日志,要不没法解释,这就的查查有没有别的机器连上了切日志。结果发现该机器mongo用户下有个相同的crontab 任务,而正常情况下都是用root用户的。自此罪魁祸首找到了!再深的bug都有个简单的源头!

 

另外:logRotate相关bug在2.2.5、2.4.3版本解决,详见SERVER-4739。

 

日志切换相关两个断言:   
16175 is for a failure of the 'logRotate' command (e.g. 'db.adminCommand("logRotate")').    
16176 is for a failure when SIGUSR1 has been received (not available on Windows).

 

· 使用syslog管理日志

2.2版本以后可采用--syslog选项,将日志由syslog管理。用syslog特性来切换日志。


修改/etc/rsyslog.conf    
.info;mail.none;authpriv.none;cron.none;user.none /var/log/messages     
user.
 /export/data/log/mongosyslog.log

 

修改/etc/logrotate.conf ,添加:   
/export/data/log/mongosyslog.log {    
missingok    
daily    
rotate 7    
postrotate    
/usr/bin/kill -HUP rsyslogd    
endscript    
}

 

设置了每天切换一次,手动切换方法logrotate -f /etc/logrotate.conf


more:    
https://groups.google.com/forum/?fromgroups=#!topic/mongodb-user/7buu-XYvSjs    
https://jira.mongodb.org/browse/SERVER-4739    
https://jira.mongodb.org/browse/SERVER-3339    
http://docs.mongodb.org/manual/tutorial/rotate-log-files/#rotate-log-files

 

更新ERROR:    
Failed to rename /export/data/mongodb/log/mongod.log to /export/data/mongodb/log/mongod.log.2013-05-03T16-01-02 Fatal Assertion 16175部分

 

日志切换另一个bug https://jira.mongodb.org/browse/SERVER-9578    
目前2.2.5,2.4.4均已修复。

















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1620672 ,如需转载请自行联系原作者


相关文章
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
4363 31
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
8月前
|
存储 NoSQL MongoDB
Docker中安装MongoDB并配置数据、日志、配置文件持久化。
现在,你有了一个运行在Docker中的MongoDB,它拥有自己的小空间,对高楼大厦的崩塌视而不见(会话丢失和数据不持久化的问题)。这个MongoDB的数据、日志、配置文件都会妥妥地保存在你为它精心准备的地方,天旋地转,它也不会失去一丁点儿宝贵的记忆(即使在容器重启后)。
1020 4
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
1441 3
|
存储 SQL 关系型数据库
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log、原理、写入过程;binlog与redolog区别、update语句的执行流程、两阶段提交、主从复制、三种日志的使用场景;查询日志、慢查询日志、错误日志等其他几类日志
946 35
MySQL日志详解——日志分类、二进制日志bin log、回滚日志undo log、重做日志redo log
|
12月前
|
存储 缓存 关系型数据库
图解MySQL【日志】——Redo Log
Redo Log(重做日志)是数据库中用于记录数据页修改的物理日志,确保事务的持久性和一致性。其主要作用包括崩溃恢复、提高性能和保证事务一致性。Redo Log 通过先写日志的方式,在内存中缓存修改操作,并在适当时候刷入磁盘,减少随机写入带来的性能损耗。WAL(Write-Ahead Logging)技术的核心思想是先将修改操作记录到日志文件中,再择机写入磁盘,从而实现高效且安全的数据持久化。Redo Log 的持久化过程涉及 Redo Log Buffer 和不同刷盘时机的控制参数(如 `innodb_flush_log_at_trx_commit`),以平衡性能与数据安全性。
692 5
图解MySQL【日志】——Redo Log
|
11月前
|
监控 Java 应用服务中间件
Tomcat log日志解析
理解和解析Tomcat日志文件对于诊断和解决Web应用中的问题至关重要。通过分析 `catalina.out`、`localhost.log`、`localhost_access_log.*.txt`、`manager.log`和 `host-manager.log`等日志文件,可以快速定位和解决问题,确保Tomcat服务器的稳定运行。掌握这些日志解析技巧,可以显著提高运维和开发效率。
1287 13
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
749 7
MySQL事务日志-Undo Log工作原理分析
|
11月前
|
SQL 存储 关系型数据库
简单聊聊MySQL的三大日志(Redo Log、Binlog和Undo Log)各有什么区别
在MySQL数据库管理中,理解Redo Log(重做日志)、Binlog(二进制日志)和Undo Log(回滚日志)至关重要。Redo Log确保数据持久性和崩溃恢复;Binlog用于主从复制和数据恢复,记录逻辑操作;Undo Log支持事务的原子性和隔离性,实现回滚与MVCC。三者协同工作,保障事务ACID特性。文章还详细解析了日志写入流程及可能的异常情况,帮助深入理解数据库日志机制。
1381 0
|
存储 NoSQL 安全
【赵渝强老师】MongoDB的Journal日志
MongoDB通过Journal日志保证数据安全,记录检查点后的更新,确保数据库从异常中恢复到有效状态。每个Journal文件100M,存于--dbpath指定的journal子目录。默认已启用Journal日志,可通过--journal参数手动启用。WiredTiger存储引擎使用128KB内存缓冲区,异常关机时可能丢失最多128KB的数据。视频讲解和详细步骤参见附录。
380 17
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
2461 14
MySQL事务日志-Redo Log工作原理分析

推荐镜像

更多