溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

redis集群特性有哪些

發(fā)布時(shí)間:2022-10-18 16:19:01 來源:億速云 閱讀:99 作者:iii 欄目:編程語言

本篇內(nèi)容介紹了“redis集群特性有哪些”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

redis3.0集群特性

主從復(fù)制(讀寫分離)

主從復(fù)制的好處有2點(diǎn):

  • 1、 避免redis單點(diǎn)故障

  • 2、 構(gòu)建讀寫分離架構(gòu),滿足讀多寫少的應(yīng)用場景

設(shè)置主從

創(chuàng)建6379、6380、6381目錄,分別將安裝目錄下的redis.conf拷貝到這三個(gè)目錄下。

分別進(jìn)入這三個(gè)目錄,分別修改配置文件,將端口分別設(shè)置為:6379(Master)、6380(Slave)、6381(Slave)。同時(shí)要設(shè)置pidfile文件為不同的路徑。

在redis中設(shè)置主從有2種方式:

  • 1、 在redis.conf中設(shè)置slaveof
    a) slaveof

  • 2、 使用redis-cli客戶端連接到redis服務(wù),執(zhí)行slaveof命令
    a) slaveof

第二種方式在重啟后將失去主從復(fù)制關(guān)系。

查看主從信息:INFO replication

主:

role:角色

connected_slaves:從庫數(shù)量

slave0:從庫信息

從:

主從從架構(gòu)

從庫只讀

默認(rèn)情況下redis數(shù)據(jù)庫充當(dāng)slave角色時(shí)是只讀的不能進(jìn)行寫操作。
可以在配置文件中開啟非只讀:slave-read-only no

復(fù)制的過程原理
  • 1、 當(dāng)從庫和主庫建立MS關(guān)系后,會(huì)向主數(shù)據(jù)庫發(fā)送SYNC命令;

  • 2、 主庫接收到SYNC命令后會(huì)開始在后臺(tái)保存快照(RDB持久化過程),并將期間接收到的寫命令緩存起來;

  • 3、 當(dāng)快照完成后,主Redis會(huì)將快照文件和所有緩存的寫命令發(fā)送給從Redis;

  • 4、 從Redis接收到后,會(huì)載入快照文件并且執(zhí)行收到的緩存的命令;

  • 5、 之后,主Redis每當(dāng)接收到寫命令時(shí)就會(huì)將命令發(fā)送從Redis,從而保證數(shù)據(jù)的一致;

無磁盤復(fù)制

通過前面的復(fù)制過程我們了解到,主庫接收到SYNC的命令時(shí)會(huì)執(zhí)行RDB過程,即使在配置文件中禁用RDB持久化也會(huì)生成,那么如果主庫所在的服務(wù)器磁盤IO性能較差,那么這個(gè)復(fù)制過程就會(huì)出現(xiàn)瓶頸,慶幸的是,Redis在2.8.18版本開始實(shí)現(xiàn)了無磁盤復(fù)制功能(不過該功能還是處于試驗(yàn)階段)。

原理:
Redis在與從數(shù)據(jù)庫進(jìn)行復(fù)制初始化時(shí)將不會(huì)將快照存儲(chǔ)到磁盤,而是直接通過網(wǎng)絡(luò)發(fā)送給從數(shù)據(jù)庫,避免了IO性能差問題。

開啟無磁盤復(fù)制:repl-diskless-sync yes

復(fù)制架構(gòu)中出現(xiàn)宕機(jī)情況,怎么辦?

如果在主從復(fù)制架構(gòu)中出現(xiàn)宕機(jī)的情況,需要分情況看:

1、 從Redis宕機(jī)
    a)  這個(gè)相對(duì)而言比較簡單,在Redis中從庫重新啟動(dòng)后會(huì)自動(dòng)加入到主從架構(gòu)中,自動(dòng)完成同步數(shù)據(jù);
    b)  問題? 如果從庫在斷開期間,主庫的變化不大,從庫再次啟動(dòng)后,
                  主庫依然會(huì)將所有的數(shù)據(jù)做RDB操作嗎?還是增量更新?(從庫有做持久化的前提下)

