复制集
关键概念
- 客户端在单台服务器上可以执行的请求,都可以发送到主节点执行。
- 客户端不能在备份节点执行写操作。
- 默认情况下,客户端不能从备份节点读取数据。需要执行显式执行setSlaveOk.
初始化同步的两种方式
- 以空数据目录启动slave服务器
- 复制master数据目录到slave,然后启动slave服务器。(需要master停机操作)
将包含数据的单机服务器扩展为复制集(需要停机操作)
假设单机服务器的host为host1,另外两台分别为host2,host3
选举机制
当一个备份节点无法与主节点连通时,他就会联系并请求其它的副本集成员将自己选举为主节点。其它成员会做几项检查:
- 自身是否能够与主节点连通?
- 希望被选举为主节点的备份节点的数据是否最新?
- 有没有其它更高优先级的成员可以被选举为主节点?
注意:
- 必须使用mongo shell来配置副本集,没有其它方法可以基于文件对副本集进行配置。
- 只有达到大多数的情况下才能选举或维持主节点,这样是为了避免出现多个主节点。
- 尽可能在副本集中使用奇数个数据成员,而不要使用仲裁者。
- 优先级为0的成员永远不能够成为主节点,这样的成员被称为被动成员(passive member).
- 隐藏成员{hidden: true}. 客户端不向隐藏成员发送请求。
- 延迟备份节点{slaveDelay: num},以秒为单位。要求成员的优先级为0. 应该隐藏延迟备份节点,以免读请求被路由到这里。
- {buildIndexes: false}, 不创建索引。这是一个永久选项,成员永远无法恢复为可以创建索引的正常成员。也要求成员的优先级为0.
- 修改配置防止复制链的产生,在PRIMARY库的shell中执行以下代码
相关命令使用
其它小知识
可以通过以下方式解决:
具体原理,可以参考mongo-doc