Redis Cluster 模式是官方支持的功能偎窘,也是現(xiàn)在最流行的 redis 集群部署方式扶镀。較傳統(tǒng)的 Sentinel 模式,不再有單機(jī)內(nèi)存容量尿孔、網(wǎng)卡流量限制,真正做到了可以隨意擴(kuò)/縮容筹麸。
redis配置啟動(dòng)
dockerfile 如下活合,這次是直接使用的 yum 安裝
# 引用的基礎(chǔ)鏡像
FROM myos
# 構(gòu)建默認(rèn)工作目錄
RUN mkdir /home/admin/redis
WORKDIR /home/admin/redis
## 安裝redis
RUN yum -y install redis
Redis 的配置文件 redis.conf 需要修改如下內(nèi)容。
# 集群開關(guān)物赶,默認(rèn)是不開啟集群模式
cluster-enabled yes
# 集群配置文件的名稱白指,每個(gè)節(jié)點(diǎn)都有一個(gè)集群相關(guān)的配置文件,持久化保存集群的信息
cluster-config-file /home/admin/redis/6379/nodes-6379.conf
# 節(jié)點(diǎn)互連超時(shí)的閥值酵紫。集群節(jié)點(diǎn)超時(shí)毫秒數(shù)
cluster-node-timeout 15000
# 比較slave斷開連接的時(shí)間和(node-timeout * slave-validity-factor) + repl-ping-slave-period告嘲。如果節(jié)點(diǎn)超時(shí)時(shí)間為三十秒, 并且slave-validity-factor為10,假設(shè)默認(rèn)的repl-ping-slave-period是10
cluster-replica-validity-factor 10
# master的slave數(shù)量大于該值错维,slave才能遷移到其他孤立master上
cluster-migration-barrier 1
# 數(shù)據(jù)目錄,數(shù)據(jù)庫的寫入會(huì)在這個(gè)目錄橄唬。rdb赋焕、aof文件也會(huì)寫在這個(gè)目錄
dir /home/admin/redis/6379/
# 指定了記錄日志的文件
logfile /home/admin/redis/6379/redis.log
下面兩種配置方式二選一,因?yàn)閞edis開啟了安全性包含的話需要設(shè)置密碼或者綁定指定ip
# 讓用戶使用AUTH命令來認(rèn)證密碼仰楚,才能使用其他命令
requirepass abc
# 指定 redis 只接收來自于該IP地址的請求
# bind 127.0.0.1
or
# 是否開啟保護(hù)模式隆判,默認(rèn)開啟。要是配置里沒有指定bind和密碼僧界。開啟該參數(shù)后侨嘀,redis只會(huì)本地進(jìn)行訪問,拒絕外部訪問
protected-mode no
然后執(zhí)行 docker 命令構(gòu)建 docker image 并啟動(dòng)捂襟。
##構(gòu)建鏡像
docker build -t myredis .
##啟動(dòng)
docker run -it -p 6301:6301 -p 6302:6302 -p 6303:6303 -p 6304:6304 -p 6305:6305 -p 6306:6306 --name redis \-v /Users/yuman/tools/docker/redis:/home/admin/redis \
-d myredis
進(jìn)入 Redis 的 Container 后咬腕,執(zhí)行如下命令來開啟多個(gè) redis 實(shí)例,由于 Redis Cluster 需要至少3個(gè)節(jié)點(diǎn)葬荷,所以我們開啟了6個(gè)實(shí)例(3節(jié)點(diǎn)主+備)涨共。
mkdir 6301 6302 6303 6304 6305 6306
sed 's/6379/6301/g' /home/admin/redis/redis.conf > /home/admin/redis/6301/redis.conf
sed 's/6379/6302/g' /home/admin/redis/redis.conf > /home/admin/redis/6302/redis.conf
sed 's/6379/6303/g' /home/admin/redis/redis.conf > /home/admin/redis/6303/redis.conf
sed 's/6379/6304/g' /home/admin/redis/redis.conf > /home/admin/redis/6304/redis.conf
sed 's/6379/6305/g' /home/admin/redis/redis.conf > /home/admin/redis/6305/redis.conf
sed 's/6379/6306/g' /home/admin/redis/redis.conf > /home/admin/redis/6306/redis.conf
redis-server ./6301/redis.conf
redis-server ./6302/redis.conf
redis-server ./6303/redis.conf
redis-server ./6304/redis.conf
redis-server ./6305/redis.conf
redis-server ./6306/redis.conf
然后執(zhí)行 ps -ef|grep redis,查看下 Redis 啟動(dòng)情況宠漩【俜矗可以看到我們需要的6個(gè)redis實(shí)例都已經(jīng)啟動(dòng)起來,并綁定到指定端口哄孤。
集群操作
集群搭建
Redis Cluster 相關(guān)命令都可以使用“redis-cli --cluster help”進(jìn)行查詢照筑。
我們現(xiàn)在來使用 Redis Cluster 命令搭建下 Redis 集群,執(zhí)行命令“redis-cli --cluster create 127.0.0.1:6301 127.0.0.1:6302 127.0.0.1:6303 127.0.0.1:6304 127.0.0.1:6305 127.0.0.1:6306 --cluster-replicas 1”瘦陈,cluster-replicas 參數(shù)是指主/從的比例凝危。
執(zhí)行命令后可以觀察控制臺,Redis 會(huì)引導(dǎo)我們方便的搭建出集群晨逝。為各個(gè)節(jié)點(diǎn)分好了主/從身份蛾默,并且將 slots 槽分散到各個(gè)節(jié)點(diǎn)。在輸入 yes 后將真正搭建 Redis 集群捉貌。
可以看到會(huì)發(fā)送 CLUSTER MEET 消息來加入集群支鸡,加入集群后,執(zhí)行集群節(jié)點(diǎn)的檢查工作趁窃。之后會(huì)執(zhí)行 slots 的open 牧挣、 coverage 檢查,這些都做完之后集群就正式建立醒陆,并可以對外提供服務(wù)瀑构。
我們執(zhí)行“redis-cli -p 6301”來連接 6301 這個(gè)節(jié)點(diǎn)。然后執(zhí)行 CLUSTER NODES 觀察下集群中節(jié)點(diǎn)的狀態(tài)刨摩。
可以看到當(dāng)前連接的節(jié)點(diǎn)會(huì)有 myself 標(biāo)識寺晌。每個(gè)節(jié)點(diǎn)分配了節(jié)點(diǎn)id世吨,0-5460 表示分配了0-5460 號 slots 槽位。
集群擴(kuò)容
集群的擴(kuò)容過程其實(shí)也很簡單呻征,主分為兩步:
- 為集群加入新節(jié)點(diǎn)
- 為新節(jié)點(diǎn)分配 slots 槽位耘婚。
首先我們參照上文的方式再啟動(dòng)兩個(gè) redis 實(shí)例。
mkdir 6307 6308
sed 's/6379/6307/g' /home/admin/redis/redis.conf > /home/admin/redis/6307/redis.conf
sed 's/6379/6308/g' /home/admin/redis/redis.conf > /home/admin/redis/6308/redis.conf
redis-server ./6307/redis.conf
redis-server ./6308/redis.conf
執(zhí)行 “ps -ef|grep redis” 命令觀察實(shí)例是否正常啟動(dòng)陆赋。
可以看到 6307沐祷、6308 實(shí)例已經(jīng)正常啟動(dòng)。
然后我們執(zhí)行命令“redis-cli --cluster add-node 127.0.0.1:6307 127.0.0.1:6301”奏甫,將 6370 節(jié)點(diǎn)加入到已有的集群中戈轿。
可以看到還是先執(zhí)行了集群及 slots 的檢查工作凌受,然后發(fā)送了 CLUSTER MEET 命令阵子,讓 6307 節(jié)點(diǎn)加入到集群中。
然后我們連接 6307 節(jié)點(diǎn)胜蛉,并查看下現(xiàn)在的集群狀態(tài)挠进。
可以看到 6307 節(jié)點(diǎn)已經(jīng)正常的加入到了集群中,并且是 master 節(jié)點(diǎn)誊册。
接著我們需要為 6307 節(jié)點(diǎn)添加 slave 節(jié)點(diǎn)领突,畢竟單節(jié)點(diǎn)是很不安全的。執(zhí)行命令“redis-cli --cluster add-node 127.0.0.1:6308 127.0.0.1:6301 --cluster-slave --cluster-master-id cfd3daab15f554f7939c2dd7b9e586c21b3c44d6” 即可為指定的節(jié)點(diǎn)添加 slave 節(jié)點(diǎn)案怯。
可以看到跟添加 6307 節(jié)點(diǎn)類似的過程君旦,只不過多了 “Configure node as replica of 127.0.0.1:6307”過程,這個(gè)就是為 6307 添加 slave 的指令嘲碱。
我們再運(yùn)行 CLUSTER NODES 命令來觀察下集群狀態(tài)金砍。
可以看到 6308 節(jié)點(diǎn)已經(jīng)正常加入集群,并成為了 6307 節(jié)點(diǎn)的 slave麦锯。
接下來我們需要移動(dòng)一些 slots 給新加入的節(jié)點(diǎn)恕稠,畢竟 Redis Cluster 是依賴 slots 來存儲、管理數(shù)據(jù)的扶欣,沒有 slots 的節(jié)點(diǎn)可以算的上是無效節(jié)點(diǎn)鹅巍。
我們執(zhí)行命令“redis-cli --cluster reshard 127.0.0.1:6301 --cluster-from 4d4c6db51fe4a3c81f055f84acc581e4c5596ee2 --cluster-to cfd3daab15f554f7939c2dd7b9e586c21b3c44d6 --cluster-slots 500”,這個(gè)命令也很明了料祠,就是從 6301 節(jié)點(diǎn)移動(dòng) 500 個(gè) slots 到 6307 節(jié)點(diǎn)骆捧。
Redis 會(huì)告知我們移動(dòng)了哪些 slots ,在輸入 yes 后會(huì)實(shí)際執(zhí)行移動(dòng)操作髓绽。然后我們再執(zhí)行“CLUSTER NODES” 名稱敛苇,來觀察下 slots 的移動(dòng)情況。
可以看到 slots 移動(dòng)已經(jīng)生效梧宫,6307 節(jié)點(diǎn)現(xiàn)在有 0-499 slots接谨,而6301 節(jié)點(diǎn)從開始的0-5460 slots 變成了 500-5460 slots摆碉。
reshad 命令也提供了一步步的交互方式來移動(dòng) slots,例如我們執(zhí)行命令“redis-cli --cluster reshard 127.0.0.1:6301”脓豪。
可以看到 redis 客戶端會(huì)做如下詢問:
- 需要移動(dòng)多少個(gè) slots
- 哪個(gè)節(jié)點(diǎn)來接收這些 slots
- 從哪些節(jié)點(diǎn)移動(dòng) slots (輸入all時(shí)候會(huì)從所有節(jié)點(diǎn)進(jìn)行移動(dòng)巷帝,或者輸入節(jié)點(diǎn)的id,已done結(jié)束)扫夜。
在移動(dòng)完之后我們再通過 “CLUSTER NODES” 命令觀察下集群狀態(tài)楞泼。
會(huì)發(fā)現(xiàn) slots 的移動(dòng)完全符合我們的預(yù)期。
集群縮容
集群縮容使用“del-node”命令笤闯,需要縮容的節(jié)點(diǎn)上沒有 slots 才可以堕阔。比如我們執(zhí)行如下命令“redis-cli --cluster del-node 127.0.0.1:6301 cfd3daab15f554f7939c2dd7b9e586c21b3c44d6”。
會(huì)提示 6307 節(jié)點(diǎn)是非空節(jié)點(diǎn)颗味,需要 reshard 掉節(jié)點(diǎn)上的數(shù)據(jù)超陆。
在使用上文中 reshard 命令,reshard 掉 6307 節(jié)點(diǎn)上的 slots 之后浦马,再執(zhí)行命令
redis-cli --cluster del-node 127.0.0.1:6301 b6e47ce43a5a0e068da4302bcceba07bc3a60fa8
redis-cli --cluster del-node 127.0.0.1:6301 cfd3daab15f554f7939c2dd7b9e586c21b3c44d6
可以看到都正常發(fā)送了 CLUSTER RESET SOFT 命令來刪除節(jié)點(diǎn)时呀。
集群故障轉(zhuǎn)移
構(gòu)建 master/slave 結(jié)構(gòu)最大原因是為了防止單點(diǎn)故障,我們來使用 “kill -9” 來殺掉一個(gè)實(shí)例的進(jìn)程晶默,觀察下redis 的處理過程谨娜。
接著通過 "CLUSTER NODES" 命令觀察集群狀態(tài),可以發(fā)現(xiàn) 6307 節(jié)點(diǎn)雖然還 master 但已經(jīng)被標(biāo)記 fail 狀態(tài)磺陡,而 6308 節(jié)點(diǎn)也按照我們預(yù)想的變成了 master 節(jié)點(diǎn)趴梢。
接著我們通過 “redis-server ./6307/redis.conf ” 重新啟動(dòng) 6307 節(jié)點(diǎn),繼續(xù)觀察集群的狀態(tài)币他。
可以發(fā)現(xiàn) 6307 節(jié)點(diǎn)又正常加入到集群中坞靶,但是狀態(tài)也由 master 變成了 slave。Redis 的故障轉(zhuǎn)移機(jī)制也完全符合預(yù)期圆丹。