1. Redis集群方案
Redis Cluster 集群模式通常具有高可用、可擴(kuò)展性、分布式、容錯(cuò)等特性。Redis 分布式方案一般有兩種:
1.1 客戶(hù)端分區(qū)方案
客戶(hù)端就已經(jīng)決定數(shù)據(jù)會(huì)被存儲(chǔ)到哪個(gè) redis 節(jié)點(diǎn)或者從哪個(gè) redis 節(jié)點(diǎn)讀取數(shù)據(jù)。其主要思想是采用哈希算法將 Redis 數(shù)據(jù)的 key 進(jìn)行散列,通過(guò) hash 函數(shù),特定的 key會(huì)映射到特定的 Redis 節(jié)點(diǎn)上。
深入剖析Redis-Redis集群模式搭建與原理詳解
客戶(hù)端分區(qū)方案的代表為 Redis Sharding,Redis Sharding 是 Redis Cluster 出來(lái)之前,業(yè)界普遍使用的 Redis多實(shí)例集群方法。Java?的 Redis 客戶(hù)端驅(qū)動(dòng)庫(kù) Jedis,支持 Redis Sharding 功能,即 ShardedJedis 以及結(jié)合緩存池的 ShardedJedisPool。
優(yōu)點(diǎn)
不使用第三方中間件,分區(qū)邏輯可控,配置簡(jiǎn)單,節(jié)點(diǎn)之間無(wú)關(guān)聯(lián),容易線(xiàn)性擴(kuò)展,靈活性強(qiáng)。
缺點(diǎn)
客戶(hù)端無(wú)法動(dòng)態(tài)增刪服務(wù)節(jié)點(diǎn),客戶(hù)端需要自行維護(hù)分發(fā)邏輯,客戶(hù)端之間無(wú)連接共享,會(huì)造成連接浪費(fèi)。
1.2. 代理分區(qū)方案
客戶(hù)端發(fā)送請(qǐng)求到一個(gè)代理組件,代理解析客戶(hù)端的數(shù)據(jù),并將請(qǐng)求轉(zhuǎn)發(fā)至正確的節(jié)點(diǎn),最后將結(jié)果回復(fù)給客戶(hù)端。
優(yōu)點(diǎn):簡(jiǎn)化客戶(hù)端的分布式邏輯,客戶(hù)端透明接入,切換成本低,代理的轉(zhuǎn)發(fā)和存儲(chǔ)分離。 缺點(diǎn):多了一層代理層,加重了架構(gòu)部署復(fù)雜度和性能損耗。
深入剖析Redis-Redis集群模式搭建與原理詳解
代理分區(qū)主流實(shí)現(xiàn)的有方案有 Twemproxy 和 Codis。
1.2.1. Twemproxy
Twemproxy 也叫 nutcraker,是 twitter 開(kāi)源的一個(gè) redis 和 memcache 的中間代理服務(wù)器程序。Twemproxy 作為代理,可接受來(lái)自多個(gè)程序的訪(fǎng)問(wèn),按照路由規(guī)則,轉(zhuǎn)發(fā)給后臺(tái)的各個(gè) Redis 服務(wù)器,再原路返回。Twemproxy 存在單點(diǎn)故障問(wèn)題,需要結(jié)合 Lvs 和 Keepalived 做高可用方案。
深入剖析Redis-Redis集群模式搭建與原理詳解
優(yōu)點(diǎn):應(yīng)用范圍廣,穩(wěn)定性較高,中間代理層高可用。 缺點(diǎn):無(wú)法平滑地水平擴(kuò)容/縮容,無(wú)可視化管理界面,運(yùn)維不友好,出現(xiàn)故障,不能自動(dòng)轉(zhuǎn)移。
1.2.2. Codis
Codis 是一個(gè)分布式Redis 解決方案,對(duì)于上層應(yīng)用來(lái)說(shuō),連接 Codis-Proxy 和直接連接原生的Redis-Server 沒(méi)有的區(qū)別。Codis 底層會(huì)處理請(qǐng)求的轉(zhuǎn)發(fā),不停機(jī)的進(jìn)行數(shù)據(jù)遷移等工作。Codis 采用了無(wú)狀態(tài)的代理層,對(duì)于客戶(hù)端來(lái)說(shuō),一切都是透明的。
深入剖析Redis-Redis集群模式搭建與原理詳解
優(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ī)房和多租戶(hù),不支持鑒權(quán)管理。
1.3. 查詢(xún)路由方案
客戶(hù)端隨機(jī)地請(qǐng)求任意一個(gè) Redis 實(shí)例,然后由 Redis 將請(qǐng)求轉(zhuǎn)發(fā)給正確的 Redis 節(jié)點(diǎn)。Redis Cluster 實(shí)現(xiàn)了一種混合形式的查詢(xún)路由,但并不是直接將請(qǐng)求從一個(gè) Redis 節(jié)點(diǎn)轉(zhuǎn)發(fā)到另一個(gè) Redis 節(jié)點(diǎn),而是在客戶(hù)端的幫助下直接重定向( redirected)到正確的 Redis 節(jié)點(diǎn)。
深入剖析Redis-Redis集群模式搭建與原理詳解
優(yōu)點(diǎn)
無(wú)中心節(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)重依賴(lài) Redis-trib 工具,缺乏監(jiān)控管理,需要依賴(lài) Smart Client (維護(hù)連接,緩存路由表,MultiOp 和 Pipeline 支持)。Failover 節(jié)點(diǎn)的檢測(cè)過(guò)慢,不如中心節(jié)點(diǎn)ZooKeeper 及時(shí)。Gossip 消息具有一定開(kāi)銷(xiāo)。無(wú)法根據(jù)統(tǒng)計(jì)區(qū)分冷熱數(shù)據(jù)。
2. 數(shù)據(jù)分布
2.1. 數(shù)據(jù)分布理論
分布式數(shù)據(jù)庫(kù)首先要解決把整個(gè)數(shù)據(jù)集按照分區(qū)規(guī)則映射到多個(gè)節(jié)點(diǎn)的問(wèn)題,即把數(shù)據(jù)集劃分到多個(gè)節(jié)點(diǎn)上,每個(gè)節(jié)點(diǎn)負(fù)責(zé)整體數(shù)據(jù)的一個(gè)子集。
深入剖析Redis-Redis集群模式搭建與原理詳解
數(shù)據(jù)分布通常有哈希分區(qū)和順序分區(qū)兩種方式,對(duì)比如下:
分區(qū)方式 特點(diǎn) 相關(guān)產(chǎn)品 哈希分區(qū) 離散程度好,數(shù)據(jù)分布與業(yè)務(wù)無(wú)關(guān),無(wú)法順序訪(fǎng)問(wèn) Redis Cluster,Cassandra,Dynamo 順序分區(qū) 離散程度易傾斜,數(shù)據(jù)分布與業(yè)務(wù)相關(guān),可以順序訪(fǎng)問(wèn) BigTable,HBase,Hypertable 由于 Redis Cluster 采用哈希分區(qū)規(guī)則,這里重點(diǎn)討論哈希分區(qū)。常見(jiàn)的哈希分區(qū)規(guī)則有幾種,下面分別介紹:
2.1.1. 節(jié)點(diǎn)取余分區(qū)
使用特定的數(shù)據(jù),如 Redis 的鍵或用戶(hù)ID,再根據(jù)節(jié)點(diǎn)數(shù)量N 使用公式:hash(key)% N 計(jì)算出哈希值,用來(lái)決定數(shù)據(jù)映射到哪一個(gè)節(jié)點(diǎn)上。
深入剖析Redis-Redis集群模式搭建與原理詳解
優(yōu)點(diǎn)
這種方式的突出優(yōu)點(diǎn)是簡(jiǎn)單性,常用于數(shù)據(jù)庫(kù)的分庫(kù)分表規(guī)則。一般采用預(yù)分區(qū)的方式,提前根據(jù)數(shù)據(jù)量規(guī)劃好分區(qū)數(shù),比如劃分為 512 或 1024 張表,保證可支撐未來(lái)一段時(shí)間的數(shù)據(jù)容量,再根據(jù)負(fù)載情況將表遷移到其他數(shù)據(jù)庫(kù)中。擴(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ū)
一致性哈??梢院芎玫慕鉀Q穩(wěn)定性問(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)。
深入剖析Redis-Redis集群模式搭建與原理詳解
優(yōu)點(diǎn)
加入和刪除節(jié)點(diǎn)只影響哈希環(huán)中順時(shí)針?lè)较虻南噜彽墓?jié)點(diǎn),對(duì)其他節(jié)點(diǎn)無(wú)影響。
缺點(diǎn)
加減節(jié)點(diǎn)會(huì)造成哈希環(huán)中部分?jǐn)?shù)據(jù)無(wú)法命中。當(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)橐恢滦怨7謪^(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ù)量的槽,如圖所示:
深入剖析Redis-Redis集群模式搭建與原理詳解
當(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 上,然后將沒(méi)有任何槽的節(jié)點(diǎn) 1 從集群中移除即可。
由于從一個(gè)節(jié)點(diǎn)將哈希槽移動(dòng)到另一個(gè)節(jié)點(diǎn)并不會(huì)停止服務(wù),所以無(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ù),如圖所示:
深入剖析Redis-Redis集群模式搭建與原理詳解
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)系,不需要客戶(hù)端或者代理服務(wù)維護(hù)槽分區(qū)元數(shù)據(jù)。 支持節(jié)點(diǎn)、槽、鍵之間的映射查詢(xún),用于數(shù)據(jù)路由、在線(xiàn)伸縮等場(chǎng)景。
2.3. Redis集群的功能限制
Redis 集群相對(duì)單機(jī)在功能上存在一些限制,需要開(kāi)發(fā)人員提前了解,在使用時(shí)做好規(guī)避。
key批量操作支持有限。
類(lèi)似 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ú)法使用事務(wù)功能。
key 作為數(shù)據(jù)分區(qū)的最小粒度
不能將一個(gè)大的鍵值對(duì)象如 hash、list 等映射到不同的節(jié)點(diǎn)。
不支持多數(shù)據(jù)庫(kù)空間
單機(jī)下的 Redis 可以支持 16 個(gè)數(shù)據(jù)庫(kù)(db0 ~ db15),集群模式下只能使用一個(gè)數(shù)據(jù)庫(kù)空間,即 db0。
復(fù)制結(jié)構(gòu)只支持一層
從節(jié)點(diǎn)只能復(fù)制主節(jié)點(diǎn),不支持嵌套樹(shù)狀復(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)需要開(kāi)啟配置cluster-enabled yes,讓 Redis 運(yùn)行在集群模式下。
Redis 集群的節(jié)點(diǎn)規(guī)劃如下:
節(jié)點(diǎn)名稱(chēng) 端口號(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 data log
$ 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)行
daemonize yes
# 綁定的主機(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
# 開(kāi)啟集群模式,把注釋#去掉
cluster-enabled yes
# 集群的配置,配置文件首次啟動(dòng)自動(dòng)生成
cluster-config-file /usr/local/redis-cluster/conf/${自定義}.conf
# 請(qǐng)求超時(shí),設(shè)置10秒
cluster-node-timeout 10000
# aof日志開(kāi)啟,有需要就開(kāi)啟,它會(huì)每次寫(xiě)操作都記錄一條日志
appendonly yes
復(fù)制代碼
redis-6379.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6379
pidfile /var/run/redis-cluster/redis-6379.pid
logfile /usr/local/redis-cluster/log/redis-6379.log
port 6379
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6379.conf
cluster-node-timeout 10000
appendonly yes
復(fù)制代碼
redis-6389.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6389
pidfile /var/run/redis-cluster/redis-6389.pid
logfile /usr/local/redis-cluster/log/redis-6389.log
port 6389
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6389.conf
cluster-node-timeout 10000
appendonly yes
復(fù)制代碼
redis-6380.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6380
pidfile /var/run/redis-cluster/redis-6380.pid
logfile /usr/local/redis-cluster/log/redis-6380.log
port 6380
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6380.conf
cluster-node-timeout 10000
appendonly yes
復(fù)制代碼
redis-6390.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6390
pidfile /var/run/redis-cluster/redis-6390.pid
logfile /usr/local/redis-cluster/log/redis-6390.log
port 6390
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6390.conf
cluster-node-timeout 10000
appendonly yes
復(fù)制代碼
redis-6381.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6381
pidfile /var/run/redis-cluster/redis-6381.pid
logfile /usr/local/redis-cluster/log/redis-6381.log
port 6381
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6381.conf
cluster-node-timeout 10000
appendonly yes
復(fù)制代碼
redis-6391.conf
daemonize yes
bind 127.0.0.1
dir /usr/local/redis-cluster/data/redis-6391
pidfile /var/run/redis-cluster/redis-6391.pid
logfile /usr/local/redis-cluster/log/redis-6391.log
port 6391
cluster-enabled yes
cluster-config-file /usr/local/redis-cluster/conf/node-6391.conf
cluster-node-timeout 10000
appendonly yes
復(fù)制代碼
3.2. 環(huán)境準(zhǔn)備
3.2.1. 安裝Ruby環(huán)境
$ sudo brew install ruby
復(fù)制代碼
3.2.2. 準(zhǔn)備rubygem redis依賴(lài)
$ sudo gem install redis
Password:
Fetching: redis-4.0.2.gem (100%)
Successfully installed redis-4.0.2
Parsing documentation for redis-4.0.2
Installing ri documentation for redis-4.0.2
Done installing documentation for redis after 1 seconds
1 gem 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 --replicas check host:port info host:port fix host:port --timeout reshard host:port --from --to --slots --yes --timeout --pipeline rebalance host:port --weight --auto-weights --use-empty-masters --timeout --simulate --pipeline --threshold add-node new_host:new_port existing_host:existing_port --slave --master-id del-node host:port node_id set-timeout host:port milliseconds call host:port command arg arg .. arg import host:port --from --copy --replace help (show this help) For check, fix, reshard, del-node, set-timeout you 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 在線(xiàn)遷移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-server conf/redis-6379.conf
sudo redis-server conf/redis-6389.conf
sudo redis-server conf/redis-6380.conf
sudo redis-server conf/redis-6390.conf
sudo redis-server conf/redis-6381.conf
sudo redis-server conf/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 -L 3 .
.
├── 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.rb
9 directories, 20 files
復(fù)制代碼
3.3.2. redis-trib關(guān)聯(lián)集群節(jié)點(diǎn)
按照從主到從的方式從左到右依次排列 6 個(gè) redis 節(jié)點(diǎn)。
$ sudo ./redis-trib.rb create --replicas 1 127.0.0.1:6379 127.0.0.1:6380 127.0.0.1:6381 127.0.0.1:6389 127.0.0.1:6390 127.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ù)同步。
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:6379
127.0.0.1:6380
127.0.0.1:6381
Adding replica 127.0.0.1:6390 to 127.0.0.1:6379
Adding replica 127.0.0.1:6391 to 127.0.0.1:6380
Adding replica 127.0.0.1:6389 to 127.0.0.1:6381
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
slots:0-5460 (5461 slots) master
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
replicates ad4b9ffceba062492ed67ab336657426f55874b7
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
復(fù)制代碼
然后輸入 yes,redis-trib.rb 開(kāi)始執(zhí)行節(jié)點(diǎn)握手和槽分配操作,輸出如下:
Can I set the above configuration (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join....
>>> Performing Cluster Check (using node 127.0.0.1:6379)
M: ad4b9ffceba062492ed67ab336657426f55874b7 127.0.0.1:6379
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: ab9da92d37125f24fe60f1f33688b4f8644612ee 127.0.0.1:6381
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 48e0a4b539867e01c66172415d94d748933be173 127.0.0.1:6390
slots: (0 slots) slave
replicates df23c6cad0654ba83f0422e352a81ecee822702e
S: d881142a8307f89ba51835734b27cb309a0fe855 127.0.0.1:6391
slots: (0 slots) slave
replicates ab9da92d37125f24fe60f1f33688b4f8644612ee
M: df23c6cad0654ba83f0422e352a81ecee822702e 127.0.0.1:6380
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 25cfa11a2b4666021da5380ff332b80dbda97208 127.0.0.1:6389
slots: (0 slots) slave
replicates ad4b9ffceba062492ed67ab336657426f55874b7
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
復(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),通過(guò) BGSAVE 命令,從節(jié)點(diǎn)redis-6389 在后臺(tái)異步地從主節(jié)點(diǎn)redis-6379 同步數(shù)據(jù)。
$ cat log/redis-6379.log
1907:C 05 Sep 16:59:52.960 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1907:C 05 Sep 16:59:52.961 # Redis version=4.0.11, bits=64, commit=00000000, modified=0, pid=1907, just started
1907:C 05 Sep 16:59:52.961 # Configuration loaded
1908:M 05 Sep 16:59:52.964 * Increased maximum number of open files to 10032 (it was originally set to 256).
1908:M 05 Sep 16:59:52.965 * No cluster configuration found, I'm ad4b9ffceba062492ed67ab336657426f55874b7
1908:M 05 Sep 16:59:52.967 * Running mode=cluster, port=6379.
1908:M 05 Sep 16:59:52.967 # Server initialized
1908:M 05 Sep 16:59:52.967 * Ready to accept connections
1908:M 05 Sep 17:01:17.782 # configEpoch set to 1 via CLUSTER SET-CONFIG-EPOCH
1908:M 05 Sep 17:01:17.812 # IP address for this node updated to 127.0.0.1
1908:M 05 Sep 17:01:22.740 # Cluster state changed: ok
1908:M 05 Sep 17:01:23.681 * Slave 127.0.0.1:6389 asks for synchronization
1908:M 05 Sep 17:01:23.681 * Partial resynchronization not accepted: Replication ID mismatch (Slave asked for '4c5afe96cac51cde56039f96383ea7217ef2af41', my replication IDs are '037b661bf48c80c577d1fa937ba55367a3692921' and '0000000000000000000000000000000000000000')
1908:M 05 Sep 17:01:23.681 * Starting BGSAVE for SYNC with target: disk
1908:M 05 Sep 17:01:23.682 * Background saving started by pid 1952
1952:C 05 Sep 17:01:23.683 * DB saved on disk
1908:M 05 Sep 17:01:23.749 * Background saving terminated with success
1908:M 05 Sep 17:01:23.752 * Synchronization with slave 127.0.0.1:6389 succeeded
復(fù)制代碼
參考
《Redis 開(kāi)發(fā)與運(yùn)維》
另外送福利了,關(guān)于Redis的學(xué)習(xí)腦圖
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
當(dāng)前題目:Redis集群模式搭建與原理詳解-創(chuàng)新互聯(lián)
文章位置:http://chinadenli.net/article22/icgjc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、企業(yè)建站、虛擬主機(jī)、網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容