跨双数据中心搭建MongoDB集群时如何配置新加坡服务器的读写规则
跨AWS区域MongoDB集群读写分离配置方案
1. 先完成副本集基础配置
首先确保你已经搭建好跨区域的MongoDB副本集,主节点部署在AWS中国区,新加坡区节点设置为只读从节点,避免被选举为主,同时增加区域标签方便路由:
- 在主节点的Mongo shell中执行如下命令添加新加坡从节点:
rs.add({ host: "<新加坡节点内网域名/IP>:27017", priority: 0, // 优先级设为0,禁止被选举为主节点 votes: 0, // 跨区延迟高的场景建议设为0,避免影响主节点选举 tags: {"region": "sg"} // 增加区域标签,用于读请求路由匹配 }) - 执行
rs.conf()确认配置已生效,新加坡节点的参数和标签和上述配置一致。
2. 新加坡区域应用端核心配置
这一步是实现本地读、跨区写的核心,所有配置都在新加坡区的应用服务的MongoDB驱动侧完成:
- 写请求配置:无需特殊修改,只要你使用副本集连接串而非直连主节点IP,MongoDB驱动默认会将所有写请求自动路由到当前主节点(也就是AWS中国区的节点)。可根据业务对数据一致性的要求配置
writeConcern,比如要求主节点确认就返回设为w:1,要求多数节点确认设为w:majority。 - 读请求配置:通过配置读偏好+标签路由,强制读请求走新加坡本地节点:
- 读偏好(readPreference)选
secondaryPreferred(新加坡节点故障时自动 fallback 到主节点读,可用性更高)或者secondary(只允许读从节点,节点故障时报错,数据一致性更高) - 配置读偏好标签(readPreferenceTags)为
[{"region": "sg"}],驱动会自动将读请求路由到带有region:sg标签的从节点,也就是新加坡本地的节点,不会访问其他区域的节点。
以下是Python pymongo驱动的配置示例,其他语言驱动逻辑一致:
from pymongo import MongoClient, ReadPreference client = MongoClient( "mongodb://<中国主节点IP>:27017,<新加坡从节点IP>:27017/?replicaSet=<你的副本集名称>", read_preference=ReadPreference.SECONDARY_PREFERRED, read_preference_tags=[{"region": "sg"}] ) - 读偏好(readPreference)选
3. 网络优化配置
为了避免跨区网络波动影响服务稳定性,建议做以下网络配置:
- AWS中国区和新加坡区之间走专线或者AWS Global Accelerator互联,不要走公网传输同步流量和写请求流量,降低延迟和丢包率
- 新加坡区MongoDB节点的安全组仅放行本地VPC内应用服务器的27017端口访问权限,中国区主节点安全组放行新加坡区服务器的专线/公网IP的27017端口访问权限
- 用AWS Route53私有解析或者本地hosts配置,将新加坡MongoDB节点的域名解析到本地内网IP,避免读请求走公网绕路
4. 配置验证
配置完成后可以通过以下方式确认路由逻辑正常:
- 开启应用端MongoDB驱动的debug日志,分别发送读、写请求,确认读请求的目标IP是新加坡本地节点,写请求的目标IP是中国区主节点
- 登录新加坡从节点执行
db.currentOp(),可以看到来自本地应用服务器的读请求记录 - 登录中国区主节点执行
db.currentOp(),可以看到来自新加坡应用服务器的写请求记录
内容的提问来源于stack exchange,提问作者angelokh
相关产品推荐
相关产品推荐

