实现MongoDB读写分离的“读偏好”介绍

在某些情况下,将读请求发送给副本集的备份节点是合理的,例如,单个服务器无法处理应用的读压力,就可以把查询请求路由到可复制集中的多台服务器上。现在绝大部分MongoDB驱动支持读偏好设置(read preference;或翻译为读取首选项),用来告诉驱动从特定的节点读取数据。

1  读偏好选项

primary — 这是默认的设置,表明只从可复制集的主节点读取数据,因此具有强一致性。如果可复制集有问题,并且没有可选举的从节点,就表示出现错误。

premaryPreferred — 设置了此参数的驱动会从主节点读取数据,除非某些原因使主节点不可用或者没有主节点,此时它会从从节点读取数据。此种设置下,读请求无法保证一致性。

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

secondarypreferred—读请求会发出到从节点,除非没有从节点可用,此时才会从主节点读取。

nearest –驱动会尝试从最近的可复制集成员节点读取读取数据,通过网络延迟判断。可以是主节点也可以是从节点。因此读请求只会发送给驱动认为最快通信的节点。

primary是唯一一个可以确保读一致的模式。因为写请求首先在主节点完成,从服务器的更新会有些延迟,所以可能在从节点无法找到刚刚在主节点写入的文档数据。

汇总以上知识,各偏好设置下读取数据请求所发往的节点如下所示:

2  最大过期时间

MongoDB 3.4及更新的版本新增了maxStalenessSeconds设置。

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

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

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

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

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

3  连接字符串格式

副本集连接字符串格式

mongodb://username:password@host1:port1,host2:port2[,...,hostN:portN]/database?options

options是连接配置中的可选项,replicaSet、readPreference、maxStalenessSeconds是其中的一个子项。

下面我们举一个例子来说明字符串是怎么配置的,测试环境的副本集信息如下:

 

副本集名称

节点角色

节点IP

端口

Reptest

主服务器

172.171.X.XX1

27017

副本节点

172.171.X.XX2

27017

仲裁节点

172.171.X.XX3

27017

 

 

 

 

 

 

 

 

 

 

账号信息如下:

 

Username

Password

DBName

mongousertest

testuserpwd

mongotestdb

 

 

 

 

如果希望程序读请求路由到从节点secondary,100秒为节点数据失效时间,此时C#程序中connectionStr的字符串可以设置如下:

stringconnectionStr = "mongodb://mongousertest:testuserpwd@172.171.x.xx1:27017,172.171.x.xx2:27017/mongotestdb?replicaSet=reptest&readPreference=secondary&maxStalenessSeconds=100";

 

 本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!

 

转载于:https://www.cnblogs.com/xuliuzai/p/9624508.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MongoDB读写分离可以通过配置主从模式或者副本集模式来实现。在主从模式中,一个节点作为主节点接收写操作,其他节点作为从节点接收操作。而在副本集模式中,所有节点都可以接收写操作,但只有主节点可以处理写操作,其他节点则同步主节点的数据。 要配置MongoDB读写分离,首先需要将主节点和从节点的信息配置到应用程序中。可以在应用程序的配置文件中,利用资源属性(resources.properties)来配置。其中,主节点的配置包括主节点的IP地址和端口号,以及访问主节点的认证信息。从节点的配置也类似,包括从节点的IP地址和端口号,以及访问从节点的认证信息。如引用所示。 在Java中使用Jongo来配置读写分离时,需要创建一个MongoClientOptions对象,并通过其builder方法设置一些连接选项,如最小连接数、最大连接数、连接超时时间等。同时,还需要创建一个MongoClient对象,并通过其构造方法传入主节点和从节点的ServerAddress对象列表,以及认证信息。最后,可以使用Jongo来进行数据库操作。具体的示例代码如引用所示。 需要注意的是,在使用MongoDB读写分离时,应该尽量将主节点和副节点都配置上,这样可以保证在主从切换时项目能够正常运行。此外,读写分离也可以通过配置MongoClientOptions对象的readPreference方法来实现,以指定操作应该在主节点还是从节点进行。具体的配置方式可以参考官方文档。 综上所述,要实现MongoDB读写分离,可以选择配置主从模式或者副本集模式,并在应用程序中配置主节点和从节点的信息。在Java中可以使用Jongo来进行配置,并通过MongoClientOptions对象来设置连接选项。最后,可以通过Jongo来进行数据库操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值