复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离

复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离复制集让mongodb的secondary支持读操作,因为存在读写延迟所以是否需要读写分离

大家好,又见面了,我是你们的朋友全栈君。

1,让mongodb的secondary支持读操作

对于replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。

如果通过shell访问mongo,要在secondary进行查询。会出现如下错误:

imageSet:SECONDARY> db.fs.files.find()

error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }

有两种方法实现从机的查询:

第一种方法:db.getMongo().setSlaveOk();

第二种方法:rs.slaveOk();

但是这种方式有一个缺点就是,下次再通过mongo进入实例的时候,查询仍然会报错,为此可以通过下列方式

vi ~/.mongorc.js

增加一行rs.slaveOk();

这样的话以后每次通过mongo命令进入都可以查询了

 

如果是通过java访问secondary的话则会报下面的异常

com.mongodb.MongoException: not talking to master and retries used up
解决的办法很多。
第一种方法:在java代码中调用dbFactory.getDb().slaveOk();
第二种方法:在java代码中调用
dbFactory.getDb().setReadPreference(ReadPreference.secondaryPreferred());//在复制集中优先读secondary,如果secondary访问不了的时候就从master中读

dbFactory.getDb().setReadPreference(ReadPreference.secondary());//只从secondary中读,如果secondary访问不了的时候就不能进行查询
第三种方法:在配置mongo的时候增加slave-ok=”true”也支持直接从secondary中读
<mongo:mongo id=”mongo” host=”${mongodb.host}” port=”${mongodb.port}”>
        <mongo:options slave-ok=”true”/> 
</mongo:mongo>

2,读写延迟

因为主节点写入后,需要复制到从节点,这个过程也是需要时间的,如果存在入库后有立刻需要查询的操作,很有可能因为延迟时间导致查到的是“旧”的数据,或查不到,这也是很严重的问题。具体的延迟时间因为业务、环境的因素不好确定,但一般也需要百十毫秒。

这里有个网友的总结:

读写分离

官网中建议不使用向从节点取数据。原因:

1、  所有的从节点拥有与主节点一样的写入负载,读的加入会增加其负载

2、  对于分片的集合,在平衡器的关系下,数据的返回结果可能会缺失或者重复某部分数据。

3、  相对而言,官方建议使用shard来分散读写请求。

使用的场景;

1、  异地的分布式部署

2、  故障切换,在紧急情况下向从节点读数据

总结:副本集不是为了提高读性能存在的,在进行oplog的时候,读操作时被阻塞的。提高读取性能应该使用分片和索引,它的存在更多是作为数据冗余,备份。尤其当主库本来就面临着大量的写入压力,对于副本集的节点,也同样会面临写的压力。

 

–本篇参考:http://wengzhijuan12.blog.163.com/blog/static/3622414520137104257376/

https://blog.csdn.net/tang_jin2015/article/details/70225143

谢谢

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/105980.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月24日 上午9:00
下一篇 2022年4月24日 上午9:00


相关推荐

  • 这 3 个爆火 AI 开源项目,Star 全过 6 万!

    这 3 个爆火 AI 开源项目,Star 全过 6 万!

    2026年3月13日
    2
  • 查看文件内容linux命令_shell读取文件夹下所有文件

    查看文件内容linux命令_shell读取文件夹下所有文件查看文件内容总览cat由第一行开始显示文件内容tac从最后一行开始显示,可以看出tac是cat的倒着写!nl显示的时候,顺道输出行号!more一页一页的显示文件内容less

    2022年8月6日
    9
  • 使用pycharm创建Django项目[通俗易懂]

    使用pycharm创建Django项目[通俗易懂]创建项目1.使用命令行创建项目如果这是你第一次使用Django的话,你需要一些初始化设置。也就是说,你需要用一些自动生成的代码配置一个Djangoproject——即一个Django项目实例需要的设置项集合,包括数据库配置、Django配置和应用程序配置。打开命令行,cd到一个你想放置你代码的目录,然后运行以下命令:django-adminstartprojectmysite#mysite是项目名这行代码将会在当前目录下创建一个mysite目录。如果命令失

    2022年8月25日
    8
  • BIND9配置文件详解

    BIND9配置文件详解参考 ISCBIND9 最详细 最认真的从零开始的 BIND9 DNS 服务搭建及其原理讲解一 conf 文件中字段详解 1 acl 一般来说 ACL 模块用来承担控制主机可以访问域名解析服务器的角色 其设置不会让控制文件的配置非常冗余和庞大 采用这个配置可以有效防范 DOS 以及 Spoofing 攻击 一般来说定义这部分的内容来规定 IP 是否能够被接入以及 Blacklist 来阻止某些特定的 IP 地址介入到域名解析服务器中 ACL 匹配客户端是否能够接入到域名服务器基于三个基本的特征 客户端的 IPv4

    2026年3月26日
    2
  • 翻译软件市场分析_it软件开发 2019年小结

    翻译软件市场分析_it软件开发 2019年小结「译」软件开发趋势 2019 调查报告

    2022年4月22日
    58
  • 用App Designer 制作2048小游戏

    用App Designer 制作2048小游戏用 AppDesigner 制作 2048 小游戏用 AppDesigner 制作的 2048 MATLAB 版本是 2020b 记录下创作思路 以免日后忘记 APP 界面设计 APP 界面如下 为了好玩 还加入了游戏进行时播放音乐的功能 下面是游戏结束界面 除了按钮和开关部分 其余都可用标签控件制作 游戏结束界面在制作时将其 Visible 属性设为 Off 确保在主界面上层 当判定游戏结束时再将 Visible 属性修改为 On 即可 app gameOverLabe Visible

    2025年10月29日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号