1. 需求場景
因業務線越做越大,需要將數據庫進行拆分隔離。因此梳理已有的十餘個服務,需要進行兩種方式的拆分。一種是整個服務的數據源全量遷移,一種是服務中庫表需部分遷移,需做雙數據源。
接着分析發現需做雙數據源的服務屬於基礎服務,更新不會很頻繁,因此做靜態上線——即配置雙數據源。dba做表全量遷移,之後服務發佈上線。需要數據源全量遷移的服務屬於實時要求高的服務,訪問量高,不可停機維護。因此採用熱切換。
2. 前期準備
1. 代碼部分: 使用Spring提供的AbstractRoutingDataSource類,進行對當前數據源的監聽。另外新寫切面判斷apollo開關是否開啓,如開啓則使用新數據源。
需要注意,部分註解會使AbstractRoutingDataSource的動態數據源監聽失效,如@Transaction註解。因爲事務註解的執行順序優先於自己建的切換數據源的切面,此時需要配置order順序保證數據源切換優先執行。
2. dba準備: 在切換的前五分鐘做好從老庫到新庫的雙寫,保證新庫數據的同步性。在切換後做老庫和新庫流量的監控。
3. no bb, show me code
git地址: https://github.com/bkxpao/datasource-switch
目前線上已成功熱切換, 求star :)