mongodb副本集数据同步的踩坑

2021年09月15日 阅读数:1
这篇文章主要向大家介绍mongodb副本集数据同步的踩坑,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

1、故事html

最近随着搞活动比较频繁致使数据库出现了波动,后端日志老是报数据库链接和读取的问题。因为我设置的是读写分离(伪的,经过设置副本集的读取策略实现的,设置的db.getMongo().setReadPref(),共有以下几个参数:mysql

One of the following read preference modes: primaryprimaryPreferredsecondarysecondaryPreferred, or nearest.详细的介绍能够进连接了解。咱们采用的是secondaryPreferred,优先读取second节点,只有从节点不可读是才会去master节点读取)。固然最好的读写分离须要使用shared分片集实现,咱们也已经切换称分片集了,这里主要是为了本篇博客将要介绍的知识点,因此会以副本集进行讲解。继续故事啊,看监控数据库状态没有什么问题啊,查看副本集状态的时候发现了点猫腻:rs.status(),发现有一个节点的syncingTo居然不是master,而是另外的一个secondary节点,这就很奇怪了,其余的都是master的地址。都知道mongodb之间同步数据是经过oplog的回访实现的,和mysql的binlog很像,因而带着这个疑问就到官网查看一番。
sql

 

2、官网游历mongodb

直达车: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.app

从mongodb2.0开始支持链式复制,而且默认是开启的,是根据second节点之间的ping time和网络距离进行选择那个second做为数据的同步节点,链式复制的优势:能够减小master的资源消耗,减小负载。缺点:节点之间同步数据原本就不可避免会有数据的延迟,执行链式复制的过程会使这个时间增大,该second节点的数据就会比其余的更落后于master,因此在读取数据的时候就会有一些问题,好比读取数据读不到,后端服务就会抛错,致使用户能感知到,很是很差,固然能够经过下降数据延迟来缓解,保证节点见的网络带宽流畅、io等。ide

 

3、方案

了解了副本集之间的复制方式,接下来就开始着手解决这个数据延迟的问题,从官网来看有两种方式:使用rs.syncFrom()设置同步源、禁用掉链式复制

一、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 vote cannot sync from members with 0votes

>rs.syncFrom("myHost:27017");

二、禁用掉链式复制

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)

 

4、一些思考

排查问题时使用的几个命令:

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/