数据库 关于 MongoDB 的 Replicate Set 一些问题

iamroody · 2013年06月08日 · 最后由 ashchan 回复于 2013年06月09日 · 4018 次阅读

目前在三台 server 上搭建了最简单的 primary/secondary/arbiter 的 Replica Set, 使用 mongoid 作为 orm,mongoid 提供了 consistency 配置,来供用户指定读操作是由 primary 还是 secondary 来处理。

问题是,你们一般设置读操作由谁来做?如果 secondary 的话,那么这种读写间隔咋处理?

如果担心 lag 的话,可以把读设成 :nearest。(不过我不确定 mongoid 和 mongo-ruby-driver 是否已经支持该选项)。

#1 楼 @ashchan 目前在 monogid 里面只能设置由 primary 和 secondary 读写,在 moped 中支持 mongodb 的那些 read preference,但是我还不知道咋用。 就算设置成:nearest, 官方文档上依然提到了说,会读取到 stale 数据。

#2 楼 @iamroody

就算设置成:nearest, 官方文档上依然提到了说,会读取到 stale 数据。

这个是自然,只要是复制的都存在这个问题。不过一般 Replica Set 之间同步很快,不大会出现这种情况。实在担心的话不如就设成只从 primary 读。

你三台服务器分别是 primary/secondary/arbiter,设置从 secondary 其实是有风险的。如果 primary 宕机了,secondary 会升为 primary,这时因为应用设成了从 secondary 读而读不到会直接报错。

#3 楼 @ashchan 恩,暂时已经调整为从 primary 读了,尽管 primary 当机的时候,会有一段时间没有 primary 而报错,但这个时间间隔在我的接受范围之内了。 谢谢了,发现用 mongodb 的人不多啊~

#3 楼 @ashchan
还需要请教一个问题,如何设置这三台机器的 mongodb 开机自动启动呢?在 ubuntu 下,安装好 mongodb 之后,会有 upstart 脚本在,但是像这样情况,我会有些自定义的路径,甚至 mongodb.conf 也在其他路径下。是否需要我把 mongodb 自带的启动脚本去掉,然后自己写一个呢?

#5 楼 @iamroody Ubuntu 下安装的 mongodb 直接用 service 管理便可,开机会自动启动。不建议你去掉它,只要修改 mongodb.conf 就可以了(默认在 /etc/mongodb.conf )。个人认为完全没必要把它放其他目录呀?

如果三个服务器,一个宕机,另外两个能投票出 primary 吗?以前遇到过宕机后起不来的情况。

#7 楼 @zhangyuan 当然可以投票出 primary,只要能获得 majority 的投票就可以。遇到宕机情况,一定要查看日志才能知道是什么原因,要不然总是不明不白。

#7 楼 @zhangyuan 只要剩下两台都设置了 priority、数据都是同步的且互相能连上对方,就可以选出一个新的 primary 来。(2/3 超过了半票数)

需要 登录 后方可回复, 如果你还没有账号请 注册新账号