Redis Cluster 實際部署

Redis Cluster 模式是官方支持的功能,也是現(xiàn)在最流行的 redis 集群部署方式。較傳統(tǒng)的 Sentinel 模式,不再有單機(jī)內(nèi)存容量、網(wǎng)卡流量限制,真正做到了可以隨意擴(kuò)/縮容。

redis配置啟動

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
# 集群配置文件的名稱,每個節(jié)點都有一個集群相關(guān)的配置文件,持久化保存集群的信息
cluster-config-file /home/admin/redis/6379/nodes-6379.conf
# 節(jié)點互連超時的閥值。集群節(jié)點超時毫秒數(shù)
cluster-node-timeout 15000
# 比較slave斷開連接的時間和(node-timeout * slave-validity-factor) + repl-ping-slave-period。如果節(jié)點超時時間為三十秒, 并且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ù)庫的寫入會在這個目錄。rdb、aof文件也會寫在這個目錄
dir /home/admin/redis/6379/
# 指定了記錄日志的文件
logfile /home/admin/redis/6379/redis.log

下面兩種配置方式二選一,因為redis開啟了安全性包含的話需要設(shè)置密碼或者綁定指定ip
# 讓用戶使用AUTH命令來認(rèn)證密碼,才能使用其他命令
requirepass abc
# 指定 redis 只接收來自于該IP地址的請求
# bind 127.0.0.1

or

# 是否開啟保護(hù)模式,默認(rèn)開啟。要是配置里沒有指定bind和密碼。開啟該參數(shù)后,redis只會本地進(jìn)行訪問,拒絕外部訪問
protected-mode no

然后執(zhí)行 docker 命令構(gòu)建 docker image 并啟動。

##構(gòu)建鏡像
docker build -t myredis . 

