Master-Slave 模式:主節點寫入,從節點非同步複製。優點是簡單易建立、自動同步;缺點是從節點無法自動升主 (需人工介入),且單主寫入擴展性有限。生產環境建議使用 Replica Set 取代。
# 建立資料目錄 mkdir master slave # 啟動主節點 (port 10000) mongod --dbpath E:\masterslave\master --port 10000 --master # 啟動從節點 (port 10001) mongod --dbpath E:\masterslave\slave --port 10001 --slave --source localhost:10000
需開啟兩個獨立命令視窗分別啟動。
mongo --port 10000use mydb.my.insert({name:"test"})mongo --port 10001use my; db.my.find() → 應出現同樣資料從節點唯讀,執行寫入操作將報錯。
複制機制核心:主節點將寫入操作記錄至 local.oplog.$main 集合,從節點輪詢並重放。
| 欄位 | 類型 | 說明 |
|---|---|---|
ts | Timestamp (8 bytes) | 4 bytes Unix 時間 + 4 bytes 遞增計數。選舉新 Primary 時選 ts 最大者。 |
op | char (1 byte) | 操作類型:i=insert, u=update, d=delete, c=cmd, n=no-op |
ns | string | 命名空間:database.collection |
o | document | 操作內容 (insert 為新文件,update 為修改後文件/$set 等) |
o2 | document | 僅 update 時存在:查詢條件 (where clause) |
// Insert
{ "ts": Timestamp(1387368754, 1), "op": "i", "ns": "my.my", "o": { "_id": ObjectId("..."), "name": "test" } }
// Delete
{ "ts": Timestamp(...), "op": "d", "ns": "my.my", "o": { "_id": ObjectId("...") } }
// Update
{ "ts": Timestamp(...), "op": "u", "ns": "my.my", "o": { "$set": { "age": 30 } }, "o2": { "_id": ObjectId("...") } }
Tab 鍵自動補全指令/集合名/欄位名db.my.updatefor(var i=0;i<3;i++){db.my.insert({name:"test",age:18})}支援自動故障轉移、多節點選舉、讀寫分離,是生產環境標準部署架構。