深入剖析Redis - Redis集群模式搭建與原理詳解

1. Redis集群方案

Redis Cluster 集群模式通常具有?高可用可擴(kuò)展性檩坚、分布式容錯(cuò)?等特性诅福。Redis 分布式方案一般有兩種:

1.1 客戶端分區(qū)方案

客戶端?就已經(jīng)決定數(shù)據(jù)會(huì)被?存儲(chǔ)?到哪個(gè) redis 節(jié)點(diǎn)或者從哪個(gè) redis 節(jié)點(diǎn)?讀取數(shù)據(jù)匾委。其主要思想是采用?哈希算法?將 Redis 數(shù)據(jù)的 key 進(jìn)行散列,通過 hash 函數(shù)氓润,特定的 key會(huì)?映射?到特定的 Redis 節(jié)點(diǎn)上赂乐。

客戶端分區(qū)方案?的代表為 Redis Sharding,Redis Sharding 是 Redis Cluster 出來之前咖气,業(yè)界普遍使用的 Redis?多實(shí)例集群?方法挨措。Java 的 Redis 客戶端驅(qū)動(dòng)庫 Jedis,支持 Redis Sharding 功能崩溪,即 ShardedJedis 以及?結(jié)合緩存池?的 ShardedJedisPool浅役。

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

不使用?第三方中間件分區(qū)邏輯?可控伶唯,配置?簡(jiǎn)單担租,節(jié)點(diǎn)之間無關(guān)聯(lián),容易?線性擴(kuò)展抵怎,靈活性強(qiáng)奋救。

缺點(diǎn)

客戶端?無法?動(dòng)態(tài)增刪?服務(wù)節(jié)點(diǎn)岭参,客戶端需要自行維護(hù)?分發(fā)邏輯,客戶端之間?無連接共享尝艘,會(huì)造成?連接浪費(fèi)演侯。

1.2. 代理分區(qū)方案

客戶端?發(fā)送請(qǐng)求到一個(gè)?代理組件代理?解析?客戶端?的數(shù)據(jù)背亥,并將請(qǐng)求轉(zhuǎn)發(fā)至正確的節(jié)點(diǎn)秒际,最后將結(jié)果回復(fù)給客戶端。

優(yōu)點(diǎn):簡(jiǎn)化?客戶端?的分布式邏輯狡汉,客戶端?透明接入娄徊,切換成本低,代理的?轉(zhuǎn)發(fā)?和?存儲(chǔ)?分離盾戴。

缺點(diǎn):多了一層?代理層寄锐,加重了?架構(gòu)部署復(fù)雜度?和?性能損耗

代理分區(qū)?主流實(shí)現(xiàn)的有方案有 Twemproxy 和 Codis尖啡。

1.2.1. Twemproxy

Twemproxy 也叫 nutcraker橄仆,是 twitter 開源的一個(gè) redis 和 memcache 的?中間代理服務(wù)器?程序。Twemproxy 作為?代理衅斩,可接受來自多個(gè)程序的訪問盆顾,按照?路由規(guī)則,轉(zhuǎn)發(fā)給后臺(tái)的各個(gè) Redis 服務(wù)器畏梆,再原路返回您宪。Twemproxy 存在?單點(diǎn)故障?問題,需要結(jié)合 Lvs 和 Keepalived 做?高可用方案奠涌。

優(yōu)點(diǎn):應(yīng)用范圍廣蚕涤,穩(wěn)定性較高,中間代理層?高可用铣猩。

缺點(diǎn):無法平滑地?水平擴(kuò)容/縮容揖铜,無?可視化管理界面,運(yùn)維不友好达皿,出現(xiàn)故障天吓,不能?自動(dòng)轉(zhuǎn)移

1.2.2. Codis

Codis 是一個(gè)?分布式?Redis 解決方案峦椰,對(duì)于上層應(yīng)用來說龄寞,連接 Codis-Proxy 和直接連接?原生的?Redis-Server 沒有的區(qū)別。Codis 底層會(huì)?處理請(qǐng)求的轉(zhuǎn)發(fā)汤功,不停機(jī)的進(jìn)行?數(shù)據(jù)遷移?等工作物邑。Codis 采用了無狀態(tài)的?代理層,對(duì)于?客戶端?來說,一切都是透明的色解。

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

