MongoDB实例重启失败探究大事务Redo导致

作者: 东山絮柳仔

1.实例重启背景

收到监控组同学反馈,连接某一个MongoDB实例的应用耗时异常,并且出现了超时。查看数据库监控平台,发现此实例服务器的IO异常飙升,而查看副本集状态(rs.status()),主从是坏掉的,从节点不可达。

登入从节点,查看mongodb服务状态,是stop的。

查看服务器的log,发现出现了OOM,Mongodb被关闭了。需要手动重启。

Jan 17 12:02:48 qqorderdb02 kernel: Out of memory: Kill process 83717 (mongod) score 919 or sacrifice child
Jan 17 12:02:48 qqorderdb02 kernel: Killed process 83717 (mongod), UID 1001, total-vm:21256876kB, anon-rss:15529572kB, file-rss:0kB, shmem-rss:0kB
Jan 17 12:42:42 qqorderdb02 systemd[1]: mongodbqq.service: main process exited, code=killed, status=9/KILL
Jan 17 12:42:42 qqorderdb02 systemd[1]: Unit mongodbqq.service entered failed state.
Jan 17 12:42:42 qqorderdb02 systemd[1]: mongodbqq.service failed.

事后分析,主节点的内存比从节点的内存大,创建索引,主节点正常执行了,而从节点出席那了OOM(12:02),KIll后,服务自启动也失败了(12:42)。 2.重启服务

重启,查看mongodblog,们会看到redo未提交的创建索引的事务

2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten]
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten]
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten] ** WARNING: Running wiredTiger with the --nojournal option in a replica set
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten] **          is deprecated and subject to be removed in a future version.
2019-01-17T19:38:11.529+0800 I CONTROL  [initandlisten]
2019-01-17T19:38:11.592+0800 I INDEX    [initandlisten] found 1 index(es) that wasn't finished before shutdown
2019-01-17T19:38:11.595+0800 I FTDC     [initandlisten] Initializing full-time diagnostic data capture with directory '/var/mongodbqq/db/diagnostic.data'
2019-01-17T19:38:11.596+0800 I INDEX    [initandlisten] found 1interrupted index build(s) on qqorderdb.weixinordersn
2019-01-17T19:38:11.596+0800 I INDEX    [initandlisten] note: restart the server with --noIndexBuildRetry to skip index rebuilds

但执行一会后,重启失败,退出。查看server log,报错信息如下:

Jan 17 19:41:10 qqorderdb02 systemd[1]: mongodbqq.service stop-final-sigterm timed out. Killing.
Jan 17 19:41:10 qqorderdb02 systemd[1]: Failed to start mongodbqq_service.
Jan 17 19:41:10 qqorderdb02 systemd[1]: Unit mongodbqq.service entered failed state.
Jan 17 19:41:10 qqorderdb02 systemd[1]: mongodbqq.service failed.

查看mongodb的log,最新的信息如下:

2019-01-17T19:41:00.001+0800 I -        [initandlisten]   Index Build: 55387600/192576426 28%
2019-01-17T19:41:03.002+0800 I -        [initandlisten]   Index Build: 57463100/192576426 29%
2019-01-17T19:41:06.002+0800 I -        [initandlisten]   Index Build: 59385700/192576426 30%
2019-01-17T19:41:09.001+0800 I -        [initandlisten]   Index Build: 61549000/192576426 31%

通过查看Server log 和 Mongodb log ,们可以判断:启动时需要重建关闭时未完成的index,但是重建这个大集合(本案例为weixinordersn,5亿数据量,102Gsize)的索引耗时较长,超过了启动服务允许的时间。服务超时后会被killed。 3.解决方案

设置systemd的service超时时间,在mongodb服务中,指明TimeoutSec参数。

TimeoutSec:定义 Systemd 停止当前服务之前等待的秒数。单位是秒,设置为0是不限制.

例如mongodbtest.service的编写,增加 TimeoutSec=1800

[Unit]

Description=mongodbtest
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongouser
Group=mongouser
 (open files)
