副本集实例如何实现读写分离和高可用

云数据库 MongoDB 版副本集实例支持高可用以及读写分离,但您必须使用正确的方法连接实例来保障高可用,并设置相关配置实现读写分离。

背景信息

MongoDB副本集实例的主节点(Primary节点)不是固定的某个节点,当出现异常时,系统会触发主备切换,原来的主节点会降为从节点(Secondary节点)。

当您使用主节点的直连地址连接数据库时,所有读写操作都会在主节点完成,从而导致该节点压力大,且一旦发生主备切换,您连接的主节点会变为从节点,此时通过该地址连接的客户端将无法执行写操作,这会严重影响到您的业务正常运行。

高可用

云数据库 MongoDB 版提供了ConnectionStringURI高可用地址,该地址包含实例所有节点的地址,发生主备切换后,写请求将会被路由到新的主节点上,不会出现无法执行写操作的情况。

更多关于MongoDB副本集实例连接地址的说明,请参见副本集实例连接说明

说明
  • 为实现高可用,建议您生产环境的应用程序都通过ConnectionStringURI地址连接实例。

  • 目前所有官方Driver都支持通过ConnectionStringURI地址连接MongoDB。

获取高可用地址

  1. 访问MongoDB副本集实例列表,在上方选择资源组和地域,然后单击目标实例ID。

  2. 在目标实例页面的左侧导航栏,单击数据库连接

  3. 获取ConnectionStringURI高可用地址。高可用地址

    使用ConnectionStringURI地址连接实例后,客户端会自动检测节点的主备关系,当主备关系发生变化时,自动将写操作切换到新的Primary节点上,以保证服务的高可用。

读写分离

ConnectionStringURI高可用地址提供了readPreferencereadPreferenceTags参数,readPreference参数可实现读写分离和负载均衡;readPreferenceTags可以将读请求优先发送到标签对应的节点。

灵活使用readPreferencereadPreferenceTags参数,通过不同标签的组合,可以满足您不同场景的需求。

读请求失败的处理方法

读请求发送的节点

参数组合方案

读请求失败情况下,读请求发送到主节点

优先读主节点

&readPreference=primaryPreferred

优先读从节点和只读节点

&readPreference=secondaryPreferred

优先读从节点(仅支持云盘版实例)

&readPreference=secondaryPreferred&readPreferenceTags=role:electable

优先读只读节点

&readPreference=secondaryPreferred&readPreferenceTags=role:readonly

读请求失败情况下,读请求不发送到主节点

仅读从节点和只读节点

&readPreference=secondary

仅读从节点(仅支持云盘版实例)

&readPreference=secondary&readPreferenceTags=role:electable

仅读只读节点

&readPreference=secondary&readPreferenceTags=role:readonly

高可用地址实现读写分离

如果您希望实现读写分离,且有明确的需求场景,在ConnectionStringURI地址后添加readPreferencereadPreferenceTags参数即可实现读写分离。

例如,您希望所有写请求发送到主节点,读请求仅发送到只读节点,且读请求失败情况下,读请求不发送到主节点,仅需在ConnectionStringURI地址后添加&readPreference=secondary&readPreferenceTags=role:readonly。示例如下:

mongodb://root:****@dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717,dds-bp19f409d7512****.mongodb.rds.aliyuncs.com:3717/admin?replicaSet=mgset-6108****&readPreference=secondary&readPreferenceTags=role:readonly
说明

测试环境使用的驱动版本如下:

  • pymongo 3.11.4

  • mongodb-driver-sync 4.6.1 

  • mongosh 2.2.15

相关文档