一個 副本集 被定義為由多個節點組成的資料庫叢集,並在它們之間配置了複製和自動容錯移轉。為了確保正確選出 PRIMARY 資料庫,副本集中必須擁有奇數個成員(包括或排除 Arbiter 節點)。
選定的資料庫負責所有主要任務。它處理傳入的寫入操作,並將其資訊儲存在 oplog 中。SECONDARY 副本成員可以存取並複製此資訊,以套用到它們自己的資料集中。因此,集合中的所有伺服器都將呈現相同的內容並確保其可用性:

現在考慮一種情況:非預期的問題(如硬體或連線故障)導致主資料庫發生停機。在這種情況下,系統將自動開始新的選舉程序,以恢復正常運作,而無需任何手動干預。這種系統的好處是您可以獲得 複製,例如提高可用性、容錯移轉備援和災難復原,而無需擔心單獨管理多個資料庫。
如果您想採用類似的系統,本教學將向您展示如何使用 CloudSigma PaaS 設定 MongoDB 副本集。正如您將在本指南中看到的,我們將使用三個成員,這通常足以提供良好的資訊安全邊際和產出,以處理大多數常見應用程式的 I/O 操作。除了複製的實際配置之外,我們還將學習如何準備環境、在資料庫節點之間設定驗證,以及如何確保您的工作已成功完成。
步驟 1:建立新環境
首先,您至少需要 3 個 MongoDB 節點才能開始設定副本集。因此,請繼續建立一個 新環境,步驟如下:

在我們的範例中,我們將所有 4.0.2 版本的 MongoDB 執行個體分配到同一個環境中。如果需要,您可以在指定的空間中變更 環境名稱 並繼續安裝程序。
該程序的下一步將是使用驗證金鑰檔案來處理這些節點之間通訊的安全問題。
步驟 2:新增驗證金鑰檔案
驗證是任何複製的關鍵組成部分。這是一個安全性保證程序,只有在副本集成員使用唯一的驗證金鑰檔案正確識別自身身分後,才允許其存取。這可以保護您的資料免受不必要的旁觀者和第三方的侵害。以下是產生您自己的驗證金鑰檔案的方法:
- 按一下其中一個資料庫節點的 Web SSH 選項並登入:

2. 接下來,您可以輸入自己的金鑰檔案,或使用 openssl 透過以下指令產生一個新檔案:
|
1 |
openssl rand -base64 741 > my.key |
在此指令中,741 代表以位元組為單位的金鑰大小,而 my.key 是金鑰的名稱。
3. 是時候將新的金鑰檔案分發到您所有的 MongoDB 執行個體了。以下是操作方法:
- 開啟 檔案管理員,方法是按一下 Config 按鈕(位於任何一個資料庫節點旁邊):

- 在設定索引標籤中的以下路徑下找到 my.key 檔案: /home/jelastic/my.key。開啟它並複製檔案內容:

- 在路徑 /var/lib/jelastic/keys 下,您會找到 keys 目錄。建立一個 新檔案,MongoDB 執行個體將利用該檔案來驗證彼此的身分。在我們的範例中,我們將建立一個名為 mongo-set.key:

- 將先前複製的內容貼到此檔案中,然後按一下 儲存 以套用到所有執行個體:

此程序的結果是, mongo-set.key 檔案已分發到我們所有的 MongoDB 節點。
步驟 3:設定 MongoDB 複製
現在我們已經確保了執行個體的安全性,接下來可以開始實際設定副本集。讓我們開始吧:
- 首先前往 MongoDB 節點的設定索引標籤,然後開啟 mongo.conf 檔案,位於 etc 資料夾。向下滾動,直到找到 replication 區段。取消註解並新增以下字串,為您的複本集命名一個唯一的名稱。在我們的範例中,我們將其命名為 db-replication:
|
1 |
replSetName: db-replication |

3. 按一下對應的按鈕以 Save the changes for all instances in the editor window.
4. 現在您必須 Restart all of your DB nodes to apply the new configuration parameters:

需要注意的是,當您完成複本集設定並重新啟動所有節點或 PRIMARY 節點時,新的 PRIMARY 資料庫選舉程序將在重新啟動期間開始。
5. 選擇您要用作 PRIMARY 的 MongoDB 伺服器,並使用 SSH 協定存取它:

