013.Redis Cluster架構(gòu)原理

1. Redis單master的瓶頸

  • master節(jié)點(diǎn)的數(shù)據(jù)和slave節(jié)點(diǎn)的數(shù)據(jù)是一模一樣的,master節(jié)點(diǎn)的最多能容納多少數(shù)據(jù)量,slave節(jié)點(diǎn)也就只能容納這么多數(shù)據(jù)
  • 當(dāng)數(shù)據(jù)量超過master的內(nèi)存,redis會(huì)使用LRU算法清除部分?jǐn)?shù)據(jù)
  • 如果確實(shí)要容納更多的數(shù)據(jù)量,redis主從架構(gòu)是無法解決這個(gè)問題的

2. Redis Cluster架構(gòu)原理

2.1 Redis Cluster架構(gòu)概述

Redis Cluster是Redis的分布式解決方案,在3.0版本正式推出,解決單master架構(gòu)的內(nèi)存、并發(fā)、流量等瓶頸,以達(dá)到負(fù)載均衡的目的。

  • 每個(gè)master負(fù)責(zé)整個(gè)集群的一部分?jǐn)?shù)據(jù),每個(gè)節(jié)點(diǎn)負(fù)責(zé)數(shù)據(jù)多少可能不一樣
  • 每個(gè)master的角色是對(duì)等的
  • 每個(gè)master節(jié)點(diǎn)都可以有N個(gè)slave節(jié)點(diǎn),當(dāng)一個(gè)master節(jié)點(diǎn)掛掉后,它的其中一個(gè)slave節(jié)點(diǎn)升級(jí)為master
  • redis cluster已經(jīng)自動(dòng)具備了主從復(fù)制能力,也就是說,我們不需要手動(dòng)再去搭建主從+sentinel架構(gòu)
  • redis cluster適用于海量數(shù)據(jù)、高并發(fā)、高可用場(chǎng)景

2.2 Hash Slot算法

(1) 分布式存儲(chǔ)的數(shù)據(jù)分配算法

  • 按照順序存儲(chǔ)

    • 與業(yè)務(wù)相關(guān),例如商品信息存在A節(jié)點(diǎn),用戶信息存在B節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)的數(shù)據(jù)可以排序
    • 容易造成數(shù)據(jù)傾斜
    • 代表產(chǎn)品:HBase
  • 散列存儲(chǔ)

    • 離散度好,數(shù)據(jù)均勻分布,每個(gè)節(jié)點(diǎn)的數(shù)據(jù)量大致相同

    • 業(yè)務(wù)無關(guān)

    • 無法順序訪問

    • 代表產(chǎn)品:Redis Cluster

分布式存儲(chǔ)的hash算法演進(jìn)

(2) hash算法

  • 優(yōu)點(diǎn)

    • 簡單
  • 問題

    • 一旦某個(gè)master宕機(jī),就需要調(diào)整hash算法,所有的數(shù)據(jù)都需要重新計(jì)算取模(由對(duì)3取模變成對(duì)2取模),然后重新分配數(shù)據(jù)
    • 發(fā)生這種故障時(shí),在數(shù)據(jù)未重新分配之前,由于更換了hash算法,導(dǎo)致大部分的請(qǐng)求都無法正確的拿到數(shù)據(jù),從而不得不去訪問數(shù)據(jù)庫,在高并發(fā)場(chǎng)景下,這樣是不能接受的,所以目前分布式緩存不再使用此種算法分配數(shù)據(jù)
  • 適用場(chǎng)景

    常用于數(shù)據(jù)庫的分庫分表規(guī)則,采用預(yù)分區(qū)的方式,提前根據(jù)數(shù)據(jù)量規(guī)劃好分區(qū)數(shù),保證可支撐未來一段時(shí)間的數(shù)據(jù)量

  • 擴(kuò)容方案

    通常采用翻倍擴(kuò)容,避免數(shù)據(jù)映射全部被打亂導(dǎo)致全量遷移

