1 数据库服务复制集概述
MongoDB复制集(replication Set)的主要意义在于实现服务高可用,它的实现依赖于两个方面的功能
- 数据写入时将数据迅速复制到另一个独立节点上
- 在接受写入的节点发生故障时自动选举出一个新的替代节点
在实现高可用的同时,复制集实现了其他几个附加功能:
- 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟
- 读写分离:不同类型的压力分别在不同的节点上执行
- 异地容灾:在数据中心故障时候快速切换到异地
一个典型的复制集由3个以上具有投票权的节点组成:(PSS PSA-建议5节点)
- 一个主节点(primary):接收写入操作和选举时投票;
- 两个或多个从节点(secondary):复制主节点上的新数据和选举时投票
- Arbiter(投票节点),建议5节点架构时应用
arbiterOnly
是 MongoDB 中复制集配置的一部分,用于指定一个节点作为 仲裁者(Arbiter),而不是数据的存储或提供数据的副本- 设置某个节点为仲裁者节点时,MongoDB 会忽略该节点的数据存储功能,只将其作为选举的一部分来参与复制集的故障转移
- 仲裁者节点不占用数据存储空间,因此在需要保证复制集多数节点数的情况下,可以使用仲裁者节点来降低资源开销
复制集节点之间的数据复制:
-
当一个修改操作发生,无论是插入、更新或删除,到达主节点时,它对数据的操作将被记录下来(经过一些必要的转换);
这些记录称为oplog
-
从节点通过在主节点上打开一个tailable游标不断获取新进入主节点的oplog,并在自己的数据库上回放,以此保证更主节点数据一致
2 配置主从复制
01 创建数据库实例
实例 | 监听端口 | 存放目录 |
---|---|---|
实例1 | 28017 | /mongodb/28017 |
实例2 | 28018 | /mongodb/28018 |
实例3 | 28019 | /mongodb/28019 |
实例4 | 28020 | /mongodb/28020 |
1.创建实例目录:
mkdir -pv /mongodb/{28017..28020}/{conf,data,log}# tree命令查看目录结构
tree -F /mongodb/
/mongodb//
├── 28017/
│ ├── conf/
│ ├── data/
│ └── log/
├── 28018/
│ ├── conf/
│ ├── data/
│ └── log/
├── 28019/
│ ├── conf/
│ ├── data/
│ └── log/
└── 28020/├── conf/├── data/└── log/
2.创建配置文件
cat > /mongodb/28017/conf/mongodb.yaml <<'EOF'
systemLog:destination: filepath: "/mongodb/28017/log/mongodb.log"logAppend: true
storage:journal:enabled: truedbPath: "/mongodb/28017/data"directoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: true
processManagement:fork: true
net:port: 28017bindIp: 10.0.0.51,127.0.0.1
replication:# 定义oplog日志存储量,实质是数据库服务的表的大小oplogSizeMB: 2048# 表示复制集的名称,要和后面创建的集群名称一致replSetName: my_repl
EOF
3.把配置文件复制到其他实例目录下,修改端口信息。编写systemd
for i in {28018..28020}; do \cp /mongodb/28017/conf/mongodb.yaml /mongodb/$i/conf; done
for i in {28018..28020}; do sed -i "s#28017#$i#g" /mongodb/$i/conf/mongodb.yaml; done
cat > /etc/systemd/system/mongod28017.service <<EOF
[Unit]
Description=MongoDB Database Server
After=network.target[Service]
User=mongodb
Group=mongodb
ExecStart=/usr/local/mongodb/bin/mongod -f /mongodb/28017/conf/mongodb.yaml
Type=forking
Restart=on-failure
LimitNOFILE=65535
TimeoutStopSec=5
PermissionsStartOnly=true
AmbientCapabilities=CAP_NET_BIND_SERVICE[Install]
WantedBy=multi-user.target
EOF
cd /etc/systemd/systemfor i in {28018..28020}; do \cp mongod28017.service mongod$i.service; done
for i in {28018..28020}; do sed -i "s#28017#$i#g" mongod$i.service; donesystemctl daemon-reload
for i in {28017..28020}; do systemctl start mongod$i; done
for i in {28017..28020}; do systemctl status mongod$i; done
02 设置主从复制
- 主从关系建立完毕后,会实现底层自动克隆过程,不用考虑备份恢复数据问题
- 对于secondary节点是默认不支持任何读和写操作的,后期可以打开节点的读功能
1.连接主库18017实例
[root@db51~]# mongo --port 28017 admin# 执行以下配置,设置复制集
config = {_id: 'my_repl',members: [{ _id: 0, host: '10.0.0.51:28017' },{ _id: 1, host: '10.0.0.51:28018' },{ _id: 2, host: '10.0.0.51:28019' }]
}# 启动复制集
> rs.initiate(config)
{ "ok" : 1 }my_repl:SECONDARY> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
2.查看复制集的状态
rs.status();
03 查看其他节点的同步状态
1.在主节点上创建一个集合
use wzy;
db.createCollection("a")
2.登录其他节点查看
04 仲裁节点
1.在主节点把28019实例改为arbiterOnly。不建议进行应用,当只有三个节点时,会有一定的风险性
config = {_id: 'my_repl',members: [{ _id: 0, host: '10.0.0.0.51:28017' },{ _id: 1, host: '10.0.0.0.51:28018' },{ _id: 2, host: '10.0.0.0.51:28019', arbiterOnly: true }]
}
2.查看集群状态
# 查看主节点状态
rs.isMaster()# 查看配置
rs.conf();
05 添加删除节点
节点停止之前先停止从节点可以避免数据不一致
# 增加/移除节点
rs.add("10.0.0.51:28020")
rs.remove("10.0.0.51:28020")# 添加仲裁节点
rs.addArb("10.0.0.0.51:28020")# 移除仲裁节点
rs.remove("10.0.0.0.51:28020")
06 秘钥认证
1.生成和分发秘钥
openssl rand -base64 756 >/mongodb/28017/conf/keyfile
chmod 600 /mongodb/28017/conf/keyfile && chown mongodb.mongodb -R /mongodb
for i in {28018..28020}; do \cp -a /mongodb/28017/conf/keyfile /mongodb/$i/conf/keyfile; done
2.所有节点增加验证功能
for i in {28017..28020}; docat >> /mongodb/$i/conf/mongodb.yaml <<EOF
security:keyFile: /mongodb/$i/conf/keyfile
EOF
done
3.重启所有节点后生效
for i in {28017..28020}; do systemctl start mongod$i; done
ongodb/$i/conf/keyfile; done
2.所有节点增加验证功能
for i in {28017..28020}; docat >> /mongodb/$i/conf/mongodb.yaml <<EOF
security:keyFile: /mongodb/$i/conf/keyfile
EOF
done
3.重启所有节点后生效
for i in {28017..28020}; do systemctl start mongod$i; done