鏈式存儲系統原理

• NoSQL運動與Cassandra系統
NoSQL的技術特徵:三個否定
否定關係模型
否定ACID事務(亞洲工業發展理事會)
否定SQL語言(現在某種程度上又迴歸SQL)
大數據促進了NoSQL的迅速繁榮,出現了大量的、技術多樣的NoSQL系統,主要可以分爲三類:文檔系統,鍵值系統和圖系統。以鍵值存儲的代表,Cassandra系統爲例。
Cassandra技術來源
Cassandra系統核心技術主要來源於兩個方面,一是Google的Bigtable,就是我們常說的大表,另一個是Amazon的DynamoDB,主要是借鑑他的P2P架構。
Cassandra特點與定位
Cassandra的技術來源決定了的它所擁有的技術特點,即,無單點故障、高可用性和可配置的一致性。他適合的應用場景包括時間序列數據、物聯網數據、社交媒體數據等等。
• 數據模型、接口和語言
Cassandra 的邏輯數據模型:
鍵空間 - Keyspace,最上層的命名空間,通常是一個應用程序一個Keyspace;
Keyspace 是列族(column family)的容器;一個keyspace 具有特定的配置(數據分區策略, 副本數目等);一個應用程序,一般有一個keyspace 和多個列族;
列族 - ColumnFamily,與table對應,不同點在於:Column Family是稀疏的表;
一個 Column Family 由很多行組成;
行 - Row,每一行由一個key唯一標識,由columns 組成;
一行由很多列組成;
列 - Column,存儲的基本單元。
列是一個三元組 : (name(用於查詢), value(沒有輔助索引的情況下無法按列查詢), timestamp(long類型,可用來解決版本衝突))
核心概念之間的包含關係:
Cassandra接口-基於Thrift的API
讀操作
get:單行鍵單列查詢
get_slice:單行鍵多列查詢
multiget_slice:多行鍵多列查詢
get_count:獲取列數量
get_range_slice:多行鍵列範圍查詢
get_indexed_slices:基於二級索引的多列查詢
寫操作
inset:單行單列寫入
batch_mutate:多行多列寫入
remove:單行單列刪除
truncate:刪除整個列族(打標記)
其他
login,describe_*,add/drop column family/keyspace
登陸,讀取表結構,添加刪除CF/KS
Cassandra查詢語言 – Not only SQL
Cassandra 0.8版 引入CQL, 類似SQL以替代傳統的RPC接口
CQL的理由
Thrift 接口(低層接口: get, get_slice, mutate...;直接暴露了內部存儲結構,不利於系統升級)
CQL2(在0.8版本(CQL)引入, 在1.0版本更新(CQL2);語法和SQL類似, 比 Thrift 接口更可擴展;幾乎是1對1的映射到 Thrift 接口, 所以不支持SQL中面向行的部分內容,也不支持複合類型)
CQL3示例
DESCRIBE keyspaces;——>查看鍵空間
CREATE KEYSPACE IF NOT EXISTS myCas WITH REPLICATION = {'class':'SimpleStrategy','replication_factor':1};——>創建鍵空間,使用鍵空間
USE testsp;——>使用鍵空間
DESCRIBE keyspace testsp;——>創建列族
CREATE ColumnFamily users1 (id int,user_name varchar, PRIMARY KEY (id) );——>插入數據
INSERT INTO users1 (id,user_name) VALUES (1, 'abc');——>更新數據
UPDATE users1 SET user_name = '2014' WHERE id = 1;——>刪除數據
DELETE FROM users1 WHERE id = 1;——>查詢數據
• 系統架構和Gossip協議
Cassandra去中心化的架構-P2P
P2P分佈式架構:所有節點在結構上是對等關係;任意節點宕機,可能對整個機羣的吞吐量造成潛在影響;但不會造成災難性的服務中斷。
擴展能力強:集羣擴展時,絕大多數步驟都是自動完成的;得益於P2P架構,集羣的擴展相比主從結構更爲簡便。
不同節點間如何相互感知(Hadoop是主從架構系統,所有節點定期與主節點通信,管理容易)
流言協議(Gossip協議—>疫情算法(Epoidemic Algorithms):借鑑Amazon的鍵值系統Dynamo的體系架構,利用Gossip協議來發現集羣中其他節點的位置(如路由表、Hash環上的位置)、狀態(如版本、負載、死活)等信息。
通過Gossip組建集羣(指定部分種子節點,某些節點要預知多個種子節點;各節點與種子節點通信,形成集羣;多次通信,集羣中的節點互相都知道,組建集羣完成。)
Gossip交換信息的三種模式:推(Push)、拽(Pull)、推+拽(Push-pull)
• 一致性哈希和數據分區
在Cassandra節點間相互連通之後,如何將大規模的數據集合進行切分並存放到到各個節點上呢?
Cassandra採用一種性哈希方法對數據集進行切分。其基本思想是用同樣的哈希函數來計算數據對象和節點的哈希值,用節點的哈希值作爲數據集的切分點。
在一致性哈希方法中,節點不再是影響數據對象哈希值的參數,而是作爲哈希函數的輸入。
一致性哈希方法的優點主要有兩條:
1、在確定了Hash函數和節點區間表以後,客戶端就可以知道一個數據項存放在哪一個物理節點上。因此不需要全局的元數據服務器
2、當節點數量改變時,不需要將所有數據對象在新的集羣進行重新分配。具體來講,如果刪除一個節點,鄰近的機器會接管刪除節點的數據,如果新增一個節點,鄰近的機器會分攤一部分數據給新節點。
• 數據副本及其一致性
數據副本是大數據存儲系統普遍採用的提高系統讀性能,並保證系統可靠性的重要手段。
副本、全副本、副本因子N
Cassandra副本策略:
簡單策略:複製數據副本到協調者節點的N-1個後繼節點上。
機架感知策略:在不同的機架中選擇存放副本的機器。
數據中心感知策略:類似機架感知策略, 只是本策略是在數據中心層面做出選擇。
副本的優點:可用性、並行化、減少數據傳輸。
副本的缺點:增加了更新成本,增加了併發控制的複雜度(併發可能會導致數據不一致)。
數據分區與數據遷移(需要同時更新數據本身與副本節點,考慮節點離開與新節點加入)。
保證數據的一致性:法團協議Quorum)
–NR (讀成功數)+ NW(寫成功數) > N(副本數)
–NW > N/2
• 節點本地數據存取
data:存儲真正的數據文件,既後面的SStable文件,可以指定多個目錄。
commitlog:存儲未寫入SSTable中的數據(在每次寫入之前先放入日誌文件)。
cache:存儲系統中的緩存數據(在服務重啓的時候從這個目錄中加載緩存數據)。
Memtable中的數據是排序的,Cassandra定期將Memtable刷到硬盤的Sstable當中;
SStable中的數據一經寫入,不再修改;
SStable被生成後,Memtable即被銷燬,相關CommitLog清空。
Cassandra系統中某一個節點的是如何完成本地數據存取的
Cassandra系統採用了P2P架構,節點完全對等,沒有主節點。
客戶端訪問可以和集羣中的任一節點相連,這個連接點叫協調者,其他節點叫非協調者。
協調者結點會根據一致性級別,把訪問請求發送給相應數據節點。
最終執行用戶請求的節點,可稱之爲本地節點。
Cassandra數據寫入
1、寫入memtable
2、寫入CommitLog
首先從memtable獲取數據,如果存在即返回;
否則,從行緩存中獲取數據,如果存在即返回;
再則,檢查布隆過濾器判斷哪些sstable中存在數據,如果不存在即返回;
檢索key緩存來快速在Sstable中定位
從sstable中獲取數據
數據寫入到行緩存中
列檢索特別快!行切片檢索比較快!
沒有任何讀操作,速度很快,阻塞來自於CPU而非I/O!
具體寫入示意圖如下:
發佈了30 篇原創文章 · 獲贊 0 · 訪問量 4574
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章