文章目錄
- 1 環境假設
- 步驟1:在兩臺服務器上安裝MongoDB
- 步驟2:配置副本集
- 步驟3:初始化副本集
- 步驟4:驗證副本集配置
- 步驟5:設置安全性(可選)
- 擴展
- 配置示例:
- 最佳實踐:
- 仲裁節點
- 步驟1:在一臺服務器上安裝MongoDB(仲裁節點)
- 步驟2:將仲裁節點加入副本集
- 步驟3:驗證仲裁節點的功能
- 總結
1 環境假設
- 服務器1:
server1
(IP:192.168.1.100
) - 服務器2:
server2
(IP:192.168.1.101
) - MongoDB版本:
4.x
(可以根據需要選擇其他版本)
步驟1:在兩臺服務器上安裝MongoDB
-
配置YUM源
在每臺服務器上添加MongoDB的YUM源。編輯
/etc/yum.repos.d/mongodb.repo
文件,內容如下:[mongodb-org-7.0]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/7.0/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/static/pgp/server-7.0.asc
如果是其他Linux發行版,請根據系統版本選擇合適的源。
-
安裝MongoDB
安裝MongoDB的相關包:
sudo yum install -y mongodb-org
-
啟動MongoDB服務
啟動MongoDB服務并設置為開機啟動:
sudo systemctl start mongod sudo systemctl enable mongod
-
驗證安裝
使用以下命令檢查MongoDB是否正常運行:
sudo systemctl status mongod
或使用
mongo
客戶端連接到MongoDB實例,確認是否可以連接。
步驟2:配置副本集
-
配置
mongod.conf
在每臺服務器上編輯MongoDB的配置文件
/etc/mongod.conf
,啟用副本集配置。修改如下:replication:replSetName: rs0
rs0
是副本集的名字,你可以根據需要修改。 -
開放端口
確保MongoDB端口(默認是
27017
)在防火墻中開放。你可以使用以下命令來開放該端口:sudo firewall-cmd --zone=public --add-port=27017/tcp --permanent sudo firewall-cmd --reload
-
啟動MongoDB
啟動或重新啟動MongoDB使配置生效:
sudo systemctl restart mongod
-
檢查MongoDB日志
檢查
mongod
日志(/var/log/mongodb/mongod.log
)確認是否有錯誤。
步驟3:初始化副本集
-
連接到MongoDB實例
在
server1
上,使用mongo
客戶端連接到MongoDB:mongo --host 192.168.1.100
-
初始化副本集
在MongoDB shell中運行以下命令來初始化副本集:
rs.initiate()
你應該會看到類似以下輸出:
{"info2" : "no configuration has been given yet","me" : "192.168.1.100:27017","ok" : 1 }
-
添加副本集成員
之后,向副本集中添加第二臺服務器
server2
:rs.add("192.168.1.101:27017")
運行以下命令檢查副本集狀態:
rs.status()
如果一切正常,你應該會看到兩個成員(
server1
和server2
)都已經加入副本集。
步驟4:驗證副本集配置
-
查看副本集狀態
使用以下命令查看副本集的狀態,確保兩個節點都在運行:
mongo --host 192.168.1.100
在Mongo shell中運行:
rs.status()
-
進行數據寫入測試
在主節點上插入數據并檢查是否同步到從節點:
use test db.testCollection.insert({name: "test"})
你可以在從節點上驗證該數據是否已同步。
步驟5:設置安全性(可選)
為了確保MongoDB副本集的安全性,可以啟用身份驗證和加密。你可以在配置文件中啟用auth
選項并創建管理員用戶。
編輯/etc/mongod.conf
文件,添加:
security:authorization: "enabled"
然后在主節點上創建管理員用戶:
mongo --host 192.168.1.100
use admin
db.createUser({user: "admin",pwd: "adminpassword",roles: [{ role: "root", db: "admin" }]
})
這樣,其他成員在加入副本集時需要提供管理員的用戶名和密碼。
擴展
MongoDB副本集的最低配置需要 3臺服務器。雖然可以在2臺服務器上搭建副本集,但為了確保高可用性和避免“腦裂”(split-brain)問題,3臺服務器是推薦的配置。
具體原因如下:
-
選舉機制:MongoDB副本集需要一個“選舉”機制來決定哪個節點作為主節點。如果只有2個節點,出現網絡分區時,這兩個節點可能無法達成一致,從而導致副本集無法正常工作。
-
高可用性:3個節點可以確保即使1個節點出現故障,副本集依然可以正常工作。在3個節點的配置中,如果其中1個節點宕機,另一個節點可以通過選舉成為新的主節點,保證系統的高可用性。
-
仲裁節點:如果你有2個數據節點,可以增加一個仲裁節點(Arbiter),這個節點只參與選舉,不保存數據。這樣可以避免“腦裂”問題,同時仍然保持副本集的選舉功能。仲裁節點不需要存儲數據,只要保證選舉時可以參與投票。
配置示例:
- 2個數據節點(
primary
和secondary
) - 1個仲裁節點(
arbiter
)
這樣配置可以確保副本集有3個投票節點,但不需要額外的存儲負擔。
最佳實踐:
- 3個數據節點 + 1個仲裁節點 是一個常見的高可用副本集配置。
- 4個數據節點 可以提供更強的故障恢復能力,但通常會增加管理和維護的復雜性。
總之,雖然最少可以配置2個節點,但為了確保高可用性和防止“腦裂”,建議使用3個節點。
仲裁節點
是的,仲裁節點(Arbiter)在搭建過程中的配置與數據節點相似,但它有一些特別的配置,主要是為了參與副本集選舉而不存儲數據。以下是如何在MongoDB副本集中設置仲裁節點的步驟:
步驟1:在一臺服務器上安裝MongoDB(仲裁節點)
你可以選擇在已經有的服務器上安裝MongoDB,或者在另一臺新服務器上安裝。這里假設你已經安裝了MongoDB,并且副本集已經創建了2個數據節點。
-
安裝MongoDB(如果尚未安裝)
在仲裁節點服務器上,按照之前的步驟使用YUM安裝MongoDB:
sudo yum install -y mongodb-org
-
配置
mongod.conf
在仲裁節點的MongoDB配置文件
/etc/mongod.conf
中,進行如下配置:replication:replSetName: rs0 # 確保與副本集名稱一致 security:authorization: "enabled" # 可選:啟用認證
-
啟動MongoDB
啟動MongoDB服務并設置為開機啟動:
sudo systemctl start mongod sudo systemctl enable mongod
-
檢查MongoDB狀態
確保MongoDB服務正常運行:
sudo systemctl status mongod
步驟2:將仲裁節點加入副本集
-
連接到一個數據節點
使用
mongo
命令連接到你的主節點(假設主節點IP是192.168.1.100
):mongo --host 192.168.1.100
-
添加仲裁節點
在Mongo shell中運行以下命令,將仲裁節點加入副本集:
rs.addArb("192.168.1.102:27017") // 假設仲裁節點的IP是192.168.1.102
這樣,MongoDB將會把
192.168.1.102
添加為仲裁節點。 -
驗證副本集狀態
運行以下命令檢查副本集狀態,確保仲裁節點已加入并且狀態正常:
rs.status()
在輸出中,你應該會看到仲裁節點的狀態類似于以下:
{"host" : "192.168.1.102:27017","arbiterOnly" : true,"stateStr" : "ARBITER","state" : 7,"uptime" : 100 }
步驟3:驗證仲裁節點的功能
-
測試選舉功能
你可以通過在主節點上停止
mongod
服務來模擬節點故障。然后檢查副本集是否能自動選舉新的主節點。如果有仲裁節點,副本集應該能夠正常進行選舉,保證系統的高可用性。 -
驗證數據同步
仲裁節點不存儲數據,它只是參與選舉過程,因此你不需要驗證數據同步。你只需要驗證它是否正確參與選舉并保持副本集的健康狀態。
總結
- 仲裁節點的搭建和數據節點類似,唯一的區別是仲裁節點配置不存儲數據,且配置文件中不需要啟用數據存儲的設置。
- 使用
rs.addArb()
將仲裁節點添加到副本集中,不需要額外的數據同步過程。 - 仲裁節點的作用是保證選舉過程的順利進行,確保即使在數據節點故障時,副本集仍然能夠正常選舉出新的主節點。
對于測試環境,如果你有2個數據節點,可以使用1個仲裁節點來模擬高可用性,而不需要額外的數據存儲。