资讯专栏INFORMATION COLUMN

MongoDB副本集其他细节

Flink_China / 2392人阅读

摘要:当一个原本运行正常的成员无法访问到时,该成员就处于的状态。成员被从副本集中移除时就变成这个状态。表示当前服务器最后一次收到其他成员心跳的时间。表示同步的数据源。

副本集环境的搭建以及一些基本的操作我们都了解了,本文我们来看看这个数据复制到底是怎么实现的。

本文是MongoDB系列的第十七篇文章,了解前面的文章有助于更好的理解本文:


1.Linux上安装MongoDB
2.MongoDB基本操作
3.MongoDB数据类型
4.MongoDB文档更新操作
5.MongoDB文档查询操作(一)
6.MongoDB文档查询操作(二)
7.MongoDB文档查询操作(三)
8.MongoDB查看执行计划
9.初识MongoDB中的索引
10.MongoDB中各种类型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)
13.MongoDB管道操作符(二)
14.MongoDB中MapReduce使用
15.MongoDB副本集搭建
16.MongoDB副本集配置


数据同步方式

MongoDB中的复制功能主要是使用操作日志oplog.rs来实现的,oplog.rs包含了主节点的每一次写操作,oplog.rs是主节点中local数据库的一个固定集合,我们可以通过如下命令查看到:

use local
show tables

如下:

备份节点通过查询这个集合就知道要复制哪些数据,同时,每一个备份节点也都维护着自己的oplog.rs,自己的oplog.rs则用来记录每一次从主节点复制数据的操作,如此,每一个备份节点都可以再作为数据源提供给其他成员使用,如果某一个备份节点在使用的过程中挂掉了,那么当它重启之后,会自动从oplog.rs的最后一个操作开始同步。

上文我们也已经说过oplog.rs是一个固定集合,我们可以通过db.getCollection("oplog.rs").stats()这个命令来查看这个固定集合的属性,包括集合大小等,执行部分结果如下:

{
    "ns" : "local.oplog.rs",
    "size" : 18170305,
    "count" : 177443,
    "avgObjSize" : 102,
    "storageSize" : 5902336,
    "capped" : true,
    "max" : -1,
    "maxSize" : 1038090240,
    "sleepCount" : 0,
    "sleepMS" : 0,
}

既然是固定集合,它里边能够保存的数据大小就是有限的。通常,oplog.rs使用空间的增长速度与系统处理处理写请求的速率近乎相同,比如主节点每分钟处理了1KB的写入请求,那么oplog.rs也可能会在一分钟内写入1KB条操作日志,但是如果主节点执行了批量删除的命令,比如下面这种:

db.c1.deleteMany({x:{$type:1}})

此时每一个受影响的文档都会产生一条oplog中的日志,这个时候oplog.rs中的日志会快速增加。

成员状态

到目前为止我们了解到的成员状态有两种,一个是PRIMARY,还有一个是SECONDDARY,成员状态的获取需要靠心跳来维护,副本集中的每一个成员每隔两秒就会向其他成员发送一个心跳请求,用来检查成员的状态,成员的状态主要有如下几种:

STARTUP

副本集中的成员刚刚启动时处于这个状态下,此时,MongoDB会去加载成员的副本集配置,配置加载成功之后,就进入到STARTUP2的状态。

STARTUP2

整个初始化同步过程都处于这个状态。

RECOVERING

这个状态是由STARTUP2状态来的,此时成员运转正常,但是此时还不能处理读取请求。

ARBITER

这是仲裁者所处的状态。

DOWN

当一个原本运行正常的成员无法访问到时,该成员就处于DOWN的状态。

UNKNOWN

如果一个成员无法到达其他任何成员,该成员就处于UNKNOWN状态,比如我们利用rs.add()方法添加一个不存在的成员,这个成员的状态就是UNKNOWN。

REMOVED

成员被从副本集中移除时就变成这个状态。

ROLLBACK

如果成员正在进行数据回滚,它就处于ROLLBACK状态,回滚结束后会转换为RECOVERING状态。

FATAL

当一个成员发生了不可挽回的错误时,且不再尝试恢复正常的话,就处于这个状态。

主节点转备份节点

通过如下命令可以让主节点转为备份节点:

rs.stepDown()

主节点转为备份节点之后会有新的主节点被选举出来,可以通过rs.status()来查看新的主节点。

rs.status()方法

前面我们已经多次使用过rs.status()方法,rs.status()方法会列出每个备份节点的含义,我们来看看这些参数的含义,先来列出一个rs.status()方法的返回值样例:

