问题:当使用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