mongodb读写分离配置

833 阅读3分钟

连接串配置

官方手册

阿里云连接串配置

读写分离代码配置

添加参数1:readPreference=secondaryPreferred 添加参数2:maxStalenessSeconds=90

"mongodb://xxxx:xxxx@s-xxxx.mongodb.rds.xxxx.com:3717/xxxx?readPreference=secondaryPreferred&maxStalenessSeconds=90"
  • readPreference=secondaryPreferred,读请求,优先从备节点查询

secondary — 这个设置告诉驱动应该一直从从节点读取数据。这种设置对于我们想确保读请求不会影响主节点的写入请求时非常有用。如果没有可用的从节点,读请求会抛出异常。

  • maxStalenessSeconds=90,最小值90s,-1 为不过时

副本集的从节点可能因为网络阻塞、磁盘吞吐低、长时间执行操作等,导致其落后于主节点。读设置maxStalenessSeconds选项让你对从节点读取定义了最大落后或“过期”时间。当从节点估计过期时间超过了maxStalenessSeconds,客户端会停止使用它进行读操作。

最大过期和primary模式不匹配,只有选择从节点成员读取操作才能应用。

当选择了使用maxStalenessSeconds进行读操作的服务端,客户端会通过比较从节点和主节点的最后一次写时间来估计从节点的过期程度。客户端会把连接指向估计落后小于等于maxStalenessSeconds的从节点。如果没有主节点,客户端使用从节点间的最近一次写操作来比较。

默认是没有最大过期时间并且客户端也不会在指向读操作时考虑从节点的落后。

注意:

必须定义maxStalenessSeconds的值大于等于90秒:定义一个更小的值会抛出异常。客户端通过定期检查每个副本集成员最后一次写时间来估计副本集过期程度。因为检查不频繁,所以估计是粗略的。因此,客户端不能强制maxStalenessSecconds小于90秒。

可选:w= majority【若配置,则必须同时配置Read Preference 】

WriteConncern选项如下

w: 数据写入到number个节点才向用客户端确认

{w: 0} 对客户端的写入不需要发送任何确认,适用于性能要求高,但不关注正确性的场景

{w: 1} 默认的writeConcern,数据写入到Primary就向客户端发送确认

{w: “majority”} 数据写入到副本集大多数成员后向客户端发送确认,适用于对数据安全性要求比较高的场景,该选项会降低写入性能

j: 写入操作的journal持久化后才向客户端确认

默认为”{j: false},如果要求Primary写入持久化了才向客户端确认,则指定该选项为true

wtimeout: 写入超时时间,仅w的值大于1时有效。

当指定{w: }时,数据需要成功写入number个节点才算成功,如果写入过程中有节点故障,可能导致这个条件一直不能满足,从而一直不能向客户端发送确认结果,针对这种情况,客户端可设置wtimeout选项来指定超时时间,当写入过程持续超过该时间仍未结束,则认为写入失败。

  • 验证配置生效

    • 需要xxxx验证日志是否正常(比如授权异常)
    • 而后灰度发布一台,运维验证指标是否有流量进入备节点(正常情况下,会有明显特征【流量进入】)

适应场景

  • 读多、写少。

不适应场景

  • 高频写

    • 该场景下,主库大量insert/update,会导致mongodb TTL索引。

      • 备库TTL索引不生效、按照RecordId查找,查找删除效率低。且过期数据是一批过期情况下,记录数量大、过期时间集中,会大量消耗备节点iops/cpu。不适合读写分离。

产品与规格

mongodb性能基线

配置最大连接数IOPS存储空间
Mongos通用8C16G8000--
Shard通用8C16G8000800010 GB~2000 GB,步长为10 GB。