承接上一篇理論基礎,本文將詳細記錄 MongoDB 3.0.1 在 CentOS 6.5 環境下,三節點複製集的完整搭建、初始化與故障切換測試過程。所有操作均在單機多端口模式下進行,生產環境請部署於不同物理機或虛擬機。
/data/mongodb3.0.1/data//data/mongodb3.0.1/db_50144//data/mongodb3.0.1/db_60144/使用 --replSet 參數指定複製集名稱及種子節點,--fork 後台運行,--logappend 日誌追加模式。關鍵參數說明:
| 參數 | 用途 |
|---|---|
--oplogSize | 操作日誌大小(默認磁盤剩餘 5%) |
--dbpath | 數據文件路徑 |
--logpath | 日誌文件路徑 |
--port | 服務端口(默認 27017) |
--replSet | 格式:複製集名/種子節點IP:端口 |
--maxConns | 最大連接數 |
--directoryperdb | 每個數據庫獨立目錄 |
# 節點 1 /usr/local/mongodb3.0.1/bin/mongod --port 40144 \ --dbpath=/data/mongodb3.0.1/data/ \ --logpath=/data/mongodb3.0.1/log/mongodb.log \ --directoryperdb --maxConns 100 --logappend \ --replSet repl/192.168.66.89:50144 --fork # 節點 2 /usr/local/mongodb3.0.1/bin/mongod --port 50144 \ --dbpath=/data/mongodb3.0.1/db_50144/ \ --logpath=/data/mongodb3.0.1/db_50144/mongodb.log \ --directoryperdb --maxConns 100 --logappend \ --replSet repl/192.168.66.89:40144 --fork # 節點 3 /usr/local/mongodb3.0.1/bin/mongod --port 60144 \ --dbpath=/data/mongodb3.0.1/db_60144/ \ --logpath=/data/mongodb3.0.1/db_60144/mongodb.log \ --directoryperdb --maxConns 100 --logappend \ --replSet repl/192.168.66.89:40144 --fork
任選一個節點(此處連接 40144)進入 Shell,切換到 admin 數據庫並執行 replSetInitiate 命令。注意 _id: "repl" 必須與啟動參數 --replSet repl 完全一致。
> use admin
switched to db admin
> db.runCommand({
"replSetInitiate": {
"_id": "repl",
"members": [
{"_id": 1, "host": "192.168.66.89:40144"},
{"_id": 2, "host": "192.168.66.89:50144"},
{"_id": 3, "host": "192.168.66.89:60144"}
]
}
})
{ "ok" : 1 }
執行 db._adminCommand("replSetGetStatus") 可見:節點 1 當選 Primary(stateStr: "PRIMARY"),節點 2、3 為 Secondary(stateStr: "SECONDARY"),健康值均為 1,複製集已正常形成。
repl:PRIMARY> use mtdamai
repl:PRIMARY> db.user.insert({name:"wangxiuli"})
WriteResult({ "nInserted" : 1 })
# 從節點需開啟讀取權限
repl:SECONDARY> rs.slaveOk()
repl:SECONDARY> db.user.find()
{ "_id" : ObjectId("..."), "name" : "wangxiuli" }
數據已自動同步至 Secondary,驗證複製功能正常。
停止 Port 40144 進程,再次執行 rs.status():
(not reachable/healthy)向新 Primary 寫入數據,再驗證 Secondary 可讀,確認故障切換無縫完成。
重新啟動 Port 40144 實例,該節點自動加入集群並成為 Secondary,通過 rs.status() 可見其 syncingTo 指向當前 Primary,數據已追平。
--replSet 後列出至少兩個節點,防單點故障。--oplogSize,避免 Secondary 落後過多需全量重同步。readPreference: secondaryPreferred),寫操作必須發送給 Primary。至此,MongoDB 複製集從搭建、初始化到故障演練全流程驗證通過,可作為生產環境部署參考依據。