數(shù)據(jù)分布
簡(jiǎn)述
- 分布式數(shù)據(jù)庫(kù)首先要解決把整個(gè)數(shù)據(jù)集按照分區(qū)規(guī)則映射到多個(gè)節(jié)點(diǎn)的問(wèn)題,即把數(shù)據(jù)集劃分到多個(gè)節(jié)點(diǎn)上催束,每個(gè)節(jié)點(diǎn)負(fù)責(zé)整體數(shù)據(jù)的一個(gè)子集
分區(qū)及限制
分區(qū)規(guī)則
- 常見(jiàn)的分區(qū)規(guī)則
- 順序分區(qū)
- 哈希分區(qū)照棋,
Redis Cluser
使用此種分區(qū)規(guī)則
- 哈希分區(qū)和順序分區(qū)對(duì)比
image- 分布式存儲(chǔ)數(shù)據(jù)分區(qū)圖
image
① 哈希分區(qū)類(lèi)型
-
- 節(jié)點(diǎn)取余分區(qū)
- 規(guī)則:使用特定的數(shù)據(jù)拓诸,如
Redis
的鍵或用戶(hù)ID
悼沈,再根據(jù)節(jié)點(diǎn)數(shù)量N
使用公式:hash(key)%N
計(jì)算出哈希值嘲叔,用來(lái)決定數(shù)據(jù)映射到哪一個(gè)節(jié)點(diǎn)上 - 優(yōu)點(diǎn):簡(jiǎn)單性
- 缺點(diǎn): 當(dāng)節(jié)點(diǎn)數(shù)量變化時(shí)懦砂,如擴(kuò)容或收縮節(jié)點(diǎn)蜒犯,數(shù)據(jù)節(jié)點(diǎn)映射關(guān)系需要重新計(jì)算,會(huì)導(dǎo)致數(shù)據(jù)的重新遷移
- 使用場(chǎng)景:數(shù)據(jù)庫(kù)的分庫(kù)分表規(guī)則孕惜,一般采用預(yù)分區(qū)的方式愧薛,提前根據(jù)數(shù)據(jù)量規(guī)劃好分區(qū)數(shù),比如劃分為512或1024張表衫画,保證可支撐未來(lái)一段時(shí)間的數(shù)據(jù)量毫炉,再根據(jù)負(fù)載情況將表遷移到其他數(shù)據(jù)庫(kù)中,擴(kuò)容時(shí)通常采用翻倍擴(kuò)容削罩,避免數(shù)據(jù)映射全部被打亂導(dǎo)致全量遷移的情況
-
翻倍擴(kuò)容遷移約50%數(shù)據(jù) image
-
- 一致性哈希分區(qū)
- 規(guī)則:為系統(tǒng)中每個(gè)節(jié)點(diǎn)分配一個(gè)
token
瞄勾,范圍一般在0~232费奸,這些token
構(gòu)成一個(gè)哈希環(huán)。數(shù)據(jù)讀寫(xiě)執(zhí)行節(jié)點(diǎn)查找操作時(shí)进陡,先根據(jù)key
計(jì)算hash
值愿阐,然后順時(shí)針找到第一個(gè)大于等于該哈希值的token
節(jié)點(diǎn) - 優(yōu)點(diǎn):加入和刪除節(jié)點(diǎn)只影響哈希環(huán)中相鄰的節(jié)點(diǎn),對(duì)其他節(jié)點(diǎn)無(wú)影響
- 缺點(diǎn):
- 加減節(jié)點(diǎn)會(huì)造成哈希環(huán)中部分?jǐn)?shù)據(jù)無(wú)法命中趾疚,需要手動(dòng)處理或者忽略這部分?jǐn)?shù)據(jù)
- 當(dāng)使用少量節(jié)點(diǎn)時(shí)缨历,節(jié)點(diǎn)變化將大范圍影響哈希環(huán)中數(shù)據(jù)映射
- 普通的一致性哈希分區(qū)在增減節(jié)點(diǎn)時(shí)需要增加一倍或減去一半節(jié)點(diǎn)才能保證數(shù)據(jù)和負(fù)載的均衡
- 使用場(chǎng)景:
- 緩存
- 大量數(shù)據(jù)節(jié)點(diǎn)的分布式方案
-
一致性哈希數(shù)據(jù)分布 image
-
- 虛擬槽分區(qū),
Redis Cluser
使用此種分區(qū)類(lèi)型
- 規(guī)則:虛擬槽分區(qū)巧妙地使用了哈喜诼螅空間辛孵,使用分散度良好的哈希函數(shù)把所有數(shù)據(jù)映射到一個(gè)固定范圍的整數(shù)集合中,整數(shù)定義為槽(slot)赡磅,這個(gè)范圍一般遠(yuǎn)遠(yuǎn)大于節(jié)點(diǎn)數(shù)魄缚,比如
Redis Cluster
槽范圍是0~16383。槽是集群內(nèi)數(shù)據(jù)管理和遷移的基本單位焚廊。采用大范圍槽的主要目的是為了方便數(shù)據(jù)拆分和集群擴(kuò)展-
槽集合與節(jié)點(diǎn)關(guān)系 image
-
槽集合與節(jié)點(diǎn)關(guān)系
- 虛擬槽分區(qū),
② Redis
數(shù)據(jù)分區(qū)
-
Redis Cluser
采用虛擬槽分區(qū)冶匹, 所有的鍵根據(jù)哈希函數(shù)映射到0~16383
整數(shù)槽內(nèi), 計(jì)算公式:slot=CRC16(key) &16383
咆瘟。 每一個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所映射的鍵值數(shù)據(jù)- 特點(diǎn)
- 解耦數(shù)據(jù)和節(jié)點(diǎn)之間的關(guān)系嚼隘, 簡(jiǎn)化了節(jié)點(diǎn)擴(kuò)容和收縮難度
- 節(jié)點(diǎn)自身維護(hù)槽的映射關(guān)系, 不需要客戶(hù)端或者代理服務(wù)維護(hù)槽分區(qū)元數(shù)據(jù)
- 支持節(jié)點(diǎn)搞疗、 槽嗓蘑、 鍵之間的映射查詢(xún), 用于數(shù)據(jù)路由匿乃、 在線伸縮等場(chǎng)景
-
使用CRC16(key) &16383將鍵映射到槽上 image
- 特點(diǎn)
③ Redis
集群功能限制
-
Redis
集群相對(duì)單機(jī)在功能上存在一些限制-
key
批量操作支持有限桩皿。如mset
、mget
幢炸, 目前只支持具有相同slot
值的key
執(zhí)行批量操作泄隔。 對(duì)于映射為不同slot
值的key
由于執(zhí)行mget
、mget
等操作可能存在于多個(gè)節(jié)點(diǎn)上因此不被支持 -
key
事務(wù)操作支持有限宛徊,只支持多key
在同一節(jié)點(diǎn)上的事務(wù)操作佛嬉,當(dāng)多個(gè)key
分布在不同的節(jié)點(diǎn)上時(shí)無(wú)法使用事務(wù)功能 -
key
作為數(shù)據(jù)分區(qū)的最小粒度, 因此不能將一個(gè)大的鍵值對(duì)象如hash
闸天、list
等映射到不同的節(jié)點(diǎn) - 不支持多數(shù)據(jù)庫(kù)空間暖呕,單機(jī)下的
Redis
可以支持16
個(gè)數(shù)據(jù)庫(kù), 集群模式下只能使用一個(gè)數(shù)據(jù)庫(kù)空間苞氮, 即db0
- 復(fù)制結(jié)構(gòu)只支持一層湾揽, 從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn), 不支持嵌套樹(shù)狀復(fù)制結(jié)構(gòu)
-
總結(jié)
- 數(shù)據(jù)分區(qū)是分布式存儲(chǔ)的核心, 理解和靈活運(yùn)用數(shù)據(jù)分區(qū)規(guī)則對(duì)于掌握
Redis Cluster
非常有幫助