在分布式快取系統中,需要將資料均勻的分布到快取伺服器集群的不同機器上,就需要使用對快取的資料的key做hash值計算, 然後在將hash值除以伺服器節點的數量取模計算出資料需要落到那台伺服器節點上。這種演算法很簡單,也可以實現資料的均勻分布, 但是,增加或者減少資料節點的時候會導致所有快取資料失效。
傳統的取模方式(餘數取模)【hashmap原理,定長(2的16次冪)陣列,查到的時間複雜度o(1)】
例如10條資料,3個節點,如果按照取模的方式,那就是
node a: 0,3,6,9
node b: 1,4,7
node c: 2,5,8
當增加乙個節點的時候,資料分布就變更為
node a:0,4,8
node b:1,5,9
node c: 2,6
node d: 3,7
總結:資料3,4,5,6,7,8,9在增加節點的時候,都需要做搬遷,成本太高。
最關鍵的區別就是,對節點和資料,都做一次雜湊運算,然後比較節點和資料的雜湊值,資料取和節點最相近的節點做為存放節點。 這樣就保證當節點增加或者減少的時候,影響的資料最少。 還是拿剛剛的例子,(用簡單的字串的ascii碼做雜湊key):
十條資料,算出各自的雜湊值
0:192 【==>】 1:196 【==>】 2:200 【==>】3:204 【==>】 4:208
5:212 【==>】6:216 【==>】7:220 【==>】8:224 【==>】9:228
有三個節點,算出各自的雜湊值
node a: 203 【==>】 node g: 209 【==>】node z: 228
這個時候比較兩者的雜湊值,如果大於228,就歸到前面的203,相當於整個雜湊值就是乙個環,對應的對映結果:
node a: 0,1,2
node g: 3,4
node z: 5,6,7,8,9
這個時候加入node n, 就可以算出node n的雜湊值:
node n: 216
這個時候對應的資料就會做遷移:
node a: 0,1,2
node g: 3,4
node n: 5,6
node z: 7,8,9
這個時候只有5和6需要做遷移
另外,這個時候如果只算出三個雜湊值,那再跟資料的雜湊值比較的時候,很容易分得不均衡,因此就引入了虛擬節點的概念, 通過把三個節點加上id字尾等方式,每個節點算出n個雜湊值,均勻的放在雜湊環上,這樣對於資料算出的雜湊值, 能夠比較雜湊的分布。
同時,如果是集群部署,可以根據 key(redis集群編號)+nodename[主機名]產生虛擬節點ip『,放到hash換上。
通過這種演算法做資料分布,在增減節點的時候,可以大大減少資料的遷移規模。
伺服器節點根據hash來分布,有時候會出現不均勻的情況,就會導致資料分布的不均勻, 通過增加虛擬節點,使得伺服器節點總數大幅增加,從而散落到hash環上就會更加均勻。
快取一致性
一般應用而言,追求的都是快取的最終一致性。一般的快取系統,都是按照key去快取查詢,如果不存在對應的value,就應該去後端系統查詢 比如db 如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對後端系統造成很大的壓力。這就叫做快取穿透。引起這個問題的主要原因還是高併發的時...
快取一致性
計算機體系結構量化研究方法 第五版 學習筆記 快取一致性 1 快取一致性的問題 2 儲存器一致性的概念 3 一致性的基本實現方案 大型 多級快取可以充分降低處理器對儲存頻寬的需求。採用對稱共享儲存器的計算機通常支援對共享資料與專用資料的快取。多處理器之間的通訊基本上是通過讀寫共享資料實現。為了降低訪...
CPU多級快取 快取一致性
mesi 快取一致性 快取一致性,用於保證多個cpu cache之間快取共享資料的一致性。mesi協議將cache line的狀態分為modify 修改 exclusive 獨佔 shared 共享 invalid 失效 modify 當前cpu cache擁有最新資料,其他cpu擁有失效資料 ca...