二、mongodb副本集搭建和维护

一、环境信息
IP地址配置规格主机名系统版本
192.168.86.114核4Gmongodb01centos7.7
192.168.86.124核4Gmongodb02centos7.7
192.168.86.13(延时节点)4核4Gmongodb03centos7.7
192.168.86.14(扩容节点)4核4Gmongodb04centos7.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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值