MongoDB集群卡死问题

    一年前搭了个MongoDB集群,跑得还算不错,可是有几回遇到过服务卡死的问题。处理起来已经驾轻就熟了,拿来跟你们分享一下:

html

故障现象:服务器

    业务查询缓慢,并且会有链接异常:socket

{ "serverUsed" : "/10.6.19.80:10013" , "errmsg" : "exception: could not run map command on all shards for ns tloc.fileprops and query { author: { $in: [ \"exception\" ] }, type: { $in: [ 0, 1 ] } } :: caused by :: socket exception [CONNECT_ERROR] for shard2/10.6.19.91:10016" , "code" : 11002 , "ok" : 0.0}
{ "serverUsed" : "/10.6.19.108:10013" , "ok" : 0.0 , "errmsg" : "MR post processing failed: { errmsg: \"exception: could not initialize cursor across all shards because : socket exception [SEND_ERROR] for 10.6.19.91:10016 @ shard2/10.6.19.91:10016\", code: 14827, ok: 0.0 }"}

    当时各个Mongo分片、路由、配置服务器进程有在运行,并且查看路由服务的IO也不算高,内存、CPU也是能够接受的。可是业务查询却会卡死,致使服务不可用。post

 

故障缘由:spa

    能经过本地链接上mongo,切到业务db,经过“db.currentOp()”查看到执行的操做,发现操做数已经开始积累,呈阻塞状态。并且经过观察能够发现通常操做累积的都是同一个分片下的任务,估计是这个分片出现了问题,有几种可能性:日志

        一、磁盘IO异常code

        二、任务参数不合理,查询确实很慢server

    总之,不可能由于一个分片问题,致使整个集群不可用。htm

 

故障恢复:blog

    若是是线上可用性,通常都会很急的,如今知道了缘由,应当即恢复。这里有两种办法:

        一、一个一个地用db.killOp("opid")去杀掉某个操做(mongo没有群杀,即便你重启了路由,那些操做还在配置服务器里存着),可是这个不大合理,由于它的增加阻塞很快,并且极可能你连mongo都登不上,整个服务都瘫痪掉了;

        二、暴力重启分片,这个是目前我在使用的,也是比较快速有效的方法

    具体重启服务,也不是全部服务器都要重启,只须要把引发阻塞的分片重启便可:

        一、经过db.currentOp()或分片mongd日志确承认疑分片

        二、直接上分片机器,kill掉mongod进程

        三、再启动mongod进程

        四、等待1分钟左右,路由服务器恢复正常

    此时,应用里那些阻塞的操做应该都没了,能够经过在路由服务上执行db.xxx.find()来确认是否集群可用。

 

转载请注明原址:http://www.cnblogs.com/lekko/p/5653940.html 

相关文章
相关标签/搜索