您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Redis Cluster是什么”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Redis Cluster是什么”這篇文章吧。
Redis Cluster是Redis的分布式解決方案。當(dāng)遇到內(nèi)存、并發(fā)、流量等瓶頸時(shí),就可以采用Cluster架構(gòu)達(dá)到負(fù)載均衡目的。因?yàn)镽edis Cluster是Redis3.0版本之后才有的,所以在Redis3.0版本之前,Redis分布式的解決方案一般有兩種:
客戶端分區(qū)方案,優(yōu)點(diǎn)是分區(qū)邏輯可控,缺點(diǎn)是需要自己處理數(shù)據(jù)路由、高可用、故障轉(zhuǎn)移等問題。
代理方案,優(yōu)點(diǎn)是簡化客戶端分布式邏輯和升級維護(hù)便利,缺點(diǎn)是加重架構(gòu)部署復(fù)雜度和性能損耗。
既然Redis已經(jīng)為我們提供了分布式的解決方案Redis Cluster那么下面我們將詳細(xì)介紹一下Redis Cluster的功能。
數(shù)據(jù)分布
Redis分布式集群首先要解決的問題就是把整個(gè)數(shù)據(jù)集按照分區(qū)規(guī)則映射到多個(gè)節(jié)點(diǎn)。所以下面我們介紹一下數(shù)據(jù)分區(qū)的規(guī)則。常見的分區(qū)規(guī)則有哈希分區(qū)和順序分區(qū)兩種。下表是這兩種分區(qū)的對比。
看上圖我們知道Redis Cluster采用的是哈希分區(qū)方式。所以下面我們重點(diǎn)介紹一下哈希分區(qū)的知識。
哈希分區(qū)主要有3種下面我們分別介紹一下它們3種的區(qū)別。
1.節(jié)點(diǎn)取余分區(qū)
使用特定的數(shù)據(jù),例如Redis的鍵或者用戶ID,在根據(jù)節(jié)點(diǎn)數(shù)量N使用公式:hash(key) % N計(jì)算出哈希值,用來決定數(shù)據(jù)映射到哪一個(gè)節(jié)點(diǎn)上。但這種分區(qū)有一個(gè)問題,就是當(dāng)節(jié)點(diǎn)數(shù)量變化時(shí),例如擴(kuò)容或減少節(jié)點(diǎn),數(shù)據(jù)節(jié)點(diǎn)映射關(guān)系都要重新計(jì)算。
2.一致性哈希分區(qū)
一致性哈希分區(qū)是為系統(tǒng)中的每個(gè)節(jié)點(diǎn)分配一個(gè)token,這些token構(gòu)成了一個(gè)哈希環(huán)。數(shù)據(jù)讀寫執(zhí)行節(jié)點(diǎn)查找操作時(shí),先根據(jù)key計(jì)算hash值,然后順時(shí)針找到第一個(gè)大于等于哈希值的token節(jié)點(diǎn)。
這種方式相比節(jié)點(diǎn)取余最大的好處是加入和刪除節(jié)點(diǎn)只影響哈希環(huán)中相鄰的節(jié)點(diǎn),而對其它節(jié)點(diǎn)無任何影響。但這種分區(qū)也有它的弊端。下面我們看一下這種分區(qū)的弊端:
加減節(jié)點(diǎn)會造成哈希環(huán)中部分?jǐn)?shù)據(jù)無法命中,需要手動(dòng)處理或者忽略這部分?jǐn)?shù)據(jù),因此一致性哈希常常用于緩存場景。
當(dāng)使用少量節(jié)點(diǎn)時(shí),節(jié)點(diǎn)變化將大范圍影響哈希環(huán)中的數(shù)據(jù)映射,因此這種方式不適合少量數(shù)據(jù)節(jié)點(diǎn)的分布式方案。
普通的一致性哈希分區(qū)在增減節(jié)點(diǎn)時(shí)需要增加一倍或減去一半節(jié)點(diǎn)才能保證數(shù)據(jù)和負(fù)載均衡。
3.虛擬槽分區(qū)
虛擬槽分區(qū)巧妙的使用了哈??臻g,使用分散度良好的哈希函數(shù)把所有數(shù)據(jù)映射到一個(gè)固定范圍的整數(shù)集合中,整數(shù)定義為槽。這個(gè)范圍一般遠(yuǎn)遠(yuǎn)大于節(jié)點(diǎn)數(shù)。槽是集群內(nèi)數(shù)據(jù)管理和遷移的基本單位。每個(gè)節(jié)點(diǎn)都會負(fù)責(zé)一定數(shù)量的槽。因?yàn)镽edis Cluser采用的就是虛擬槽,所以下面重點(diǎn)介紹一下Redis的數(shù)據(jù)分區(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ù)。
Redis虛擬槽分區(qū)的特點(diǎn):
解耦數(shù)據(jù)和節(jié)點(diǎn)之間的關(guān)系,簡化了節(jié)點(diǎn)擴(kuò)容和收縮難度。
節(jié)點(diǎn)自身維護(hù)槽的映射關(guān)系,不需要客戶端或者代理服務(wù)維護(hù)槽分區(qū)元數(shù)據(jù)。
支持節(jié)點(diǎn)、槽、鍵之間的映射查詢,用于數(shù)據(jù)路由、在線伸縮等場景。
集群功能限制
Redis集群相對于單機(jī)來說在功能上存在一些限制,下面我們看一下具體限制:
1.key批量操作支持有限。如mset、mget,目前只支持具有相同slot值的key執(zhí)行批量操作。對于映射為不同的slot值的key由于mset、mget操作可能存在于多個(gè)節(jié)點(diǎn)上因此不被支持。
2.key事務(wù)操作支持有限。并且只支持多key在同一個(gè)節(jié)點(diǎn)上的事務(wù)操作,當(dāng)多個(gè)key分布在不同的節(jié)點(diǎn)上時(shí)無法使用事務(wù)功能。
3.key作為數(shù)據(jù)分區(qū)的最小粒度,因此不能將一個(gè)大的鍵值對象如hash、list等映射到不同的節(jié)點(diǎn)。
4.不支持多數(shù)據(jù)庫空間,單機(jī)下的Redis可以支持16個(gè)數(shù)據(jù)庫,集群模式下只能使用一個(gè)數(shù)據(jù)庫空間。即 db 0。
5.復(fù)制結(jié)構(gòu)只支持一層,從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn),不支持樹狀復(fù)制結(jié)構(gòu)。
以上是“Redis Cluster是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。