gpt4 book ai didi

php - 如何设置 PHP MongoDB 自动故障转移

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:51 25 4
gpt4 key购买 nike

当我的复制集的主服务器失败时,当前打开的连接也会立即失败(!)抛出 MongoConnectionException(No candidate servers found)或 MongoCursorException (mongoUbuntu:8004: Remote server has closed the connection) 当我使用 GridFS 时。这是错误还是我必须更改设置才能使自动故障转移正常工作?

安装

  • Linux ubuntu 内核 3.16.0-31-generic
  • PHP 5.5.12-2ubuntu4.3
  • pecl/mongo 1.6.6
  • 蒙戈2.6.3
  • 通过 cli 的 PHP
  • 服务器的主机名是 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 driver的文档中有描述,我在哪里可以找到它?

最佳答案

是的,驱动确实抛出了一个异常。从技术上讲,这是正确的做法,特别是如果您想知道集合何时发生故障转移。您需要做的是捕获异常并重试。

这里最大的问题是出于某种原因你正在评估。 Eval 需要仅在 master 上运行,因此当一个集合发生故障转移时,它必须等待选出的 master,这可能需要长达 10 秒的时间。

然而,似乎 eval 的这一方面实际上没有记录,尽管它被识别:https://dba.stackexchange.com/questions/75852/mongodb-replicaset-reconfig-when-primary-and-majority-dont-exist因为这个问题的回答者实际上是 10gen (MongoDB Inc),而且他似乎并不否认 eval 不适用于辅助数据库。不过,我相当确定这曾经出现在文档中,那是我第一次看到它的地方。

这在 Python 的 MongoDB 101 类(class)中有很好的解释。这同样适用于大多数语言。我个人只是在找到一个新的主节点之前不允许连接(但我不会评估这些东西),但如果你只是阅读,你可以删除评估并通过 PHP 执行此操作。这应该可以让您不受阻碍地阅读。

关于php - 如何设置 PHP MongoDB 自动故障转移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29518729/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com