4.MongoDB的readPreference模式

在读取数据的过程中我们需要关注以下两个问题:

  • 从哪里读?关注数据节点位置
  • 什么样的数据可以读?关注数据的隔离性

第一个问题则是有readPreference来解决

第二个问题则是由readConcern来解决

readPreference?

readPreference决定使用那一个节点来满足正在发起的读请求,可选值包括:

  • primary:只选择主节点;(默认值)
  • primaryPreferred:优先选择主节点,如果不可用则选择从节点
  • secondary:只选择从节点
  • secondaryPreferred:优先选择从节点,如果从节点不可用则选择主节点
  • nearest:选择最近的节点

readPreference使用场景如下:

这里主要是以一个电商为例:

readPreference与tag

  当复制集中有个多个secondary时,为了更加精准地控制读操作执行某个节点,可以利用tags属性给复制集节点设置标签,然后在应用程序的代码中通过连接字符串传入相应的参数,可以通过如下命令给节点设置标签,如下:

conf = rs.conf()
conf.members[1].tags = {"city" : "GZ" }
rs.reconfig(conf)   ## 配置完了之后要使用该命令进行更新配置文件

如何配置readPreference

   1.通过Mongodb的连接串参数: 

  mongodb://host1:27107,host2:27107,host3:27107/?replicaSet=rs&readPreference=secondary

  2.通过MongoDB驱动程序API:  

  MongoCollection.withReadPreference(ReadPreference readPref)

  3.Mongo shell

  db.collection.find({}).readPref( "secondary" )

readPreference实验:从节点读

  • 主节点写入{x:1},观察该条数据在各个节点均可见
  • 在两个从节点分别执行 db.fsyncLock() 来锁定写入(同步)
  • 主节点写入 { x:2 }
    • db.test.find({a:123})
    • db.test.find({a:123}).readPref("secondary") ##这里在我的实验中好像并不行,很奇怪。。。
  • 解除从节点锁定 db.fsynUnlock()
    • db.test.find({a:123}).readPref("secondary")

    

posted on 2022-04-25 20:43  太白金星有点烦  阅读(1198)  评论(0)    收藏  举报

导航