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   太白金星有点烦  阅读(1071)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示