zoukankan      html  css  js  c++  java
  • MongoDB 复制集

    关于读写分离

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

    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 如何实现读写分离
  • 相关阅读:
    XML 增、删、改和查示例
    DataGrid 完全攻略之三(实现删除全选或者全不选)
    DataGrid 完全攻略之七(实现选择、编辑和修改)
    ASP.NET 2.0,无刷新页面新境界
    DataGrid 完全攻略之二(把数据导出到Excel)
    ASP.NET 2.0角色及成员管理
    动态改变页面的CSS样式
    ASP.NET 2.0新控件、管理外观、布局及其它用户体验
    页面一postback,它就显示页面的最顶端,怎样让它定位在某一位置?
    20100120 ~ 20100220 小结与本月计划
  • 原文地址:https://www.cnblogs.com/jay54520/p/8428678.html
Copyright © 2011-2022 走看看