(3) 一致性hash算法

  • 實(shí)現(xiàn)思路
    • 每個(gè)節(jié)點(diǎn)被預(yù)先分配一個(gè)token(可以理解為它管理的hash值的邊界),多個(gè)節(jié)點(diǎn)管理范圍為[0, 2^32]的hash值范圍
    • 數(shù)據(jù)讀寫時(shí),先根據(jù)key求hash值,然后就知道此hash值在哪段范圍內(nèi)
    • 順時(shí)針找到的節(jié)點(diǎn)就是其數(shù)據(jù)存儲(chǔ)的節(jié)點(diǎn)
  • 問題
    • 加減節(jié)點(diǎn)會(huì)造成哈希環(huán)中部分?jǐn)?shù)據(jù)(1/N的數(shù)據(jù)量,N為節(jié)點(diǎn)個(gè)數(shù))無法命中,當(dāng)一個(gè)master掛掉之后,例如master1掛掉,那么當(dāng)請(qǐng)求從master1獲取數(shù)據(jù)時(shí),是獲取不到的,于是繼續(xù)順時(shí)針去master2、master0獲取數(shù)據(jù),當(dāng)然也是獲取不到的,需要手動(dòng)處理這些無法命中的數(shù)據(jù)
    • 節(jié)點(diǎn)數(shù)量越多,增減節(jié)點(diǎn)帶來的影響越小,因此不適用與集群中只有少量節(jié)點(diǎn)的情況
    • 容易造成數(shù)據(jù)熱點(diǎn)問題
  • 擴(kuò)容方案
    • master的增減,需要增加一倍或者減少一倍,才能保證數(shù)據(jù)和負(fù)載的均衡

(4) 優(yōu)化后的一致性hash算法

  • 給master節(jié)點(diǎn)之間增加了均勻分布的虛擬節(jié)點(diǎn)
  • 如果某個(gè)區(qū)間內(nèi)有大量的數(shù)據(jù),順時(shí)針找到的就是其他的虛擬節(jié)點(diǎn),這樣每個(gè)區(qū)間內(nèi)的數(shù)據(jù)都會(huì)均勻的分配到不同的master中去

(5) redis的hash slot算法

  • 實(shí)現(xiàn)原理

    • Redis Cluster使用16384個(gè)槽(slot)來管理一段整數(shù)集合(hash值),slot是集群內(nèi)數(shù)據(jù)管理和遷移的基本單位

    • 每個(gè)master節(jié)點(diǎn)負(fù)責(zé)管理一部分slot,例如有5個(gè)節(jié)點(diǎn),那個(gè)每個(gè)節(jié)點(diǎn)管理大約3276個(gè)槽

    • 對(duì)每個(gè)key使用CRC32算法進(jìn)行hash得到一個(gè)整數(shù)值,然后使用hash值對(duì)16384進(jìn)行取模,得到此數(shù)據(jù)應(yīng)該分配到的slot編號(hào),配置該slot即可被該slot的master管理

    • 每個(gè)master管理的slot的信息就緩存在本地,客戶端連接集群時(shí),會(huì)獲取集群slot配置信息,從而通過key精確找到slot所在的節(jié)點(diǎn)

    • 可以強(qiáng)制指定某個(gè)key掛在指定的slot上

  • 優(yōu)點(diǎn)

    • 解耦數(shù)據(jù)和節(jié)點(diǎn)之間的關(guān)系,簡化了節(jié)點(diǎn)擴(kuò)容和收縮難度,增加一個(gè)master,就讓其他的master分一部分slot給新來的master管理,移除一個(gè)master,就把這個(gè)master管理的slot分配給其他的master

    • 某個(gè)master掛掉,不影響整個(gè)集群,因?yàn)檎?qǐng)求是到slot,而不是到master,但在slot遷移完成之前,請(qǐng)求到掛掉的節(jié)點(diǎn)也是不行的

    • slot遷移的過程是很快的

    • 節(jié)點(diǎn)自身維護(hù)slot的映射關(guān)系,無需人為管理

    • 支持槽、節(jié)點(diǎn)、key之間的映射關(guān)系查詢

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容