冰解的破-Redis

Redis

Redis 是一個 Key-Value 存儲系統。和 Memcached 類似,它支持存儲的 value 類型相對更多,包括 string(字符串)、 list(鏈表)、 set(集合)和 zset(有序集合)。這些數據類型都支持 push/pop、add/remove 及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis 支持各種不同方式的排序。與 memcached 一樣,為了保證效率,數據都是緩存在內存中。區別的是 Redis 會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了 master-slave(主從)同步。

學習整理:

  • redis中hash slot是什么?

hash slot 是redis分布式部署,節點分配的一種方法
redis分布式部署其結構如下:


redis-cluster

Redis 集群采用每個節點擁有 1(主服務自身)到 N 個副本(N-1 個附加的從服務器)的主從模型,cluster內部master和slave之間的數據是異步復制的(提高性能,主要是在性能和一致性間的一個平衡)。
一個redis cluster有固定的16384個hash slot,slot被均勻的分配到cluster中的master節點上,而一個key具體的存儲在哪個slot上,則是通過key的CRC16編碼對16384取模得出的。

再講講hash slot的基本原理:

hash-slot

記錄和物理機之間引入了虛擬桶層,記錄通過hash函數映射到虛擬桶,記錄和虛擬桶是多對一的關系;第二層是虛擬桶和物理機之間的映射,同樣也是多對一的關系,即一個物理機對應多個虛擬桶,這個層關系是通過內存表實現的。

Redis 集群沒有并使用傳統的一致性哈希來分配數據,而是采用另外一種叫做哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然后將這個key 分到哈希槽區間的節點上,具體算法就是:CRC16(key) % 16384。

  • 如果用戶將新節點 D 添加到集群中, 那么集群只需要將節點 A 、B 、 C 中的某些槽移動到節點 D 就可以了。
    比如我想新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上。
  • 與此類似, 如果用戶要從集群中移除節點 A , 那么集群只需要將節點 A 中的所有哈希槽移動到節點 B 和節點 C , 然后再移除空白(不包含任何哈希槽)的節點 A 就可以了。

因為將一個哈希槽從一個節點移動到另一個節點不會造成節點阻塞, 所以無論是添加新節點還是移除已存在節點, 又或者改變某個節點包含的哈希槽數量, 都不會造成集群下線。

最后補充一個跟hash槽類似但應用更廣的一個叫一致性hash的東東:

環形Hash空間
按照常用的hash算法來將對應的key哈希到一個具有232次方個桶的空間中,即0~(232)-1的數字空間中。現在我們可以將這些數字頭尾相連,想象成一個閉合的環形。如下圖

環形空間

把數據通過一定的hash算法處理后映射到環上
映射數據

將機器通過hash算法映射到環上
映射機器
對象與機器處于同一哈希空間中,這樣按順時針轉動object1存儲到了NODE1中,object3存儲到了NODE2中,object2、object4存儲到了NODE3中。

機器的刪除與添加

  • 節點(機器)的刪除
    刪除節點
  • 節點(機器)的添加
    添加節點

通過按順時針遷移的規則,那么object2被遷移到了NODE4中,其它對象還保持這原有的存儲位置。通過對節點的添加和刪除的分析,一致性哈希算法在保持了單調性的同時,還是數據的遷移達到了最小,這樣的算法對分布式集群來說是非常合適的,避免了大量數據遷移,減小了服務器的的壓力。

一致性哈希算法中,為了盡可能的滿足平衡性,其引入了虛擬節點。

“虛擬節點”( virtual node )是實際節點(機器)在 hash 空間的復制( replica ),一個節點(機器)對應了若干個“虛擬節點”,這個對應個數也稱為“復制個數”,“虛擬節點”在 hash 空間中以hash值排列。


虛擬節點

映射關系:object1->NODE1-1,object2->NODE1-2,object3->NODE3-2,object4->NODE3-1。通過虛擬節點的引入,對象的分布就比較均衡了。那么在實際操作中,對象從hash到虛擬節點到實際節點的轉換如下圖:


時間轉換

“虛擬節點”的hash計算可以采用對應節點的IP地址加數字后綴的方式。例如假設NODE1的IP地址為192.168.1.100。引入“虛擬節點”前,計算 cache A 的 hash 值:
Hash(“192.168.1.100”);

引入“虛擬節點”后,計算“虛擬節”點NODE1-1和NODE1-2的hash值:
Hash(“192.168.1.100#1”); // NODE1-1
Hash(“192.168.1.100#2”); // NODE1-2

參見:
hash slot(虛擬桶):https://www.cnblogs.com/abc-begin/p/8203613.html
每天進步一點點——五分鐘理解一致性哈希算法(consistent hashing):https://blog.csdn.net/cywosp/article/details/23397179

TO BE CONTINUED ......

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容

  • 基于內存的NoSQL數據庫。提供五種數據結構的存儲。字符串、列表、集合、有序集合、散列表。Redis 支持很多特性...
    韓絕交閱讀 709評論 0 1
  • Redis Cluster Specification 1 設計目標和理由 1.1 Redis Cluster g...
    近路閱讀 4,268評論 0 12
  • 本文檔翻譯自 http://redis.io/topics/cluster-tutorial 。 本文檔是 Red...
    會跳舞的機器人閱讀 66,952評論 2 21
  • 昨天下午放學回家兒子吃了點藥就睡了,快10點的時候醒了,睜開眼就和我說:“媽媽,我肚子不疼了。”我趕緊過去,看到他...
    恬靜_799a閱讀 143評論 0 0
  • 1 他們說我是個怪人,那也許只是因為背向人群而行使我欣喜。 在我很小的時候我從沒想過要當一個講故事的人,可是當我成...
    桃錦閱讀 2,676評論 4 50