從 MongoDB 5開始,三成員複寫集已經不支援PSA架構,如果一定想要架設也可以,下列三種方式都可以建立 PSA 複寫集,但注意衍生問題。
方法一
> use admin
> db.adminCommand({
'setDefaultRWConcern': 1,
'defaultWriteConcern': {
'w': 1
}
})
衍生問題:
1. 初始化為 Primary:20000、Secondary:20001、Arbiter:20002 2. 停掉 200001 3. 在 20000 插入一筆資料 {name: 'David'} 4. 停掉 20000 5. 啟動 200001,等他變為 Primary 6. 在 200001 插入一筆資料 {name: 'Tom'} 接下來分兩種狀況 狀況一: 7. 啟動 20000,此時 20000 為 Secondary 8. 查詢資料,兩筆資料只剩下 Tom,而 David 消失 狀況二: 7. 停掉 20001 8. 啟動 20000,等 20000 變成 Primary 9. 查詢資料,兩筆資料只剩下 David,而 Tom 消失
方法二
> use admin
> db.adminCommand({
'setDefaultRWConcern': 1,
'defaultWriteConcern': {
'w': 'majority'
}
})
衍生問題:
1. 初始化為 Primary:20000、Secondary:20001、Arbiter:20002 2. 停掉 20001 3. 在 20000 插入一筆資料 {name: 'David'} 4. 進入無限等待
方法三
> use admin
> db.adminCommand({
'setDefaultRWConcern': 1,
'defaultWriteConcern': {
'w': 'majority',
'wtimeout': 2000
}
})
衍生問題:
1. 初始化為 Primary:20000、Secondary:20001、Arbiter:20002 2. 停掉 20001 3. 在 20000 插入一筆資料 {name: 'David'} 4. 2000毫秒後收到確認,但高頻率寫入資料時將產生嚴重寫入延遲
建議方式
- 官方建議:至少五成員複寫集,也就是 PSSSA。
- 採PSA架構時,當Primary與Secondary都正常運作,使用方法二;當Primary或Secondary有任何一個故障,手動改方法一。