{
"members" : [
    {
        "_id" : 1,
        "name" : "192.168.248.135:27017",
        "health" : 1,
        "state" : 2,
        "stateStr" : "SECONDARY",
        "uptime" : 241,
        "optime" : {
                "ts" : Timestamp(1509881297, 1),
                "t" : NumberLong(16)
        },
        "optimeDurable" : {
                "ts" : Timestamp(1509881297, 1),
                "t" : NumberLong(16)
        },
        "optimeDate" : ISODate("2017-11-05T11:28:17Z"),
        "optimeDurableDate" : ISODate("2017-11-05T11:28:17Z"),
        "lastHeartbeat" : ISODate("2017-11-05T11:28:18.073Z"),
        "lastHeartbeatRecv" : ISODate("2017-11-05T11:28:18.769Z"),
        "pingMs" : NumberLong(0),
        "syncingTo" : "192.168.248.136:27017",
        "configVersion" : 15
    },
    {
        "_id" : 3,
        "name" : "192.168.248.136:27017",
        "health" : 1,
        "state" : 1,
        "stateStr" : "PRIMARY",
        "uptime" : 250,
        "optime" : {
                "ts" : Timestamp(1509881297, 1),
                "t" : NumberLong(16)
        },
        "optimeDate" : ISODate("2017-11-05T11:28:17Z"),
        "electionTime" : Timestamp(1509881276, 1),
        "electionDate" : ISODate("2017-11-05T11:27:56Z"),
        "configVersion" : 15,
        "self" : true
    }
]
}

1.stateStr用来描述当前节点的状态。
2.uptime表示从成员可达到现在所经历的时间。
3.optimeDate表示每个成员的oplog中最后一个操作发生的时间。
4.lastHeartbeat表示当前服务器最后一次收到其他成员心跳的时间。
5.pingMs表示心跳从当前服务器到达某个成员所花费的平均时间。
6.syncingTo表示同步的数据源。
7.health表示该服务器是否可达,1表示可达,0表示不可达。

复制链问题

数据复制时可以从主节点直接复制,也可以从备份节点开始复制,从备份节点复制可以形成复制链,如果想禁止复制链,即所有的数据都从主节点复制,可以通过chainingAllowed属性来设置,具体步骤如下:

config=rs.config()
config.settings.chainingAllowed=false
rs.reconfig(config)

好了,MongoDB中副本集的其他细节我们就先说到这里,小伙伴们有问题欢迎留言讨论。

参考资料:

1.《MongoDB权威指南第2版》

更多资料请关注公众号:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/19161.html

相关文章

  • 深入浅出MongoDB 复制

    摘要:申明本文由笔者首发于深入浅出复制中文社区深入浅出复制由于自己开了,所以将之前比较好的文章挪过来便于大家浏览。新增由于网络问题导致失败重试机制。 申明 本文由笔者首发于InfoQ:《深入浅出MongoDB复制》MongoDB中文社区:《深入浅出MongoDB复制》 由于自己开了blog,所以将之前比较好的文章挪过来便于大家浏览。 综述 笔者最近在生产环境中遇到许多复制相关问题,查阅网上资...

    Jacendfeng 评论0 收藏0
  • 两年了,我写了这些干货!

    摘要:开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章系列处理登录请求前后端分离一使用完美处理权限问题前后端分离二使用完美处理权限问题前后端分离三中密码加盐与中异常统一处理 开公众号差不多两年了,有不少原创教程,当原创越来越多时,大家搜索起来就很不方便,因此做了一个索引帮助大家快速找到需要的文章! Spring Boo...

    huayeluoliuhen 评论0 收藏0
  • 初识MongoDB分片

    摘要:复制一份,命名为,修改文件内容如下注意改为我们第一步创建的目录,端口号改为这个随意,只要该端口没被占用即可,表示这是一个配置服务器,另外由于我们的配置服务器要做成备份集,所以要设置。 分片是指将数据拆分,拆分后存放在不同的机器上的过程,以此来降低单个服务器的压力,同时也解决单个服务器硬盘空间不足的问题,让我们可以用廉价的机器实现高性能的数据架构。有的小伙伴不理解分片和副本集的差异,一言...

    Nino 评论0 收藏0
  • MongoDB教程合

    摘要:磕磕绊绊,我们的系列教程终于落下帷幕,从月第一篇开始到现在,中间有一段时间开小差,不过还好没有烂尾。好了,这里我再把本系列的所有文章罗列出来,以供小伙伴们搜索查看。 磕磕绊绊,我们的MongoDB系列教程终于落下帷幕,从11月21第一篇开始到现在,中间有一段时间开小差,不过还好没有烂尾。好了,这里我再把本系列的所有文章罗列出来,以供小伙伴们搜索查看。 1.Linux上安装Mongo...

    FingerLiu 评论0 收藏0

发表评论

0条评论

Flink_China

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<