Mongo多副本连接串之读写分离

MongoDB副本集实例通过多个数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用。需要注意的是,您需要使用正确的方法连接副本集实例来保障高可用,您也可以通过设置来实现读写分离。

使用前须知

  • 副本集实例的Primary节点不是固定的。当遇到副本集轮转升级、Primary节点宕机、网络分区等场景时可能会触发主备切换,副本集可能会选举一个新的Primary节点,原先的Primary节点会降级为Secondary节点。
  • 若使用Primary节点的地址直接连接Primary节点,所有的读写操作均在Primary节点完成,造成该节点压力较大,且一旦副本集发生主备切换,您连接的Primary会降级为Secondary,您将无法继续执行写操作,将严重影响到您的业务使用。

Connection String连接说明

要正确连接副本集实例,您需要先了解下MongoDB的Connection String URI,所有官方的driver都支持以Connection String的方式来连接MongoDB。

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

参数说明:

  • mongodb:// :前缀,代表这是一个Connection String。
  • username:password@:登录数据库的用户和密码信息,如果启用了鉴权,需要指定密码。
  • hostX:portX:副本集成员的IP地址:端口信息,多个成员以英文逗号(“,”)分割。
  • /database:要访问的数据库名称,默认为admin。
  • ?options:指定额外的连接选项。常见的额外选项为authSource=<authenticationDatabase>,该参数用于指定数据库账号所属的数据库。<authenticationDatabase>为鉴权数据库名称。数据库账号必须在所属的数据库下进行鉴权,才能鉴权成功。如果不配置该参数,<database>会作为鉴权数据库。

说明

关于Connection String的更多信息,请参见Connection String URI

副本集实例Connection String URI连接示例

MongoDB提供了Connection String URI连接方式。

应用程序设置使用Connection String URI来连接实例,要实现读写分离,需要在Connection String URI的options里添加readPreference=secondaryPreferred,设置读请求为Secondary节点优先。示例:数据库账号为test,所属数据库为admin。 mongodb://test:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-6108****&readPreference=secondaryPreferred

    通过上述Connection String来连接MongoDB副本集实例,读请求将优先发给Secondary节点实现读写分离。同时客户端会自动检测节点的主备关系,当主备关系发生变化时,自动将写操作切换到新的Primary节点上,以保证服务的高可用。

    复制集的读写设置

    • Read Preference默认情况下,复制集的所有读请求都发到Primary,Driver可通过设置Read Preference来将读请求路由到其他的节点。
      • primary:默认规则,所有读请求发到Primary。
      • primaryPreferred:Primary优先,如果Primary不可达,请求Secondary。
      • secondary:所有的读请求都发到Secondary。
      • secondaryPreferred:Secondary优先,当所有Secondary不可达时,请求Primary。
      • nearest:读请求发送到最近的可达节点上(通过ping探测得出最近的节点)。
    • Write Concern默认情况下,Primary完成写操作即返回,Driver可通过配置Write Concern来设置写成功的规则,详情请参见Write Concern。如下的write concern规则设置写必须在大多数节点上成功,超时时间为5秒。  db.products.insert( { item: "envelopes", qty : 100, type: "Clasp" }, { writeConcern: { w: "majority", wtimeout: 5000 } } )
    • 上面的设置方式是针对单个请求的,也可以修改副本集默认的write concern,这样就不用单独设置每个请求。  cfg = rs.conf() cfg.settings = {} cfg.settings.getLastErrorDefaults = { w: "majority", wtimeout: 5000 } rs.reconfig(cfg)
    暂无评论

    发送评论 编辑评论

    
    				
    |´・ω・)ノ
    ヾ(≧∇≦*)ゝ
    (☆ω☆)
    (╯‵□′)╯︵┴─┴
     ̄﹃ ̄
    (/ω\)
    ∠( ᐛ 」∠)_
    (๑•̀ㅁ•́ฅ)
    →_→
    ୧(๑•̀⌄•́๑)૭
    ٩(ˊᗜˋ*)و
    (ノ°ο°)ノ
    (´இ皿இ`)
    ⌇●﹏●⌇
    (ฅ´ω`ฅ)
    (╯°A°)╯︵○○○
    φ( ̄∇ ̄o)
    ヾ(´・ ・`。)ノ"
    ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
    (ó﹏ò。)
    Σ(っ °Д °;)っ
    ( ,,´・ω・)ノ"(´っω・`。)
    ╮(╯▽╰)╭
    o(*////▽////*)q
    >﹏<
    ( ๑´•ω•) "(ㆆᴗㆆ)
    😂
    😀
    😅
    😊
    🙂
    🙃
    😌
    😍
    😘
    😜
    😝
    😏
    😒
    🙄
    😳
    😡
    😔
    😫
    😱
    😭
    💩
    👻
    🙌
    🖕
    👍
    👫
    👬
    👭
    🌚
    🌝
    🙈
    💊
    😶
    🙏
    🍦
    🍉
    😣
    Source: github.com/k4yt3x/flowerhd
    颜文字
    Emoji
    小恐龙
    花!
    上一篇
    下一篇