分佈式要解決什麼問題呢?解決持久化數據太大,單個節點的硬盤沒法存儲的問題;解決運算量太大,單個節點的內存、CPU沒法處理的問題。數據庫
數據分片
數據冗餘網絡
解決這些問題,有兩種思路:scale up,scale out。前者就是提高單個節點的能力,更大的磁盤,更快的CPU,定製的軟硬件,然而這意味着更高的價格,並且再怎麼scaleup 也是有上限的。後者就是把存儲、計算任務分擔到普通的機器上,經過動態增長節點來應對數據量的增加,但缺點是多個節點的管理、任務的調度比較麻煩,這也是分佈式系統研究和解決的問題。只有當數據量達到單機沒法存儲、處理的狀況下才考慮分佈式,否則都是自找麻煩。異步
狀態的維護比計算要難不少,所謂狀態就是須要持久化的數據。所以主要考慮分佈式存儲,何況即便是分佈式計算,爲了節省帶寬須要儘可能保證data locality,也是須要分佈式存儲。分佈式
如今有一堆數據,多是結構化或者半結構化,須要將數據分片(segment、fragment、shard),造成一個個的數據子集,存儲到一組物理節點上,物理節點之間經過網絡通訊。那麼須要考慮兩個問題:
第一:數據如何劃分;
第二:數據的可靠性、可用性問題性能
數據分片
數據分片是指將數據子集儘量均衡的劃分到各個物理節點上。那麼會有哪些挑戰呢?
(1)若是某個物理節點宕機,如何將該物理節點負責的數據儘快的轉移到其餘物理節點;
(2)若是新增了物理節點,怎麼從其餘節點遷移數據到新節點;
(3)對於可修改的數據(即不是隻能追加的數據),好比數據庫數據,若是某節點數據量變大,怎麼將部分數據遷移到其餘負載較小的節點,及達到動態均衡的效果。
(4)元數據的管理問題:當數據分佈在各個節點,那麼當用戶使用的時候須要知道具體的數據在哪個節點上。所以,系統須要維護數據的元數據:即每個數據所在的位置、狀態等信息。當用戶須要具體的數據時,先查詢元數據,而後再去具體的節點上查詢。當數據在節點之間遷移的時候,也須要更新元數據。元數據的管理節點這裏稱之爲meta server。元數據的管理也帶來了新的挑戰:
(4.1)如何抽取數據的特徵(特徵是分片的依據,也是用戶查詢數據時的key),或者支持用戶自定義數據特徵;
(4.2)如何保證meta server的高性能和高可用,是單點仍是複製集
(5)分片的粒度,即數據子集的大小,也是數據遷移的基本單位。粒度過粗,不利於數據均衡;粒度過細,管理、遷移成本又會比較大。spa
數據冗餘
前面提到,分佈式系統中的節點都是普通的節點,所以有必定的機率會出現物理故障,好比斷電、網絡不可用,這些故障致使數據的暫時不可用;另一些故障更嚴重,會致使數據的丟失,好比磁盤損壞。即便單個節點的故障是小几率,當集羣中的節點數目不少是,故障就成爲了一個大機率事件。所以,保證數據的高可用和可靠性是分佈式系統必須解決的問題。
爲了不單點故障,可行的辦法就是數據冗餘(複製集),即將同一份數據放在不一樣的物理節點,甚至是不一樣的數據中心。若是數據是一次寫,屢次讀那很好辦,隨便從哪一個副本讀取都行。但對於不少分佈式存儲系統,好比數據庫,數據是持續變化的,有讀有寫。那麼複製集會帶來什麼樣的挑戰呢,須要如何權衡呢,假設有三個副本:
(1)三個副本的地位,你們都是平等的仍是有主(primary、master)有次(secondary、slave),若是是平等的,那麼每一個節點均可以接收寫操做;若是不平等,能夠一個節點負責全部的寫操做,全部節點都提供讀操做,
(2)在平等的狀況下,怎麼保證寫入操做不衝突,保證各個節點的數據是一致的,怎麼保證能讀取到最新的數據
(3)不平等的狀況下
(3.1)寫節點怎麼將變動的數據同步到其餘節點,同步仍是異步;
(3.2)非寫節點可否提供讀數據,若是可以容許,會不會讀取到過期的數據。
(3.3)主節點是怎麼產生的,當主節點宕機的時候,怎麼選擇出新的主節點。是有統一的複製集管理中心(記錄誰主誰次,各自的狀態),仍是複製集本身選舉出一個主節點?
(4)無論複製集內部的節點是平等的,仍是有集中式節點的,只要有多個數據副本,就須要考慮數據的一致性可用性問題。按照CAP理論,只能同時知足一致性 可用性 分區容錯性之間的兩者,不一樣的分佈式系統須要權衡。server