淺談數據庫擴容方案


起因

每一個項目都是由小項目發展而來,從最初的一台數據庫,到后面的幾千上萬台數據庫,這發展的過程,我們都要涉及到一個技術問題:當數據量太大的時候,如何進行擴容?

 

案例

小明現在負責一個站點,用戶數據庫有2個,網站用戶數據通過ID取模,分別存在兩台用戶數據庫中,現在數據增大,兩台數據庫已經不夠用了,現在需要增加數據庫進行擴容,小明應該如何進行擴容?

 

方案

  1. 停機擴容
  2. 平滑擴容

 

停機擴容

我們先來了解下停機擴容方案,這是一種很多人初期都會使用的方案(幾台數據庫的時候),具體步驟:

  1. 小明先掛公告,告訴大家明天的凌晨02:00 - 06:00,站點將停機升級;
  2. 時間到了,小明停止了所有對外服務;
  3. 小明新增了2個數據庫,然后寫了一個程序,將原先的2個庫的數據遷移到現有的4個庫(2+2)上;
  4. 數據遷移完成,修改數據庫服務配置;
  5. 重啟服務,並重新開啟對外服務。

 

回滾方案:

數據遷移失敗,或者遷移后測試失敗,則將服務配置修改回原先的兩個庫,改天再升級。

 

優點:

  • 簡單

 

缺點:

  1. 不高可用
  2. 開啟升級到升級完成,時間短,項目組壓力大,易出錯
  3. 升級時間基本是半夜人流量最少的時候,項目組疲累,容易出錯
  4. 運行一段時間后,發現問題,難以回滾,只能回到擴容前,會丟失部分數據

 

適用:

  1. 小型網站;
  2. 大部分游戲;
  3. 對高可用要求不高的服務。

 

平滑擴容

現在我們來聊一下本文的重點:平滑擴容中最好的方案就是擴容的數據庫是原先數據庫的倍數,如:2個數據庫擴容到4個數據庫,是原先的2倍。步驟:

(1)新增2個數據庫

(2)配置雙主進行數據同步(先測試,后線上,重啟服務時間是秒級)

 

(3)數據同步完成之后,配置主主雙寫因為同步有延遲,如果每時每刻都有數據寫入/更新的話,就不能准確的保證數據已經同步完成

 

(4)數據同步完成后(時間比較長),刪除雙主同步,修改數據庫配置,並重啟(秒級);

 

(5)此時已經擴容完成,但此時的數據並沒有減少,新增的數據庫跟舊的數據庫一樣多的數據,此時還需要寫一個程序,清空數據庫中多余的數據,如:

  1. User1去除 uid % 4 = 2的數據;
  2. User3去除 uid % 4 = 0的數據;
  3. User2去除 uid % 4 = 3的數據;
  4. User4去除 uid % 4 = 1的數據。

現在,我們就已經完成了數據庫的平滑擴容了。

 

優點

  1. 擴容期間,服務照常進行,保證高可用
  2. 時間長,項目組壓力沒有這么大,出錯率低
  3. 擴容期間,遇到什么問題,都可以隨時調試,不怕影響線上服務
  4. 每個數據庫少了一半的數據量。

 

缺點

  1. 程序復雜,需要配置雙主、主主雙寫、檢測數據同步等額外技術;
  2. 但后期數據庫成千上萬台的時候,擴容復雜(情況非常少,除非將很多業務數據放在同一個數據庫)。

 

適用:

  1. 大型網站;
  2. 對高可用要求高的服務。

 

總結

本文主要簡單講解了數據庫擴容的兩種方案,並對這兩種方案的優缺點、適用場景進行了說明:

  • 停機擴容:簡單,不高可用,易出錯,擴容后不能回滾,只能回檔,會丟失一部分數據。
  • 平滑擴容:復雜,高可用,出錯調試容易,易回滾,不會造成數據丟失,

 

結語

  1. 每一種方案都有適合它的場景,適合自己的,才是最好的;
  2. 小編經驗有限,希望此文章對大家有幫助;
  3. 每天進步一點點。

 

參考文獻

58沈劍老師架構師之路的:數據庫秒級平滑擴容架構方案


免責聲明!

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



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