實(shí)現(xiàn)了上層 Proxy 和底層 Redis 的?高可用茂嗓,數(shù)據(jù)分片?和?自動(dòng)平衡,提供?命令行接口?和 RESTful API科阎,提供?監(jiān)控?和?管理?界面述吸,可以動(dòng)態(tài)?添加?和?刪除?Redis 節(jié)點(diǎn)。

缺點(diǎn)

部署架構(gòu)?和?配置?復(fù)雜锣笨,不支持?跨機(jī)房?和?多租戶蝌矛,不支持?鑒權(quán)管理

1.3. 查詢路由方案

客戶端隨機(jī)地?請(qǐng)求任意一個(gè) Redis 實(shí)例错英,然后由 Redis 將請(qǐng)求?轉(zhuǎn)發(fā)?給?正確?的 Redis 節(jié)點(diǎn)入撒。Redis Cluster 實(shí)現(xiàn)了一種?混合形式?的?查詢路由,但并不是?直接?將請(qǐng)求從一個(gè) Redis 節(jié)點(diǎn)?轉(zhuǎn)發(fā)?到另一個(gè) Redis 節(jié)點(diǎn)椭岩,而是在?客戶端?的幫助下直接?重定向( redirected)到正確的 Redis 節(jié)點(diǎn)茅逮。

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

無中心節(jié)點(diǎn),數(shù)據(jù)按照??存儲(chǔ)分布在多個(gè) Redis 實(shí)例上簿煌,可以平滑的進(jìn)行節(jié)點(diǎn)?擴(kuò)容/縮容,支持?高可用?和?自動(dòng)故障轉(zhuǎn)移鉴吹,運(yùn)維成本低姨伟。

缺點(diǎn)

嚴(yán)重依賴 Redis-trib 工具,缺乏?監(jiān)控管理豆励,需要依賴 Smart Client (維護(hù)連接夺荒,緩存路由表,MultiOp 和 Pipeline 支持)良蒸。Failover 節(jié)點(diǎn)的?檢測(cè)過慢技扼,不如?中心節(jié)點(diǎn)?ZooKeeper 及時(shí)。Gossip 消息具有一定開銷嫩痰。無法根據(jù)統(tǒng)計(jì)區(qū)分?冷熱數(shù)據(jù)剿吻。

2. 數(shù)據(jù)分布

2.1. 數(shù)據(jù)分布理論

分布式數(shù)據(jù)庫?首先要解決把?整個(gè)數(shù)據(jù)集?按照?分區(qū)規(guī)則?映射到?多個(gè)節(jié)點(diǎn)?的問題,即把?數(shù)據(jù)集?劃分到?多個(gè)節(jié)點(diǎn)?上串纺,每個(gè)節(jié)點(diǎn)負(fù)責(zé)?整體數(shù)據(jù)?的一個(gè)?子集丽旅。

數(shù)據(jù)分布通常有?哈希分區(qū)?和?順序分區(qū)?兩種方式,對(duì)比如下:

分區(qū)方式 特點(diǎn) 相關(guān)產(chǎn)品 哈希分區(qū) 離散程度好纺棺,數(shù)據(jù)分布與業(yè)務(wù)無關(guān)榄笙,無法順序訪問 Redis Cluster,Cassandra祷蝌,Dynamo 順序分區(qū) 離散程度易傾斜茅撞,數(shù)據(jù)分布與業(yè)務(wù)相關(guān),可以順序訪問 BigTable,HBase米丘,Hypertable 由于 Redis Cluster 采用?哈希分區(qū)規(guī)則剑令,這里重點(diǎn)討論?哈希分區(qū)。常見的?哈希分區(qū)?規(guī)則有幾種蠕蚜,下面分別介紹:

2.1.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)上腺毫。

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

這種方式的突出優(yōu)點(diǎn)是?簡(jiǎn)單性,常用于?數(shù)據(jù)庫?的?分庫分表規(guī)則挣柬。一般采用?預(yù)分區(qū)?的方式潮酒,提前根據(jù)?數(shù)據(jù)量?規(guī)劃好?分區(qū)數(shù),比如劃分為 512 或 1024 張表邪蛔,保證可支撐未來一段時(shí)間的?數(shù)據(jù)容量急黎,再根據(jù)?負(fù)載情況?將??遷移到其他?數(shù)據(jù)庫?中。擴(kuò)容時(shí)通常采用?翻倍擴(kuò)容侧到,避免?數(shù)據(jù)映射?全部被?打亂勃教,導(dǎo)致?全量遷移?的情況。

缺點(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ù)的?重新遷移汞贸。

2.1.2. 一致性哈希分區(qū)

一致性哈希?可以很好的解決?穩(wěn)定性問題绳军,可以將所有的?存儲(chǔ)節(jié)點(diǎn)?排列在?收尾相接?的 Hash 環(huán)上,每個(gè) key 在計(jì)算 Hash 后會(huì)?順時(shí)針?找到?臨接?的?存儲(chǔ)節(jié)點(diǎn)?存放矢腻。而當(dāng)有節(jié)點(diǎn)?加入?或?退出?時(shí)门驾,僅影響該節(jié)點(diǎn)在 Hash 環(huán)上?順時(shí)針相鄰?的?后續(xù)節(jié)點(diǎn)

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

加入?和?刪除?節(jié)點(diǎn)只影響?哈希環(huán)?中?順時(shí)針方向?的?相鄰的節(jié)點(diǎn)多柑,對(duì)其他節(jié)點(diǎn)無影響奶是。

缺點(diǎn)

加減節(jié)點(diǎn)?會(huì)造成?哈希環(huán)?中部分?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ù)載的均衡帐偎。

注意:因?yàn)?一致性哈希分區(qū)?的這些缺點(diǎn)逐纬,一些分布式系統(tǒng)采用?虛擬槽?對(duì)?一致性哈希?進(jìn)行改進(jìn),比如 Dynamo 系統(tǒng)削樊。

2.1.3. 虛擬槽分區(qū)

虛擬槽分區(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ò)展豪嗽。每個(gè)節(jié)點(diǎn)會(huì)負(fù)責(zé)?一定數(shù)量的槽,如圖所示:

當(dāng)前集群有 5 個(gè)節(jié)點(diǎn)豌骏,每個(gè)節(jié)點(diǎn)平均大約負(fù)責(zé) 3276 個(gè)?龟梦。由于采用?高質(zhì)量?的?哈希算法,每個(gè)槽所映射的數(shù)據(jù)通常比較?均勻窃躲,將數(shù)據(jù)平均劃分到 5 個(gè)節(jié)點(diǎn)進(jìn)行?數(shù)據(jù)分區(qū)计贰。Redis Cluster 就是采用?虛擬槽分區(qū)

節(jié)點(diǎn)1: 包含 0 到 3276 號(hào)哈希槽蒂窒。

節(jié)點(diǎn)2:包含 3277 到 6553 號(hào)哈希槽躁倒。

節(jié)點(diǎn)3:包含 6554 到 9830 號(hào)哈希槽。

節(jié)點(diǎn)4:包含 9831 到 13107 號(hào)哈希槽洒琢。

節(jié)點(diǎn)5:包含 13108 到 16383 號(hào)哈希槽秧秉。

這種結(jié)構(gòu)很容易?添加?或者?刪除?節(jié)點(diǎn)。如果?增加?一個(gè)節(jié)點(diǎn) 6衰抑,就需要從節(jié)點(diǎn) 1 ~ 5 獲得部分??分配到節(jié)點(diǎn) 6 上象迎。如果想?移除?節(jié)點(diǎn) 1,需要將節(jié)點(diǎn) 1 中的??移到節(jié)點(diǎn) 2 ~ 5 上停士,然后將?沒有任何槽?的節(jié)點(diǎn) 1 從集群中?移除?即可挖帘。

由于從一個(gè)節(jié)點(diǎn)將?哈希槽?移動(dòng)到另一個(gè)節(jié)點(diǎn)并不會(huì)?停止服務(wù)完丽,所以無論?添加刪除或者?改變?某個(gè)節(jié)點(diǎn)的?哈希槽的數(shù)量?都不會(huì)造成?集群不可用?的狀態(tài).

2.2. Redis的數(shù)據(jù)分區(qū)

Redis Cluster 采用?虛擬槽分區(qū)恋技,所有的??根據(jù)?哈希函數(shù)?映射到 0~16383 整數(shù)槽內(nèi),計(jì)算公式:slot = CRC16(key)& 16383逻族。每個(gè)節(jié)點(diǎn)負(fù)責(zé)維護(hù)一部分槽以及槽所映射的?鍵值數(shù)據(jù)蜻底,如圖所示:

2.2.1. Redis虛擬槽分區(qū)的特點(diǎn)

解耦?數(shù)據(jù)?和?節(jié)點(diǎn)?之間的關(guān)系,簡(jiǎn)化了節(jié)點(diǎn)?擴(kuò)容?和?收縮?難度聘鳞。

節(jié)點(diǎn)自身?維護(hù)槽的?映射關(guān)系薄辅,不需要?客戶端?或者?代理服務(wù)?維護(hù)?槽分區(qū)元數(shù)據(jù)

支持?節(jié)點(diǎn)抠璃、站楚、?之間的?映射查詢,用于?數(shù)據(jù)路由搏嗡、在線伸縮?等場(chǎng)景窿春。

2.3. Redis集群的功能限制

Redis 集群相對(duì)?單機(jī)?在功能上存在一些限制拉一,需要?開發(fā)人員?提前了解,在使用時(shí)做好規(guī)避旧乞。

key?批量操作?支持有限蔚润。

類似 mset、mget 操作尺栖,目前只支持對(duì)具有相同 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ù)功能痴颊。

key 作為?數(shù)據(jù)分區(qū)?的最小粒度

不能將一個(gè)?大的鍵值?對(duì)象如 hash、list 等映射到?不同的節(jié)點(diǎn)屡贺。

不支持?多數(shù)據(jù)庫空間

單機(jī)?下的 Redis 可以支持 16 個(gè)數(shù)據(jù)庫(db0 ~ db15)蠢棱,集群模式?下只能使用?一個(gè)?數(shù)據(jù)庫空間,即 db0甩栈。

復(fù)制結(jié)構(gòu)?只支持一層

從節(jié)點(diǎn)?只能復(fù)制?主節(jié)點(diǎn)泻仙,不支持?嵌套樹狀復(fù)制?結(jié)構(gòu)。

3. Redis集群搭建

Redis-Cluster 是 Redis 官方的一個(gè)?高可用?解決方案量没,Cluster 中的 Redis 共有 2^14(16384) 個(gè) slot?玉转。創(chuàng)建 Cluster 后,?會(huì)?平均分配?到每個(gè) Redis 節(jié)點(diǎn)上殴蹄。

下面介紹一下本機(jī)啟動(dòng) 6 個(gè) Redis 的?集群服務(wù)究抓,并使用 redis-trib.rb 創(chuàng)建?3主3從?的?集群。搭建集群工作需要以下三個(gè)步驟:

3.1. 準(zhǔn)備節(jié)點(diǎn)

Redis 集群一般由?多個(gè)節(jié)點(diǎn)?組成袭灯,節(jié)點(diǎn)數(shù)量至少為 6 個(gè)刺下,才能保證組成?完整高可用?的集群。每個(gè)節(jié)點(diǎn)需要?開啟配置?cluster-enabled yes稽荧,讓 Redis 運(yùn)行在?集群模式?下橘茉。

Redis 集群的節(jié)點(diǎn)規(guī)劃如下:

節(jié)點(diǎn)名稱 端口號(hào) 是主是從 所屬主節(jié)點(diǎn) redis-6379 6379 主節(jié)點(diǎn) --- redis-6389 6389 從節(jié)點(diǎn) redis-6379 redis-6380 6380 主節(jié)點(diǎn) --- redis-6390 6390 從節(jié)點(diǎn) redis-6380 redis-6381 6381 主節(jié)點(diǎn) --- redis-6391 6391 從節(jié)點(diǎn) redis-6381?注意:建議為集群內(nèi)?所有節(jié)點(diǎn)?統(tǒng)一目錄,一般劃分三個(gè)目錄:conf姨丈、data畅卓、log,分別存放?配置蟋恬、數(shù)據(jù)和?日志?相關(guān)文件翁潘。把 6 個(gè)節(jié)點(diǎn)配置統(tǒng)一放在 conf 目錄下。

3.1.1. 創(chuàng)建redis各實(shí)例目錄

$sudo mkdir -p /usr/local/redis-cluster$cd/usr/local/redis-cluster$sudo mkdir conf datalog$ sudo mkdir -p data/redis-6379 data/redis-6389 data/redis-6380 data/redis-6390 data/redis-6381 data/redis-6391復(fù)制代碼