##啟動
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í)行如下命令來開啟多個 redis 實例,由于 Redis Cluster 需要至少3個節(jié)點,所以我們開啟了6個實例(3節(jié)點主+備)。

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 啟動情況。可以看到我們需要的6個redis實例都已經(jī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 會引導(dǎo)我們方便的搭建出集群。為各個節(jié)點分好了主/從身份,并且將 slots 槽分散到各個節(jié)點。在輸入 yes 后將真正搭建 Redis 集群。

可以看到會發(fā)送 CLUSTER MEET 消息來加入集群,加入集群后,執(zhí)行集群節(jié)點的檢查工作。之后會執(zhí)行 slots 的open 、 coverage 檢查,這些都做完之后集群就正式建立,并可以對外提供服務(wù)。

我們執(zhí)行“redis-cli -p 6301”來連接 6301 這個節(jié)點。然后執(zhí)行 CLUSTER NODES 觀察下集群中節(jié)點的狀態(tài)。

可以看到當(dāng)前連接的節(jié)點會有 myself 標(biāo)識。每個節(jié)點分配了節(jié)點id,0-5460 表示分配了0-5460 號 slots 槽位。

集群擴(kuò)容

集群的擴(kuò)容過程其實也很簡單,主分為兩步:

  1. 為集群加入新節(jié)點
  2. 為新節(jié)點分配 slots 槽位。

首先我們參照上文的方式再啟動兩個 redis 實例。

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” 命令觀察實例是否正常啟動。

可以看到 6307、6308 實例已經(jīng)正常啟動。

然后我們執(zhí)行命令“redis-cli --cluster add-node 127.0.0.1:6307 127.0.0.1:6301”,將 6370 節(jié)點加入到已有的集群中。

可以看到還是先執(zhí)行了集群及 slots 的檢查工作,然后發(fā)送了 CLUSTER MEET 命令,讓 6307 節(jié)點加入到集群中。

然后我們連接 6307 節(jié)點,并查看下現(xiàn)在的集群狀態(tài)。

可以看到 6307 節(jié)點已經(jīng)正常的加入到了集群中,并且是 master 節(jié)點。

接著我們需要為 6307 節(jié)點添加 slave 節(jié)點,畢竟單節(jié)點是很不安全的。執(zhí)行命令“redis-cli --cluster add-node 127.0.0.1:6308 127.0.0.1:6301 --cluster-slave --cluster-master-id cfd3daab15f554f7939c2dd7b9e586c21b3c44d6” 即可為指定的節(jié)點添加 slave 節(jié)點。

可以看到跟添加 6307 節(jié)點類似的過程,只不過多了 “Configure node as replica of 127.0.0.1:6307”過程,這個就是為 6307 添加 slave 的指令。

我們再運行 CLUSTER NODES 命令來觀察下集群狀態(tài)。

可以看到 6308 節(jié)點已經(jīng)正常加入集群,并成為了 6307 節(jié)點的 slave。

接下來我們需要移動一些 slots 給新加入的節(jié)點,畢竟 Redis Cluster 是依賴 slots 來存儲、管理數(shù)據(jù)的,沒有 slots 的節(jié)點可以算的上是無效節(jié)點。

我們執(zhí)行命令“redis-cli --cluster reshard 127.0.0.1:6301 --cluster-from 4d4c6db51fe4a3c81f055f84acc581e4c5596ee2 --cluster-to cfd3daab15f554f7939c2dd7b9e586c21b3c44d6 --cluster-slots 500”,這個命令也很明了,就是從 6301 節(jié)點移動 500 個 slots 到 6307 節(jié)點。

Redis 會告知我們移動了哪些 slots ,在輸入 yes 后會實際執(zhí)行移動操作。然后我們再執(zhí)行“CLUSTER NODES” 名稱,來觀察下 slots 的移動情況。

可以看到 slots 移動已經(jīng)生效,6307 節(jié)點現(xiàn)在有 0-499 slots,而6301 節(jié)點從開始的0-5460 slots 變成了 500-5460 slots。

reshad 命令也提供了一步步的交互方式來移動 slots,例如我們執(zhí)行命令“redis-cli --cluster reshard 127.0.0.1:6301”。

reshad命令

可以看到 redis 客戶端會做如下詢問:

  1. 需要移動多少個 slots
  2. 哪個節(jié)點來接收這些 slots
  3. 從哪些節(jié)點移動 slots (輸入all時候會從所有節(jié)點進(jìn)行移動,或者輸入節(jié)點的id,已done結(jié)束)。

在移動完之后我們再通過 “CLUSTER NODES” 命令觀察下集群狀態(tài)。

會發(fā)現(xiàn) slots 的移動完全符合我們的預(yù)期。

集群縮容

集群縮容使用“del-node”命令,需要縮容的節(jié)點上沒有 slots 才可以。比如我們執(zhí)行如下命令“redis-cli --cluster del-node 127.0.0.1:6301 cfd3daab15f554f7939c2dd7b9e586c21b3c44d6”。

會提示 6307 節(jié)點是非空節(jié)點,需要 reshard 掉節(jié)點上的數(shù)據(jù)。

在使用上文中 reshard 命令,reshard 掉 6307 節(jié)點上的 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é)點。

集群故障轉(zhuǎn)移

構(gòu)建 master/slave 結(jié)構(gòu)最大原因是為了防止單點故障,我們來使用 “kill -9” 來殺掉一個實例的進(jìn)程,觀察下redis 的處理過程。

接著通過 "CLUSTER NODES" 命令觀察集群狀態(tài),可以發(fā)現(xiàn) 6307 節(jié)點雖然還 master 但已經(jīng)被標(biāo)記 fail 狀態(tài),而 6308 節(jié)點也按照我們預(yù)想的變成了 master 節(jié)點。

接著我們通過 “redis-server ./6307/redis.conf ” 重新啟動 6307 節(jié)點,繼續(xù)觀察集群的狀態(tài)。

可以發(fā)現(xiàn) 6307 節(jié)點又正常加入到集群中,但是狀態(tài)也由 master 變成了 slave。Redis 的故障轉(zhuǎn)移機(jī)制也完全符合預(yù)期。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容