目录
在MongoDB学习(一):安装&基础概念&数据类型&部分shell操作曾经提到过,MongoDB有复制集(副本集)和分片集的概念。
1 概念
复制集是主从机制的扩展与改进,例如:
- 容灾机制:主节点(Primary)down之后,自动通过选举机制提升从节点(Secondary)为新的主节点,保证集群可用性
- 一致性:事务提交需要经过50%以上节点确认方可成功,否则将回滚
- 该内容可以通过WriteConcern选项进行配置,详见MongoDB学习(二):CRUD操作、条件运算、分页操作、排序
好处有:
- 高可用、高一致性
- 防止误操作:主从节点数据同步有一定延时,通过数据冗余,可以一定程度上避免删库跑路
- 负载均衡:通过将读操作均匀分配给各节点,避免过多请求冲击导致的宕机
复制集不适用于以下场景:
- 硬件不足:例如数据量大于内存时,就必须使用硬盘上的虚拟内存进行数据交换,导致I/O下降,此时集群并不比单机快多少,最好先使用分片对数据进行分割
- 写多读少:此时主节点不但要承担大量的写操作,还需要频繁进行数据同步,反而降低了效率
- 持续读:由于从节点并不是实时同步数据的,要么读取的数据存在过期的风险,要么需要将每次写入的数据进行同步,导致较大的延时
关于选举方式等,可以参考Paxos算法。在MongoDB 3.0中,复制集最多支持50个节点。
2 配置
上面提到,复制集事务提交需要超过50%节点确认,因此推荐配置奇数个节点,最少3个(如果仅有2个节点,那么每个结点都不能down,这样的配置意义不大),这三个节点可以都存放数据(一主两从),也可以配置一个仲裁节点(一主一从)。仲裁节点的作用是,当集群由于网络问题出现了两个节点数相等的分区时,它可以强制进行选举以维持服务。
我们在本地进行模拟。
首先创建三个文件夹:
root@Ubuntu:~# mkdir ~/primary
root@Ubuntu:~# mkdir ~/secondary
root@Ubuntu:~# mkdir ~/arbiter
然后基于这三个文件夹启动mongod:
mongod --replSet test --dbpath ~/primary --port 9000
mongod --replSet test --dbpath ~/secondary --port 9001
mongod --replSet test --dbpath ~/arbiter --port 9002
然后连接主节点并初始化:
mongo --port 9000
> rs.initiate()
{
"info2" : "no configuration specified. Using a default configuration for the set",
"me" : "localhost:9000",
"ok" : 1,
"operationTime" : Timestamp(1549627807, 1),
"$clusterTime" : {
"clusterTime" : Timestamp(1549627807, 1),
"signature" : {
"hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
"keyId" : NumberLong(0)
}
}