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