所以我跟踪了一个关于副本集中故障转移的严重问题。
为具有一个主服务器,一个从服务器和一个仲裁服务器的集群构建图片。我们使用连接字符串:
mongodb://admin:pass@slave,master
当两个主机都启动时,显然一切都很好,但是当我开始尝试关闭节点并将其重新启动时,会产生意外行为。
让我说我取下主人,奴隶然后被提升并成为新的主人,然后php驱动程序连接到新的主人(唯一的节点),这是预期的,这很棒......现在。
所以现在让我们取下新的主人,并带回老主人。将旧主服务器重新分配给主服务器角色,现在它是群集中唯一的节点。现在php驱动程序呈现完全无法运行。它根本不会连接到群集中的任何节点,即使此时已启动。我想可能重新启动另一个节点(从而将群集中的所有节点恢复到上升位置)可以缓解问题 - 但事实并非如此。所以现在我有一个100%启动并运行的集群,但php驱动程序无法连接,它给出了错误:
No candidate servers found
刷新100次不会解决这个问题,我找到的唯一解决方案是重启php-fpm。重新启动php-fpm后,立即开始连接(直到我重复测试十次,希望结果不同)。
因此,对我来说,当具有活动连接的节点发生故障时,持久连接无法正常关闭/刷新这一问题一定是个问题。所以在我看来(请注意,这是我根据我所观察到的闲置猜测),在两个节点都关闭然后重新启动的情况下,mongo驱动程序仍然保持连接已经死亡,当节点重新联机时,它不会尝试删除和重新创建连接。
这很糟糕,它破坏了我们决定首先使用mongo副本集的最大原因之一(持续运行时间)。
我使用的是MongoDB版本2.4.5,php驱动程序版本1.4.3和php-fpm版本5.4.9。
知道如何解决这个问题吗?我真的不希望每次节点发生故障时都要重启php-fpm,但如果这是唯一的方法,我将不得不配置某种类型的运行状况监视器来自动触发php-fpm重启 - 但同样,我宁愿不必这样做。
由于