不會(huì)的,因?yàn)樵赗edis2.8版本后就實(shí)現(xiàn)了,主從斷線后恢復(fù)的情況下實(shí)現(xiàn)增量復(fù)制。

2、 主Redis宕機(jī)

這個(gè)相對(duì)而言就會(huì)復(fù)雜一些,需要以下2步才能完成

    i.  第一步,在從數(shù)據(jù)庫中執(zhí)行SLAVEOF NO ONE命令,斷開主從關(guān)系并且提升為主庫繼續(xù)服務(wù);
    ii. 第二步,將主庫重新啟動(dòng)后,執(zhí)行SLAVEOF命令,將其設(shè)置為其他庫的從庫,這時(shí)數(shù)據(jù)就能更新回來;

這個(gè)手動(dòng)完成恢復(fù)的過程其實(shí)是比較麻煩的并且容易出錯(cuò),有沒有好辦法解決呢?當(dāng)前有的,Redis提高的哨兵(sentinel)的功能。

哨兵(sentinel)

什么是哨兵

顧名思義,哨兵的作用就是對(duì)Redis的系統(tǒng)的運(yùn)行情況的監(jiān)控,它是一個(gè)獨(dú)立進(jìn)程。它的功能有2個(gè):

  • 1、 監(jiān)控主數(shù)據(jù)庫和從數(shù)據(jù)庫是否運(yùn)行正常;

  • 2、 主數(shù)據(jù)出現(xiàn)故障后自動(dòng)將從數(shù)據(jù)庫轉(zhuǎn)化為主數(shù)據(jù)庫;

原理

單個(gè)哨兵的架構(gòu):

多個(gè)哨兵的架構(gòu):

多個(gè)哨兵,不僅同時(shí)監(jiān)控主從數(shù)據(jù)庫,而且哨兵之間互為監(jiān)控。

配置哨兵

啟動(dòng)哨兵進(jìn)程首先需要?jiǎng)?chuàng)建哨兵配置文件:

vim sentinel.conf

輸入內(nèi)容:

sentinel monitor taotaoMaster 127.0.0.1 6379 1

說明:

    taotaoMaster:監(jiān)控主數(shù)據(jù)的名稱,自定義即可,可以使用大小寫字母和“.-_”符號(hào)
    127.0.0.1:監(jiān)控的主數(shù)據(jù)庫的IP
    6379:監(jiān)控的主數(shù)據(jù)庫的端口
    1:最低通過票數(shù)

啟動(dòng)哨兵進(jìn)程:

redis-sentinel ./sentinel.conf

由上圖可以看到:

  • 1、 哨兵已經(jīng)啟動(dòng),它的id為9059917216012421e8e89a4aa02f15b75346d2b7

  • 2、 為master數(shù)據(jù)庫添加了一個(gè)監(jiān)控

  • 3、 發(fā)現(xiàn)了2個(gè)slave(由此可以看出,哨兵無需配置slave,只需要指定master,哨兵會(huì)自動(dòng)發(fā)現(xiàn)slave)

配置多個(gè)哨兵
vim sentinel.conf

輸入內(nèi)容:

sentinel monitor taotaoMaster 127.0.0.1 6381 2
sentinel monitor taotaoMaster2 127.0.0.1 6381 1

集群

即使有了主從復(fù)制,每個(gè)數(shù)據(jù)庫都要保存整個(gè)集群中的所有數(shù)據(jù),容易形成木桶效應(yīng)。

使用Jedis實(shí)現(xiàn)了分片集群,是由客戶端控制哪些key數(shù)據(jù)保存到哪個(gè)數(shù)據(jù)庫中,如果在水平擴(kuò)容時(shí)就必須手動(dòng)進(jìn)行數(shù)據(jù)遷移,而且需要將整個(gè)集群停止服務(wù),這樣做非常不好的。

Redis3.0版本的一大特性就是集群(Cluster),接下來我們一起學(xué)習(xí)集群。

架構(gòu)

  • (1)所有的redis節(jié)點(diǎn)彼此互聯(lián)(PING-PONG機(jī)制),內(nèi)部使用二進(jìn)制協(xié)議優(yōu)化傳輸速度和帶寬.

  • (2)節(jié)點(diǎn)的fail是通過集群中超過半數(shù)的節(jié)點(diǎn)檢測失效時(shí)才生效.

  • (3)客戶端與redis節(jié)點(diǎn)直連,不需要中間proxy層.客戶端不需要連接集群所有節(jié)點(diǎn),連接集群中任何一個(gè)可用節(jié)點(diǎn)即可

  • (4)redis-cluster把所有的物理節(jié)點(diǎn)映射到[0-16383]slot(插槽)上,cluster 負(fù)責(zé)維護(hù)node<->slot<->value

修改配置文件

  • 1、 設(shè)置不同的端口,6379、6380、6381

  • 2、 開啟集群,cluster-enabled yes

  • 3、 指定集群的配置文件,cluster-config-file “nodes-xxxx.conf”

創(chuàng)建集群

首先,進(jìn)入redis的安裝包路徑下:
cd /usr/local/src/redis/redis-3.0.1/src/

執(zhí)行命令:

./redis-trib.rb create --replicas 0 192.168.56.102:6379 192.168.56.102:6380 192.168.56.102:6381

–replicas 0:指定了從數(shù)據(jù)的數(shù)量為0

注意:這里不能使用127.0.0.1,否則在Jedis客戶端使用時(shí)無法連接到!

redis-trib用法:

測試

什么情況??(error) MOVED 7638 127.0.0.1:6380

因?yàn)閍bc的hash槽信息是在6380上,現(xiàn)在使用redis-cli連接的6379,無法完成set操作,需要客戶端跟蹤重定向。

redis-cli -c

插槽的分配

通過cluster nodes命令可以查看當(dāng)前集群的信息:

該信息反映出了集群中的每個(gè)節(jié)點(diǎn)的id、身份、連接數(shù)、插槽數(shù)等。

當(dāng)我們執(zhí)行set abc 123命令時(shí),redis是如何將數(shù)據(jù)保存到集群中的呢?執(zhí)行步驟:

1、  接收命令set abc 123
2、  通過key(abc)計(jì)算出插槽值,然后根據(jù)插槽值找到對(duì)應(yīng)的節(jié)點(diǎn)。(abc的插槽值為:7638)
3、  重定向到該節(jié)點(diǎn)執(zhí)行命令

整個(gè)Redis提供了16384個(gè)插槽,也就是說集群中的每個(gè)節(jié)點(diǎn)分得的插槽數(shù)總和為16384。

./redis-trib.rb 腳本實(shí)現(xiàn)了是將16384個(gè)插槽平均分配給了N個(gè)節(jié)點(diǎn)。

注意:如果插槽數(shù)有部分是沒有指定到節(jié)點(diǎn)的,那么這部分插槽所對(duì)應(yīng)的key將不能使用。

插槽和key的關(guān)系

計(jì)算key的插槽值:

key的有效部分使用CRC16算法計(jì)算出哈希值,再將哈希值對(duì)16384取余,得到插槽值。

什么是有效部分?

  • 1、 如果key中包含了{(lán)符號(hào),且在{符號(hào)后存在}符號(hào),并且{和}之間至少有一個(gè)字符,則有效部分是指{和}之間的部分;
    a) key={hello}_tatao的有效部分是hello

  • 2、 如果不滿足上一條情況,整個(gè)key都是有效部分;
    a) key=hello_taotao的有效部分是全部

新增集群節(jié)點(diǎn)

再開啟一個(gè)實(shí)例的端口為6382

執(zhí)行腳本:

./redis-trib.rb add-node 192.168.56.102:6382 192.168.56.102:6379

已經(jīng)添加成功!查看集群信息:

發(fā)現(xiàn)沒有插槽數(shù)。

接下來需要給6382這個(gè)服務(wù)分配插槽,將6379的一部分(1000個(gè))插槽分配給6382:

查看節(jié)點(diǎn)情況:

刪除集群節(jié)點(diǎn)

想要?jiǎng)h除集群節(jié)點(diǎn)中的某一個(gè)節(jié)點(diǎn),需要嚴(yán)格執(zhí)行2步:

1、 將這個(gè)節(jié)點(diǎn)上的所有插槽轉(zhuǎn)移到其他節(jié)點(diǎn)上;

    a)  假設(shè)我們想要?jiǎng)h除6380這個(gè)節(jié)點(diǎn)
    b)  執(zhí)行腳本:./redis-trib.rb reshard 192.168.56.102:6380
    c)  選擇需要轉(zhuǎn)移的插槽的數(shù)量,因?yàn)?380有5128個(gè),所以轉(zhuǎn)移5128個(gè)
    d)  輸入轉(zhuǎn)移的節(jié)點(diǎn)的id,我們轉(zhuǎn)移到6382節(jié)點(diǎn):82ed0d63cfa6d19956dca833930977a87d6ddf7
    e)  輸入插槽來源id,也就是6380的id
    f)  輸入done,開始轉(zhuǎn)移
    g)  查看集群信息,可以看到6380節(jié)點(diǎn)已經(jīng)沒有插槽了。

2、 使用redis-trib.rb刪除節(jié)點(diǎn)

    a)  ./redis-trib.rb del-node 192.168.56.102:6380 4a9b8886ba5261e82597f5590fcdb49ea47c4c6c
    b)  del-node host:port node_id
    c)   
    d)  查看集群信息,可以看到已經(jīng)沒有6380這個(gè)節(jié)點(diǎn)了。

故障機(jī)制

1、  集群中的每個(gè)節(jié)點(diǎn)都會(huì)定期的向其它節(jié)點(diǎn)發(fā)送PING命令,并且通過有沒有收到回復(fù)判斷目標(biāo)節(jié)點(diǎn)是否下線;
2、  集群中每一秒就會(huì)隨機(jī)選擇5個(gè)節(jié)點(diǎn),然后選擇其中最久沒有響應(yīng)的節(jié)點(diǎn)放PING命令;
3、  如果一定時(shí)間內(nèi)目標(biāo)節(jié)點(diǎn)都沒有響應(yīng),那么該節(jié)點(diǎn)就認(rèn)為目標(biāo)節(jié)點(diǎn)疑似下線;
4、  當(dāng)集群中的節(jié)點(diǎn)超過半數(shù)認(rèn)為該目標(biāo)節(jié)點(diǎn)疑似下線,那么該節(jié)點(diǎn)就會(huì)被標(biāo)記為下線;
5、  當(dāng)集群中的任何一個(gè)節(jié)點(diǎn)下線,就會(huì)導(dǎo)致插槽區(qū)有空檔,不完整,那么該集群將不可用;
6、  如何解決上述問題?
a)  在Redis集群中可以使用主從模式實(shí)現(xiàn)某一個(gè)節(jié)點(diǎn)的高可用
b)  當(dāng)該節(jié)點(diǎn)(master)宕機(jī)后,集群會(huì)將該節(jié)點(diǎn)的從數(shù)據(jù)庫(slave)轉(zhuǎn)變?yōu)椋╩aster)繼續(xù)完成集群服務(wù);

集群中的主從復(fù)制架構(gòu)

架構(gòu):

出現(xiàn)故障:

4.9.3. 創(chuàng)建主從集群

需要啟動(dòng)6個(gè)redis實(shí)例,分別是:
6379(主) 6479(從)
6380(主) 6480(從)
6381(主) 6481(從)

啟動(dòng)redis實(shí)例:

cd 6379/ && redis-server ./redis.conf && cd ..
cd 6380/ && redis-server ./redis.conf && cd ..
cd 6381/ && redis-server ./redis.conf && cd ..
cd 6479/ && redis-server ./redis.conf && cd ..
cd 6480/ && redis-server ./redis.conf && cd ..
cd 6481/ && redis-server ./redis.conf && cd

創(chuàng)建集群,指定了從庫數(shù)量為1,創(chuàng)建順序?yàn)橹鲙欤?個(gè))、從庫(3個(gè)):

./redis-trib.rb create --replicas 1 192.168.56.102:6379 192.168.56.102:6380 192.168.56.102:6381 192.168.56.102:6479 192.168.56.102:6480 192.168.56.102:6481

“redis集群特性有哪些”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI