一个mongo php sdk长连接的问题

问题:当使用php driver进行压测的时候,有时候发现会出现异常,出现No candidate servers found的错误。

环境:server端用了三台机器做replicaSet,mongod用的机器名标识。 php driver在new Mongoclient时使用array('readPreference' => MongoClient::RP_NEAREST, 'replicaSet' => 'test001'))参数,server用的ip来标识。

经过排查,发现产生的原因是replicaSet机制导致的。

出现"No candidate servers found"出现的原因是因为无法与服务端连立连接导致,为什么无法连接连接呢?用netstat -na发现有大量的TIME_WAIT导致,导致web机上端口不够用,所以无法建立新的连接,从而就出现了这个错误。

我们知道mongo php driver使用的是长连接,为什么还会连接这么多连接呢?

经过分析php driver的代码,在new MongoClient时,如果指明了replicaSet参数,则建连接时会调用mongo_get_read_write_connection_replicaset,在这个函数中会调用mongo_discover_topology来发现集群中的新节点,这个函数中会调用mongo_connection_ismaster来探测新节点以节确定是否是master还是secondary等。

static void mongo_discover_topology(mongo_con_manager *manager, mongo_servers *serv
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值