##一、MongoDB复制集原理
###(一)复制集简介
  Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。
  下图(图片源于云栖社区)是一个典型的Mongdb复制集,包含一个Primary节点和2个Secondary节点。

  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:

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()

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

use test
db.test2.find()

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

MongoDB复制集原理、搭建及复制集简单维护相关推荐

  1. Kubernetes集群搭建之Etcd集群配置篇

    docker快速启动etcd脚本 https://www.cnblogs.com/ka1em/p/11300355.html rm -rf /tmp/etcd-data.tmp && ...

  2. mongodb 3.4 集群搭建升级版 五台集群

    最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进.如果大家不熟悉什么是分片.副本集.仲裁者的话请先 ...

  3. Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。...

    1   什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...

  4. Solr集群搭建,zookeeper集群搭建,Solr分片管理,Solr集群下的DataImport,分词配置。

    1   什么是SolrCloud SolrCloud(solr 云)是Solr提供的分布式搜索方案,当你需要大规模,容错,分布式索引和检索能力时使用 SolrCloud.当一个系统的索引数据量少的时候 ...

  5. redis安装、持久化、数据类型、常用操作、操作键值、安全设置、慢查询日志、存储session、主从配置、集群介绍、集群搭建配置、集群操作,php安装redis扩展...

    21.9 redis介绍 21.10 redis安装 21.11 redis持久化 21.12 redis数据类型 21.13/21.14/21.15 redis常用操作 21.16 redis操作键 ...

  6. Redis集群搭建(多机集群)

    链接: https://pan.baidu.com/s/1IczvAUFhNz23xvCjlTiI_A?pwd=ruge Redis入门篇 https://blog.csdn.net/tongxin_ ...

  7. Hadoop详解(五)——ZooKeeper详解,ZooKeeper伪分布搭建和集群搭建,Hadoop集群搭建,sqoop工具的使用

    ZooKeeper简介 什么是ZooKeeper? ZooKeeper是Google的Chubby一个开源的实现,是Hadoop分布式协调服务. 它包含了一个简单的原语集,分布式应用程序可以基于它实现 ...

  8. Redis集群搭建(Cluster 集群模式,分片集群)

    Redis集群搭建Cluster 集群模式 引言 Redis的集群介绍 搭建方法 创建集群 其他服务的搭建 引言 redis相信大家不陌生,是最常用的缓存解决方案了.但是,在服务开发中,单机都会存在单 ...

  9. MongoDB在单机上搭建分片副本集群(windows)

    ------------------------------ 1.安装MongoDB ... ... ------------------------------ 2.准备好文件夹 --config: ...

  10. MySQL数据库高可用集群搭建-PXC集群部署

    Percona XtraDB Cluster(下文简称PXC集群)提供了MySQL高可用的一种实现方法.集群是有节点组成的,推荐配置至少3个节点,但是也可以运行在2个节点上. PXC原理描述: 分布式 ...

最新文章

  1. jquery 实现仿QQ右下角弹出框
  2. C#嵌套任务和子任务
  3. Linux 随机启动 Mysql​
  4. 成功者十三个价值连城的习惯
  5. 使用trilium搭建专属知识库
  6. 【转载】什么时候该选C语言实现业务逻辑,什么时候该选Python?
  7. python爬虫之利用pyquery爬取当当网图书信息
  8. 什么是驻点和拐点_驻点、极值点、拐点间的“爱恨情仇”
  9. python爬楼梯问题_使用python算法解决楼梯台阶问题方法详解
  10. 【计算机组成原理】:计算机系统的组成和层次
  11. License之外,社区的规则与潜规则
  12. 优酷路由器刷openwrt固件一
  13. 三种食物会让肿瘤疯长
  14. 字符串连接 (c语言)
  15. php 炒粉,市委书记在夜排档吃炒粉,一定是摆拍?
  16. 影评《北京爱情故事》告诉我们一些事
  17. 计算机专业考研复习方法,2014年东北大学计算机专业——关于考研我个人的复习方法...
  18. 下一代安全管理平台NextSOC
  19. Java彩球屏保的制作
  20. 八个超赞的两轮平衡小车设计,小白最爱

热门文章

  1. uniapp页面高度100%无效问题
  2. 使用 Hexo 搭建个人博客
  3. 快来解锁小程序蓝牙开发技能
  4. Vue获取DOM元素并修改属性
  5. 为何技术人员很难做好售前工作?
  6. Linux安全加固之修改SSH登录端口
  7. python微信机器人pc端
  8. c语言动态分配内存及内存分配部分函数
  9. 程序媛:互联网稀有物种
  10. “TCP连接”究竟是什么意思?