MongoDB复制集原理、搭建及复制集简单维护

一、MongoDB复制集原理

(一)复制集简介

  Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
  下图(图片源于云栖社区)是一个典型的Mongdb复制集,包含一个Primary节点和2个Secondary节点。
典型的Mongdb复制集
  MongoDB复制集具有如下四个特点:
1.主是唯一的,但不是固定的。整个复制集中只有一个主节点,其余为从节点或选举节点,但是因为MongoDB具有自动容灾的功能,所以当唯一的主节点发生宕机时会从从节点的Priority参数不为0当中选举一个为主节点,所以说主是唯一的,但不是固定的。
2.由大多数据原则保证数据的一致性。即MongoDB复制集内投票成员(参数Vote不为0的其他成员具有选举权,在2.6版本后不能设置Vote大于1,即只能投票一次)数量为N,则大多数为 N/2 + 1,当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。通常建议将复制集成员数量设置为奇数。
3.从库无法写入。MongoDB复制集中只有主节点可以Writes,主节点和从节点可以Read。
4.相对于传统的主从结构,复制集可以自动容灾。即当某个主节点宕机后会自动从从节点(Priority大于0的从节点)中选举出一个作为新的主节点,而某个从节点宕机后能继续正常工作。

(二)复制集节点介绍

  MongoDB按功能可分为主节点、从节点(隐藏节点、延时节点、“投票”节点)和选举节点。

节点名 说明
主节点(Primary) 可以提供读Writes/Read的节点,整个复制集中只有一个主节点。
隐藏节点(Hidden) 提供Read并对程序不可见的节点。
延时节点(Delayed) 提供Read并能够延时复制的节点。
“投票”节点(Priority) 提供Read并具有投票权的节点。
选举节点(Arbiter) Arbiter节点,无数据,仅作选举和充当复制集成员。又成为投票节点。

  Primary节点:复制集通过replSetInitiate命令(或mongo shell的rs.initiate())进行初始化,初始化后各个成员间开始发送心跳消息,并发起Priamry选举操作,获得『大多数』成员投票支持的节点,会成为Primary,其余节点成为Secondary。
  Secondary节点:正常情况下,复制集的Seconary会参与Primary选举(自身也可能会被选为Primary),并从Primary同步最新写入的数据,以保证与Primary存储相同的数据。Secondary可以提供读服务,增加Secondary节点可以提供复制集的读服务能力,同时提升复制集的可用性。另外,Mongodb支持对复制集的Secondary节点进行灵活的配置,以适应多种场景的需求。
  Arbiter节点:Arbiter节点只参与投票,不能被选为Primary,并且不从Primary同步数据。比如你部署了一个2个节点的复制集,1个Primary,1个Secondary,任意节点宕机,复制集将不能提供服务了(无法选出Primary),这时可以给复制集添加一个Arbiter节点,即使有节点宕机,仍能选出Primary。Arbiter本身不存储数据,是非常轻量级的服务,当复制集成员为偶数时,最好加入一个Arbiter节点,以提升复制集可用性。
  Priority节点:默认为1,Priority参数设置范围在0-1000的整数值。Priority0节点的选举优先级为0,永远不会被选举为Primary。
  Vote节点:Vote默认为1,Vote参数的值在2.6版本后只能设置为0或1。Mongodb 3.0里,复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员的vote属性必须设置为0,即不参与投票。Vote设置为0时永远没有投票权。
  Hidden节点:Hidden节点不能被选为主(因为Priority为0),并且对Driver不可见。因Hidden节点不会接受Driver的请求,可使用Hidden节点做一些数据备份、离线计算的任务,不会影响复制集的服务。
  Delayed节点:delayed的配置受到opolg的影响。Delayed节点必须是Hidden节点,并且其数据落后与Primary一段时间(可配置,比如1个小时)。因Delayed节点的数据比Primary落后一段时间,当错误或者无效的数据写入Primary时,可通过Delayed节点的数据来恢复到之前的时间点。

二、MongoDB复制集搭建

(一)MongoDB配置文件配置

  首先要下载MongoDB并解压安装,这里限于篇幅就不多说,参考
文章:https://blog.csdn.net/qq_24598601/article/details/81071586
然后修改每一个MongoDB的配置文件mongo.config,增加参数replSet,参数的值随便起,我给的是rs0,最后保存。附上代码:

#ip绑定,限制ip访问
bind_ip=127.0.0.1

#端口
port=20001

#数据库配置路径
dbpath=D:\MongoDB\data

#日志文件配置
logpath=D:\MongoDB\log\mongo.log

#设置日志为追加的方式写日志
logappend=true

#启用身份认证
#auth=true

#复制集名称
replSet=rs0

(二)MongoDB服务启动

  然后启动MongoDB服务,已经启动了的需要重启,具体启动方法我在前一篇文章中已经有细说,如果不懂的可以评论留言。
文章地址:https://blog.csdn.net/qq_24598601/article/details/81071586
MongoDB服务启动

(三)MongoDB复制集配置文件配置

  服务启动后我们就可以正式配置复制集启动了。第一步我们连接到MongoDB:

mongo 127.0.0.1:20001/admin

  因为我们在前面的配置文件中使用了bind_ip参数绑定了ip,所以只能这么登陆,然后后面的admin是指定连接的数据库,如果不指定默认连接到test库。
