隨着互聯網的數據量越來越大,很多單表的數據量已經上億了,甚至更多,這樣單表的數據已經達到了查詢的瓶頸,那么就需要將數據庫進行拆分。
如何有效的進行數據庫拆分呢,而且在互聯網公司停機進行數據庫處理不是很現實,因為影響了業務量。那么就需要更好的方法去進行解決。
首先咱們先准備一下數據庫,然后將數據庫建立好相同的表結構。通過服務雙寫繼續將舊數據庫繼續進行CRUD操作,然后將新數據進行增刪改操作。記錄就數據庫里邊的一個標志,然后將舊數據庫的標志之前的數據,通過寫一個同步工具將舊的數據庫表的數據同步到新數據庫中。效果如下圖:
這樣新產生的數據將寫到新庫,同時舊數據庫的數據進行及時同步。
數據同步完成后需要進一步檢查所有的數據,如果沒有問題就申請兩個虛擬IP或者域名,然后分別掛到兩台機器上。
這樣一個數據庫就變成兩台數據庫了,然后兩台數據庫將表中的字段進行hash,hash結果為0的走到第一個數據庫中,hash結果為1的走到數據庫中。效果如下:
在切換的過程中,需要通過ZK配置直接將數據庫進行這種方式的切換。此時需要觀察一周左右的時間,同時兩個數據庫雙寫可以繼續寫着,防止新庫出現數據問題是及時往舊數據庫進行切換。
如果一周之后沒有問題的話,將雙寫去掉,實現數據的分離。
這個時候數據庫還沒有完全分開,has(key)=0的數據庫中還存在着hash(key) = 1的數據,這時需要把這樣的數據刪除掉。這樣上億的數據分為兩個庫,然后兩個數據庫每個各5000萬條。
數據庫分開之后,后續的統計等結果還要進行相應的修改,需要通過在內存中計算結果,然后把計算的結果放到匯總起來,得到統計和分析的結果。
這樣就基本實現了不用停機服務而進行的數據庫切換。
大家應該也注意到上圖中,為了實現高可用,一個主庫都帶着一個主庫,兩個庫之間通過任務進行的數據同步,假如訪問虛擬IP的時候一個數據庫出現了問題,那么直接接到另一個數據庫上。
未來的話,需要再需要繼續擴容的話,還需要以2*n的庫進行擴容,這樣has(key) = 0 和 hash(key) = 2數據保持一致, hash(key) = 1 和 hash(key) = 3數據一致。當數據同步完成之后0,2就可以按照上述的方法進行拆分,然后拆為兩個虛擬IP,同時將hash(key)=2的數據從數據庫 hash(key)= 0的數據庫刪除掉,1、3相同的原理,這樣數據庫就實現了同步。
同學們有沒有更好的方法?可以和我一起討論。當然咱們還有一些分庫分表比較成熟的工具比如ShardingSphere和MyCAT,這些工具都是比較好的分庫分表解決方案,當然在使用之前一定要做好功課,避免使用的時候采坑。
有問題歡迎來拍~