請記住:一旦選出 PRIMARY 資料庫,其他複本集成員將無法再進行直接寫入操作。這意味著所有變更和設定只能在目前的 PRIMARY 節點上執行和套用。因此,除非您已安排 priorities,否則您必須將應用程式中的連線字串變更為新的 PRIMARY 節點。
6. 接下來,使用您對應的憑證存取複製品資料庫:
|
1 |
mongo -u {user} -p {password} {DB_name} |

在此命令中:
- {user} –指的是將發送到您電子郵件的管理員使用者名稱(預設通常為 admin)。
- {password} –這是與對應使用者名稱一起發送到您電子郵件的密碼。
- {DB_name}- 代表您希望在此複本集中複製的資料庫名稱(在我們的範例中,我們使用預設的 admin)。
在新選舉的情況下,您可以使用相同的 admin 使用者憑證登入新的 PRIMARY 資料庫。
7. 連線建立後,您需要執行以下行來定義目前 MongoDB 節點的參數並初始化複本集:
|
1 2 3 4 5 |
config = {_id : "{replica_set}", members : [{_id : 0, host:"{current_db_ip}:27017"},]} rs.initiate() |
在上述行中,您將用您自己的對應資料替換括號中的值:
- {replica_set} – 這是您在本節開始時指定的複製資料庫群組名稱。在我們的案例中,這是 db-replication。
- {current_db_ip} – 表示您選擇的資料庫容器的 IP 地址:

在我們的案例中,執行的行是:
|
1 2 |
config = {_id : "db-replication", members : [{_id : 0, host:"10.100.2.182:27017"},]} |

|
1 |
rs.initiate() |

8. 接下來,對所有其餘資料庫執行以下命令:
|
1 |
rs.add("{db_ip}:27017") |
這裡, {db_ip} 指的是每個資料庫的 IP 地址:

9. 新增所有複製成員後,您將獲得一個功能齊全的複本集。我們建議在程序結束時確保一切都已正確設定。為此,請執行以下命令: rs.status()。這將顯示有關您複本集的完整資訊,如下所示:

步驟 4:設定 ReplicaSet 仲裁者
我們建議在某些情況下使用 Arbiter 節點。什麼是 Arbiter 節點?通常,如果複本集包含奇數個節點,則複製會更可靠。因此,如果您目前集合中的節點數為偶數,您可以新增一個 Arbiter 節點以維持法定人數,因為它會回應集合中其他成員的心跳和選舉請求。以下是關於 Arbiter 節點的一些詳細資訊:
- 仲裁者 (Arbiter) 不儲存任何資料;它只在其他節點發生故障時參與選舉投票。
- 它非常輕量,不會消耗太多資源。
- 它在加密的副本之間交換使用者憑證。
- 為了保持最高的可用性,請嘗試在獨立的節點上執行仲裁者。
以下是如何將仲裁者節點新增至您的副本集:
- 首先,我們將進行一些水平擴展,並向叢集新增一個額外的節點:


2. 新增節點後,我們需要一個新的金鑰檔案。請前往 keys 目錄並建立一個金鑰檔案 mongo-set.key。從先前設定的任何資料庫節點複製金鑰內容,並像我們之前那樣全部貼到這裡。
3. 前往 mongod.conf 設定檔。取消註解 replication 區段並新增 repISetName(在我們的範例中為 db-replication)。此外,請前往 security 區段並新增 keyFile 參數(在我們的範例中為 /var/lib/jelastic/keys/mongo-set.key)。
4. 最後,重新啟動新節點以套用這些新的設定參數:

請務必記住,此時您不需要重新啟動叢集中的所有節點。只需重新啟動新新增的仲裁者節點。重新啟動所有節點將導致重新選舉主節點 (PRIMARY)(除非您已指定優先級以選擇特定的資料庫節點作為 PRIMARY)。
5. 最後,可以將仲裁者新增至副本集中。為此,請在主節點 (PRIMARY) 執行以下指令:
|
1 |
rs.addArb("{db_ip}:27017") |
這裡, {db_ip} 是新節點的 IP 地址:

6. 現在,您可以檢查並確認新節點是否已成為仲裁者。您可以透過 SSH 登入新節點,並使用您在建立節點時於電子郵件中收到的憑證連線至 MongoDB 執行個體:

