mongodb副本集配置延迟节点
延时节点是主节点过去某个时间点的“数据快照”,通常用来做数据备份,如果主节点有误操作而删除了数据,可以通过延时节点来恢复数据。例如,当前时间是10:00,并且延时节点设置1个小时的延时同步,那么该节点不会同步1个小时内主节点上的操作。建议延迟 4 小时,保证可以恢复 4 小时以内的误操作。
mongodb副本集搭建
- 机器规划清单
| 节点 | 端口 | 角色 | 优先级 | 版本信息 |
|---|---|---|---|---|
| 192.168.31.101 | 3717 | 主库 | 15,与节点2互为主备 | Oralce Linux 8.9 x64、Mongodb 6.0.6 |
| 192.168.31.102 | 3717 | 从库 | 15,与节点1互为主备 | Oralce Linux 8.9 x64、Mongodb 6.0.6 |
| 192.168.31.103 | 3717 | 延迟节点 | 0 | Oralce Linux 8.9 x64、Mongodb 6.0.6 |
1.系统初始化
#.set timezone
cat /etc/resolv.conf | grep "^nameserver" || echo "nameserver 223.5.5.5" > /etc/resolv.conf
timedatectl set-timezone Asia/Shanghai
#.set ulimit
ulimit -n 65536
cat /etc/security/limits.conf | grep nofile | grep 65536 || echo "* - nofile 65536" >> /etc/security/limits.conf
cat /etc/rc.local | grep ulimit | grep 65536 || echo "ulimit -n 65536" >> /etc/rc.local
#.disable hugepage
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
#.set vm.max_map_count
cat /etc/sysctl.conf | grep max_map_count || echo "vm.max_map_count=655360" >> /etc/sysctl.conf
/sbin/sysctl -p /etc/sysctl.conf
#.disable iptables
/usr/sbin/iptables -F
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl status firewalld.service
2.安装 mongodb 单节点
- 2.1.所有节点:创建用户(不允许用户登录)
cat /etc/group | grep mongodb || groupadd mongodb
cat /etc/passwd | grep mongodb || useradd mongodb -g mongodb -s /usr/sbin/nologin
- 2.2.所有节点:安装yum依赖
#.配置阿里云的yum源
curl -sL 'http://iso.sqlfans.cn/config/linux_change_repo.sh' | bash
#.安装依赖
yum install -y numactl openssl
- 2.3.所有节点:下载 mongodb 及 mongosh 客户端,示例 安装文件
rhel80基于 Oracle Linux 8.9
cd /opt
wget -c http://iso.sqlfans.cn/mongodb/mongodb-linux-x86_64-rhel80-6.0.6.tgz
wget -c http://iso.sqlfans.cn/mongodb/mongosh-1.6.0-linux-x64.tgz
tar -xvf mongodb-linux-x86_64-rhel80-6.0.6.tgz -C /opt/
tar xvf /opt/mongosh-1.6.0-linux-x64.tgz -C /opt/
mv /opt/mongodb-linux-x86_64-rhel80-6.0.6 /opt/mongodb
cp /opt/mongosh-1.6.0-linux-x64/bin/mongosh /opt/mongodb/bin/
rm -rf /opt/mongosh-1.6.0-linux-x64
- 2.4.所有节点:修改配置文件(启用replSet、注释掉auth和keyFile)
mkdir -p /data/mongo_3717/{data,log,pid}
cat >/data/mongo_3717/mongo_3717.conf<<EOF
quiet=false
timeStampFormat=iso8601-local
logappend=true
journal=true
#auth=true
directoryperdb=true
fork=true
oplogSize=20480
replSet=set3717
bind_ip=0.0.0.0
port=3717
profile=1
slowms=500
cpu=true
storageEngine=wiredTiger
wiredTigerCacheSizeGB=4
wiredTigerDirectoryForIndexes=true
wiredTigerIndexPrefixCompression=true
wiredTigerJournalCompressor=zlib
wiredTigerCollectionBlockCompressor=snappy
dbpath=/data/mongo_3717/data
#keyFile=/data/mongo_3717/data/keyfile
pidfilepath=/data/mongo_3717/pid/pid_3717.pid
logpath=/data/mongo_3717/log/mongo_3717.log
EOF
- 2.5.主节点:创建秘钥文件,然后拷贝到所有节点相关目录下
openssl rand -base64 741 > /data/mongo_3717/data/keyfile
scp -r -P22 /data/mongo_3717/data/keyfile 192.168.31.102:/data/mongo_3717/data/
scp -r -P22 /data/mongo_3717/data/keyfile 192.168.31.103:/data/mongo_3717/data/
- 2.6.所有节点:修改权限,并启动服务
chmod 600 /data/mongo_3717/data/keyfile
chown -R mongodb.mongodb /data/mongo_3717
sudo -u mongodb numactl --interleave=all /opt/mongodb/bin/mongod -f /data/mongo_3717/mongo_3717.conf
netstat -lnpt | grep mongo
- 2.7.所有节点:加入开机启动
cat /etc/rc.local | grep mongo_3717 || echo "sudo -u mongodb numactl --interleave=all /opt/mongodb/bin/mongod -f /data/mongo_3717/mongo_3717.conf" >> /etc/rc.local
3.配置 mongodb 副本集
- 3.1.主节点:搭建单节点replicaSet,并添加其他节点
注:示例 将节点3设置为hidden(隐藏节点的优先级必须为0),同时 secondaryDelaySecs=3600
/opt/mongodb/bin/mongosh --port 3717 <<EOF
use admin;
var cfg={_id:"set3717",members:[{_id:0,host:"192.168.31.101:3717"}]};
rs.initiate(cfg);
sleep(5000);
rs.add("192.168.31.102:3717");
rs.add("192.168.31.103:3717");
rs.isMaster();
sleep(5000);
var cfg=rs.conf()
cfg.members[0].priority=15;
cfg.members[1].priority=15;
cfg.members[2].priority=0;
cfg.members[2].hidden=true;
cfg.members[2].secondaryDelaySecs=3600
rs.reconfig(cfg);
sleep(5000);
db.createUser({user:'dba_admin',pwd:'cf_rB1NKCzbaQuPH',roles:[{role:'root',db:'admin'}]});
show users;
exit;
EOF
- 3.2.所有节点:取消注释,重启mongod进程
sed -i 's/#auth/auth/g' /data/mongo_3717/mongo_3717.conf
sed -i 's/#keyFile/keyFile/g' /data/mongo_3717/mongo_3717.conf
sed -i 's/#replSet=set3717/replSet=set3717/g' /data/mongo_3717/mongo_3717.conf
ps aux | grep mongod | grep -v grep | awk '{print $2}' | xargs kill -9 2> /dev/null
sudo -u mongodb numactl --interleave=all /opt/mongodb/bin/mongod -f /data/mongo_3717/mongo_3717.conf
netstat -lnpt | grep mongo
4.验证副本集状态
- 4.1.任意节点:执行 rs.config() 确认集群状态,可以看到节点3有个属性:secondaryDelaySecs: Long("3600")
/opt/mongodb/bin/mongosh -u dba_admin -p cf_rB1NKCzbaQuPH --authenticationDatabase admin --host 192.168.31.102 --port 3717 admin <<EOF
rs.conf();
exit;
EOF
- 4.2.任意节点:在主节点上,创建测试db和测试数据
/opt/mongodb/bin/mongosh -u dba_admin -p cf_rB1NKCzbaQuPH --authenticationDatabase admin --host 192.168.31.101 --port 3717 admin <<EOF
use testdb;
db.createCollection("test");
db.getCollection("test").insert({"note":"当前时间 2027-07-29 15:38"});
show dbs;
exit;
EOF
- 4.3.任意节点:确认节点2的测试数据已存在
/opt/mongodb/bin/mongosh -u dba_admin -p cf_rB1NKCzbaQuPH --authenticationDatabase admin --host 192.168.31.102 --port 3717 admin <<EOF
db.getMongo().setReadPref('primaryPreferred');
use testdb;
db.test.find();
exit;
EOF
5.延迟验证
- 5.1.任意节点:确认节点3(延迟节点)测试数据不存在
/opt/mongodb/bin/mongosh -u dba_admin -p cf_rB1NKCzbaQuPH --authenticationDatabase admin --host 192.168.31.103 --port 3717 admin <<EOF
db.getMongo().setReadPref('primaryPreferred');
use testdb;
db.test.find();
exit;
EOF
- 5.2.任意节点:1小时之后,确认节点3(延迟节点)测试数据已同步
/opt/mongodb/bin/mongosh -u dba_admin -p cf_rB1NKCzbaQuPH --authenticationDatabase admin --host 192.168.31.103 --port 3717 admin <<EOF
db.getMongo().setReadPref('primaryPreferred');
use testdb;
db.test.find();
exit;
EOF