springboot based 主從資料來源中介軟體方案
先定幾個原則/目標:
原則:
1.必須保證資料邏輯的一致性;
反例:剛寫了資料,(因為主從延遲)查詢不到;
2.對開發人員透明,對業務程式碼無侵入性;與單資料來源的業務程式碼呼叫一致;
反例:對已有業務程式碼的侵入式改動,顯示說明datasource;
3.根據呼叫場景自動選擇主從資料來源
場景:涉及寫入,讀寫都在主庫進行。只涉及查詢,從庫查詢
反例:
3.1寫事務呼叫從庫
3.2非必要的從主庫查詢
4.給業務開發選擇的權利,可以以最低成本的方式顯示進行資料來源(類別)選擇(如annotation等);
場景:只涉及查詢,但是業務需要,必須從主庫查詢;
5.主從資料來源共存,與單資料來源方案,可以無縫切換
擴充套件目標:
6.低成本的資料來源切換執行緒安全
反例:全域性悲觀鎖,同步鎖實現
7.支援多個從庫/從庫HA
8.主資料庫不可用,從庫自動頂上
9.程式碼級別上,採用spring boot starter方案
不考慮場景:
sharding 目前不考慮,如果需要,作單獨專題展開。
備忘問題:
傳播級別:
呼叫者上下文顯示說明MASTER,被呼叫者顯示說明SLAVE; 或反過來,需要一個合理的切換機制/或者不切換;
傳播性可以做如下規則:
1.如果外層為master,則內層不管原先級別,都將提升至master級別;
2.級別只升不降
3. 同一個執行緒,如果不切換主從,同一分類的機器,(主要是指多個slave )例項也不切換
4.更多的呼叫層級,直接遞推即可(傳播);
case:
- master → slave => master → master
- master → master => master → master
- slave → master => slave → master
- slave → slave => slave → slave
Master/Slave 切換場景的幾種設定:
預設Slave(效能優先) | 預設Master(開發效率優先) | 如果呼叫者未顯示說明@Master/Slave,根據事務狀態自主選擇主從; 不在傳播鏈中生成@Master/Slave |
如果呼叫者未顯示說明@Master/Slave,根據事務狀態自主選擇主從; 在傳播鏈中生成@Master/Slave |
|
---|---|---|---|---|
優點 | 1.分擔主庫負擔 2.儘可能利用從庫,從庫只讀,HA成本低 |
1.現有程式碼無任何改動可正常執行
|
1.使用者完全控制,截斷了隱性的@Master 2.更多的@Slave場景機會 |
1.整個傳播鏈行為一致,使得整個資料行為更一致; |
缺點 | 所有現有的服務,涉及到寫或者必須連master的場景,必須顯示標明@Master; 否則會有兩種情況: 1.涉及寫入的時候會預設連線到只讀從庫,程式會報錯; 2. 非寫入動作,但可能有資料讀取的延時性問題 |
1.需要顯示標明@Slave,才能連線從庫 2.從庫利用率會較低 |
1.有可能業務邏輯的不一致; 例子: a.不標明@Master/Slave 的呼叫上下文先執行了 寫操作; b.然後呼叫了@Slave 的讀操作服務; a步驟寫入的資料,有可能在b操作中讀取不出來
這種場景,當然可以通過顯示標明呼叫者為
|
1.對事務的狀態判斷,並不能單方面很好的決定是否選擇主從,所以一般會選擇主庫;(TODO:看是否能更好優化) 2.為了程式執行邏輯不出異常的情況下,而大多選擇了@Master,那麼接下來的級別都會是@Master,@Slave 的場景會非常少,從庫利用率會很低 |