天天看點

《解讀NoSQL》——2.6 通過資料庫分片獲得水準擴充能力

本節書摘來自異步社群出版社《解讀nosql》一書中的第2章,第2.6節,作者: 【美】dan mccreary(丹•麥克雷) , ann kelly(安•凱利),更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

随着一個組織存儲的資料量增加,可能在某個時候,業務運作所需的資料量超過了目前環境所能運作的最大值,這時候,一些将資料分成合理的資料塊的機制是必要的。組織和系統可以将資料庫自動分片(将一個資料庫劃分為一些塊,這些塊稱作資料庫分片,它們遍布在一些分布式伺服器上)作為持續存儲資料并且最小化當機時間的手段。在稍早的系統上手動配置資料庫并将資料從舊系統複制到新系統時,這個操作可能會耗費系統數小時,然而nosql系統會自動進行這個操作。資料庫的成長性和自動分區資料的容錯性對于nosql系統來說很重要。對于大資料系統和容錯系統,分片操作已經成為高度自動化的過程。接下來讓我們來看看分片如何工作以及它面臨的挑戰。

假設你建立了一個網站,它允許使用者登入和建立自己的私人空間并與朋友們分享。他們會上傳檔案、發送資訊并發表一些他們對喜歡的(或不喜歡的)事物的看法。你搭建起網站,将這些資訊儲存到運作在單個cpu之上的mysql資料庫中。人們如果喜歡它,就會登入網站,建立首頁,邀請朋友,不知不覺間你的磁盤空間已經所剩無幾。接下來該怎麼辦?如果你使用的是典型的rdbms,那麼答案是購買新的系統并将一半使用者遷移到新系統中。哎,你以前的系統可能需要當機一段時間,這樣你才能重寫應用讓它知道從哪個資料庫中得到所需的資訊。圖2-9顯示了一個資料分片的典型示例。

《解讀NoSQL》——2.6 通過資料庫分片獲得水準擴充能力

圖2-9 當單個處理器不能很好地勝任系統的吞吐量需求時,就需要執行分片操作。當發生分片時,你會希望資料被移動到兩個系統中,而每個系統負責原來一半的工作。許多nosql系統内建了自動分片功能,你隻需将一台伺服器添加至工作節點資源池裡,資料庫管理系統會自動将資料移動至新節點。大多數rdbms不支援自動分片

有多種方式可以完成從單個資料庫遷移至多個資料庫的過程。

(1)可以将使用者名以a~n開頭的使用者保留在原有的系統中,而将使用者名以o~z開頭的使用者遷移至新系統。

(2)可以将美國使用者保留在原有系統中,而将歐洲使用者遷移至新系統。

(3)可以随機将一半使用者遷移至新系統中。

每一種方式都有其優勢和劣勢。例如,第一種方案,如果某個使用者修改了使用者名,那麼是否應該将它自動遷移到新系統?第二種方案,如果某個使用者搬家到一個新的國家,那麼他的資料是否也該被遷移?如果使用者都喜歡與周圍的人分享連結,那麼将這些使用者放在同一系統中是否有性能上優勢?如果美國的使用者都習慣在晚上同一時間活躍又會怎麼樣?其中一個資料庫會承受巨大壓力而另一個空閑嗎?如果你的網站規模再次翻倍又會如何?你會每次硬着頭皮不斷地重寫代碼來應付嗎?你會讓你的系統當機一周等你更新軟體嗎?

随着伺服器數量的增長,你會發現每一台伺服器當機的機率是均等的,是以每當你增加一台伺服器,那麼某一部分不工作的機率會增加。你或許會認為你将資料庫切分到兩個系統的過程也可以用來複制資料到備份系統或者鏡像系統以防系統故障,但是這會帶來新的問題。如果主節點被修改了,那麼必須保證備份資料同步更新,這就需要有一個資料複制方案。同步這些資料庫耗費時間的同時也會降低系統性能。現在你需要維護更多伺服器了!

歡迎來到資料庫分片、複制和分布式計算的世界。可以看到當資料庫不斷成長,你需要考慮和權衡許多問題。nosql系統已經有很多方法允許使用者在擴大資料庫規模的同時不用關閉伺服器。當存儲節點或網絡出現故障時仍維持資料庫運作叫作被稱為分區容錯性——一個在nosql社群出現的而傳統資料庫管理者努力追求的新概念。

了解事務完整性和自動分片對于考慮搭建分布式系統時面臨的權衡問題是很重要的。盡管資料庫性能、事務完整性以及如何利用記憶體和自動分片特性很重要,但有些時候,你必須确認并專注于系統最重要的方面,而使其他方面變得靈活。在下一節中,我們将通過一個标準的流程來了解在選擇過程中需要做出的權衡,這樣有助你專注于對組織最重要的事物。