1. 缘起
使用RockMongo管理MongoDB集群,发现对于不同的副本集,如果配置了相同的名字,则RockMongo无法正确处理。原因在于RockMongo连接MongoDB使用的mongo-php-driver不支持这种情况。
以下摘自http://php.net/manual/en/mongo.connecting.rs.php
Warning
The driver does not support connecting to different replica sets with the same name. This extends beyond one script so make sure to have separate names for each of your replica sets. That also means that you can not do this:Example #2 Wrong replica set name duplication
1
2
3
4
$m = new MongoClient("mongodb://devserver1,devserver2,devserver3/?replicaSet=repset");
$m = new MongoClient("mongodb://prodserver1,prodserver2,prodserver3/?replicaSet=repset");
Instead, you need to have two different names for your replica sets:
Example #3 Correct use of two replica set names
1
2
3
4
$m = new MongoClient("mongodb://devserver1,devserver2,devserver3/?replicaSet=devset");
$m = new MongoClient("mongodb://prodserver1,prodserver2,prodserver3/?replicaSet=prodset");
2. 解决方法
在阅读了mongo-php-driver的代码后,发现mongo-php-driver使用副本集名称作为哈希键值,保存副本集各节点的信息。所以如果不同的副本集具有相同的名字,则集群信息发生混乱,对代码进行了简单修改,绕过了该问题,详见https://github.com/winway/mongo-php-driver-legacy/tree/v1.6.10.1