MongoDB副本集-阿里云开发者社区

开发者社区> 梓杰> 正文

MongoDB副本集

简介: MongoDB 副本集
+关注继续查看

MongoDB副本集

一、副本集基础

1.1 副本集概念

  MongoDB副本集是由一个主节点和多个副本节点组成。主节点将数据的改变推送到副本节点上,在一定的延迟之后,每个MongoDB实例维护相同的数据。通过维护冗余的数据副本,能够实现数据的备份,读写分离和自动故障转移。

1.2 副本集使用场景

  • 数据冗余,用做故障恢复使用,当发生硬件故障或者其它原因造成的宕机时,可以使用副本进行恢复。
  • 读写分离,读请求会分流到所有副本上,减轻主节点的读压力。

1.3 副本集的故障转移

  MongoDB副本集是主从复制的高级形式。主从复制仅仅实现了数据备份和读写分离,但是主节点一旦宕机,需要手动启动从节点进行故障转移;MongoDB副本集在主从复制基础上实现了故障转移的功能,也就是当主节点宕机时,某一台副本节点会自动提升为新主节点。

1.4 副本集相关命令

rs.initiate() #使用默认配置初始化副本集
rs.initiate(cfg) #使用配置文件cfg初始化副本集
rs.reconfig(cfg) #修改副本集配置信息
rs.status() #查看副本集状态
rs.conf() #查看副本集配置
rs.add(hostportstr) #添加新的节点 
rs.addArb(hostportstr) #添加仲裁节点
rs.remove(hostportstr) #删除节点
rs.slaveOk() #允许副本节点只读,默认副本节点不允许读写
rs.isMaster() #查看哪个节点为主节点
rs.printReplicationInfo() #查看oplog大小以及oplog可用时间,可以判断系统繁忙程度
rs.printSlaveReplicationInfo() #查看复制集成员以及延迟
rs.stepDown([stepdownSecs, catchUpSecs]) #手动主从切换
rs.freeze(secs) #冻结当前节点在指定的时间内(秒)不能选举为主
rs.syncFrom(hostportstr) #管理员临时覆盖当前成员的默认同步目标。以[hostname]:[port]的形式指定要复制的成员的名称。

二、副本集成员

  复制集成员最多50个。参与Primary选举投票的成员最多7个,其他成员的votes属性必须设置为0,即不参与投票。一般而言,副本集节点有3中类型,主节点(Primary)、副本节点(Secondary)、仲裁节点(Arbiter)。
_

2.1 主节点

  和其他数据库上的主节点一样,可以提供读写服务。

2.2 副本节点

  副本节点也基本上和其他类型数据库的从节点一样,可以实现备份和读写分离的作用。MongoDB的副本节点可以设置以下几个属性:

2.2.1 优先级为0的节点

  优先级为0的节点的特点:

  • 不会升级为主节点;但是可以投票。
  • 此节点正常参与主节点产生的oplog的读取,进行数据备份和命令执行。
  • 此节点可正常参与客户端对于数据的读取,进行担当负载均衡的工作。

  Priority=0在mongoDB中的解释就是一个Standby,可投票不可参选,并且承担负载。对于Priority为0节点的情况,通常作为一个standby,或由于硬件配置较差,设置为0以使用不可能成为主。
_

2.2.2 隐藏节点

  这个隐藏节点是对客户端的隐藏,客户端如果要读取副本节点的数据,永远无法读取隐藏节点的数据,因为设置了隐藏的这个节点对于客户端是透明的,不可见。但是,对于副本节点和主节点来说都是可见的,所以,隐藏节点依然可以投票,依然要按照oplog进行命令的复制,只是不参与负载了。
Hidden属性的前提是必须是一个Priority=0的节点,所以会具备一些优先级=0的特点。

  • 隐藏节点不能被选为主(Priority为0),并且对Driver不可见。
  • 在隐藏节点上,可做一些数据备份、离线计算的任务,不会影响复制集的服务。
  • 隐藏节点成员建议总是将其优先级设置为0。
  • 由于对Driver不可见,因此不会作为读节点,隐藏节点可以作为投票节点。
  • 在分片集群当中,mongos不会同隐藏节点交互。
    _

2.2.3 延迟节点

  延迟节点代表此节点的数据与Primary的数据有一定的延迟,通过设定一个延迟的属性来确定。

  • 此节点必须是一个Priority=0且为Hidden的节点。
  • 此节点虽然又迟延又Hidden,但是还是可以投票。延迟单位设置为秒。
    _

2.2.4 非投票节点

  MongoDB一个副本集最多有7个投票节点,如果还有其它的节点,需要设置为非投票节点。非投票节点拥有数据副本,但是不参与投票。另外,非投票节点,其priority必须设置为0。
_

