mongodb副本集数据同步的踩坑
一、故事
最近随着搞活动比较频繁导致数据库出现了波动,后端日志总是报数据库连接和读取的问题。由于我设置的是读写分离(伪的,通过设置副本集的读取策略实现的,设置的db.getMongo().setReadPref(),共有如下几个参数:
One of the following read preference modes: primary
, primaryPreferred
, secondary
, secondaryPreferred
, or nearest
.详细的介绍可以进链接了解。我们采用的是secondaryPreferred,优先读取second节点,只有从节点不可读是才会去master节点读取
)。当然最好的读写分离需要使用shared分片集实现,我们也已经切换称分片集了,这里主要是为了本篇博客将要介绍的知识点,所以会以副本集进行讲解。继续故事啊,看监控数据库状态没有什么问题啊,查看副本集状态的时候发现了点猫腻:rs.status(),发现有一个节点的syncingTo竟然不是master,而是另外的一个secondary节点,这就很奇怪了,其他的都是master的地址。都知道mongodb之间同步数据是通过oplog的回访实现的,和mysql的binlog很像,于是带着这个疑问就到官网查看一番。
二、官网游历
直达车:https://docs.mongodb.com/manual/reference/method/js-replication/、https://docs.mongodb.com/manual/tutorial/manage-chained-replication/
先来看一下官网的描述:
Starting in version 2.0, MongoDB supports chained replication. A chained replication occurs when a secondarymember replicates from another secondary member instead of from the primary. This might be the case, for example, if a secondary selects its replication target based on ping time and if the closest member is another secondary.
Chained replication can reduce load on the primary. But chained replication can also result in increased replication lag, depending on the topology of the network.
You can use the settings.chainingAllowed
setting in Replica Set Configuration to disable chained replication for situations where chained replication is causing lag.
从mongodb2.0开始支持链式复制,并且默认是开启的,是根据second节点之间的ping time和网络距离进行选择那个second作为数据的同步节点,链式复制的优点:可以减少master的资源消耗,减少负载。缺点:节点之间同步数据本来就不可避免会有数据的延迟,执行链式复制的过程会使这个时间增大,该second节点的数据就会比其他的更落后于master,所以在读取数据的时候就会有一些问题,比如读取数据读不到,后端服务就会抛错,导致用户能感知到,非常不好,当然可以通过降低数据延迟来缓解,保证节点见的网络带宽流畅、io等。
三、方案
了解了副本集之间的复制方式,接下来就开始着手解决这个数据延迟的问题,从官网来看有两种方式:使用rs.syncFrom()设置同步源、禁用掉链式复制
1、rs.syncFrom
官网对于这个命令的介绍:
Provides a wrapper around the replSetSyncFrom
, which allows administrators to temporarily override the default sync target for the current member. Specify the name of the member you want to replicate from in the form of [hostname]:[port]
.
Changed in version 3.2: MongoDB 3.2 replica set members with 1 vote
cannot sync from members with 0votes
.
>rs.syncFrom("myHost:27017");
2、禁用掉链式复制
Disable Chained Replication
To disable chained replication, set the settings.chainingAllowed
field in Replica Set Configuration to false
.
If chained replication is disabled, you still can use replSetSyncFrom
to specify that a secondary replicates from another secondary. But that configuration will last only until the secondary recalculates which member to sync from.(禁用了链式复制以后,还是可以通过replSetSyncFrom指定复制源为second,但是必须要有投票权
)
You can use the following sequence of commands to set settings.chainingAllowed
to false
:
cfg = rs.config() cfg.settings.chainingAllowed = false
rs.reconfig(cfg)
Re-enable Chained Replication
To re-enable chained replication, set settings.chainingAllowed
to true
. You can use the following sequence of commands:
cfg = rs.config()
cfg.settings.chainingAllowed = true
rs.reconfig(cfg)
四、一些思考
排查问题时使用的几个命令:
mongostat
mongotop
rs.status()
rs.printSlaveReplicationInfo() 打印数据同步延迟信息
rs.printReplicationInfo() 打印oplog信息
具体遇到数据同步延迟的,需要具体分析当时的情况,不能盲目的修改。首先考虑节点服务器的负载情况和当时的网络环境是否正常,有的时候可能是网络环境导致的,排除这些原因后,再去考虑修改同步源。这样要做好读写分离,否则master的压力会非常大。如果master的压力太大就要做一些处理,比如切换一下msater升级资源或使用replSetSyncFrom切换同步源到second上。
参考:
https://www.cnblogs.com/cuishuai/p/8034851.html
https://docs.mongodb.com/manual/tutorial/manage-chained-replication/
https://docs.mongodb.com/manual/reference/method/rs.syncFrom/
mongodb副本集数据同步的踩坑的更多相关文章
- Mongodb 副本集 数据同步简单测试
副本集的搭建,请见 CENTOS6.5 虚拟机MONGODB创建副本集 接下来将简单说明下副本集之间的数据同步. 1.首先,进入primary节点 MOGO_PATH/bin/mongo -por ...
- MongoDB副本集(一主两从)读写分离、故障转移功能环境部署记录
Mongodb是一种非关系数据库(NoSQL),非关系型数据库的产生就是为了解决大数据量.高扩展性.高性能.灵活数据模型.高可用性.MongoDB官方已经不建议使用主从模式了,替代方案是采用副本集的模 ...
- MongoDB副本集配置系列七:MongoDB oplog详解
1:oplog简介 oplog是local库下的一个固定集合,Secondary就是通过查看Primary 的oplog这个集合来进行复制的.每个节点都有oplog,记录这从主节点复制过来的信息,这样 ...
- 一次flume exec source采集日志到kafka因为单条日志数据非常大同步失败的踩坑带来的思考
本次遇到的问题描述,日志采集同步时,当单条日志(日志文件中一行日志)超过2M大小,数据无法采集同步到kafka,分析后,共踩到如下几个坑.1.flume采集时,通过shell+EXEC(tail -F ...
- 『审慎』.Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
异步Task简单介绍 本标题有点 哗众取宠,各位都别介意(不排除个人技术能力问题) —— 接下来:我将会用一个小Demo 把 本文思想阐述清楚. .Net 4.0 就有了 Task 函数 —— 异步编 ...
- Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历
Net4.6 Task 异步函数 比 同步函数 慢5倍 踩坑经历 https://www.cnblogs.com/shuxiaolong/p/DotNet_Task_BUG.html 异步Task简单 ...
- Win10 安装配置 MongoDB 4.0 踩坑记
redis 官方没有 Windows 版的,微软维护的已经好久没更新了,所以就在想着换成 MongoDB. 于是一趟被我复杂化的踩坑之旅就开始了,同时也记录一下,避免有人遇见跟我一样的问题. 首先在 ...
- MQ异步同步搜索引擎ElasticSearch数据踩坑
业务背景 在大型网站中,为了减少DB压力.让数据更精准.速度更快,将读拆分出来采用搜索引擎来为DB分担读的压力,ElasticSearch就是目前市面上比较流行的搜索引擎,他的检索速度奇快.支持各种复 ...
- MongoDB 副本集的原理、搭建、应用
概念: 在了解了这篇文章之后,可以进行该篇文章的说明和测试.MongoDB 副本集(Replica Set)是有自动故障恢复功能的主从集群,有一个Primary节点和一个或多个Secondary节点组 ...
随机推荐
- index.jsp首页访问不了的解决方法
解决方法: Tomcat,将项目添加到里面 部署解包的webapp目录 将Web项目部署到Tomcat中的方法之一,是部署没有封装到WAR文件中的Web项目.要使用这一方法部署未打包的webapp目录 ...
- Windows 8.1 Update中的小改变
在Build 2014大会中,发布了Windows 8.1 Update的更新,并将于4月8日通过Windows Update进行推送.但是,在MSDN订阅下载中,带有该更新的镜像已经可以在4月3号放 ...
- 18:description方法
本小节知识点: [掌握]description基本概念 [掌握]description重写的方法 [了解]description陷阱 1.description基本概念 NSLog(@"%@ ...
- hdu 4925 黑白格
http://acm.hdu.edu.cn/showproblem.php?pid=4925 给定一个N*M的网格,对于每个格子可以选择种树和施肥,默认一个苹果树收获1个苹果,在一个位置施肥的话,周围 ...
- 2.Handler处理器 和 自定义Opener
Handler处理器 和 自定义Opener opener是 urllib2.OpenerDirector 的实例,我们之前一直都在使用的urlopen,它是一个特殊的opener(也就是模块帮我们构 ...
- WPF TreeView BringIntoViewBehavior
由于项目需要,需要能够定位TreeView中的点,TreeView的节点数过多的情况下,即使找到了对应的节点并选中展示了,由于不在可视区域内,给用户的感觉还是不好,因此设计如下的Behavior,来实 ...
- 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar
[源码下载] 背水一战 Windows 10 (40) - 控件(导航类): AppBar, CommandBar 作者:webabcd 介绍背水一战 Windows 10 之 控件(导航类) App ...
- java多线程面试题整理及答案(2018年)
1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对 运算密集型任务提速.比如,如果一个线程完 ...
- 05-创建kubectl-kubeconfig文件
本文档介绍创建 kubeconfig 文件 下载 kubectl $ wget https://dl.k8s.io/v1.6.0/kubernetes-client-linux-amd64.tar.g ...
- linux shell使用别名,切换当前目录
别名alias 别名就是一种快捷方式,以省去用户输入一长串命令序列的麻烦. 别名使用alias命令 比如 alias cp='cp -i' alias l.='ls -d .* --color=tty ...