3.1.2. redis配置文件管理

根據(jù)以下?模板?配置各個(gè)實(shí)例的 redis.conf歼争,以下只是搭建集群需要的?基本配置拜马,可能需要根據(jù)實(shí)際情況做修改箱歧。

# redis后臺(tái)運(yùn)行daemonizeyes# 綁定的主機(jī)端口bind 127.0.0.1# 數(shù)據(jù)存放目錄dir /usr/local/redis-cluster/data/redis-6379# 進(jìn)程文件pidfile /var/run/redis-cluster/${自定義}.pid# 日志文件logfile /usr/local/redis-cluster/log/${自定義}.log# 端口號(hào)port 6379# 開啟集群模式,把注釋#去掉cluster-enabledyes# 集群的配置一膨,配置文件首次啟動(dòng)自動(dòng)生成cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf# 請(qǐng)求超時(shí)呀邢,設(shè)置10秒cluster-node-timeout 10000# aof日志開啟,有需要就開啟豹绪,它會(huì)每次寫操作都記錄一條日志appendonlyyes復(fù)制代碼

redis-6379.conf

daemonize yesbind 127.0.0.1dir/usr/local/redis-cluster/data/redis-6379pidfile /var/run/redis-cluster/redis-6379.pidlogfile /usr/local/redis-cluster/log/redis-6379.logport 6379cluster-enabled yescluster-config-file/usr/local/redis-cluster/conf/node-6379.confcluster-node-timeout 10000appendonly yes復(fù)制代碼

redis-6389.conf

daemonize yesbind 127.0.0.1dir/usr/local/redis-cluster/data/redis-6389pidfile /var/run/redis-cluster/redis-6389.pidlogfile /usr/local/redis-cluster/log/redis-6389.logport 6389cluster-enabled yescluster-config-file/usr/local/redis-cluster/conf/node-6389.confcluster-node-timeout 10000appendonly yes復(fù)制代碼

redis-6380.conf

daemonize yesbind 127.0.0.1dir/usr/local/redis-cluster/data/redis-6380pidfile /var/run/redis-cluster/redis-6380.pidlogfile /usr/local/redis-cluster/log/redis-6380.logport 6380cluster-enabled yescluster-config-file/usr/local/redis-cluster/conf/node-6380.confcluster-node-timeout 10000appendonly yes復(fù)制代碼

redis-6390.conf

daemonize yesbind 127.0.0.1dir/usr/local/redis-cluster/data/redis-6390pidfile /var/run/redis-cluster/redis-6390.pidlogfile /usr/local/redis-cluster/log/redis-6390.logport 6390cluster-enabled yescluster-config-file/usr/local/redis-cluster/conf/node-6390.confcluster-node-timeout 10000appendonly yes復(fù)制代碼

redis-6381.conf

daemonize yesbind 127.0.0.1dir/usr/local/redis-cluster/data/redis-6381pidfile /var/run/redis-cluster/redis-6381.pidlogfile /usr/local/redis-cluster/log/redis-6381.logport 6381cluster-enabled yescluster-config-file/usr/local/redis-cluster/conf/node-6381.confcluster-node-timeout 10000appendonly yes復(fù)制代碼

redis-6391.conf

daemonize yesbind 127.0.0.1dir/usr/local/redis-cluster/data/redis-6391pidfile /var/run/redis-cluster/redis-6391.pidlogfile /usr/local/redis-cluster/log/redis-6391.logport 6391cluster-enabled yescluster-config-file/usr/local/redis-cluster/conf/node-6391.confcluster-node-timeout 10000appendonly yes復(fù)制代碼

3.2. 環(huán)境準(zhǔn)備

3.2.1. 安裝Ruby環(huán)境

$ sudobrew install ruby復(fù)制代碼

3.2.2. 準(zhǔn)備rubygem redis依賴

$ sudo geminstallredisPassword:Fetching: redis-4.0.2.gem (100%)Successfully installed redis-4.0.2Parsing documentationforredis-4.0.2Installing ri documentationforredis-4.0.2Done installing documentationforredisafter1seconds1gem installed復(fù)制代碼

3.2.3. 拷貝redis-trib.rb到集群根目錄

