云数据库 MongoDB 版副本集实例支持高可用以及读写分离,但您必须使用正确的方法连接实例来保障高可用,并设置相关配置实现读写分离。
背景信息
MongoDB副本集实例的主节点(Primary节点)不是固定的某个节点,当出现异常时,系统会触发主备切换,原来的主节点会降为从节点(Secondary节点)。
当您使用主节点的直连地址连接数据库时,所有读写操作都会在主节点完成,从而导致该节点压力大,且一旦发生主备切换,您连接的主节点会变为从节点,此时通过该地址连接的客户端将无法执行写操作,这会严重影响到您的业务正常运行。
高可用
云数据库 MongoDB 版提供了ConnectionStringURI高可用地址,该地址包含实例所有节点的地址,发生主备切换后,写请求将会被路由到新的主节点上,不会出现无法执行写操作的情况。
更多关于MongoDB副本集实例连接地址的说明,请参见副本集实例连接说明。
为实现高可用,建议您生产环境的应用程序都通过ConnectionStringURI地址连接实例。
目前所有官方Driver都支持通过ConnectionStringURI地址连接MongoDB。
获取高可用地址
访问MongoDB副本集实例列表,在上方选择资源组和地域,然后单击目标实例ID。
在目标实例页面的左侧导航栏,单击数据库连接。
获取ConnectionStringURI高可用地址。
使用ConnectionStringURI地址连接实例后,客户端会自动检测节点的主备关系,当主备关系发生变化时,自动将写操作切换到新的Primary节点上,以保证服务的高可用。
读写分离
ConnectionStringURI高可用地址提供了readPreference
和readPreferenceTags
参数,readPreference
参数可实现读写分离和负载均衡;readPreferenceTags
可以将读请求优先发送到标签对应的节点。
灵活使用readPreference
和readPreferenceTags
参数,通过不同标签的组合,可以满足您不同场景的需求。
读请求失败的处理方法 | 读请求发送的节点 | 参数组合方案 |
读请求失败情况下,读请求发送到主节点 | 优先读主节点 |
|
优先读从节点和只读节点 |
| |
优先读从节点(仅支持云盘版实例) |
| |
优先读只读节点 |
| |
读请求失败情况下,读请求不发送到主节点 | 仅读从节点和只读节点 |
|
仅读从节点(仅支持云盘版实例) |
| |
仅读只读节点 |
|
高可用地址实现读写分离
如果您希望实现读写分离,且有明确的需求场景,在ConnectionStringURI地址后添加readPreference
和readPreferenceTags
参数即可实现读写分离。
例如,您希望所有写请求发送到主节点,读请求仅发送到只读节点,且读请求失败情况下,读请求不发送到主节点,仅需在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