MongoDB复制是将数据同步在多个服务器的过程,它提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性,并可以保证数据的安全性。另外,复制还可以从硬件故障和服务中断中恢复数据。
一、基础
MongoDB复制集由一组mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,客户端的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。它通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用。
- 选举Primary节点
复制集通过replSetInitiate命令(或mongo shell的rs.initiate())进行初始化,初始化后各个成员间开始发送心跳消息,并发起Priamry选举操作,获得大多数成员投票支持的节点,会成为Primary,其余节点成为Secondary。正常情况下复制集的Secondary会参与Primary选举(自身也可能会被选为Primary),并从Primary同步最新写入的数据,以保证与Primary存储相同的数据。Secondary可以提供读服务,增加Secondary节点可以提供复制集的读服务能力,同时提升复制集的可用性。
假设复制集内投票成员数量为N,则大多数为
N/2 + 1
,当复制集内存活成员数量不足大多数时,整个复制集将无法选举出Primary,复制集将无法提供写服务,处于只读状态。
- 特殊Secondary节点
- Arbiter节点:翻译过来为仲裁节点,只参与投票,不能被选为Primary,并且不从Primary同步数据。
- Priority0节点:Priority0节点的选举优先级为0,不会被选举为Primary,也不能触发选举,更改Priority
- Vote0节点:从3.0版本开始(目前截止到4.2.5),复制集成员最多50个,参与Primary选举投票的成员最多7个,其他成员即Vote0的vote属性必须设置为0,即不参与投票。
- Hidden节点:对客户端Driver不可见,且不能被选为主节点(Priority为0)。
- Delayed节点:主要用于数据恢复,其必须是Hidden节点,则Priority肯定为0,另外
members[n].votes必须设为1
从节点基本属性
1 | { |
- 常用命令
- rs.initiate()初始化复制集
- rs.status()查看复制集状态
- rs.conf()/config()查看复制集配置信息
- rs.add()增加节点
- rs.addArb()增加Arbiter节点
- rs.remove()移除节点
- db.isMaster()查看是否为主节点
- db.getReplicationInfo()查看复制集信息
- db.getMongo().setSlaveOk()设置从节点为可读
二、搭建(同一台机器不同端口实现)
- 准备工作
cd /usr/local/src
- 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.11.tgz
- 或使用
sudo wget https://fastdl.mongodb.org/osx/mongodb-osx-ssl-x86_64-4.0.11.tgz
- 或使用
- 解压
sudo tar -zxvf mongodb-osx-ssl-x86_64-4.0.11.tgz
- 可
cd
到想安装的目录再运行解压命令则省去了移动命令(重命名自己定)
- 可
- 移动并重命名
sudo mv /usr/local/src/mongodb-osx-ssl-x86_64-4.0.11 /usr/local/mongodb-4.0.11
cd mongodb-4.0.11
- 分别创建data和logs存放目录
sudo mkdir -p data/27017 data/27018 data/27019
sudo mkdir -p logs/27017 logs/27018 logs/27019
sudo touch logs/27017/mongo.log logs/27018/mongo.log logs/27019/mongo.log
sudo chmod -R 777 data
sudo chmod -R 777 logs
- 分别创建
27017.conf/27018.conf/27019.conf
,内容如下:
1 | dbpath = /usr/local/mongodb-4.0.11/data/27017 |
- 分别启动三个节点
- ./bin/mongod -f 27017.conf
- ./bin/mongod -f 27018.conf
- ./bin/mongod -f 27019.conf
通过
shell
进入任意一个节点./bin/mongo --port 27017/27018/27019
,不带--port
参数默认进入27017
切换到admin库
use admin
配置复制集节点信息
1 | config={ |
- 初始化复制集
rs.initiate(config)
,正常情况下会有以下输出:
1 | { |
- 查看复制集状态
rs.status()
1 | { |
查看复制集配置信息
rs.conf()
在主节点写入数据
1 | ./bin/mongo |
- 在从节点读取数据
1 | ./bin/mongo --port 27018 |
默认进入从节点时数据不可读,因为mongodb默认是从主节点读写数据的,需要设置副本节点可以读:
db.getMongo().setSlaveOk()
1 | db.user.find();# 正常 |
- 自动故障转移(关闭主节点27017服务)
1 | use admin; |
进入一个从节点查看复制集信息
rs.status()
重新启动27017
./bin/mongod -f 27017.conf
启动27017客户端
./bin/mongo
查看复制集状态
rs.status()