大量的集合为何导致Secondary无法同步?

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Tair(兼容Redis),内存型 2GB
简介:

最近遇到一个user case,因为集合数量太多,导致Secondary节点无法进行initial sync(主备同步的第一步,可理解为从Primary上全量拷贝数据)。

副本集使用wiredtiger存储引擎,一共60,000+集合,平均每个集合4个索引,wiredtiger的集合及每个索引都对应一个单独的文件来存储,数据目录下总共300,000+文件,listDatabases命令执行时,会遍历所有DB的每个集合,获取集合及其索引文件占用的存储空间信息,实现类似如下的伪代码。

listDatabases() {
    dbNames = getAllDatabaseNames();
    for db in dbNames {
        sizeOnDisk = 0;
        for coll in db.getAllColletions() {
                size += coll.size();
                for index in coll.getAllIndexes() {
                    size += index.size();
                }    
        }
        addToOutput(db, size);
    }       
}

使用wiredtiger引擎时,获取集合及索引文件大小信息时,需要打开一个特殊的cursor来读取,整个listDatabases需要遍历300,000+个文件来逐个获取大小信息,导致整个命令的执行开销很大,总耗时在30s以上。

Secondary在执行initial sync时,其过程类似如下

  1. 删除本地除local外的所有数据库
  2. 执行listDatabases命令,获取同步源上所有DB的列表
  3. 针对每个DB,调用listCollections获取所有集合信息,并遍历所有集合,同步集合内的文档并建立索引。
  4. ......

initial sync执行时,设置了socket timeout为30s,而listDatabases的执行时间是超过30s的,导致同步在listDatabases时就一直超时失败,10次重试后仍然失败,Secondary进程就直接退出了。

2016-06-27T20:59:46.494+0800 I REPL     [rsSync] ******
2016-06-27T20:59:46.495+0800 I REPL     [rsSync] initial sync pending
2016-06-27T20:59:46.499+0800 I REPL     [rsSync] no valid sync sources found in current replset to do an initial sync
2016-06-27T20:59:47.499+0800 I REPL     [rsSync] initial sync pending
2016-06-27T20:59:47.517+0800 I REPL     [rsSync] initial sync drop all databases
2016-06-27T20:59:47.517+0800 I STORAGE  [rsSync] dropAllDatabasesExceptLocal 1
2016-06-27T20:59:47.517+0800 I REPL     [rsSync] initial sync clone all databases
2016-06-27T21:00:17.517+0800 I NETWORK  [rsSync] Socket recv() timeout  10.182.4.106:27017
2016-06-27T21:00:17.517+0800 I NETWORK  [rsSync] SocketException: remote: (NONE):0 error: 9001 socket exception [RECV_TIMEOUT] server [10.1.1.6:27017] 
2016-06-27T21:00:17.519+0800 E REPL     [rsSync] 6 network error while attempting to run command 'listDatabases' on host '10.1.1.6:27017' 
2016-06-27T21:00:17.519+0800 E REPL     [rsSync] initial sync attempt failed, 9 attempts remaining

问题已反馈给官方团队,详情见SERVER-24948,在3.4版本里会去掉socket timeout来解决这个问题。

实际上,同步过程中listDatabases只需要获取所有DB的名称即可,并不需要size信息,所以我们的想法是给listDatabases命令加一个 {nameOnly: true}的选项,让命令只返回所有DB的名称信息,这样整个开销会很小,SERVER-3181也遇到类似问题,提了相同的解决思路,我们会在MongoDB云数据库里加上这个选项用于主备同步,github pull request

使用MongoDB时,建议用户还是合理的控制下集合数量(集合数量太多,很可能存储设计上也有问题,得好好review下),集合数量一旦大了,有可能面临各种问题,就如同上述的场景listDatabases耗时长,想监控数据库的容量使用情况都难。

上述问题其他的解决方案

  • Primary(同步源)上使用mmapv1引擎,内存足够的情况下,listDatabases的开销要更小些。
  • Secondary同步时不设置或设置更长的socket超时时间
  • 加新节点上,将Primary的数据拷贝到新的节点,跳过initial sync
相关文章
|
数据可视化 定位技术 Python
Python基础综合案例-数据可视化(地图)
今天给大家带来的是Python综合实战开发的数据可视化操作 通过python实现对数据的分析、可视化
239 0
|
编解码 网络协议 开发工具
Android平台RTSP|RTMP直播播放器技术接入说明
大牛直播SDK自2015年发布RTSP、RTMP直播播放模块,迭代从未停止,SmartPlayer功能强大、性能强劲、高稳定、超低延迟、超低资源占用。无需赘述,全自研内核,行业内一致认可的跨平台RTSP、RTMP直播播放器。本文以Android平台为例,介绍下如何集成RTSP、RTMP播放模块。
596 0
|
12月前
|
关系型数据库 MySQL 数据库连接
MySQL 1040 - Too many connections 如何解决?
【10月更文挑战第11天】MySQL 1040 - Too many connections 如何解决?
1088 1
|
Linux Docker 容器
/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录...
/var/lib/docker/overlay2 占用很大,清理Docker占用的磁盘空间,迁移 /var/lib/docker 目录...
743 0
|
人工智能 JSON 安全
超越GPT4!Cluade 3重磅发布!国外最新大模型!
超越GPT4!Cluade 3重磅发布!国外最新大模型!
427 0
|
SQL NoSQL 前端开发
MySQL 连接数过多的处理方法合集 - Too many connections - 卡拉云
碰到`Can not connect to MySQL server. Too many connections”-mysql`错误着实令人抓狂。这基本等于失去了对 MySQL 的控制权。本教程将详细讲解多种处理此错误的方法。 sudo mysql -uroot -p ERROR 1040 (00000): Too many connections
23067 1
|
关系型数据库 MySQL
mysql下载源码方法
方法一 进入mysql官网:http://dev.mysql.com/downloads/mysql/ 选择相关的平台下载:     3.选择Source Code 选型后,拉倒网页下方,选择要下载的源码包         4.
13972 2
|
程序员 Python
【圣诞节限定】教你用Python画圣诞树,做个浪漫的程序员
最近在各大社交平台看到好多圣诞树,看到大佬们画的圣诞树一个比一个精致,我也特别想尝试画一棵特别的圣诞树。下面是我画的一棵简易的圣诞树,虽然和网络上大佬们的圣诞树相比不是很精致,但是对于萌新们来说,画这样一棵简易的圣诞树还是非常轻松的。 ps:重要的不是圣诞树,重要的是你的心意哦~
341 0
【圣诞节限定】教你用Python画圣诞树,做个浪漫的程序员
|
存储 缓存 NoSQL
哪些数据库是行存储?哪些是列存储?有什么区别?
导读:本文带你了解面向列与面向行的数据库。
|
应用服务中间件
idea控制台乱码(tomcat日志乱码)的解决办法
idea控制台乱码(tomcat日志乱码)的解决办法
idea控制台乱码(tomcat日志乱码)的解决办法