MongoDB 複制集要求多數派 (Majority) 選舉 Primary。當節點數為偶數時,需部署 **Arbiter (仲裁節點)** 參與投票但不存儲數據,以最小資源成本保障高可用。本文記錄從雙節點改造為「雙節點 + 仲裁」的完整流程與驗證。
| 階段 | 節點配置 | 投票成員 | 故障轉移能力 |
|---|---|---|---|
| 初始 | PRIMARY (11:27017) + SECONDARY (12:27018) + SECONDARY (13:27019) | 3 | 正常 |
| 移除一節點 | PRIMARY (11:27017) + SECONDARY (12:27018) | 2 (偶數) | 失效 - Primary 掛掉無法選舉新 Primary |
| 加入 Arbiter | PRIMARY + SECONDARY + ARBITER (13:27019) | 3 (奇數) | 恢復正常 |
# 1. 建立資料目錄 (極小,僅存儲配置與投票狀態)
mkdir -p /var/lib/mongo/arbiter
chown mongod:mongod /var/lib/mongo/arbiter
# 2. 配置 mongod.conf
cat > /etc/mongod.conf <
# 1. 連線 Primary
mongo mongodb11.kk.net:27017
# 2. 加入仲裁節點
rs.addArb("mongodb13.kk.net:27019")
# 3. 驗證配置
rs.conf()
db.isMaster()
# 輸出應包含:
# "arbiters" : [ "mongodb13.kk.net:27019" ]
# "hosts" : [ "mongodb11.kk.net:27017", "mongodb12.kk.net:27018" ]
# 1. 模擬 Primary 進程掛掉
kill $(pgrep mongod) # 在 192.168.1.11
# 2. 連線 Secondary 觀察
mongo mongodb12.kk.net:27018
db.isMaster()
# 應顯示 "ismaster" : true,Primary 自動切換至 12:27018
# 3. 重啟原 Primary,觀察其降級為 Secondary
service mongod start # 在 192.168.1.11
db.isMaster() # 顯示 "secondary" : true
dbpath 僅佔用極少空間 (MB 級),無 .wt 數據檔。priority: 0 (預設),永遠不會成為 Primary。replSetGetStatus 中 stateStr、optimeDate 差距、electionId 變更頻率。keyFile 或 x.509 認證,配置 bindIp 限制存取來源。