研究動態擴容數據庫解決方案


  隨着互聯網的數據量越來越大,很多單表的數據量已經上億了,甚至更多,這樣單表的數據已經達到了查詢的瓶頸,那么就需要將數據庫進行拆分。

  如何有效的進行數據庫拆分呢,而且在互聯網公司停機進行數據庫處理不是很現實,因為影響了業務量。那么就需要更好的方法去進行解決。

  首先咱們先准備一下數據庫,然后將數據庫建立好相同的表結構。通過服務雙寫繼續將舊數據庫繼續進行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,這些工具都是比較好的分庫分表解決方案,當然在使用之前一定要做好功課,避免使用的時候采坑。

  有問題歡迎來拍~

  

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM