簡體   English   中英

當輔助節點無法訪問時,在 PHP 中連接到 MongoDB 副本集需要一分鍾以上

[英]Connection to MongoDB replica set takes a minute+ in PHP when a secondary is unreachable

我有一個由 5 個成員組成的副本集:服務器 1 上的主+仲裁器,服務器 2 上的輔助+仲裁器,服務器 3 上的隱藏輔助(備份節點)。如果一台服務器出現故障或暫時失去連接,我希望此配置能夠工作。

但是,當服務器 2 出現故障(帶有輔助節點+仲裁節點的服務器)時,我遇到了一個奇怪的問題。 從 PHP 到副本集的任何連接都需要一分鍾以上的時間。 我嘗試修改連接字符串以從中排除已關閉的服務器(輔助節點),但沒有幫助。

同時通過 mongo 控制台連接工作得很好。 主節點仍然是主節點。 PHP 錯誤日志不包含任何錯誤。

唯一有幫助的是從副本集中刪除服務器上的節點。

但是,我現在擔心配置的故障轉移。 正如我現在意識到的,如果帶有輔助+仲裁節點的服務器宕機,整個配置將停止正常工作。 有什么辦法可以避免嗎? 無論輔助+仲裁服務器是否可用,我都需要 PHP 客戶端能夠連接到主服務器。 如何做到這一點?

mongo PHP 客戶端庫版本為 1.6.x,服務器版本為 3.0。

如果服務器 2 出現故障,您的配置將不起作用。 你的副本集有 3 個投票節點,其中兩個在服務器 2 上。如果服務器 2 宕機,該集有 1/3 的成員,因此無法維護或選舉主節點。 你需要 2/3 的人能夠互相交談來選舉一個主要的。

您對問題的描述與副本集的行為方式不一致 - 當 2/3 關閉時通過 shell 連接到主節點不會顯示主節點剩余的主節點。 它將降級為次要。 你確定你有正確的症狀嗎?

只是想知道您的連接字符串是什么樣的。

根據我的經驗,這樣的事情適用於副本集配置:

$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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM