日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

Redis聚类

發(fā)布時(shí)間:2023/12/3 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis聚类 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文是我們學(xué)院課程的一部分,標(biāo)題為Redis NoSQL鍵值存儲(chǔ) 。

這是Redis的速成班。 您將學(xué)習(xí)如何安裝Redis并啟動(dòng)服務(wù)器。 此外,您將在Redis命令行中亂七八糟。 接下來(lái)是更高級(jí)的主題,例如復(fù)制,分片和集群,同時(shí)還介紹了Redis與Spring Data的集成。 在這里查看 !

目錄

1.簡(jiǎn)介 2. Redis集群限制 3.分片(分區(qū))方案
3.1鍵哈希標(biāo)簽
4.簡(jiǎn)而言之,Redis聚類 5.一致性,可用性和可伸縮性
5.1一致性 5.2可用性 5.3可擴(kuò)展性
6.安裝具有群集支持的Redis 7.配置Redis集群
7.1配置Redis Cluster主節(jié)點(diǎn) 7.2配置Redis Cluster從節(jié)點(diǎn)和復(fù)制 7.3驗(yàn)證Redis集群工作正常 7.4在正在運(yùn)行的Redis集群中添加和刪除節(jié)點(diǎn)
8. Redis集群命令 9. Redis前哨 10.下一步是什么

1.簡(jiǎn)介

本教程的最后部分專門介紹Redis的最新和最酷但仍處于試驗(yàn)階段(尚未投入生產(chǎn))的功能-群集。 本部分的內(nèi)容主要基于Redis文檔部分http://redis.io/topics/cluster-tutorial和http://redis.io/topics/cluster-spec 。 Redis集群(或簡(jiǎn)稱為Redis集群)是一種分布式Redis部署,旨在解決以下主要目標(biāo):

  • 自動(dòng)在多個(gè)節(jié)點(diǎn)之間分割數(shù)據(jù)集的能力
  • 提供高性能和線性可擴(kuò)展性的能力
  • 保留來(lái)自與大多數(shù)節(jié)點(diǎn)連接的客戶端的所有寫操作的能力( 寫安全性 / 一致性
  • 能夠在大多數(shù)主節(jié)點(diǎn)都可訪問且每個(gè)不再可用的主節(jié)點(diǎn)上至少有一個(gè)可訪問的從節(jié)點(diǎn)的網(wǎng)絡(luò)分區(qū)中生存的能力( 可用性

Redis Cluster是數(shù)據(jù)分片(分區(qū))的替代(但更高級(jí))解決方案,我們已經(jīng)在本教程的第4部分“ Redis Sharding”中看到過(但不是使用第三方工具,所有功能均由Redis本身提供)附加配置)。 為了實(shí)現(xiàn)高可用性,Redis Cluster還高度依賴于主從復(fù)制,這在本教程的第3部分“ Redis復(fù)制”中已經(jīng)看到。

2. Redis集群限制

首先,與Redis Cluster相關(guān)的所有功能都處于實(shí)驗(yàn)?zāi)J?#xff0c;尚未準(zhǔn)備好用于生產(chǎn)。

構(gòu)建任何高度可用的分布式系統(tǒng)非常困難,但是Redis試圖使其成為可能。 有一些局限性需要注意和權(quán)衡,我們已經(jīng)提到了其中一些,但在這里也有必要重復(fù)一下。

首先,處理多個(gè)按鍵的命令不被Redis的集群支持( SINTER , SUNION ,...)。 這種功能需要在Redis節(jié)點(diǎn)之間移動(dòng)數(shù)據(jù),這將使Redis Cluster無(wú)法在負(fù)載下提供可接受的性能和可預(yù)測(cè)的行為。 通常,在Redis節(jié)點(diǎn)中處理命令的鍵不可用的所有操作都不會(huì)實(shí)現(xiàn)。

其次,Redis Cluster不支持像獨(dú)立版本的Redis一樣的多個(gè)數(shù)據(jù)庫(kù)。 只有一個(gè)數(shù)據(jù)庫(kù)0,并且不允許SELECT 。

第三,Redis集群中的節(jié)點(diǎn)不將命令代理到存儲(chǔ)給定密鑰的正確節(jié)點(diǎn),而是將客戶端重定向到服務(wù)給定范圍的密鑰空間的正確節(jié)點(diǎn)(所謂的query routing的混合形式)。 最終,客戶端獲得群集拓?fù)涞淖钚卤硎?#xff0c;并且知道哪個(gè)節(jié)點(diǎn)提供密鑰的哪個(gè)子集,可以直接聯(lián)系正確的節(jié)點(diǎn)以發(fā)送給定命令(有效地回退到client side partitioning )。

3.分片(分區(qū))方案

正如我們從第4部分 Redis Sharding中已經(jīng)知道的那樣,有兩種數(shù)據(jù)分片(分區(qū))方案用于拆分?jǐn)?shù)據(jù),而一致性哈希是最先進(jìn)和廣泛使用的方案。 Redis Cluster不使用一致的哈希,而是使用不同形式的數(shù)據(jù)拆分,每個(gè)鍵都是所謂的hash slot 。

Redis群集中有16384個(gè)hash slots ,要計(jì)算給定密鑰的hash slot ,將計(jì)算該密鑰的CRC16函數(shù)( http://en.wikipedia.org/wiki/Cyclic_redundancy_check ),然后將其模將16384的值應(yīng)用于其結(jié)果。

Redis群集中的每個(gè)節(jié)點(diǎn)都負(fù)責(zé)hash slots的子集。 例如,讓我們考慮一個(gè)具有四個(gè)Redis節(jié)點(diǎn)# 1 ,# 2 ,# 3和# 4的集群。 這可能會(huì)給我們以下hash slots分布:

  • Redis節(jié)點(diǎn)1包含從04096的 hash slots
  • Redis節(jié)點(diǎn)2包含從40978192的 hash slots
  • Redis節(jié)點(diǎn)3包含從819312288的 hash slots
  • Redis節(jié)點(diǎn)4包含從1228916383的 hash slots

這種分片(分區(qū))方案可以輕松更改群集的拓?fù)?#xff08;添加和刪除節(jié)點(diǎn))。 例如,如果需要添加新節(jié)點(diǎn)#5,則應(yīng)將來(lái)自節(jié)點(diǎn)# 1 ,# 2 ,# 3和# 4的一些hash slots移至節(jié)點(diǎn)# 5 。 同樣,如果需要從群集中刪除節(jié)點(diǎn)# 3 ,則應(yīng)將節(jié)點(diǎn)# 3服務(wù)的hash slots移至節(jié)點(diǎn)# 1和# 2 。 當(dāng)節(jié)點(diǎn)#3變空時(shí),可以將其從群集中永久刪除。

現(xiàn)在最好的部分是:因?yàn)閷ash slots從一個(gè)節(jié)點(diǎn)移動(dòng)到另一個(gè)節(jié)點(diǎn)不需要停止正在進(jìn)行的操作,所以添加和刪除節(jié)點(diǎn)(或更改節(jié)點(diǎn)持有的hash slots的百分比)不需要停機(jī)。

在本教程的后面,我們將回到本示例,并使用三個(gè)Redis主節(jié)點(diǎn)(每個(gè)節(jié)點(diǎn)由一個(gè)從屬節(jié)點(diǎn)支持)構(gòu)建實(shí)際的集群。 在Redis Cluster運(yùn)行期間,我們將添加和刪除一些節(jié)點(diǎn),以了解如何實(shí)時(shí)hash slots 。

3.1鍵哈希標(biāo)簽

Redis分片(分區(qū))方案支持的非常有趣的功能就是所謂的密鑰hash tags 。 Hash tags是一種確保在同一hash slot分配兩個(gè)(或多個(gè))密鑰的技術(shù)。

為了支持hash tags , hash slot以不同的方式計(jì)算。 如果鍵包含“ {…} ”模式,則僅對(duì)“ { ”和“ } ”之間的子字符串進(jìn)行哈希處理,以獲得hash slot (如果出現(xiàn)多次“ { ”或“ } ”密鑰名稱,會(huì)制定一些規(guī)則,并在http://redis.io/topics/cluster-spec中進(jìn)行了描述。

我們?cè)?strong>第4部分的 Redis Sharding中玩過的Twemproxy ( nutcracker )還允許遵循相同的規(guī)則集來(lái)配置用于hash tags 。

4.簡(jiǎn)而言之,Redis聚類

在Redis群集中,所有節(jié)點(diǎn)都持有全局密鑰集的某些部分(碎片或分區(qū))。 此外,每個(gè)節(jié)點(diǎn)都保持群集的狀態(tài)(包括hash slots映射),以便將客戶端重定向到給定密鑰的正確節(jié)點(diǎn)。 Redis群集中的所有節(jié)點(diǎn)還能夠自動(dòng)發(fā)現(xiàn)其他節(jié)點(diǎn),檢測(cè)不可達(dá)或無(wú)法按預(yù)期工作的節(jié)點(diǎn),并在需要時(shí)執(zhí)行從屬節(jié)點(diǎn)以進(jìn)行主選舉。

至于http://redis.io/topics/cluster-spec上描述的實(shí)現(xiàn)細(xì)節(jié),則集群中的所有節(jié)點(diǎn)都使用帶有二進(jìn)制協(xié)議的TCP( cluster bus )進(jìn)行連接,以便每個(gè)節(jié)點(diǎn)都連接到該節(jié)點(diǎn)中的每個(gè)其他節(jié)點(diǎn)。使用cluster bus的cluster bus (這意味著在N個(gè)節(jié)點(diǎn)的Redis群集中,每個(gè)節(jié)點(diǎn)具有N – 1個(gè)傳出TCP連接和N – 1個(gè)傳入TCP連接)。 這些TCP連接始終保持活動(dòng)狀態(tài)。 節(jié)點(diǎn)使用八卦協(xié)議( http://en.wikipedia.org/wiki/Gossip_protocol )分散群集狀態(tài),發(fā)現(xiàn)新節(jié)點(diǎn),確保所有節(jié)點(diǎn)均正常工作以及在群集中傳播發(fā)布/訂閱消息。

Redis群集中的每個(gè)節(jié)點(diǎn)都有唯一的ID(名稱)。 節(jié)點(diǎn)ID(名稱)是160位隨機(jī)數(shù)的十六進(jìn)制表示,是在節(jié)點(diǎn)第一次啟動(dòng)時(shí)獲得的。 節(jié)點(diǎn)會(huì)將其ID(名稱)保存在節(jié)點(diǎn)配置文件中(默認(rèn)情況下為nodes.conf ),并將永久使用相同的ID(名稱)(或至少在不刪除節(jié)點(diǎn)配置文件的情況下)。

節(jié)點(diǎn)ID(名稱)用于標(biāo)識(shí)整個(gè)Redis群集中的每個(gè)節(jié)點(diǎn)。 給定節(jié)點(diǎn)可以更改其IP地址,而無(wú)需也更改其ID(名稱)。 群集還能夠檢測(cè)IP或/和端口的更改,并使用在cluster bus運(yùn)行的八卦協(xié)議廣播此信息。 此外,每個(gè)節(jié)點(diǎn)還具有與之相關(guān)的其他信息,Redis群集中的所有其他節(jié)點(diǎn)都應(yīng)知道以下信息:

  • 節(jié)點(diǎn)所在的IP地址和TCP端口
  • 一組標(biāo)志(主,從,…)
  • 節(jié)點(diǎn)服務(wù)的一組hash slots (請(qǐng)參閱分片(分區(qū))方案 )
  • 上次使用群集總線發(fā)送ping數(shù)據(jù)包
  • 上次收到pong數(shù)據(jù)包的答復(fù)
  • 節(jié)點(diǎn)被標(biāo)記為失敗的時(shí)間
  • 該節(jié)點(diǎn)的從站數(shù)量
  • 主節(jié)點(diǎn)ID(名稱)(如果此節(jié)點(diǎn)是從節(jié)點(diǎn))(如果為主節(jié)點(diǎn),則為零)

使用CLUSTER NODES命令可以使用某些信息(請(qǐng)參閱Redis Cluster Commands部分)。

5.一致性,可用性和可伸縮性

Redis Cluster是一個(gè)分布式系統(tǒng)。 好的分布式系統(tǒng)是可擴(kuò)展的,并且能夠大規(guī)模提供更好的性能。 但是,在任何分布式系統(tǒng)中,任何組件都可能隨時(shí)發(fā)生故障,并且系統(tǒng)應(yīng)該提供某些保證,以防發(fā)生此類故障(尤其是在它是數(shù)據(jù)存儲(chǔ)的情況下)。 在本節(jié)中,我們將簡(jiǎn)要介紹Redis在一致性,可用性和可伸縮性方面進(jìn)行的一些高級(jí)權(quán)衡。 可以在http://redis.io/topics/cluster-spec和http://redis.io/topics/cluster-tutorial中找到更深入的見解和詳細(xì)信息。 請(qǐng)注意,Redis Cluster的發(fā)展非常Swift,本節(jié)中討論的某些保證可能不再成立。

5.1一致性

Redis Cluster無(wú)法保證強(qiáng)大的一致性,但是會(huì)努力保留客戶端執(zhí)行的所有寫入操作。 不幸的是,這并不總是可能的。 由于Redis Cluster在主節(jié)點(diǎn)和從節(jié)點(diǎn)之間使用異步復(fù)制,因此在網(wǎng)絡(luò)分區(qū)期間可能丟失寫操作時(shí),總是會(huì)有時(shí)間窗口。 如果主節(jié)點(diǎn)在沒有到達(dá)從節(jié)點(diǎn)的寫入的情況下死亡,則寫入將永遠(yuǎn)丟失(以防萬(wàn)一主節(jié)點(diǎn)長(zhǎng)時(shí)間無(wú)法訪問并且其從節(jié)點(diǎn)之一被提升為主節(jié)點(diǎn))。

5.2可用性

Redis群集在網(wǎng)絡(luò)分區(qū)的少數(shù)部分不可用。 在網(wǎng)絡(luò)分區(qū)的多數(shù)端中,假設(shè)每個(gè)不可達(dá)的主機(jī)至少有多數(shù)主機(jī)和一個(gè)從機(jī),Redis群集仍然可用。 這意味著Redis群集可以承受群集中幾個(gè)節(jié)點(diǎn)的故障,但不能承受大型網(wǎng)絡(luò)分區(qū)。 對(duì)于示例,讓我們考慮具有N個(gè)主節(jié)點(diǎn)( M1 , M2 , M3 )和N個(gè)從屬節(jié)點(diǎn)( S1 , S2 , S3 ,每個(gè)主節(jié)點(diǎn)都有一個(gè)從節(jié)點(diǎn))的Redis集群。 如果由于網(wǎng)絡(luò)分區(qū)而導(dǎo)致任何單個(gè)主節(jié)點(diǎn)無(wú)法訪問(假設(shè)我們?yōu)镸2 ),則群集的大部分仍將保持可用狀態(tài)(并且S2將被提升為主節(jié)點(diǎn))。 以后,如果其他任何主節(jié)點(diǎn)或從節(jié)點(diǎn)變得不可訪問( S2除外),則群集仍然可用。 但是請(qǐng)注意,如果節(jié)點(diǎn)S2由于某種原因發(fā)生故障,則Redis Cluster將無(wú)法繼續(xù)運(yùn)行(因?yàn)橹鱉2和從屬S2都不可用)。

5.3可擴(kuò)展性

從分片(分區(qū))方案部分我們已經(jīng)知道,Redis群集節(jié)點(diǎn)不會(huì)將命令轉(zhuǎn)發(fā)給給定密鑰的正確節(jié)點(diǎn),而是重定向客戶端。 客戶端最終獲得完整的映射,其中哪些節(jié)點(diǎn)服務(wù)于哪個(gè)鍵子集,并且可以直接與正確的節(jié)點(diǎn)聯(lián)系。 因此,Redis Cluster能夠線性擴(kuò)展(添加更多節(jié)點(diǎn)可帶來(lái)更好的性能),因?yàn)樗兄С值牟僮鞯奶幚矸绞脚c單個(gè)Redis實(shí)例完全相同,而沒有額外的開銷。

6.安裝具有群集支持的Redis

Redis Cluster當(dāng)前僅在不穩(wěn)定版本中可用。 撰寫本文時(shí),最新的不穩(wěn)定版本是3.0.0-beta1 ,可以從http://redis.io/download下載。 請(qǐng)注意,僅提供Linux發(fā)行版,Windows端口尚不可用。

使用集群安裝Redis發(fā)行版與本教程的第1部分“ Redis安裝”中描述的常規(guī)Redis安裝沒有什么不同,并且遵循相同的步驟:

wget https://github.com/antirez/redis/archive/3.0.0-beta1.tar.gz tar xf 3.0.0-beta1.tar.gz cd redis-3.0.0-beta1/ make make test sudo make install

最后一步之后,通常的Redis可執(zhí)行文件將安裝在/usr/local/bin文件夾中。

7.配置Redis集群

無(wú)法使用常規(guī)Redis實(shí)例和常規(guī)配置創(chuàng)建Redis群集。 相反,應(yīng)該在特殊的群集模式下運(yùn)行幾個(gè)空的Redis實(shí)例。 為此,應(yīng)使用特定于群集的配置來(lái)運(yùn)行實(shí)例(應(yīng)在配置文件中將cluster-enabled指令設(shè)置為“ yes ”),以便啟用特定于群集的功能和命令。

運(yùn)行某些具有群集模式支持的Redis實(shí)例所需的最少設(shè)置包括以下設(shè)置。

  • cluster-enabled (默認(rèn):
    為該實(shí)例啟用Redis集群模式
  • cluster-config-file nodes.conf (默認(rèn)值: nodes.conf
    存儲(chǔ)此實(shí)例的配置的文件的路徑。 該文件絕不應(yīng)該被觸碰,它只是由Redis Cluster實(shí)例在啟動(dòng)時(shí)生成,并在每次需要時(shí)進(jìn)行更新(請(qǐng)參閱Nutshell中的Redis Clustering一節(jié))。
  • cluster-node-timeout 5000
    故障檢測(cè)算法將超時(shí)(以毫秒為單位)之后無(wú)響應(yīng)的實(shí)例視為發(fā)生故障。 正如我們?cè)诜制?#xff08;分區(qū))方案部分中提到的那樣,我們將配置和運(yùn)行一個(gè)實(shí)時(shí)Redis集群,其中包含三個(gè)Redis主節(jié)點(diǎn)( master1 , master2 , master3 ),每個(gè)主節(jié)點(diǎn)由Redis從屬節(jié)點(diǎn)( slave1 , slave2 , slave3 )支持,如圖所示。下面的圖片。

圖1. Redis集群拓?fù)?

在此過程中,我們將探索大多數(shù)Redis集群功能,但在此之前,讓我們從配置主服務(wù)器和從服務(wù)器開始。 為了使配置足夠簡(jiǎn)單,我們將從群集正常運(yùn)行所需的最低限度的設(shè)置開始。

7.1配置Redis Cluster主節(jié)點(diǎn)

Redis主節(jié)點(diǎn)的最小配置如下所示:

  • Redis節(jié)點(diǎn)master1 ( redis-master1.conf ) port 6379cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
  • Redis節(jié)點(diǎn)master2 ( redis-master2.conf ) port 6380cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
  • Redis節(jié)點(diǎn)master3 ( redis-master3.conf ) port 6381cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes

準(zhǔn)備好配置文件后,我們可以將配置作為命令行參數(shù),一一啟動(dòng)Redis主節(jié)點(diǎn)。

  • redis服務(wù)器redis-master1.conf

    圖2. Redis master1節(jié)點(diǎn)以集群模式運(yùn)行

  • redis服務(wù)器redis-master2.conf

    圖3. Redis master2節(jié)點(diǎn)以集群模式運(yùn)行

  • redis服務(wù)器redis-master3.conf

    圖4. Redis master3節(jié)點(diǎn)以集群模式運(yùn)行

與獨(dú)立Redis實(shí)例的控制臺(tái)輸出相比,有兩個(gè)值得注意的區(qū)別:

  • 開始時(shí),每個(gè)節(jié)點(diǎn)都會(huì)生成其unique ID ( 名稱 ),如我們?cè)凇?Nutshell中的Redis群集》中所討論的那樣,請(qǐng)注意,此值僅在第一次運(yùn)行時(shí)生成,然后再使用
  • 每個(gè)實(shí)例都以cluster mode運(yùn)行
  • 此外,對(duì)于每個(gè)正在運(yùn)行的實(shí)例,都有一個(gè)使用當(dāng)前node ID ( name )和一些其他信息創(chuàng)建的nodes.conf文件。

目前,我們有三個(gè)Redis主節(jié)點(diǎn)以集群模式運(yùn)行,但實(shí)際上尚未形成集群(每個(gè)Redis主節(jié)點(diǎn)僅看到自身,而其他節(jié)點(diǎn)則看不到)。 為了驗(yàn)證這一點(diǎn),我們可以在每個(gè)實(shí)例上單獨(dú)運(yùn)行CLUSTER NODES命令(請(qǐng)參閱Redis Cluster Commands部分),并觀察確實(shí)如此。

圖5.每個(gè)Redis主節(jié)點(diǎn)僅看到自己,而看不到其他

為了形成集群,應(yīng)使用CLUSTER MEET命令將Redis節(jié)點(diǎn)(以集群模式運(yùn)行)連接在一起(請(qǐng)參閱Redis集群命令部分)。 不幸的是,該命令僅接受IP地址,但不接受主機(jī)名。 在我們的拓?fù)鋗aster1具有IP地址192.168.1.105, master2擁有192.168.2.105和master3具有192.168.3.105。 具有IP地址,讓我們對(duì)master1節(jié)點(diǎn)發(fā)出命令。

圖6.發(fā)出CLUSTER MEET命令形成Redis集群

現(xiàn)在,如果我們重新運(yùn)行CLUSTER NODES命令,結(jié)果應(yīng)該會(huì)完全不同。

圖7a。 在每個(gè)Redis主節(jié)點(diǎn)上重新運(yùn)行CLUSTER NODES以確認(rèn)每個(gè)節(jié)點(diǎn)都能看到所有其他節(jié)點(diǎn)(有效地形成了一個(gè)集群)。

圖7b。 在每個(gè)Redis主節(jié)點(diǎn)上重新運(yùn)行CLUSTER NODES以確認(rèn)每個(gè)節(jié)點(diǎn)都能看到所有其他節(jié)點(diǎn)(有效地形成了一個(gè)集群)。

圖7c。 在每個(gè)Redis主節(jié)點(diǎn)上重新運(yùn)行CLUSTER NODES以確認(rèn)每個(gè)節(jié)點(diǎn)都能看到所有其他節(jié)點(diǎn)(有效地形成了一個(gè)集群)。

CLUSTER NODES命令的輸出看起來(lái)有點(diǎn)晦澀難懂,需要一些解釋,每列的含義。

第1欄 Node ID (名稱)
第2欄 IP:port節(jié)點(diǎn)的IP:port
第三欄 標(biāo)志: 主人 , 奴隸 , 我自己 , 失敗 …
第4欄 如果是從站,則為主站的Node ID (名稱)
第5欄 上一個(gè)未決PING的時(shí)間仍在等待回復(fù)
第6欄 最后收到的PONG 時(shí)間
第7欄 此節(jié)點(diǎn)的配置時(shí)代(請(qǐng)參閱http://redis.io/topics/cluster-spec )
第8欄 到該節(jié)點(diǎn)的鏈接狀態(tài)
第9欄 Hash slots

表格1

在輸出中未設(shè)置最后一列Hash Slots ,這是有原因的:我們尚未將hash slot分配給主節(jié)點(diǎn),這就是我們現(xiàn)在要做的。 可以通過在特定群集節(jié)點(diǎn)上使用CLUSTER ADDSLOTS 命令 (請(qǐng)參閱Redis群集命令 )將Hash slots分配給節(jié)點(diǎn)(分別使用CLUSTER DELSLOTS分配)。 不幸的是,不可能分配hash slot范圍(如0-5400),而應(yīng)單獨(dú)分配每個(gè)hash slot (總數(shù)16384中 )。 克服此限制的最簡(jiǎn)單方法之一是使用一些Shell腳本。 由于集群中只有三個(gè)Redis主節(jié)點(diǎn),因此可以這樣劃分16384個(gè)hash slots的范圍:

  • Redis節(jié)點(diǎn)master1包含hash slots 0 – 5400 for slot in {0..5400}; do redis-cli -h master1 -p 6379 CLUSTER ADDSLOTS $slot; done;
  • Redis節(jié)點(diǎn)master2包含hash slots 5401 – 10800 for slot in {5400..10800}; do redis-cli -h master2 -p 6380 CLUSTER ADDSLOTS $slot; done;
  • Redis節(jié)點(diǎn)master3包含hash slots 10801 – 16383 for slot in {10801..16383}; do redis-cli -h master3 -p 6381 CLUSTER ADDSLOTS $slot; done;

如果再次運(yùn)行CLUSTER NODES命令,則最后一列將填充每個(gè)主節(jié)點(diǎn)服務(wù)的適當(dāng)hash slots (與我們之前分配給節(jié)點(diǎn)的hash slot范圍完全匹配)。

圖8. CLUSTER NODES顯示每個(gè)主節(jié)點(diǎn)服務(wù)的hash slots

7.2配置Redis Cluster從節(jié)點(diǎn)和復(fù)制

為了使我們的Redis集群完整,我們需要向每個(gè)運(yùn)行的Redis主節(jié)點(diǎn)中恰好添加一個(gè)從節(jié)點(diǎn)。 盡管本教程的第3部分“ Redis復(fù)制”足夠好地介紹了復(fù)制配置,但是Redis集群的做法有所不同。 從一開始,運(yùn)行和配置從站的過程與主站沒有什么不同(唯一的區(qū)別是端口號(hào))。

  • Redis節(jié)點(diǎn)slave1 ( redis- slave1.conf ) port 7379cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
  • Redis節(jié)點(diǎn)slave2 ( redis-slave2.conf ) port 7380cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes
  • Redis節(jié)點(diǎn)slave3 ( redis-slave3.conf ) port 7381cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes

讓我們先啟動(dòng)所有三個(gè)從屬實(shí)例,再啟動(dòng)CLUSTER MEET命令,以便每個(gè)節(jié)點(diǎn)都將加入我們正在運(yùn)行的Redis集群。

redis-server redis-slave1.conf redis-server redis-slave2.conf redis-server redis-slave3.conf

作為CLUSTER MEET需要IP地址,我們slave1具有IP地址192.168.4.105, slave2擁有192.168.5.105和slave3有192.168.6.105。

redis-cli -h master1 -p 6379 CLUSTER MEET 192.168.4.105 7379 redis-cli -h master1 -p 6379 CLUSTER MEET 192.168.5.105 7380 redis-cli -h master1 -p 6379 CLUSTER MEET 192.168.6.105 7381

和往常一樣,使用CLUSTER NODES命令,我們可以看到Redis集群中的當(dāng)前節(jié)點(diǎn)(共有六個(gè))。 輸出顯示所有節(jié)點(diǎn)均為主節(jié)點(diǎn)。

圖9. CLUSTER NODES所有六個(gè)節(jié)點(diǎn)顯示為主節(jié)點(diǎn)

要配置復(fù)制,應(yīng)通過提供主Node ID (名稱)在每個(gè)Redis從屬服務(wù)器上執(zhí)行新的CLUSTER REPLICATE命令。 下表總結(jié)了所有一起復(fù)制所需的部分(通過查詢CLUSTER NODES命令輸出的結(jié)果)。

主主持人 master1
主節(jié)點(diǎn)ID 3508ffe11ba5fbfbb93db5b21a413799272f5d0f
從節(jié)點(diǎn) slave1
redis-cli -h slave1 -p 7379集群副本3508ffe11ba5fbfbb93db5b21a413799272f5d0f

表2

主主持人 master2
主節(jié)點(diǎn)ID 610976e1ca5382b96718cd7e261d3543e6a99af4
從節(jié)點(diǎn) slave2
redis-cli -h slave2 -p 7380集群副本610976e1ca5382b96718cd7e261d3543e6a99af4

表3

主主持人 master3
主節(jié)點(diǎn)ID d8a2ae6221624212b76d9cf6c1483452e3c26117
從節(jié)點(diǎn) slave3
redis-cli -h slave3 -p 7381集群復(fù)制d8a2ae6221624212b76d9cf6c1483452e3c26117

表5

至此,我們的Redis集群已正確配置,并具有我們要?jiǎng)?chuàng)建的拓?fù)洹?CLUSTER NODES命令顯示所有連接到主站的從站。

圖10. CLUSTER NODES顯示連接在一起的主節(jié)點(diǎn)和從節(jié)點(diǎn)

如我們所見,所有節(jié)點(diǎn)都處于健康狀態(tài),相互連接并且分配了正確的角色(主節(jié)點(diǎn)和從節(jié)點(diǎn))。

7.3驗(yàn)證Redis集群工作正常

與Redis一樣,確保Redis集群按預(yù)期工作的最佳方法是使用redis-cli發(fā)出一些命令。 請(qǐng)注意,因?yàn)榧褐械墓?jié)點(diǎn)不代理命令,而是重定向客戶端(請(qǐng)參閱分片(分區(qū))方案 ),所以客戶端必須支持這樣的協(xié)議,這就是為什么redis-cli應(yīng)該與-c命令行選項(xiàng)一起運(yùn)行(有集群支持):

redis-cli -h master1 -p 6379 -c

讓我們嘗試設(shè)置存儲(chǔ)的鍵(使用SET命令),然后再查詢它們(使用GET命令)。 因?yàn)槲覀冊(cè)谌齻€(gè)節(jié)點(diǎn)之間分配了hash slots ,所以密鑰也將分布在所有這些節(jié)點(diǎn)上。 名稱為some-key的第一個(gè)密鑰存儲(chǔ)在我們連接到的master1節(jié)點(diǎn)本身上。


圖11.設(shè)置密鑰some-key將存儲(chǔ)在master1

但是,如果我們嘗試存儲(chǔ)名稱為some-another-key ,那么將會(huì)發(fā)生有趣的事情: redis-cli告訴我們?cè)撝祵⒋鎯?chǔ)在IP地址為192.168.3.105 ( master3 )的節(jié)點(diǎn)上保留此鍵所屬的hash slot 。


圖12.設(shè)置一個(gè)鍵,另一個(gè)鍵將存儲(chǔ)在master3

請(qǐng)注意,命令執(zhí)行后, redis-cli將自動(dòng)重定向到節(jié)點(diǎn)192.168.3.105 ( master3 )。 一旦我們?cè)谌杭?jié)點(diǎn)192.168.3.105 ( master3 )上,我們可以通過發(fā)出CLUSTER GETKEYSINSLOT命令來(lái)驗(yàn)證hash slot確實(shí)包含密鑰some-another-key。


圖13.驗(yàn)證hash slot 15929是否包含密鑰some-another-key

我們也可以驗(yàn)證的Redis從節(jié)點(diǎn)slave3已復(fù)制的關(guān)鍵some-another-key從主( master3 ),并返回其值。

圖14. Redis從屬服務(wù)器( slave3 )復(fù)制了主服務(wù)器( master3 )的密鑰

7.4在正在運(yùn)行的Redis集群中添加和刪除節(jié)點(diǎn)

我們?cè)诜制?#xff08;分區(qū))方案部分中已經(jīng)提到,Redis集群可以在不停機(jī)的情況下進(jìn)行重新配置,并且通常涉及hash slots遷移。 讓我們向集群添加另一個(gè)主節(jié)點(diǎn)master4 (IP地址為192.168.7.105 )并將插槽15929從節(jié)點(diǎn)master3到master4 (這是包含密鑰some-another-key的hash slot )。 她是Redis節(jié)點(diǎn)master4 ( redis- master4.conf )配置:

port 6384cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yesredis-server redis-master4.confredis-cli -h master1 -p 6379 CLUSTER MEET 192.168.7.105 6384

圖15. Redis master4已加入集群

hash slots遷移過程包括以下階段:

  • 在擁有特定hash slot ( master3 )的群集節(jié)點(diǎn)上,應(yīng)執(zhí)行命令CLUSTER SETSLOT slot MIGRATING ,其中是新節(jié)點(diǎn)master4的Node ID (即d8095be33a2b9d06affcb5583f7150b1341f4c96)。 redis-cli -h master3 -p 6381 CLUSTER SETSLOT 15929 MIGRATINGd8095be33a2b9d06affcb5583f7150b1341f4c96

    當(dāng)某個(gè)插槽標(biāo)記為MIGRATING ,該節(jié)點(diǎn)將接受所有有關(guān)此hash slot查詢請(qǐng)求,但前提是給定鍵存在,否則該查詢將轉(zhuǎn)發(fā)到作為遷移目標(biāo)的節(jié)點(diǎn)。

  • 在應(yīng)成為特定hash slot ( master4 )的新所有者的群集節(jié)點(diǎn)上,命令CLUSTER SETSLOT slot IMPORTING ,其中是當(dāng)前所有者master3的Node ID (即d8a2ae6221624212b76d9cf6c1483452e3c26117)。 redis-cli -h master4 -p 6384 CLUSTER SETSLOT 15929 IMPORTINGd8a2ae6221624212b76d9cf6c1483452e3c26117
  • 此時(shí),應(yīng)使用MIGRATE命令(請(qǐng)參閱http://redis.io/commands/migrate )將hash slot所有密鑰從當(dāng)前所有者master3到新所有者master4 。 因?yàn)橹挥幸话谚€匙,所以很容易。 redis-cli -h master3 -p 6381 MIGRATE master4 6384 some-another-key 0 0
  • 最后,當(dāng)hash slot變?yōu)榭諘r(shí)(可以通過發(fā)出CLUSTER GETKEYSINSLOT命令進(jìn)行驗(yàn)證),可以將其分配給新節(jié)點(diǎn)( master4 )。 redis-cli -h master3 -p 6381 CLUSTER SETSLOT 15929 NODEd8095be33a2b9d06affcb5583f7150b1341f4c96

雖然了解詳細(xì)情況非常有用,但是手動(dòng)執(zhí)行這樣的過程非常困難且容易出錯(cuò)。 但是Redis Cluster軟件包提供了一個(gè)方便的實(shí)用程序,稱為redis-trib ,位于Redis發(fā)行版的src文件夾中。 它是用Ruby編寫的,通過簡(jiǎn)化Redis集群的管理可能會(huì)很有幫助(有關(guān)更多詳細(xì)信息,請(qǐng)參見http://redis.io/topics/cluster-tutorial )。

8. Redis集群命令

Redis Cluster添加了另外一組專用于集群管理,監(jiān)視和配置的命令。 在本教程的第2部分“ Redis命令”中沒有涉及這些命令 ,因?yàn)樗鼈冊(cè)诜€(wěn)定版本中尚不可用。 另外,Redis網(wǎng)站上沒有足夠的文檔,但是至少我們可以簡(jiǎn)要描述每個(gè)命令(您已經(jīng)在實(shí)際操作中看到了許多命令)。

命令 CLUSTER SETSLOT插槽NODE <node-id>
描述 將hash slot分配給節(jié)點(diǎn)。 該命令應(yīng)在擁有此hash slot的節(jié)點(diǎn)上發(fā)出,并且hash slot不應(yīng)包含任何鍵(應(yīng)為空)。

表6

命令 集群SETSLOT插槽IMPORTING <node-id>
描述 將hash slot標(biāo)記為從<node-id>導(dǎo)入。 <node-id>應(yīng)該是此hash slot的所有者。

表7

命令 集群SETSLOT插槽MIGRATING <node-id>
描述 將hash slots標(biāo)記為正在遷移到<node-id>。 該命令應(yīng)在擁有此hash slot的節(jié)點(diǎn)上發(fā)出。

表8

命令 集群節(jié)點(diǎn)
描述 顯示Redis集群中的當(dāng)前節(jié)點(diǎn)集。

表9

命令 集群ADDSLOTS slot1 [slot2]…[slotN]
描述 將hash slots分配給Redis節(jié)點(diǎn)。

表10

命令 集群DELSLOTS slot1 [slot2]…[slotN]
描述 從Redis節(jié)點(diǎn)中刪除hash slots分配。

表11

命令 群集會(huì)議IP端口
描述 將節(jié)點(diǎn)添加到Redis集群。

表12

命令 集群獲取<node-id>
描述 從Redis集群中刪除節(jié)點(diǎn)。

表13

命令 集群復(fù)制<master-node-id>
描述 使此節(jié)點(diǎn)成為主節(jié)點(diǎn)<master-node-id>的副本。

表14

命令 集群GETKEYSINSLOT插槽數(shù)
描述 從任何特定的鍵返回名稱hash slot限制輸出來(lái)計(jì)算密鑰數(shù)量。 如果執(zhí)行此命令的節(jié)點(diǎn)不是slot的所有者,則該命令不返回任何結(jié)果。

表15

9. Redis前哨

Redis的另一個(gè)偉大但仍具有實(shí)驗(yàn)性的功能是Redis Sentinel 。 該系統(tǒng)旨在幫助管理實(shí)時(shí)Redis實(shí)例,并牢記以下目標(biāo):

  • 監(jiān)視 :Sentinel不斷檢查您的主實(shí)例和從實(shí)例是否按預(yù)期工作
  • 通知 :Sentinel能夠通知受監(jiān)視的Redis實(shí)例之一是否有問題
  • 自動(dòng)故障轉(zhuǎn)移 :如果某些主節(jié)點(diǎn)未按預(yù)期工作,則Sentinel可以啟動(dòng)故障轉(zhuǎn)移過程,將其中一個(gè)從屬節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)

Redis Sentinel是一個(gè)非常有前途的功能,但目前正在Redis源代碼的不穩(wěn)定分支中進(jìn)行開發(fā)。 它不是Redis發(fā)行版的一部分。

有關(guān)更多詳細(xì)信息,請(qǐng)參見http://redis.io/topics/sentinel 。

10.下一步是什么

在本節(jié)中,我們介紹了Redis集群的一個(gè)非常吸引人且要求很高的功能。 即使仍在開發(fā)中,該功能也足夠穩(wěn)定,可以開始使用它。 在本教程的下一部分中,我們將介紹用于在不同部署方案中訪問Redis的編程Java API。

翻譯自: https://www.javacodegeeks.com/2015/09/redis-clustering.html

總結(jié)

以上是生活随笔為你收集整理的Redis聚类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。