架構出 PSA 複寫集

psa

從 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有任何一個故障,手動改方法一。

發表迴響