天天看点

MongoDB Driver:使用正确的姿势连接复制集

mongodb复制集(replica set)通过<code>存储多份数据副本</code>来保证数据的高可靠,通过<code>自动的主备切换机制</code>来保证服务的高可用。但需要注意的时,连接副本集的<code>姿势</code>如果不对,服务高可用将不复存在。

MongoDB Driver:使用正确的姿势连接复制集

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

总而言之,mongodb复制集里primary节点是不固定的,不固定的,不固定的,重要的事情说3遍。

当连接复制集时,如果直接指定<code>primary</code>的地址来连接,当时可能可以正确读写数据的,但一旦复制集发生主备切换,你连接的primary会降级为secondary,你将无法继续执行写操作,这将严重影响到你的线上服务。

所以生产环境千万不要直连primary,千万不要直连primary,千万不要直连primary。

说了这么多,到底该如何连接复制集?

要正确连接复制集,需要先了解下mongodb的connection string uri,所有官方的driver都支持以connection string的方式来连接mongodb。

下面就是connection string包含的主要内容

mongodb:// 前缀,代表这是一个connection string

username:password@ 如果启用了鉴权,需要指定用户密码

hostx:portx 复制集成员的ip:port信息,多个成员以逗号分割

/database 鉴权时,用户帐号所属的数据库

?options 指定额外的连接选项

以连接aliclouddb for mongodb为例,当你购买阿里云mongodb复制集时,就会得到复制集的名称、以及复制集成员的地址信息。

MongoDB Driver:使用正确的姿势连接复制集
MongoDB Driver:使用正确的姿势连接复制集

为了方便用户使用,控制台上也生成了连接复制集的connection string及通过mongo shell连接到命令。

MongoDB Driver:使用正确的姿势连接复制集

例如通过java来连接,更多的demo

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

在options里添加<code>readpreference=secondarypreferred</code>即可实现,读请求优先到secondary节点,从而实现读写分离的功能,更多<code>读选项</code>参考read preferences

在options里添加<code>maxpoolsize=xx</code>即可将客户端连接池限制在xx以内。

在options里添加<code>w= majority</code>即可保证写请求成功写入大多数节点才向客户端确认,更多<code>写选项</code>参考write concern