分享

应急处理mongo 数据库锁

 A_POST 2019-07-06
mongo 锁的处理和状况查询


mongo 锁的处理流程

    mongo数据库突然变的很缓慢,读取速度还可以,其他操作( add,save,delete)尤其缓慢,处理时间平均时间超过30s,一开始发现是mongo集群出现了问题,无法找到主mongo服务器,后来发现服务器的队列命令已经排满了,cpu也是300%左右,说明服务器也已经处于饱和状态,后续的请求命令只能排在队列尾部,无法及时执行,
    经过一天的尝试后发现,由于主服务器找不到,从服务器无法使用更新命令,并且更新时会自动锁表,从而导致其他命令不能及时执行,

查看当前操作
db.currentOp()
正常的情况是返回很少的数据或者返回空
“fsyncLock” : 1 同步到磁盘的进程
如果有锁就会造成数据库无法访问或缓慢

解决:

解锁,但尽量不要使用
db.fsyncUnlock(); 

杀掉负载高的应用id
db.killOp(466404288)

获取服务器状态
db.serverStatus()

哪些操作会对数据库产生锁?
Operation Lock Type
Issue a query Read lock
Get more data from a cursor Read lock
Insert data Write lock
Remove data Write lock
Update data Write lock
Map-reduce Read lock and write lock, unless operations are specified as non-atomic. Portions of map-reduce jobs can run concurrently.
Create an index Building an index in the foreground, which is the default, locks the database for extended periods of time.
db.eval() Write lock. db.eval() blocks all other JavaScript processes.
eval Write lock. If used with the nolock lock option, the eval option does not take a write lock and cannot write data to the database.
aggregate() Read lock

哪些数据库管理操作会锁数据库?

db.collection.ensureIndex(),
reIndex,
compact,
db.repairDatabase(),
db.createCollection(), when creating a very large (i.e. many gigabytes) capped collection,
db.collection.validate(),
db.copyDatabase().This operation may lock all databases  

通过mongo外置命令查看原因

如:
mongostat使用命令

--help
--verbos
--host <hostname><:port>, -h <hostname><:port>
--port <port>
--ipv6
--ssl
--sslCAFile <filename>
--sslPEMKeyFile <filename>
--sslPEMKeyPassword <value>
--sslCRLFile <filename>
--sslAllowInvalidCertificates
--sslFIPSMode
--username <username>, -u <username>
--password <password>, -p <password>
--authenticationDatabase <dbname>
--authenticationMechanism <name>
--gssapiServiceName
--gssapiHostName
--noheaders
--rowcount <number>, -n <number>
--http
--discover
--all

输出参数
inserts 每秒插入次数
query 每秒查询次数
update   每秒更新次数
delete   每秒删除次数
getmore 每秒每批次响应返回的文档数量,cursor.batchSize()
command 每秒的命令数,比如count,slave或者secondary的命令/秒,

flushs/s 每秒执行fsync将数据写入硬盘的次数。
mapped/s 所有的被内存映射的数据量,虚拟内存单位是MB
non-mapped 所使用物理内存
size 虚拟内存使用量,单位MB
res 物理内存使用量,单位MB
faults/s 每秒访问失败数,数据被交换出物理内存,放到swap。不要超过100,否则就是机器内存太小,造成频繁swap写入。此时要升级内存或者扩展
locked % 被锁的时间百分比全局锁,尽量控制在50%以下吧
locked db 数据库上细纹锁定时间百分比,这个值有可能大于100%
idx miss % 索引不命中所占百分比。如果太高的话就要考虑索引是不是少了
q t|r|w 当Mongodb接收到太多的命令而数据库被锁住无法执行完成,它会将命令加入队列。这一栏显示了总共、读、写3个队列的长度,都为0的话表示mongo毫无压力。高并发时,一般队列值会升高。
qr 队列客户端读等待时间
qw 队列客户端写等待时间
ar 活跃客户段的读操作数
aw 活跃客户端的写操作数
netIn 请求网络流量字节单位
netOut 响应网络流量字节单位
conn 连接总数
set 副本集的
repl 副本集状态
M master
MEC secondary
REC recovering
UNK unknow
SLV slave
RTR 路由

mongotop
对于数据库内每个表的读写情况,显示每秒的数据情况

--help
--verbos -v
--quiet 
--host <hostname><:port>, -h <hostname><:port>
--port <port>
--ipv6
--ssl
--sslCAFile <filename>
--sslPEMKeyFile <filename>
--sslPEMKeyPassword <value>
--sslCRLFile <filename>
--sslAllowInvalidCertificates
--sslFIPSMode
--username <username>, -u <username>
--password <password>, -p <password>
--authenticationDatabase <dbname>
--authenticationMechanism <name>
--gssapiServiceName
--gssapiHostName
--locks

显示结果
mongotop.ns 数据库的命名空间和连接
mongotop.db 数据库名
mongotop.total 数据库花费的总时间
mongotop.read 读操作的总时间
mongotop.write 写操作的总时间
mongotop.<timestamp>

硬盘I/O检测
mongoperf 

mongoperf.nThreads   多线程
mongoperf.fileSizeMB 文件大小默认1M
mongoperf.sleepMicros

分片检测
mongos

对于具体某条查询,可以通过慢查询profile解决

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多