10

我有一个由 5 个成员组成的副本集:服务器 1 上的主 + 仲裁器,服务器 2 上的辅助 + 仲裁器,服务器 3 上的隐藏辅助(备份节点)。如果一台服务器出现故障或暂时失去连接,我希望此配置能够工作。

但是,当服务器 2 关闭时(具有辅助 + 仲裁节点的服务器),我遇到了一个奇怪的问题。从 PHP 到副本集的任何连接都需要一分钟多的时间。我尝试修改连接字符串以从中排除已关闭的服务器(辅助节点),但它没有帮助。

同时通过 mongo 控制台连接工作得很好。主节点仍然是主节点。PHP 错误日志不包含任何错误。

唯一有帮助的是从副本集中删除服务器上的节点。

但是,我现在担心配置的故障转移。正如我现在意识到的那样,如果具有辅助+仲裁节点的服务器出现故障,整个配置将停止正常工作。有什么办法可以避免吗?无论辅助+仲裁服务器是否可用,我都需要 PHP 客户端能够连接到主服务器。如何做到这一点?

mongo PHP客户端库版本为1.6.x,服务器版本为3.0。

4

2 回答 2

1

如果服务器 2 出现故障,您的配置将不起作用。您的副本集有 3 个投票节点,其中两个在服务器 2 上。如果服务器 2 宕机,该副本集有 1/3 的成员,因此无法维护或选举主节点。您需要 2/3 能够相互交谈才能选出主要成员。

您对问题的描述与副本集的行为方式不一致 - 当 2/3 关闭时通过 shell 连接到主节点不会显示主节点剩余的主节点。它将降级为次要。你确定你有正确的症状吗?

于 2015-04-29T15:24:11.580 回答
1

只是想知道您的连接字符串是什么样的。

根据我的经验,这样的事情适用于副本集配置:

$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017");

但是当 rs2 出现故障时,我会有与您描述的类似的经历。您可能需要确保使用正确的连接字符串格式:

$m = new MongoClient("mongodb://rs1.example.com:27017", array("replicaSet" => "myReplSetName"));

或者

$m = new MongoClient("mongodb://rs1.example.com:27017,rs2.example.com:27017/?replicaSet=myReplSetName");

于 2015-05-08T04:14:42.950 回答