mongodb总结和问题排查


副本集延迟写入

可以使用ops manage配置延迟写入,将一个slave配置成delayed hidden(注意:此时votes无法配置成1)。也可以直接使用mongo shell配置,配置关键命令,

conf=rs.conf()
conf.members[2].votes=1
conf.members[2].slaveDelay=3600
conf.members[2].priority=0
conf.members[2].hidden=1
rs.reconfig(conf)

(解释:votes可投票,副本集可投票数量至少需要3个,slaveDelay延迟写入秒,priority优先级为0不会被选为主,hidden为1,隐藏节点对客户端不可见)

ops manage不能配置delayed hidden节点的votes,主要是为了防止开启Write Concern Majority 的时候,有投票权的节点需要过半写入才算成功写入,而delayed hidden节点成功写入需要等待slaveDelay延迟时间,主节点宕机后,少了一个节点可能会引起性能下降。


问题排查

mongodb排查问题思路

1.开启慢查询日志可通过查看mongodb.log,里面记录所有慢查询操作;
2.cpu异常时使用mongostatus和mongotop查看当前插入和查询的tps,并可定位到具体表;
3.使用db.system.profile.find({millis:{$gt:30}})查看最近的慢查询操作,
使用db.getcurretop可以查看正在进行的操作,基本能定位cpu吃满问题。

mongodb崩溃,查看日志发现是open files达到最大引起的wiredtiger引擎崩溃。
通过 cat /proc/pid/limits发现max open files值是1024,
也就是说数据库同时打开了1024个文件,导致了崩溃。
解决方法是prlimit --pid 41814 --nofile=65535:65535,
并且可以修改默认大小 ulimit -n 65535。
db.serverStatus()可以查看当前打开的文件数量
wiredtiger->connection->files currently open

副本集问题

客户端连接url设置成mongodb://xxx1:27017,xxx2:27017,xxx3:27017/?replicaSet=xxx ,
要使客户端连接自动切换需要在mongo上设置db.setSlaveOK(true)
或者 echo “rs.slaveOk();” >> /root/.mongorc.js

mongo单机迁移至副本集重要步骤

原来的单机数据不迁移直接作为副本集的master,如果要迁移可以使用dump后重新导入的方式,或者停服务直接拷贝整个db文件夹。
修改配置为副本集后初始化节点

rs.initiate( {
	_id: "test",
	members: [
	{ _id: 0, host: "xxx:27017",priority:2}
] })

将节点升级为master,
rs.stepDown()
启动副本集slave节点同样配置好,在主节点机子上加入slave
rs.add({_id:1,host:‘xxx:27018’,priority:1})
启动仲裁节点同样配置好,在主节点机子上加入
rs.add({ _id: 2, host: “xxx:27019”,arbiterOnly:true })

mongo创建索引卡住

有一个集群启动了异常的slave之后索引建立正常了,原因是1主两备情况下有一个备异常关闭导致的。

mongo常用命令

启动 /usr/bin/mongod  --config /etc/mongod.conf
状态查询 mongostat  --host xxx:27017  -xxx -xxx --authenticationDatabase admin
关闭服务 ./mongo admin --eval "db.shutdownServer()"
mongod  --shutdown  --dbpath /database/mongodb/data/
查询db.getCollection('oplog.rs').find({"ts":{$gt:Timestamp(1620507602,1)},"ns":/xxx/}).count()

查询对应db.集合.的oplog条数,慎用

db.getCollection('oplog.rs').find({"ts":{$gt:Timestamp(1620507601,1)},"ns":/XXX/}).count()

本地dump,restore

mongodump -d local -c oplog.rs   -q "{\"ns\":\"XXX\"}"  -o ./backup2
mongorestore --oplogReplay  --oplogLimit "1619159597:2" backup2/
mongodump -d local -c oplog.rs   -q "{\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1617792281,\"i\":1}}}}"  -o ./backup2
mongodump -d local -c oplog.rs   -q "{\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1612694681,\"i\":1}}}}"  -o ./backup2

mongodump -d local -c oplog.rs   -q "{\"ns\":{\"\$not\":{\"\$regex\":\"config.\"}}}"  -o ./backup2
mongodump -d local -c oplog.rs   -q "{\"ns\":{\"\$not\":{\"\$regex\":\"config.\"}},\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1612694681,\"i\":1}}}}"  -o ./backup2

远程 dump,restore
mongodump -h XXX:XXX -d local -c oplog.rs   -q "{\"ns\":{\"\$not\":{\"\$regex\":\"config.\"}},\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1612694681,\"i\":1}}}}"  -o ./backup2

 mongodump -h 127.0.0.1:27017 -d local -c oplog.rs  -q "{\"ns\":{\"\$not\":{\"\$regex\":\"config.\"}},\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1612694681,\"i\":1}}}}"  -o log


mongodump -h xxx:27017 -d local -c oplog.rs  -q "{\"\$and\":[{\"ns\":{\"\$not\":{\"\$regex\":\"config.\"}},\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1612694681,\"i\":1}}}},{\"ns\":{\"\$not\":{\"\$regex\":\"XXX.\"}},\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":1612694681,\"i\":1}}}}]}"  -o log

oplog备份shell脚本参考

BEGIN_TIME=`cat<./end`
echo $BEGIN_TIME
END_TIME=`date '+%s'`

echo $END_TIME
STR_DATE1=`date -d @$BEGIN_TIME  "+%Y-%m-%d-%H-%M-%S"`
STR_DATE2=`date -d @$END_TIME  "+%Y-%m-%d-%H-%M-%S"`
STR_DATE="$STR_DATE1----$STR_DATE2"
rm -rf $STR_DATE
echo $STR_DATE
mkdir -p $STR_DATE/log
mongodump -h xxx:27017 -d local -c oplog.rs   -q "{\"ns\":{\"\$not\":{\"\$regex\":\"config.\"}},\"ts\":{\"\$gt\":{\"\$timestamp\":{\"t\":$BEGIN_TIME,\"i\":1}}}}"  -o ./$STR_DATE/log

mongorestore -h 127.0.0.1:27017 --oplogReplay  --oplogLimit "$END_TIME:2" ./$STR_DATE/log/
LAST_END_TIME=$((10#${END_TIME}-(60*60*24))) #往前一天,防止时间不一致导致的数据丢失,oplog实际大小+1天
echo $LAST_END_TIME
echo $LAST_END_TIME>./end

mongo官方工具ops manager 4.4.6

打开realtime界面会造成cpu大幅升高,几M每秒的流量流出,关掉界面cpu和流量一会儿就恢复正常了。

其他总结

1.mongodb也支持视图。通过pipeline的形式执行多条命令。

2.固定集合和ttl特性。

3.mongo使用lookup或者内嵌文档的形式实现join功能。

4.使用副本集或者分片集群支持
read concern(读偏好):
五个等级:local(因果不一致),available(因果不一致),majority(读大多数,jounal如果没开不一定落盘),linearizable,snapshot。
write concern(写偏好):
majority:大多数

5.磁盘被未知进程占用
lsof | grep deleted| sort -nr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值