2.3 仲裁节点

  没有数据副本,不会成为主节点,主要用来选举投票。当副本集的节点数据为偶数时,需要添加一个仲裁节点。仲裁节点因为没有数据,只参与投票,所以仲裁节点需要的资源很小,但是不建议将仲裁节点部署在副本集的其他节点上。

三、副本集选举机制

  复制集通过rs.initiate()命令进行初始化。初始化后各个成员间开始发送心跳消息,并发起主节点选举操作,获得大多数成员投票支持的节点,会成为主节点,其余节点成为副本节点。
  当复制集内投票成员数量为N,则大多数为(N/2)+1,当复制集内存活成员数量不足大多数时,整个复制集将无法选举出主节点,复制集将无法提供写服务,处于只读状态。Mongodb副本集的选举基于Bully算法,这是一种协调者竞选算法;主节点的选举受节点间心跳、优先级、最新的oplog时间等多种因素影响。
  触发选举条件:

  • 初始化一个副本集时;
  • 从库不能连接到主库(默认超过10s,可通过heartbeatTimeoutSecs参数控制),由从库发起选举;
  • 主库放弃primary角色,比如执行rs.stepDown(30)命令;

四、副本集同步机制

  副本集中数据同步过程:主节点写入数据,副本节点通过读取主节点的oplog得到复制信息,开始复制数据并且将复制信息写入到自己的oplog。如果某个操作失败,则备份节点停止从当前数据源复制数据。如果某个备份节点由于某些原因挂掉了,当重新启动后,就会自动从oplog的最后一个操作开始同步,同步完成后,将信息写入自己的oplog,由于复制操作是先复制数据,复制完成后再写入oplog,有可能相同的操作会同步两份,不过MongoDB在设计之初就考虑到这个问题,将oplog的同一个操作执行多次,与执行一次的效果是一样的。简单的说就是:当主节点完成数据操作后,副本节点会做出一系列的动作保证数据的同步:

  • 检查自己local库的oplog.rs集合找出最近的时间戳。
  • 检查主节点local库oplog.rs集合,找出大于此时间戳的记录。
  • 将找到的记录插入到自己的oplog.rs集合中,并执行这些操作。

  副本集的同步和主从同步一样,都是异步同步的过程,不同的是副本集有个自动故障转移的功能。其原理是:slave端从primary端获取日志,然后在自己身上完全顺序的执行日志所记录的各种操作(该日志是不记录查询操作的),这个日志就是local数据 库中的oplog.rs表,默认在64位机器上这个表是比较大的,占磁盘大小的5%,oplog.rs的大小可以在启动参数中设定:--oplogSize 1000,单位是M。
PS:在副本集的环境中,要是所有的Secondary节点都宕机了,只剩下Primary节点。最后Primary节点会变成Secondary节点,不能提供服务。

五、总结

  本文详细介绍了MongoDB副本集的基本概念、特性,副本集成员以及选举、同步特性。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
mongodb3.0副本集搭建补充~~非admin数据库的用户权限
之前有搭建mongodb3.0的副本集,不过当时直接使用的admin数据库,用户也是直接给的root。 链接:http://blog.csdn.net/tuzongxun/article/details/51723259 最近想要把数据移到非admin数据库上,便重新以非admin库创建用户,过程大致和之前的一样,但创建用户的时候还是遇到了一些问题,主要是在用户角色和权限上。 我搭建过程中
1922 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4241 0
mongodb集群方式-分片+副本集方式
分片就是水平的扩展,将数据分拆到不同的机器上,以达到存储更多的数据,处理更大的负载。可以选定将按照指定的文档键值进行分片。 配置 整体部署方案: 启动三个分片服务,两个做数据存储,另一个作为config, 配置分片的副本集,创建管理员用户,关闭mongod,打开keyfile,启动mongos,配置分片服务。
1038 0
MongoDB副本集同步原理
MongoDB的同步原理,官方文档介绍的比较少,网上资料也不是太多,下面是结合官方文档、网上资料和测试时候的日志,整理出来的一点东西。
1940 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10758 0
搭建mongodb集群(副本集+分片)
搭建mongodb集群(副本集+分片) 转载自:http://blog.csdn.net/bluejoe2000/article/details/41323051 完整的搭建mongodb集群(副本集+分片)的例子。
1019 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,云吞铺子总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系统盘、创建快照、配置安全组等操作如何登录ECS云服务器控制台? 1、先登录到阿里云ECS服务器控制台 2、点击顶部的“控制台” 3、通过左侧栏,切换到“云服务器ECS”即可,如下图所示 通过ECS控制台的远程连接来登录到云服务器 阿里云ECS云服务器自带远程连接功能,使用该功能可以登录到云服务器,简单且方便,如下图:点击“远程连接”,第一次连接会自动生成6位数字密码,输入密码即可登录到云服务器上。
16579 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
3096 0
+关注
梓杰
DBA
36
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载