LimitNOFILE=64000
Type=forking
ExecStart=/data/mongodb/mongobin404/bin/mongod --config /data/mongodb/mongobin404/bin/mongodbtest.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/data/mongodb/mongobin404/bin/mongod --shutdown --config /data/mongodb/mongobin404/bin/mongodbtest.conf
PrivateTmp=true TimeoutSec=1800

[Install]
WantedBy=multi-user.target

4.性能下降的分析

结合 应用超时 和 数据库监控的IO飙升的时间关联,性能下降主要分别是 创建索引 和 主从断掉导致oplog.rs 插入、查询、更新变慢导致。

5.参考文献 1.https://cloudblue.freshdesk.com/support/solutions/articles/44001881778 2.https://www.cnblogs.com/f-society/p/13177614.html 本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

原文创作:东山絮柳仔

原文链接:https://www.cnblogs.com/xuliuzai/p/15156886.html

文章列表

更多推荐

更多
  • Docker高级-十五、使用亚马逊 EC2 创建 Amazon EC2 实例,创建密钥对,启动 Amazon EC2 实例,连接到 Amazon EC2 实例,查找公共 IP 地址,查找公共 DNS,添加默认安全组,停止 Amazon EC2 实例,更改实例类型,摘要, 亚马逊网
    Apache CN

  • Docker高级-十三、使用 Apache Solr 设置环境,启动 Apache Solr 服务器的 Docker 容器,启动交互式 Shell,登录 Solr 管理控制台,创建核心索引,加载样本数据,在 Solr 管理控制台中查询 Apache Solr,使用 REST API 客户端
    Apache CN

  • Docker高级-十四、使用 Apache Spark 设置环境,运行 CDH 的 Docker 容器,以纱线集群模式运行 Apache Spark 作业,在 yarnclient 模式下运行 Apache Spark 作业,运行 Apache Spark Shell,摘要,Apache S
    Apache CN

  • Docker高级-十一、使用 Apache Sqoop 设置环境,启动 Docker 容器,启动交互式终端,创建 MySQL 表,将 MySQL JDBC Jar 添加到 Sqoop 类路径,设置 JAVA_HOME 环境变量,配置 Apache Hadoop,用 Sqoop 将 MySQL
    Apache CN

  • Docker高级-十二、使用 ApacheKafka 设置环境,为 Apache Kafka 启动 Docker 容器,查找 IP 地址,列出 Kafka 的日志,创造一个 Kafka 主题,启动 Kafka 制作人,启动 Kafka 消费者,生产和消费消息,停止和移除 Docker 容器
    Apache CN

  • Docker高级-八、使用 Apache Hadoop 设置环境,启动 Hadoop,启动交互式 Shell,为 MapReduce 字数统计应用创建输入文件,运行 MapReduce 字数统计应用,停止 Hadoop Docker 容器,使用 CDH 坞站映像,摘要,Apache Hado
    Apache CN

  • Docker高级-九、使用 Apache Hive 设置环境,正在启动 Apache Hive,连接到直线 CLI 外壳,连接到 HiveServer2,创建配置单元表,将数据加载到配置单元表中,查询配置单元表,停止 Apache 蜂房,摘要,Apache Hive 是用于存储、管理和查
    Apache CN

  • Docker高级-十、使用 Apache HBase 设置环境,从 CDH 开始,启动交互式外壳,启动 HBase Shell,创建 HBase 表,列出 HBase 表,获取单个表格行,获取单行列,扫描表格,阻止 CDH,摘要,Apache HBase 是 Apache Hadoop 数
    Apache CN

  • Docker高级-六、使用 Apache Cassandra 设置环境,启动 Apache Cassandra,启动 TTY,连接到 CQL Shell,创建密钥空间,更改密钥空间,使用密钥空间,创建表格,添加表格数据,查询表,从表格中删除,截断表格,放下一张桌子,删除一个键空间,退出 CQL 壳
    Apache CN

  • Docker高级-七、使用 Couchbase 服务器 设置环境,启动 Couchbase,访问 Couchbase Web 控制台,配置 Couchbase 服务器群集,添加文档,启动交互式终端,运行 Couchbase CLI 工具,停止 Couchbase 服务器和容器,摘要,Couc
    Apache CN

  • 近期文章

    更多
    文章目录

      推荐作者

      更多