redis-trib.rb 是 redis 官方推出的管理 redis?集群?的工具价淌,集成在 redis 的源碼 src 目錄下,將基于 redis 提供的?集群命令?封裝成?簡(jiǎn)單瞒津、便捷蝉衣、實(shí)用?的?操作工具

$ sudo cp/usr/local/redis-4.0.11/src/redis-trib.rb /usr/local/redis-cluster復(fù)制代碼

查看 redis-trib.rb 命令環(huán)境是否正確巷蚪,輸出如下:

$ ./redis-trib.rb Usage:redis-trib create host1:port1 ...hostN:portN--replicascheck host:portinfo host:portfix host:port--timeoutreshard host:port--from--to--slots--yes--timeout--pipelinerebalance host:port--weight--auto-weights--use-empty-masters--timeout--simulate--pipeline--thresholdadd-node new_host:new_port existing_host:existing_port--slave--master-iddel-node host:port node_idset-timeouthost:port millisecondscall host:port command arg arg ..argimport host:port--from--copy--replacehelp (show this help)For check,fix,reshard,del-node,set-timeoutyou can specify the host and port of any working node in the cluster.復(fù)制代碼

redis-trib.rb 是 redis 作者用 ruby 完成的病毡。redis-trib.rb?命令行工具?的具體功能如下:

命令 作用 create 創(chuàng)建集群 check 檢查集群 info 查看集群信息 fix 修復(fù)集群 reshard 在線遷移slot rebalance 平衡集群節(jié)點(diǎn)slot數(shù)量 add-node 將新節(jié)點(diǎn)加入集群 del-node 從集群中刪除節(jié)點(diǎn) set-timeout 設(shè)置集群節(jié)點(diǎn)間心跳連接的超時(shí)時(shí)間 call 在集群全部節(jié)點(diǎn)上執(zhí)行命令 import 將外部redis數(shù)據(jù)導(dǎo)入集群 3.3. 安裝集群

3.3.1. 啟動(dòng)redis服務(wù)節(jié)點(diǎn)

運(yùn)行如下命令啟動(dòng) 6 臺(tái) redis 節(jié)點(diǎn):

sudo redis-serverconf/redis-6379.confsudo redis-serverconf/redis-6389.confsudo redis-serverconf/redis-6380.confsudo redis-serverconf/redis-6390.confsudo redis-serverconf/redis-6381.confsudo redis-serverconf/redis-6391.conf復(fù)制代碼

啟動(dòng)完成后,redis 以集群模式啟動(dòng)屁柏,查看各個(gè) redis 節(jié)點(diǎn)的進(jìn)程狀態(tài):

$ ps -ef | grep redis-server 0 1908 1 0 4:59下午 ?? 0:00.01 redis-server *:6379 [cluster] 0 1911 1 0 4:59下午 ?? 0:00.01 redis-server *:6389 [cluster] 0 1914 1 0 4:59下午 ?? 0:00.01 redis-server *:6380 [cluster] 0 1917 1 0 4:59下午 ?? 0:00.01 redis-server *:6390 [cluster] 0 1920 1 0 4:59下午 ?? 0:00.01 redis-server *:6381 [cluster] 0 1923 1 0 4:59下午 ?? 0:00.01 redis-server *:6391 [cluster] 復(fù)制代碼

在每個(gè) redis 節(jié)點(diǎn)的 redis.conf 文件中啦膜,我們都配置了 cluster-config-file 的文件路徑,集群?jiǎn)?dòng)時(shí)淌喻,conf 目錄會(huì)新生成?集群?節(jié)點(diǎn)配置文件僧家。查看文件列表如下:

$ tree -L3..├── appendonly.aof├── conf│ ├── node-6379.conf│ ├── node-6380.conf│ ├── node-6381.conf│ ├── node-6389.conf│ ├── node-6390.conf│ ├── node-6391.conf│ ├── redis-6379.conf│ ├── redis-6380.conf│ ├── redis-6381.conf│ ├── redis-6389.conf│ ├── redis-6390.conf│ └── redis-6391.conf├── data│ ├── redis-6379│ ├── redis-6380│ ├── redis-6381│ ├── redis-6389│ ├── redis-6390│ └── redis-6391├── log│ ├── redis-6379.log│ ├── redis-6380.log│ ├── redis-6381.log│ ├── redis-6389.log│ ├── redis-6390.log│ └── redis-6391.log└── redis-trib.rb9directories,20files復(fù)制代碼

