码迷,mamicode.com
首页 > 数据库 > 详细

MongoDB 复制集

时间:2018-02-08 00:20:13      阅读:265      评论:0      收藏:0      [点我收藏+]

标签:ber   err   算法   mon   back   节点   读写   llb   编程   

关于读写分离

由于写入主之后,同步到从有一个时间,所以读写分离会引发数据一致性问题。

MongoDB 通过复制集(Replica Set)来实现读写分离。

MongoDB复制集(Replica Set)

通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用。

当遇到复制集轮转升级、Primary宕机、网络分区等场景时,复制集可能会选举出一个新的Primary,而原来的Primary则会降级为Secondary,即发生主备切换。所以,MongoDB复制集里Primary节点是不固定的[1]。

复制集选举

意译自 复制集选举

选举发生在初始化复制集或者主节点不可用的时候。在选举发生的过程中(没有主节点),所有节点都是只读的。

如果对于主节点来说,大部分节点不可用或者不能被主节点连接,那么主节点会退化为从节点。由于复制集没有了主节点,所以复制集是只读的。

心跳

复制集成员每两秒发送心跳(ping)到其他成员。如果心跳在10秒内没有响应,其他成员将其标记为不可用状态。

成员优先级

在复制集有一个稳定的主节点后,选举算法会尽最大努力让最高优先级的可用从节点发起选举。成员优先级会影响选举的时间和结果;拥有高优先级的成员能比低优先级的成员更快发起选举,所以就更可能赢得选举。然而,当存在高优先级成员时,低优先级成员也可能在短期内被选举为主节点。复制集成员会持续发起选举直到最高优先级成员成为主节点。

优先级为0的成员不会发起选举,也就不会成为主节点。

网络分区

如果网络分区后,主节点发现它只能探测到少部分节点,那么它会降级为从节点。拥有大部分节点的另一边会选举出新的主节点。

否决选举

选举协议 1 排除了否决选举,所以这个只存在于选举协议 0。感兴趣的可以自己去看 https://docs.mongodb.com/manual/core/replica-set-elections/#vetoes-in-elections

选举与非选举成员

复制集成员的 members[n].votes 设置为 1,表示1张选票。通过设置 members[n].votes 为 0 来设置非选举成员。

在 3.2 之后,

  • 非选举成员的 priority 必须设置为 0
  • priority 大于 0 的成员的 votes 必须大于 0

只有以下状态的成员才有投票资格

  • PRIMARY
  • SECONDARY
  • RECOVERING
  • ARBITER
  • ROLLBACK

一个复制集最多有 50 个成员,最多有 7 个选举成员。

连接复制集

由于MongoDB复制集里Primary节点是不固定的,所以不能只连接当时的Primary节点,当时可能可以正确读写数据,但一旦复制集发生主备切换,您连接的Primary会降级为Secondary,您将无法继续执行写操作[1]。

MongoDB Connection String

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]

  • mongodb:// 前缀:代表这是一个Connection String。
  • username:password@:如果启用了鉴权,需要指定用户密码。
  • hostX:portX:复制集成员的ip:port信息,多个成员以逗号分割。
  • /database:鉴权时,用户帐号所属的数据库。
  • ?options:指定额外的连接选项。
  • 实现读写分离:在options里添加readPreference=secondaryPreferred读请求优先到Secondary节点,从而实现读写分离的功能。更多读选项请参考Read preferences。
  • 设置数据写入到大多数节点后返回客户端确认:在options里添加w= majority即可保证写请求成功写入大多数节点才向客户端确认,更多写选项参考Write Concern。

通过正确的Connection String来连接MongoDB复制集,客户端会自动检测复制集的主备关系,当主备关系发生变化时,自动将写切换到新的主上,以保证服务的高可用。

对编程的影响

无影响,与单节点的使用情况一样。

参考

  1. 阿里云-MongoDB 如何实现读写分离

MongoDB 复制集

标签:ber   err   算法   mon   back   节点   读写   llb   编程   

原文地址:https://www.cnblogs.com/jay54520/p/8428678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!