【发布时间】:2015-06-13 15:38:46
【问题描述】:
当我的复制集的主服务器出现故障时,当前打开的连接也会立即失败 (!) 在我使用 GridFS 时抛出 MongoConnectionException (No candidate servers found) 或 MongoCursorException (mongoUbuntu:8004: Remote server has closed the connection)。
这是一个错误还是我必须更改我的设置才能使自动故障转移正常工作?
安装
- Linux ubuntu 内核 3.16.0-31-generic
- PHP 5.5.12-2ubuntu4.3
- pecl/mongo 1.6.6
- mongo 2.6.3
- PHP 通过 cli
- 服务器的主机名为
mongoUbuntu,mongodb 进程是在一台计算机上使用以下命令行启动的
Mongod 选项
我在端口 8001、8002、8003 和 8004 上运行 4 个服务器,在 8010 上运行一个仲裁器。8001 的命令行如下:
mongod --replSet rs1 --dbpath /var/lib/mongodb1 --port 8001 --smallfiles --oplogSize 200 --httpinterface --rest
复制集 rs.status()
{
"set" : "rs1",
"date" : ISODate("2015-04-08T14:48:57Z"),
"myState" : 3,
"members" : [
{
"_id" : 0,
"name" : "mongoUbuntu:8004",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 467,
"optime" : Timestamp(1428501340, 1),
"optimeDate" : ISODate("2015-04-08T13:55:40Z"),
"lastHeartbeat" : ISODate("2015-04-08T14:48:56Z"),
"lastHeartbeatRecv" : ISODate("2015-04-08T14:48:55Z"),
"pingMs" : 0,
"syncingTo" : "mongoUbuntu:8001"
},
{
"_id" : 1,
"name" : "mongoUbuntu:8003",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 987,
"optime" : Timestamp(1428501340, 1),
"optimeDate" : ISODate("2015-04-08T13:55:40Z"),
"lastHeartbeat" : ISODate("2015-04-08T14:48:56Z"),
"lastHeartbeatRecv" : ISODate("2015-04-08T14:48:56Z"),
"pingMs" : 0,
"syncingTo" : "mongoUbuntu:8001"
},
{
"_id" : 2,
"name" : "mongoUbuntu:8002",
"health" : 1,
"state" : 3,
"stateStr" : "RECOVERING",
"uptime" : 3142,
"optime" : Timestamp(1428498901, 1),
"optimeDate" : ISODate("2015-04-08T13:15:01Z"),
"infoMessage" : "still syncing, not yet to minValid optime 55252e9b:37",
"self" : true
},
{
"_id" : 3,
"name" : "mongoUbuntu:8001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 3139,
"optime" : Timestamp(1428501340, 1),
"optimeDate" : ISODate("2015-04-08T13:55:40Z"),
"lastHeartbeat" : ISODate("2015-04-08T14:48:56Z"),
"lastHeartbeatRecv" : ISODate("2015-04-08T14:48:56Z"),
"pingMs" : 0,
"electionTime" : Timestamp(1428503596, 1),
"electionDate" : ISODate("2015-04-08T14:33:16Z")
},
{
"_id" : 4,
"name" : "mongoUbuntu:8010",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 3139,
"lastHeartbeat" : ISODate("2015-04-08T14:48:56Z"),
"lastHeartbeatRecv" : ISODate("2015-04-08T14:48:55Z"),
"pingMs" : 0
}
],
"ok" : 1
}
PHP 脚本
当我终止当前主节点时,以下脚本正在运行(示例没有实际使用 GridFS,但直接执行查询。)
<?php
$conn = new \MongoClient(
'mongodb://mongoUbuntu:8001,mongoUbuntu:8002,mongoUbuntu:8003',
array('replicaSet' => 'rs1', 'readPreference' => \MongoClient::RP_PRIMARY_PREFERRED)
);
$db = $conn->bat; //db name: bat
$gridfs = $this->_db->getGridFS();
while(true) {
$documents = $db->execute('db.getCollection(\'fs.files\').count()');
echo $documents['retval']."\n";
sleep(1);
}
问题
在我终止当前主节点之前,脚本正在将文档计数打印到命令行。当我终止当前的主要(在各自的 mongod 命令行上按 Ctrl+C)时,php 脚本立即因为异常,在本例中为 MongoConnectionException No candidate servers found。
我用github的脚本创建了full debug log,并保存为Gist mongo-php-log-automaticfailover-fails。
我是否必须添加另一个选项来创建连接或复制集的配置?如果在 mongodb 文档或 mongodb php 驱动程序文档中有描述,我在哪里可以找到它?
【问题讨论】:
标签: php linux mongodb failover