准备工作
偷我大哥@mike.wang两篇博客
读取首选项
了解了读取首选项之后,问题就来了,我既想读写分离,又要数据一致怎么办。
等待写入复制
| 配置 | 描述 | 是否能保证读写分离时数据一致 |
|---|---|---|
| w=0 | 写完后就不管了 | 否 |
| w=1 | 默认值,等待主节点确认成功 | 否 |
| w=n | 一直等待直到主节点和n-1个从节点确认成功 | 是,但是每新增一个节点就要改一次配置,不可取 |
| w=majority | 一直等待直到大多数数据节点确认成功 | 否 |
| w={tag set} | 一直等待直到tag set里的所有数据节点确认成功 | 是(配置灵活且新增配置不用改配置文件,推荐) |
一定,千万,绝对不要忘了wtimeout
牺牲了写入速度,但问题好像确实解决了,但是这样真的好吗?当数据一致性要求较高的时候,适合做读写分离吗?我也不知道,之后再说。
个人觉得当数据一致性要求较高的时候,如果从节点不是很多,对读取性能提升不是很大,那还是不要做了
php mongo配置
关于php mongo配置的介绍
还有优化参考,下面是我copy的一部分觉得有必要看一下的
减少is_master_interval值
对于对可用性要求高的应用程序来说,建议检查默认的驱动程序运行时的配置设置。
mongo.is_master_interval选项控制着在复制集重新选举时驱动如何快速恢复。
is_master_interval选项默认值为15s,设置驱动发送“isMaster”请求每个mongod实例的时间间隔。这些请求帮助驱动程序判断复制集的拓扑结构,具体的来说,就是请求检测哪个节点是primary并可以接收写操作。
建议将该值设置为1或2秒,以让驱动程序在集群选举或故障转移时,能够迅速的定位到primary节点。当然啦,这也取决于有多少客户端以及ping的频率。
注意,当primary节点发生变化时,如选举或故障转移,总是会有几秒钟驱动程序会收到一个“MongoConnectionException” 信息 “No candidate servers found”。这些异常需要在你的代码中进行处理.
default_socket_timeout
PHP驱动程序不显示的定义一个默认的连接超时。相反,默认值由php.ini文件中的default_socket_timeout选项决定,默认是60秒。连接将等待60秒断开,时间有些长,需要降低些。
还有一个mongo集群管理图形化工具umongo