3.3.2. redis-trib關(guān)聯(lián)集群節(jié)點(diǎn)

按照?從主到從?的方式?從左到右?依次排列 6 個(gè) redis 節(jié)點(diǎn)。

$ sudo ./redis-trib.rb create --replicas1127.0.0.1:6379127.0.0.1:6380127.0.0.1:6381127.0.0.1:6389127.0.0.1:6390127.0.0.1:6391復(fù)制代碼

集群創(chuàng)建后裸删,redis-trib 會(huì)先將 16384 個(gè)?哈希槽?分配到 3 個(gè)?主節(jié)點(diǎn)八拱,即 redis-6379,redis-6380 和 redis-6381涯塔。然后將各個(gè)?從節(jié)點(diǎn)?指向?主節(jié)點(diǎn)肌稻,進(jìn)行?數(shù)據(jù)同步

>>>Creatingcluster>>>Performinghashslotsallocationon6nodes...Using3masters:127.0.0.1:6379127.0.0.1:6380127.0.0.1:6381Addingreplica127.0.0.1:6390to127.0.0.1:6379Addingreplica127.0.0.1:6391to127.0.0.1:6380Addingreplica127.0.0.1:6389to127.0.0.1:6381>>>Tryingtooptimizeslavesallocationforanti-affinity[WARNING]SomeslavesareinthesamehostastheirmasterM:ad4b9ffceba062492ed67ab336657426f55874b7127.0.0.1:6379slots:0-5460(5461slots)masterM:df23c6cad0654ba83f0422e352a81ecee822702e127.0.0.1:6380slots:5461-10922(5462slots)masterM:ab9da92d37125f24fe60f1f33688b4f8644612ee127.0.0.1:6381slots:10923-16383(5461slots)masterS: 25cfa11a2b4666021da5380ff332b80dbda97208127.0.0.1:6389replicatesad4b9ffceba062492ed67ab336657426f55874b7S: 48e0a4b539867e01c66172415d94d748933be173127.0.0.1:6390replicatesdf23c6cad0654ba83f0422e352a81ecee822702eS:d881142a8307f89ba51835734b27cb309a0fe855127.0.0.1:6391replicatesab9da92d37125f24fe60f1f33688b4f8644612ee復(fù)制代碼

然后輸入 yes匕荸,redis-trib.rb 開始執(zhí)行?節(jié)點(diǎn)握手?和?槽分配?操作爹谭,輸出如下:

CanIsettheaboveconfiguration? (type'yes'to accept):yes>>>Nodesconfigurationupdated>>>Assignadifferentconfigepochtoeachnode>>>SendingCLUSTERMEETmessagestojointheclusterWaitingfortheclustertojoin....>>>PerformingClusterCheck(using node127.0.0.1:6379)M:ad4b9ffceba062492ed67ab336657426f55874b7127.0.0.1:6379slots:0-5460(5461slots)master1additionalreplica(s)M:ab9da92d37125f24fe60f1f33688b4f8644612ee127.0.0.1:6381slots:10923-16383(5461slots)master1additionalreplica(s)S:48e0a4b539867e01c66172415d94d748933be173127.0.0.1:6390slots: (0slots)slavereplicatesdf23c6cad0654ba83f0422e352a81ecee822702eS:d881142a8307f89ba51835734b27cb309a0fe855127.0.0.1:6391slots: (0slots)slavereplicatesab9da92d37125f24fe60f1f33688b4f8644612eeM:df23c6cad0654ba83f0422e352a81ecee822702e127.0.0.1:6380slots:5461-10922(5462slots)master1additionalreplica(s)S:25cfa11a2b4666021da5380ff332b80dbda97208127.0.0.1:6389slots: (0slots)slavereplicatesad4b9ffceba062492ed67ab336657426f55874b7[OK]Allnodesagreeaboutslotsconfiguration.>>>Checkforopenslots...>>>Checkslotscoverage...[OK]All16384slotscovered.復(fù)制代碼

