架構師速成8.3-可用性之分庫分表


有狀態分布式,涉及的知識就比較多了,不過我們可以拿幾個現實的例子由淺入深的來理解。

數據庫的分庫分表

  1. 假設你是一個開發負責人,開始使用單機的數據庫,突然一天數據庫硬盤掛掉了。你沒有做備份,然后就沒有然后了。
  2. 進入第2個公司,你意識到備份的重要性,每天定時備份到另一台機器,突然有一天,數據庫硬盤掛掉了。你心想幸好我有備份,然后巴拉巴拉的恢復起來,用了2個小時。老板說不錯,但是—-我們因為宕機造成大量用戶流失,信譽下降,然后就又沒有然后了。上面說的就是單點的問題。
  3. 進入第3個公司,你覺得單點很可怕,所以主備做起來,數據自動同步到備庫,做到隨時准備切換。突然有一天,主數據庫硬盤掛掉了,你從容的修改數據庫連接指向備庫,重啟系統恢復了,只用了5分鍾。此時掌聲一片,你沉浸在無比的歡樂中,老板說不錯,但是—就在這5分鍾我們丟了一個上億的單子。我擦,你不是故意的吧!(其實這有可能是真實的片段,我們創業時,就30分鍾斷網,結果正好在舉行一個大型的營銷策划,不說了,我擦一會眼淚),然后就又沒有然后了。其實當你用上主備時,說明數據庫已經有狀態了,必須要區分誰是主,誰是備。
  4. 進入第4個公司,你不但做了主備,還做了高可用,通過HA實現了瞬時切換。突然有一天,主數據庫硬盤掛掉了,你從容的端起了你的屌絲杯,世界清靜了。老板說不錯,小子我看好你。從此你走向人生巔峰,出任CTO,迎娶白富美。但是沒過多久問題來了,隨着用戶不斷的增加,你的數據庫搖搖欲墜,不時就抽瘋。老板說搞定他,不然我就搞定你。
  5. 咋辦,分庫分表啊!如何分,這就涉及到更多的規則了,比如按照用戶id是最常見的做法。此時你不但需要管主備而且還需要在程序中確定如何路由,結果集合並,如果再有機器增加,還要涉及數據遷移,另外還要防止出現重復id的臟數據,需要全局唯一主鍵,等等。亞美蝶!知道有狀態的痛苦了吧。這也是為什么有些同學轉投nosql的存儲的很大原因,nosql替你屏蔽了這些規則,他在內部實現了路由、分庫、合並等等。
  6. 提到這里不得不提一下淘寶的牛逼產品–drds(沈公子是不是應該給些廣告費啊)。
    • 分布式SQL引擎
      • 將數據按照條件分散到多個數據節點(分庫分表),對於數據操作sql進行分布式優化,獲得最佳執行效率
    • 自主運維
      • DRDS的用戶運維平台提供DRDS接入、分布式DDL、拆分信息維護、平滑擴縮容、分布式DML、監控等常用功能,讓運維工作變得更簡單
    • 小表復制
      • 對於配置表,常量表等不經常變化的表進行多節點對等同步,加速該類表與其他拆分表做關聯查詢的速度
    • 分布式全局唯一id
      • 提供全局唯一數字id服務,幫助您在分布式環境下,繼續保持類似唯一鍵、主鍵等數據的全局(所有節點)唯一性

 

  1. 看到了吧,這就是有狀態帶來的痛苦。為了把有狀態變為無狀態有時候你需要做大量的工作。
有關分庫分表的關鍵點和難點,我新一章統一講解。


免責聲明!

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



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