作者:北丐。MongoDB中文社区联席主席,针对MongoDB,MySQL,Redis集群,Oracle,TiDB;有丰富的实践经验和企业级授课经验。
一、MongoDB数据库修改Oplog,
回收空间,升级3.2版本等
1. 目前生产环境现状
(1)随着业务日益增大,数据量也随之增多,由于历史原因,所有业务DB基本都在一个MongoD实例中;
(2)随之而来的就是业务访问DB QPS/TPS等压力增大,导致用户业务接口不断超时;
(3)主机磁盘空间使用比率过大,数据库/集合存碎片比较多;
(4)MongoDB版本为3.2,有一定的WT引擎内存死锁概率,建议升级到3.4版本;
(5)Oplog在高峰期只有3.5分钟可同步数据时间间隔,覆盖后secondary节点成为recovering状态。
2. MongoDB环境
(1)主机配置
16core cpu,128G内存,4TBSDD
(2)MongoDB架构
192.168.111.4:28010主
192.168.111.5:28010从
192.168.111.6:28010从
1主+两从复制集模式(业务读,大数据拉取数据)
(3)数据库现状
user:PRIMARY> show dbs;
msg_user 816.698GB
comm_user 1721.887GB
video_user 1315.534GB
(4)Oplog大小
a.由于mongodb oplog是封顶集合,即固定大小;基于历史原因,oplog设置为1GB;
b.存在的风险:比如3节点副本集,一主两从,如果oplog在高峰期,主库dml相当频繁,覆盖了oplog日志信息,而secondary节点没有接收到,则secondary状态则会成为recovering状态,不可对外提供读服务;
c.或者secondary节点在高峰期down,3分钟修复不好,则成为recovering状态
(5)综合考量如上
a.垂直拆分DB,降低集群的qps/tps,缓解业务访问DB产生资源竞争导致接口超时;
b.以添加3.4版本副本集:同步数据,修改参数中Oplog大小;
3. 添加3.4版本隐藏副本节点
(1)登陆主库111.5
(2)执行添加命令
rs.add()
参数配置参考
(3)为什么不添加3.2 mongo版本,而是添加了3.4mongo版本
最主要原因:提升全量同步
a.在拷贝数据的时候同时建立所有的索引,在之前的版本,拷数据时会先建立_id索引,其余的索引在数据拷贝完之后集中建立
b.在拷贝数据的同时,会把同步源上新产生的oplog拉取到本地local数据库的临时集合存储着,等数据全量拷贝完,直接读取本地临时集合的 oplog来应用,提升了追增量的效率,同时也避免了同步源上 oplog不足导致无法同步的问题;
c.3.4版本的全量同步性能约有 20%的提升,如果数据集很大,并且在同步的过程中有写入,提升的效果会更明显,并且彻底解决了因同步源oplog不足而导致进入RECOVERING状态无法同步的问题
4. 升级副本集主从节点
(1)192.168.111.6:28010从库操作
a.先挂载一个4tb存储磁盘
b.将该节点设置为隐藏节点
cfg =rs.conf() #数组下标从0开始
cfg.members[2].priority= 0
cfg.members[2].hidden= true
rs.reconfig(cfg)
c.使用mongostat观察是否还有读
query基本为0即可
d.将192.168.111.7shutdown后,copy数据到111.6
数据copy完后;
切记:先将111.7起来,不然集群中4个节点,在替换111.6数据时会发生主选举失败;
e.然后111.6 shutdown,使用3.4新版本启动即可
f.大概10分钟左右,将该节点设置为非隐藏状态
cfg = rs.conf() #数组下标从0开始
cfg.members[2].priority = 10
cfg.members[2].hidden = false
rs.reconfig(cfg)
(2)192.168.111.5:28010从库升级参考(1)即可
主要是cfg = rs.conf()获取的下标数据不一样
(3)最后升级192.168.111.4:28010主库
a.选择在业务低峰期执行
b.首先将其中一台从库提升为主库:192.168.111.6:28010
使用调整优先级来进行的,比如主库优先级是100,将从库设置如下
cfg = rs.conf() #数组下标从0开始
cfg.members[2].priority = 156
rs.reconfig(cfg)
c.然后将192.168.111.4:28010设置为隐藏节点
cfg = rs.conf() #数组下标从0开始
cfg.members[0].priority = 0
cfg.members[0].hidden = true
rs.reconfig(cfg)
d.111.7 shutdown后,copy数据到111.4
e.启动111.4
f.将111.4设置为非隐藏节点
cfg = rs.conf() #数组下标从0开始
cfg.members[0].priority = 10
cfg.members[0].hidden = false
rs.reconfig(cfg)
运行10分钟左右看看访问情况
g.将111.4切换为主库
cfg = rs.conf() #数组下标从0开始
cfg.members[0].priority = 356
rs.reconfig(cfg)
5. 注意说明
(1)添加新节点111.7的时候,参数文件中Oplog设置为50G
(2)同步数据时将journal设置为false,完了之后,修改为true
(3)升级到3.4版本后,登陆集群中每台查询,oplog大小
user:PRIMARY>db.printReplicationInfo()
configured oplog size: 50240MB
(4)MongoDB数据库空间大小《同时回收的DB空间》
user:PRIMARY>show dbs;
msg_user 645.213GB
comm_user 1319.731GB
video_user 997.298GB
6. 修改MongoDB架构
在原来基础上,192.168.111.7为隐藏节点;
添加了一个延迟节点111.8
将变成5个节点的副本集
二、 MongoDB数据库迁移
- 副本集名称修改
1. 目标将核心数据库comm_user迁移到新环境
集群规划:
192.168.111.14:28010主
192.168.111.15:28010从
192.168.111.16:28010从
192.168.111.17:28010隐藏
192.168.111.18:28010延迟
主机配置 16c 128g内存 4tb ssd
2. 具体操作如下
(1)在111.4主节点添加隐藏节点192.168.111.14:28010
a.将192.168.111.7数据copu到111.14主机,并启动mongod进程
b.在111.4添加
rs.add()
c.建议在晚上业务低峰期执行
(2)提升192.168.111.14:28010为主节点
保障192.168.111.14:28010在集群中的状态为SECONDARY
(3)在111.4上执行remove操作
rs.remove(“192.168.111.14:28010”)
(4)登陆111.14提升为主
注意:初始化 和之前的集群名称一样
3. 将副本集名称从user修改为comm_user
(1)3.4版本使用admin账号操作local数据库需要授权如下角色
user:PRIMARY> db.createRole(,actions:['anyAction']}]})
user:PRIMARY> db.grantRolesToUser( "admin" , [{ role: "sysadmin", db: "admin" } ])
否则:"errmsg" : "not authorized on local toexecute command ……
(2)在local库中修改副本集相关信息
a.登陆192.168.111.14:28010
b.use local
{
"_id" : "user",
……
f.user:PRIMARY> doc._id = "commUser"
commUser
WriteResult({ "nMatched" : 0,"nUpserted" : 1, "nModified" : 0, "_id" :"commUser" })
{
"_id" :"user",
……
}
{
"_id" :"commUser",
……
}
删除旧的副本集名称
WriteResult({ "nRemoved" : 1 })
(3)修改参数文件中副本集名称
#/usr/local/mongodb-linux-x86_64-3.4.20/bin/mongod-f/data/etc/user.conf –shutdown
# vim/data/etc/user.conf
修改
replication:
replSetName:commUser
/usr/local/mongodb-linux-x86_64-3.4.20/bin/mongod-f/data/etc/user.conf –启动
(4)登陆192.168.111.14:28010查看即可
(5)陆续将其他节点添加到该集群中
rs.add()
rs.add()
rs.add()
rs.add()
a.将15/16成为secondary状态后,修改为非隐藏节点
cfg = rs.conf()
cfg.members[1].priority= 10
cfg.members[1].hidden= false
rs.reconfig(cfg)
b.将111.18成为secondary状态后,修改为隐藏延迟节点
cfg =rs.conf()
cfg.members[4].priority = 0
cfg.members[4].hidden = true
cfg.members[4].slaveDelay = 18000
rs.reconfig(cfg)
4. 业务修改连接DB IP和副本集名称
5. 说明:
(1)在迁移数据库,将111.14提升为主,我们使用了6秒时间完成操作
a.DB操作的命令要准备好
b.业务提前修改好新集群的IP+port,直接重启服务
(2)在之前老的集群111.4中,将连接comm_user数据库的用户名密码修改
a.登陆111.4:28010
b.修改密码
use comm_user
db.changeUserPassword(comm_user,' comm_user20190090');
(3)在随后没有如果业务不出问题,则可将老的集群中comm_userDB删除
三、MongoDB版本升级版本
1. 参考如下文章
升级到3.6参数https://docs.mongodb.com/manual/release-notes/3.6-upgrade-replica-set/
2. 登陆192.168.111.14:28010操作如下
commUser:PRIMARY>db.adminCommand( { setFeatureCompatibilityVersion : "3.4" } )
{"ok" : 1 }
commUser:PRIMARY>db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{ "featureCompatibilityVersion" :"3.4", "ok" : 1 }
(1)Shutdown
# /usr/local/mongodb-linux-x86_64-3.4.20/bin/mongod -f/data/home/db/user.conf –shutdown
(2)使用3.6版本启动
#/usr/local/mongodb-linux-x86_64-3.6.13/bin/mongod -f /data/home/db/user.conf
(3)登陆到14mongo实例
commUser:PRIMARY>db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
{"featureCompatibilityVersion" : { "version" :"3.4" }, "ok" : 1 }
commUser:PRIMARY>db.adminCommand( { setFeatureCompatibilityVersion : "3.6" } )
{ "ok" : 1,"operationTime" : Timestamp(1561358793, 12) }
(4)查看版本
use admin
{"_id" : "authSchema", "currentVersion" : 5 }
{ "_id" :"featureCompatibilityVersion", "version" : "3.6"}
(5)进入local数据库
commUser:PRIMARY>use local
switchedto db local
commUser:PRIMARY>show tables;
me
oplog.rs
replset.minvalid
replset.oplogTruncateAfterPoint
startup_log
system.profile
system.replset
比3.4版本多了几个集合
3. 说明
(1)如上只是一个升级主库的案例;
(2)事实上,先升级secondary,将该节点设置为隐藏节点,没有query后,在操作,基本不影响业务操作;
(3)然后再升级主库,当然会将某个secondary提升为主库,在主从切换时,会有大概1~5秒的影响;
(4)从3.2升级到3.4是因为需要回收空间,在线添加节点是最有效的方式;
(5)如果不回收空间等其他操作,从3.4升级到3.6只需要按照官网操作即可。
领取专属 10元无门槛券
私享最新 技术干货