執(zhí)行?集群檢查,檢查各個(gè) redis 節(jié)點(diǎn)占用的?哈希槽(slot)的個(gè)數(shù)以及 slot?覆蓋率每聪。16384 個(gè)槽位中旦棉,主節(jié)點(diǎn)?redis-6379齿风、redis-6380 和 redis-6381 分別占用了 5461药薯、5461 和 5462 個(gè)槽位。

3.3.3. redis主節(jié)點(diǎn)的日志

可以發(fā)現(xiàn)救斑,通過 BGSAVE 命令童本,從節(jié)點(diǎn)?redis-6389 在?后臺(tái)?異步地從?主節(jié)點(diǎn)?redis-6379 同步數(shù)據(jù)。

$ catlog/redis-6379.log1907:C05Sep16:59:52.960# oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo1907:C05Sep16:59:52.961# Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started1907:C05Sep16:59:52.961# Configuration loaded1908:M05Sep16:59:52.964* Increased maximumnumberofopen filesto10032(itwas originallysetto256).1908:M05Sep16:59:52.965* No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b71908:M05Sep16:59:52.967* Running mode=cluster, port=6379.1908:M05Sep16:59:52.967# Server initialized1908:M05Sep16:59:52.967* Readytoaccept connections1908:M05Sep17:01:17.782# configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH1908:M05Sep17:01:17.812# IP address for this node updated to 127.0.0.11908:M05Sep17:01:22.740# Cluster state changed: ok1908:M05Sep17:01:23.681* Slave127.0.0.1:6389asksforsynchronization1908:M05Sep17:01:23.681* Partial resynchronizationnotaccepted: Replication ID mismatch (Slave askedfor'4c5afe96cac51cde56039f96383ea7217ef2af41',myreplication IDs are '037b661bf48c80c577d1fa937ba55367a3692921'and'0000000000000000000000000000000000000000')1908:M05Sep17:01:23.681* Starting BGSAVEforSYNCwithtarget: disk1908:M05Sep17:01:23.682* Background saving startedbypid19521952:C05Sep17:01:23.683* DB savedondisk1908:M05Sep17:01:23.749* Background saving terminatedwithsuccess1908:M05Sep17:01:23.752* Synchronizationwithslave127.0.0.1:6389succeeded復(fù)制代碼

參考

《Redis 開發(fā)與運(yùn)維》

Java高架構(gòu)師脸候、分布式架構(gòu)穷娱、高可擴(kuò)展绑蔫、高性能、高并發(fā)泵额、性能優(yōu)化配深、Spring boot、Redis嫁盲、ActiveMQ篓叶、Nginx、Mycat羞秤、Netty缸托、Jvm大型分布式項(xiàng)目實(shí)戰(zhàn)學(xué)習(xí)架構(gòu)師視頻免費(fèi)學(xué)習(xí)加群:835638062 點(diǎn)擊鏈接加入群聊【Java高級(jí)架構(gòu)】:https://jq.qq.com/?_wv=1027&k=5S3kL3v

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市瘾蛋,隨后出現(xiàn)的幾起案子俐镐,更是在濱河造成了極大的恐慌,老刑警劉巖哺哼,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佩抹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡取董,警方通過查閱死者的電腦和手機(jī)匹摇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甲葬,“玉大人廊勃,你說我怎么就攤上這事【眩” “怎么了坡垫?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)画侣。 經(jīng)常有香客問我冰悠,道長(zhǎng),這世上最難降的妖魔是什么配乱? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任溉卓,我火速辦了婚禮,結(jié)果婚禮上搬泥,老公的妹妹穿的比我還像新娘桑寨。我一直安慰自己,他們只是感情好忿檩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布尉尾。 她就那樣靜靜地躺著,像睡著了一般燥透。 火紅的嫁衣襯著肌膚如雪沙咏。 梳的紋絲不亂的頭發(fā)上辨图,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音肢藐,去河邊找鬼故河。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吆豹,可吹牛的內(nèi)容都是我干的忧勿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼瞻讽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鸳吸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起速勇,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤晌砾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后烦磁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體养匈,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年都伪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了呕乎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陨晶,死狀恐怖猬仁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情先誉,我是刑警寧澤湿刽,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站褐耳,受9級(jí)特大地震影響诈闺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜铃芦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一雅镊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刃滓,春花似錦仁烹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽叙赚。三九已至老客,卻和暖如春僚饭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背胧砰。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工鳍鸵, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尉间。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓偿乖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親哲嘲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子贪薪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容