學習NoSQL

    NoSQL的全稱是Not Only SQL,不僅僅是SQL,它是跟數據庫存儲有關的思想。google的bigtable和amazon的dynamo是對該思想的兩個優秀實現。


數據非關係化

    上一代的數據庫都是關係型數據庫,突出表的結構。NoSQL數據庫不採用關係型,而是用key-value來存儲數據,數據之間的依賴變得更加稀疏。


分佈式存儲

    在海量數據的數據庫存儲上,一般是人爲的進行數據庫的分佈存儲,依據數據的某一項屬性來存儲到不同的結點上。這樣的劃分是人爲實現的,單個數據庫並不知道整個數據存儲分佈情況。NoSQL希望把這個過程承包下來自己解決的,於是Map/Reduce,一致性Hash都應用到這裏來。擴展性是分佈式系統的一個重要要求,非關係型的數據庫是方便擴容的。另外爲了保證數據的可靠性,數據至少要有2份副本。


     以MySQL爲代表的關係型數據庫所遵守的規則是ACID,即原子性、一致性、獨立性、持久性。而NoSQL所遵守的規則是BASE,即基本可用、軟狀態、最終一致性。NoSQL認爲,對於分佈式系統來說,系統一致性、可用性、容錯性這三點的同時滿足是不顯示的,更不會滿足高可用性。可以針對不同的場景需要,滿足其中的兩點,放寬對第三點的要求。


分佈式哈希表DHT,一致性哈希

    哈希空間是0~2^64的數值空間,一致性哈希的思想是把要存儲的數據和存儲用的機器結點都映射到哈希空間,然後再做選擇。把數據value映射到哈希空間,得到value的key值;把所有服務器結點映射到哈希空間,得到各node值;然後要做的就是在這個哈希空間裏做key值到node值的映射。0~2^64的空間可以看作是環形的,並且再約定一個正方向,那麼映射關係就可以是key值在正方向上最近的node值。

    這樣一來,服務器結點的增和減(即node值的添加和移除)只會影響其最近的key值數據的存儲。

    如果各服務器結點的負載不夠均衡,可以添加“虛擬結點”,即添加node值使得node值在環形空間分佈的更加均勻,而新添加的node值其實是已有的服務器結點。這就需要在服務器結點到node值空間的映射之間再加一層映射,讓同一個服務器結點能映射到多個node值上去。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章