一、环境信息
IP地址 | 配置规格 | 主机名 | 系统版本 |
---|---|---|---|
192.168.86.11 | 4核4G | mongodb01 | centos7.7 |
192.168.86.12 | 4核4G | mongodb02 | centos7.7 |
192.168.86.13(延时节点) | 4核4G | mongodb03 | centos7.7 |
192.168.86.14(扩容节点) | 4核4G | mongodb04 | centos7.7 |
二、部署(扩容节点不参与配置)
1、各个节点系统优化
1>修改ulimit
cat /etc/security/limits.conf
* soft nofile 1024000
* hard nofile 1024000
* nproc 65536
cat /etc/security/limits.d/20-nproc.conf
* soft nproc 65536 #默认是4096
root soft nproc unlimited
2>禁用hugepage
echo never >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/defrag
echo 'echo never >/sys/kernel/mm/transparent_hugepage/enabled ' >>/etc/rc.local
echo 'echo never >/sys/kernel/mm/transparent_hugepage/defrag ' >>/etc/rc.local
chmod +x /etc/rc.d/rc.local
2、各个节点安装mongo
yum -y install https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-org-server-5.0.1-1.el7.x86_64.rpm
yum -y install https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-org-mongos-5.0.1-1.el7.x86_64.rpm
yum -y install https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-database-tools-100.5.0.x86_64.rpm
yum -y install https://repo.mongodb.org/yum/redhat/7/mongodb-org/5.0/x86_64/RPMS/mongodb-org-shell-5.0.1-1.el7.x86_64.rpm
systemctl start mongod.service
systemctl enable mongod.service
3、各个节点配置副本集,修改 /etc/mongod.conf为以下内容
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /var/log/mongodb/mongod.log
# Where and how to store data.
storage:
dbPath: /var/lib/mongo
journal:
enabled: true
# how the process runs
processManagement:
fork: true # fork and run in background
pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
timeZoneInfo: /usr/share/zoneinfo
# network interfaces
net:
port: 27017
bindIp: 0.0.0.0
#副本集名称需要保持一致,包括扩容节点
replication:
replSetName: rs0
4、各个节点重启mongodb服务查看端口是否监听
systemctl restart mongod.service
netstat -anptu|grep 27017
5、本集的初始化并查看状态
mongo 192.168.86.11:27017
use admin
config = { _id:"rs0", members:[
{_id:0,host:"192.168.86.11:27017"},
{_id:1,host:"192.168.86.12:27017"},
{_id:2,host:"192.168.86.13:27017"}]
}
rs.initiate( config )
rs.status()
6、测试数据同步
mongo 192.168.86.11:27017 (PRIMARY)
use duanshuaixing-mongodb
db.user.insert({ name: 'duanshuaixing', age:27 })
mongo 192.168.86.12:27017 (SECONDARY)
rs.slaveOk() #SECONDARY需要声明是slave才能查看数据
use duanshuaixing-mongodb
db.user.find()
7、查看主从延时
rs.printSlaveReplicationInfo()
三、副本集故障自动切换
1、mongodb的副本集当primary挂了,会挑选其中的一台secondary升级为primary。条件是剩下的集群台数>=2;如果集群只剩下一个实例的话,会有异常
2、模拟故障primary场景
#查看primary所在节点,登录primary节点关闭mongod服务,其他节点会提升为primary
rs.status()
systemctl stop mongod.service
#登录其他mongodb节点查询primary节点,验证插入数据和数据同步是否正常,预期服务不受影响
mongo 192.168.86.12:27017 (PRIMARY)
use duanshuaixing-mongodb
db.user.insert({ name: 'duanshuaixing02', age:27 })
db.user.find()
mongo 192.168.86.12:27017 (SECONDARY)
rs.slaveOk()
use duanshuaixing-mongodb
db.user.find()
3、模拟故障2台mongodb节点
#任意故障集群中的2台,预取数据写入异常,读不受影响
systemctl stop mongod.service
#登录剩下的一台mongodb存活节点查看集群状态
mongo 192.168.86.13:27017
rs.slaveOk()
rs.status() #故障节点被置为SECONDARY,状态为not reachable/healthy
use duanshuaixing-mongodb
db.user.find() #数据查询正常
4、节点恢复加入集群
#恢复任意1台mongo故障实例,集群选出新的primary,读写恢复正常,数据同步
systemctl start mongod.service
mongo 192.168.86.13:27017 (PRIMARY)
use duanshuaixing-mongodb
db.user.insert({ name: 'duanshuaixing03', age:27 })
db.user.find()
mongo 192.168.86.12:27017 (SECONDARY)
rs.slaveOk()
use duanshuaixing-mongodb
db.user.find()
#恢复2台mongo故障实例,数据同步
mongo 192.168.86.11:27017 (SECONDARY)
rs.slaveOk()
use duanshuaixing-mongodb
db.user.find()
四、修改节点priority权重提升为primary
1、mongodb副本集的主的选举
primary的选举依赖于各个实例的优先权重,默认权重都是1
复本集的主挑选权重最高的,权重一样的无法控制谁为主
2、登录primary修改节点权重
mongo 192.168.86.13:27017 (primary)
conf = rs.config() #获取副本集的配置,查看"_id"、"priority"字段,默认权重都是1,
conf.members[0].priority = 10 #索引号从0开始,每次递增1,类似数组
conf.members[1].priority = 5
conf.members[2].priority = 2
rs.reconfig(conf) #更新mongodb副本集的配置,优先权重最高的提升为primary,重启数据同步完成后会切换为主
五、集群扩缩容
扩容
1、节点初始化和mongodb安装
参考步骤二中的1、各个节点系统优化;2、各个节点安装mongo;3、各个节点配置副本集,修改 /etc/mongod.conf为以下内容;4、各个节点重启mongodb服务查看端口是否监听
2、集群内添加新增mongo节点
mongo 192.168.86.11:27017 (primary)
rs.add('192.168.86.14:27017') #rs.add默认权重都是1
rs.status()
3、登录新增节点查看数据同步情况
mongo 192.168.86.14:27017 (SECONDARY)
rs.slaveOk()
use duanshuaixing-mongodb
db.user.find()
4、mongodb
PRIMARY节点降级
rs.stepDown(30)
缩容
1、从mongodb副本集中移除实例,不可移除primary,副本集经过添加删除后顺序会乱,设置权重需要注意每个实例的位置, rs.config() 确认后设置
mongo 192.168.86.11:27017 (primary)
rs.remove('192.168.86.12:27017')
rs.status()
五、备份和恢复,mongodump、mongorestore
1、单节点场景,使用步骤4移除的节点192.168.86.12部署单节点环境
单台服务器建议一定要备份
mongodb提供mongodump工具备份数据
mongodb有提供mongorestore工具恢复数据
mongodb备份说明,指定ip和端口
单台服务器直接使用mongodump和mongorestore进行备份恢复
副本集需要连接到primary上备份和恢复
1>环境准备
清理数据目录
systemctl stop mongod.service
rm -rf /var/lib/mongo/*
修改/etc/mongod.conf,注释副本集配置并重启mongo
#replication:
# replSetName: rs0
systemctl restart mongod.service
2> 数据准备
插入50w条数据
use duanshuaixing-mongodb
for(i=1; i<=500000;i++){
db.user.insert( {name:'mytest'+i, age:i} )
}
查询数据条数
db.user.count()
3>备份数据
mkdir ~/mongodb-backup
mongodump -h 192.168.86.12:27017 -o ~/mongodb-backup/
4>删除数据库模拟数据丢失场景
mongo 192.168.86.12:27017
use duanshuaixing-mongodb
db.dropDatabase()
5>恢复数据名确认数据是否完整
mongorestore -h 192.168.86.12:27017 ~/mongodb-backup/
mongo 192.168.86.12:27017
use duanshuaixing-mongodb
db.user.count()
6>带密码认证备份恢复
mongodump -h 'rs0/192.168.192.168.86.39:27017,192.168.86.39:27018,192.168.86.39:27019' -u 'root' -p 'rootPassw0rd' --oplog --authenticationDatabase admin --gzip -o /tmp/
mongorestore -h 'rs0/192.168.192.168.86.39:27017,192.168.86.39:27018,192.168.86.39:27019' -u 'root' -p 'rootPassw0rd' --oplogReplay --gzip /tmp/
rs0是副本集名称
-h:指定当前备份主机ip
-u:指定验证的用户名
-p:指定用户名对应的密码
--oplog:replica set或者master/slave模式专用。在备份过程中捕获oplog更改日志,以保持一致的时间点。该选项只对全库导出有效,所以不能指定-d选项。因为整个实例的变更操作都会集中在local库中的oplog.rs集合中。
--gzip:可选项。启用备份文件的内联压缩。
-o:指定备份的路径
--authenticationDatabase:认证数据库
--oplogReplay:用于备份恢复,重放oplog。
六、配置添加延时备份节点
延时同步的副本节点在拿到oplog后不会立即执行,而是等待一段时间后才执行。在一定程度上可以避免因为误操作或恶意操作造成的数据损失。
该方案的优点是:
1、发现问题后可快速将延时副本节点变为主节点,回退数据到一段时间之前。
2、延迟节点可作为一个投票节点发挥作用。
3、可通过oplog恢复到指定时间点。
4、延时节点通过延时从opLog同步数据来实现,因此延时时长的设置需要考虑两个因素:
1>不小于维护时间窗口。
2>比opLog的容量要小一些,不然会不能同步而进入stale状态。
5、配置延时同步节点
mongo 192.168.86.11:27017 (PRIMARY)
use admin
rs.status()
根据规划添加延迟备份节点(members[]根据规划填写)
cfg = rs.conf();
cfg.members[2].priority = 0;
cfg.members[2].hidden = true;
cfg.members[2].slaveDelay = 7200; #mongodb4.7以前用slaveDelay
cfg.members[2].secondaryDelaySecs = 7200; #mongodb4.7及以后使用secondaryDelaySecs字段配置,jira地址:https://jira.mongodb.org/browse/SERVER-50423
cfg.members[2].votes = 1;
rs.reconfig(cfg)
七、FAQ
1、查看mongo的连接IP
db.currentOp(true).inprog.forEach(function(d){if (d.client)printjson(d.client)})
2、查看mongodb连接数
db.serverStatus().connections
3、查看mongoSlave节点与PRIMARY节点落后情况
rs.printSlaveReplicationInfo()
4、修改oplog大小(默认50G)
use local
db.getReplicationInfo()
db.adminCommand({replSetResizeOplog:1,size:102400})
db.getReplicationInfo()