這顯示我們剛剛新增到叢集的新節點正作為 db-replication 的仲裁者。這確保了在任何情況下都能達到法定人數,使副本集更加可靠。
步驟 5:測試資料庫叢集可用性
接下來,我們可以設定我們的 MongoDB 叢集以進行遠端連線和操作。在以下範例中,我們將使用一個簡單的 PHP 小程式來連線並執行一些檢查指令。
為此,您需要一個應用程式伺服器,例如 Apache。您可以像我們一樣將其新增到您的環境中,或者在獨立的環境中建立一個新的伺服器。
- 首先點擊 Change Environment Topology 並新增伺服器:


2. 開啟 Configuration Manager 分頁,針對 Apache 伺服器,點擊 Config 按鈕,如下所示:

3. 尋找並開啟 index.php 檔案,位於 /var/www/webroot/ROOT 目錄中,並貼上以下程式碼以取代預設內容:
|
1 |
<!--?php try{ $mongodbConnectionURI= "mongodb://{db_username}:{db_password}@node{NodeID}-{environment_domain}:27017, node{NodeID}-{environment_domain}:27017,node{NodeID}-{environment_domain}:27017,node{NodeID}-{environment_domain}:27017/?replicaSet={replica_set_name}&readPreference=primary"; $manager = new MongoDB\Driver\Manager($mongodbConnectionURI); $command = new MongoDB\Driver\Command(['ping' => 1]); $cursor = $manager->executeCommand('db', $command); $response = $cursor->toArray()[0]; var_dump($response); echo'<br><br>'; var_dump($manager->getServers()); } catch (Exception $e){ echo $e->getMessage(); } ?--> |
上述程式碼中的以下值需要替換為您相應的數據:
- {replica_set_name} – 輸入您的副本集名稱。
- {db_username} – 新增所選主資料庫的管理員使用者(預設為 admin)。
- {db_password} – 輸入管理員使用者的密碼。
- {NodeID} – 填入對應節點的識別碼。您可以在以下位置找到此資訊:CloudSigma PaaS dashboard.
- {environment_domain} – 新增環境網域。您也可以在 CloudSigma PaaS 儀表板上找到此資訊:

請確保在適當的 mongodbConnectionURI 區段中指定您副本集中每個節點的 ID。
輸入對應的值並執行程式碼將會顯示一組類似以下的字串:

請確保您在此時儲存 檔案!
4. 為了讓 Apache 與 MongoDB 伺服器進行互動,它需要一個特殊的模組。您可以在以下位置新增此模組:configs。前往 etc 資料夾並開啟 php.ini 檔案。找到 [mongodb] 區段。在這裡,您只需要移除 之前的分號extension=mongodb.so 行以啟用此擴充功能:

5. 按一下編輯器視窗中的 儲存 以套用新設定。與往常一樣,我們需要重新啟動節點以套用變更。按一下 重新啟動節點 按鈕,位於 Application Server 旁邊:

6. 現在按一下 在瀏覽器中開啟 按鈕來進行測試:

點擊此圖示將開啟一個新的瀏覽器分頁,其中將顯示有關您副本集成員/節點及其可存取性的所有資訊,如下所示:

由於我們使用了 指令 ping ( 的第 6 行 index.php ),第一行顯示檢查副本集可用性的結果:
|
1 |
object(stdClass)#11 (3) { ["ok"]=> float(1) } |
這意味著副本集已成功測試。
結果中的下一個區塊顯示有關副本集主機的詳細資訊。此數據是透過 函數取得的 getServers ( 的第 11 行 index.php)。同樣地,您也可以檢查在建立此副本集過程中分配的一些值:
- host – 特定資料庫的 IP 地址。
- port – 這是目前複製成員的連接埠。
- [“is_primary”] 和 [“is_secondary”] – 指示伺服器狀態的參數。所選主 MongoDB 伺服器的對應值分別為 true、false,而其他兩個 MongoDB 伺服器則分別為 – false、true。
此外,您可以隨時啟動和停止資料庫節點以追蹤變更。您也可以重新整理頁面來執行相同操作。這使您能夠確保您的 MongoDB 叢集始終可用、正常運行,並按照您的配置運作。
CloudSigma PaaS 允許其使用者利用使用副本集的好處,而無需過多擔心設定和後端方面的問題。本教學展示了只需幾個簡單的步驟,即可輕鬆設定您專屬的 MongoDB 叢集。您可以深入了解 MongoDB、如何為 Ubuntu 進行設定 或 公有雲伺服器,以及 CloudSigma PaaS 所提供的其他進階功能。我們也歡迎您進行試用 免費的 PaaS,以熟悉 dashboard 和 marketplace 及其提供的功能。
留言
目前尚無留言。成為第一個留言的人吧。