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