大型互聯網系統數據庫切換方案
前言
互聯網公司中,有不少大型系統,如商城的價格系統,優惠券系統,等等。這些系統在一年又一年的運營之后,數據存儲量將相當龐大,我們最終會做一些數據庫方面的升級,簡單粗暴的方法就是切庫,以滿足更多的數據庫存儲空間、更好的數據讀取性能。
然而切庫的操作,對于系統而言,無異于換血操作,是一件相當危險的操作,那么如何平穩,或者說損失最小的情況下,將系統的數據庫進行切換呢?這就是本文要分享的內容了。
需求
很多情況下,我們可以通過對系統進行優化就能滿足系統的性能要求的情況下,我們是不會選擇切庫這個方案的。筆者經歷的切庫情況,有以下兩種:
數據庫中間件
- 原先的數據庫使用的是通過Docker安裝的MySQL,切換為公司內部的數據庫中間件(也稱分布式數據庫,類似阿里云的RDS),項目中的代碼程序不用做過多的分庫分表改造,由數據庫中間件幫我們做了這個事情,我們的數據存儲很自然地變為多分片存儲了;
- 原先的數據庫為公司內部的數據庫中間件,由于分片過少,需要擴容分片。而數據庫中間件不能很好地擴縮容分片,進行少分片數據庫中間件切多分片數據庫中間件切換;
方案
有了以上的共識,最后還是選擇切庫方案的話,通常我們會選擇在夜深人靜時分,即系統訪問量最少的情況下,像電商一般是半夜3點半左右,進行切庫操作,避免切庫過程造成過多的臟數據。
當然,我們的系統,需要提前開發好切庫相關的代碼,如新庫SQL適配、切庫過程的開關引入,等等。
至于具體的將數據庫從A切換到B的步驟,有以下幾點:
切庫流程
1.將A庫中的數據,全量同步到B庫中,同時保持增量同步。
這樣我們如果將數據庫連接從A改為B時,讀取的數據,是一樣的,當然期間的數據庫同步延遲是不可避免的。而數據的同步,可以使用阿里巴巴開源的中間件canal。
2.將A庫進行停寫。
一旦A庫進行停寫了,那么B庫在很短的時間延遲之后,將獲得同A一樣的全量數據了,然后我們就可以把數據庫同步斷開。
3.將系統的數據庫鏈接切換到B庫。
我們的系統需要事先鏈接兩套數據庫,通過開關控制數據庫鏈接,如此我們就可以通過極短的時間內,將系統的數據庫鏈接進行切換。