第二步,编写复制集配置文件配置,然后回车运行

config = {"_id":"rs0",
          "members":[
          {"_id":0,host:"127.0.0.1:20001"},
          {"_id":1,host:"127.0.0.1:20002"},
          {"_id":2,host:"127.0.0.1:20003"}
          ]
}

其中第一个“_id”为复制集的ID标识,即”_id”:”rs0”;第二个“_id”是复制集内成员的标识,即”_id”:0。效果图:
编写成功后的样子

(四)MongoDB复制集初始化启动

  第三步:初始化复制集,命令如下:

 rs.initiate(config)

初始化复制集
请注意编写代码前的”>符号的变化,在没有配置好复制集之前只有”>“,初始化后有”rs0:SECONDARY>“了,SECONDARY表示该节点是从节点,PRIMARY表示该节点是主节点。接下来我们可以使用命令来查看复制集状态:

rs.status()

复制集状态
我们现在已经完成了复制集的搭建。
还有一种初始化的方法,就是先只初始化一个节点,然后再通过命令rs.add("ip:port")来添加从节点或通过命令rs.addArb("ip:port")来添加投票节点。

(五)验证MongoDB复制集

  接下来我们需要验证一下复制集的数据同步,我在主节点(127.0.0.1:20001)上的test库加了collection集合为test2的数据。命令:

use test
db.test2.insert("x":1)

首先登陆另一个从节点(127.0.0.1:20002)命令:mongo 127.0.0.1:20002/admin
登陆其中一个从节点
然后使用命令show dbs查看数据库会报错,这时我们需要运行命令:
rs.slaveOk()

rs.slaveOk()

然后再运行show dbs就可以了,这是因为从节点默认不能操作数据。
最后我们运行命令:

use test
db.test2.find()

MongoDB复制集数据同步

MongoDB复制集数据同步就完成了。如果感兴趣,可以继续验证复制集故障迁移(自动容灾),可以将主节点进行模拟宕机(关闭主节点的服务),然后你就会看到另外从节点就变成了主节点。log日志中有详情记录。

三、MongoDB复制集维护

(一)MongoDB复制集配置文件参数介绍

  在上面我们只用到了复制集的_id和host参数,下面还有一些常用参数,我简单的介绍一下,通过这些参数我们可以很好的管理和搭建更好的复制集,在实际生成环境下,不建议经常去更改这些参数,以免引起程序未知的错误。

参数名称 取值类型 说明
_id 整数 节点的唯一标识。
host 字符串 节点的IP地址,包含端口号。
arbiterOnly 布尔值 是否为投票节点,默认是false。是设置投票(选举)节点有关的参数
priority 整数 选举为主节点的权值,默认是1,范围0-1000。
hidden 布尔值 是否隐藏,默认false,是设置隐藏节点有关的参数。
votes 整数 投票数,默认为1,取值是0或1,是设置”投票“节点有关的参数。
slaveDelay 整数 延时复制,是设置延时节点有关的参数。单位秒(s)

(二)MongoDB复制集简单维护

  我们可以通过修改上面这些参数来进行复制集的维护;首先登陆到主节点mongo 127.0.0.1:20001/admin,因为只能在主节点上操作。
1.增加从节点
rs.add(“ip:port”)
rs.add({“_id”:4,”host”:”ip:port”,”priority”:1,”hidden”:false})
2.增加投票节点
rs.addArb(“ip;port”)
rs.addArb({“_id”:5,”host”:”ip:port”})
rs.add({‘_id’:5,”host”:”new_node:port”,”arbiterOnly”:true})
3.删除节点
rs.remove(“ip;port”)
4.修改节点参数
(1)config = rs.conf()
(2)config.members[i].参数 = 值
(3)rs.reconfig(config, {“force”:true})或rs.reconfig(config),前面是强制重新配置
5.主节点降级
rs.stepDown(整数),意思是在整数秒内降级
6.查看配置文件
rs.conf()
7.查看复制集状态
rs.status()
还有很多很多维护事项。
注:
  要设置某节点为隐藏节点需要设置参数hidden为true及priority参数值为0;
  设置某节点为”投票“节点不需要设置,默认就是,但要设置它不是”投票“节点需要设置参数votes为0;
  设置某节点为延时节点就需要设置参数slaveDelay;
  如果将某节点要设置为投票节点,则需要设置参数arbiterOnly为true,但是如果是已经是从节点了再要改成投票节点就需要先remove掉,再用相应的方法添加。

注意:
  修改副本集成员配置时的限制:
1. 不能修改_id;
2. 不能将接收rs.reconfig命令的成员的优先级设置为 0;
3. 不能将仲裁者成员(投票节点或选举节点)变为非仲裁者成员(从节点),不能将非仲裁者成员(从节点)变为仲裁者成员(投票节点或选举节点);
4. 不能将 buildIndexes:false 改为 true;

四、关于MongoDB复制集待思考问题,欢迎留言评论

  1. 复制集的安全问题怎么解决?
  2. 在生产环境中怎么样去配置高可用的复制集?
  
  
参考文章:

[1] MongoDB复制集原理:http://www.mongoing.com/archives/2155

猜你喜欢

转载自blog.csdn.net/qq_24598601/article/details/81150614