MongoDB3.2 复制集(Replica Set)的配置详解

发布时间:2017-12-01 编辑:小张个人博客 查看次数:5560

MongoDB复制集是将数据同步在多个服务器的过程。

复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。

复制还允许您从硬件故障和服务中断中恢复数据。

什么是MongoDB复制集

  • 保障数据的安全性

  • 数据高可用性 (24*7)

  • 灾难恢复

  • 无需停机维护(如备份,重建索引,压缩)

  • 分布式读取数据

MongoDB-复制集原理

虽然Journaling日志功能提供了数据恢复的功能,但是他通常针对的是单个节点来说的,而复制集则针对的是一组进程,通常是多个节点组成,在每个节点上有Journaling日志保证数据完整性,在整个复制集中实现自动故障转移,从而保证了数据库的高可用性。 

在生产环境中,一个复制集应该最少包含三个节点,一个仲裁节点(arbiter),唯一一个数据主节点(primary),一个或多个数据次节点(secondary)。 

主节点用来接收所有的写操作,一个复制集有且仅有一个primary能够进行写关注(写关注将在后面介绍),主节点在他的操作日志oplog中将所有的修改记录到数据集data sets中。典型的结构如下所示:

MongoDB-复制集原理

secondary节点备份primary节点上的数据,secondary节点可以有多个,一旦primary节点不可用,abiter将从secondary节点中选取一个作为primary节点,secondary节点的作用如下:

MongoDB-复制集原理

现在除了primary,secondary节点外,可以新增一个mongod实例副本集作为arbiter,arbiter不能维护数据集。arbiter的主要作用是维持与复制集中所有的其他节点的心跳以保证选举需要的节点数,因为arbiter不是一个数据存储集,arbiter可以提供一个比全功能副本集更廉价的方法来获取法定人数。如果复制集中是偶数个节点,可以通过添加arbiter节点使得primary可以获取到大多数的投票。arbiter不需要专门的硬件支持。arbiter的作用如下:

MongoDB-复制集原理

相对于primary与secondary节点可能在一次选举中(主节点失效触发)互换角色,arbiter仲裁者永远都是arbiter。

故障转移流程如下所示:

故障转移

MongoDB-复制集的创建:


mongod --dbpath D:\MongoDB\data\m1 --logpath D:\MongoDB\data\log1\1.log --port 27018 --replSet rs1 
mongod --dbpath D:\MongoDB\data\m2 --logpath D:\MongoDB\data\log2\2.log --port 27019 --replSet rs1 
mongod --dbpath D:\MongoDB\data\m3 --logpath D:\MongoDB\data\log3\3.log --port 27020 --replSet rs1

启动一个mongo客户端,连接到上面的一个mongod实例

mongo --port 27018

配置MongoDB复制集

var config = {
    _id:'rs1',
    members:
    [
        {_id:0,
        host:'192.168.1.107:27018'
        }
    ]
}

根据配置做初始化

rs.initiate(config);

配置MongoDB复制集

添加节点

rs.add('192.168.1.107:27019');
rs.add('192.168.1.107:27020');

查看状态

rs.status();

配置MongoDB复制集

删除复制集成员

rs.remove("192.168.1.107:27020")

主节点插入数据

use test
db.user.insert({uid:1,name:'zhangsan'});

启动一个mongo客户端,连接到上面的一个mongod实例,查询同步情况

mongo --port 27019
rs1:SECONDARY> show dbs;

Error: listDatabases failed:{ "ok" : 0, "errmsg" : "not master and sla

veOk=false", "code" : 13435 } :

出现上述错误,是因为slave默认不许读写

rs.slaveOk();

Error: listDatabases failed

MongoDB-数据同步

当primary节点完成插入操作后,secondary节点为了保证数据的同步,也会完成一些动作,所有的secondary节点将检查自己的local数据库上oplog.rs是否有修改,找出最近一条记录的时间戳,然后secondary节点将此时间戳作为条件查询primary节点上的oplog.rs集合,并找出所有大雨此时间戳的记录,最后secondary节点将这些找到的记录差润到自己的oplog.rs集合,同时执行这些记录代表的操作,然后完成数据同步。

use test;
db.user.find();

MongoDB-数据同步

MongoDB-故障转移

MongoDB自动故障转移是依靠心跳包实现的就是在前文提到的(lastHeartbeat)字段。Mongod每隔两秒向其他成员发送一个心跳包并且通过rs.status()返回的成员的”headth”来判断成员状态,如果出现复制集中primary节点不可用,则复制集中所有的secondary节点会触发一次选举操作,选举出新的primary节点,arbiter只是负责选举其他成员成primary节点,自己不会参与到选举中。如果secondary节点有多个则会选择拥有最新时间戳的oplog记录或较高权限的节点称为primary。而如果secondary节点失败,则不会发生重新选举primary过程。

MongoDB-故障转移


本文参考:《MongoDB官方文档》 《MongoDB的复制集》 



出处:小张个人博客

网址:http://blog.023xs.cn/

您的支持是对博主最大的鼓励,感谢您的认真阅读。欢迎转载,但请保留该声明。

顶部

Copyright © 小张个人博客 All Rights Reserved 渝ICP备15006773号-1

联系方式:[email protected] | 本站文章仅供学习和参考

渝公网安备 50024102500267号