1. 程式人生 > >springboot based 主從資料來源中介軟體方案

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操作中讀取不出來

 

這種場景,當然可以通過顯示標明呼叫者為
@Master 來規避;

 

1.對事務的狀態判斷,並不能單方面很好的決定是否選擇主從,所以一般會選擇主庫;(TODO:看是否能更好優化)

2.為了程式執行邏輯不出異常的情況下,而大多選擇了@Master,那麼接下來的級別都會是@Master,@Slave 的場景會非常少,從庫利用率會很低