PHP连接MongoDB报错:connection closed calling hello on ‘127.0.0.1:27017’

352次阅读
没有评论

最近发现服务端 MongoDB 经常链接异常,但是 mongoDB 服务并没有挂掉。

本地命令链接 MongoDB 服务端出现异常,提示如下。

[root@iZbp17nmmwr83guotvjxvzZ ~]# mongo
MongoDB shell version v4.4.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Error: network error while attempting to run command 'isMaster' on host '127.0.0.1:27017'  :
connect@src/mongo/shell/mongo.js:374:17
@(connect):2:6
exception: connect failed
exiting with code 1

PHP 错误日志

ERR: No suitable servers found (`serverSelectionTryOnce` set): [connection closed calling hello on '127.0.0.1:27017']

重启 mongoDB,发现 mongoDB 当前连接数和 php 当前的进程数成正比。
分析原因为当前 php 的进程数超过 mongoDB 的最大连接数。导致 mongoDB 的可用链接数被拉满,以致无法与其他客户端正常建立连接。

# 查询 mongo 链接数
> mongo
> db.serverStatus().connections;
{
        "current" : 3310,
        "available" : 49118,
        "totalCreated" : 52224,
        "active" : 3,
        "exhaustIsMaster" : 2,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 2
}
> db.serverStatus().connections;
{
        "current" : 3323,
        "available" : 49105,
        "totalCreated" : 52523,
        "active" : 3,
        "exhaustIsMaster" : 2,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 2
}

# 查询 PHP 进程数
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3349
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3380
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3346
[root@iZbp17nmmwr83guotvjxvzZ ~]# netstat -napo |grep "php-fpm" | wc -l
3353

根本原因:php 的 MongoDB 驱动扩展在每次 $conn=new MongoDB\Client("mongodb://localhost:27017");
的时候都会建立一个新连接,但该驱动扩展并未提供关闭连接的方法。参考 GitHub 的 issues 链接:https://github.com/mongodb/mongo-php-driver/issues/393

解决方法:找到原因那么就要解决问题,要么增加连接数限制,要么在代码中显式关闭创建的 MongoClient。要么使用连接池管理程序端与 mongoDB 的链接。同类问题参考链接:https://learnku.com/articles/34780?#reply262009

我这里将 PHP-Fpm 的运行模式由 static(静态)模式修改为了 dynamic(动态)模式。具体效果观察中。

正文完
有偿技术支持加微信
post-qrcode
 
评论(没有评论)
验证码