Redis Cluster 實(shí)際部署

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í)也很簡單呻征,主分為兩步:

  1. 為集群加入新節(jié)點(diǎn)
  2. 為新節(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”脓豪。

reshad命令

可以看到 redis 客戶端會(huì)做如下詢問:

  1. 需要移動(dòng)多少個(gè) slots
  2. 哪個(gè)節(jié)點(diǎn)來接收這些 slots
  3. 從哪些節(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ù)期圆丹。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滩愁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子辫封,更是在濱河造成了極大的恐慌硝枉,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件倦微,死亡現(xiàn)場離奇詭異妻味,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)欣福,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門责球,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事雏逾〖慰悖” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵栖博,是天一觀的道長屑宠。 經(jīng)常有香客問我,道長仇让,這世上最難降的妖魔是什么典奉? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮丧叽,結(jié)果婚禮上卫玖,老公的妹妹穿的比我還像新娘。我一直安慰自己踊淳,他們只是感情好假瞬,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著嚣崭,像睡著了一般笨触。 火紅的嫁衣襯著肌膚如雪懦傍。 梳的紋絲不亂的頭發(fā)上雹舀,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機(jī)與錄音粗俱,去河邊找鬼说榆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寸认,可吹牛的內(nèi)容都是我干的签财。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼偏塞,長吁一口氣:“原來是場噩夢啊……” “哼唱蒸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灸叼,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤神汹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后古今,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屁魏,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年捉腥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氓拼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桃漾,靈堂內(nèi)的尸體忽然破棺而出坏匪,到底是詐尸還是另有隱情,我是刑警寧澤撬统,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布剥槐,位于F島的核電站,受9級特大地震影響宪摧,放射性物質(zhì)發(fā)生泄漏粒竖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一几于、第九天 我趴在偏房一處隱蔽的房頂上張望蕊苗。 院中可真熱鬧,春花似錦沿彭、人聲如沸朽砰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞧柔。三九已至,卻和暖如春睦裳,著一層夾襖步出監(jiān)牢的瞬間造锅,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工廉邑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留哥蔚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓蛛蒙,卻偏偏與公主長得像糙箍,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子牵祟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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