使用 Docker 搭建高可用 Redis Cluster 集群

上一篇文章描述了使用 Docker 基于哨兵模式搭建高可用的Redis绷耍,這一篇文章則使用Docker搭建Redis集群。

Redis Cluster 簡(jiǎn)介

Redis 3.0提供的分布式數(shù)據(jù)庫(kù)解決方案——Redis Cluster捏检。不僅可以主從復(fù)制轮傍,還可以像Sentinel那樣有故障轉(zhuǎn)移機(jī)制。除此之外,集群還有幾個(gè)獨(dú)有的特點(diǎn):去中心化和數(shù)據(jù)分片赡模。

去中心化:集群沒有中心(核心)節(jié)點(diǎn),就不會(huì)受到太大的影響师抄,當(dāng)某個(gè)主節(jié)點(diǎn)故障而不會(huì)影響整個(gè)集群的可用性漓柑。
分片:集群中的主節(jié)點(diǎn)可以水平擴(kuò)展,使用哈希槽將鍵值對(duì)分配到不同的主節(jié)點(diǎn)叨吮,分擔(dān)了單機(jī)Redis的壓力辆布。

接下來(lái)主要介紹如何使用 Docker 搭建Redis Cluster (Redis的版本為5.0

1.創(chuàng)建集群目錄,存放各個(gè)節(jié)點(diǎn)的配置目錄(/conf/redis.conf)和數(shù)據(jù)目錄(/data)

for port in 'seq 8081 8089' ; do mkdir -p ./${port}/conf && PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf && mkdir -p ./${port}/data; done

2.運(yùn)行端口為8081~8089的容器

for port in 'seq 8081 8089'; do docker run -d -ti -p ${port}:${port} -p 1${port}:1${port} -v /cluster-docker/${port}/conf/redis.conf:/etc/redis/redis.conf -v /cluster-docker/${port}/data:/data --restart always --name redis-${port} --net redis-net --sysctl net.core.somaxconn=1024 redis:5.0 redis-server /etc/redis/redis.conf; done

docker ps
3.獲取各個(gè)容器的內(nèi)外ip

for port in 'seq 8081 8089'; do echo -n "$(docker inspect --format '{{ (index .NetworkSettings.Networks "bridge").IPAddress }}' "redis-${port}")":${port} ' ' ; done

復(fù)制打印出來(lái)的ip和端口

4.創(chuàng)建集群

隨便進(jìn)入一個(gè)redis容器茶鉴,譬如

docker exec -it redis-8081 /bin/bash

再執(zhí)行創(chuàng)建集群的命令

redis-cli --cluster create 172.17.0.2:8081 172.17.0.3:8082 172.17.0.4:8083 172.17.0.5:8084 172.17.0.6:8085 172.17.0.7:8086 172.17.0.8:8087 172.17.0.9:8088 172.17.0.10:8089 --cluster-replicas 2

需要特別說明的是 --cluster-replicas 2 這一條命令锋玲,表示集群中的每個(gè)主節(jié)點(diǎn)創(chuàng)建兩個(gè)從節(jié)點(diǎn)。示例的集群為三主六從

搭建集群

顯示 Can I set the above configuration? (type 'yes' to accept): 的時(shí)候涵叮,輸入yes

如無(wú)意外的話惭蹂,最后顯示 [OK] All 16384 slots covered. 則代表集群創(chuàng)建成功!如果輸入yes之后一直顯示 Waiting for the cluster to join... 請(qǐng)參考我另外一篇拙作 搭建Redis集群遇到的問題:Waiting for the cluster to join...

成功搭建集群

執(zhí)行cluster nodes查看主從節(jié)點(diǎn)詳細(xì)信息割粮,如下圖:

cluster nodes

輸出格式為:

<id> <ip:port> <flags> <master> <ping-sent> <pong-recv> <config-epoch> <link-state> <slot> <slot> ... <slot>

id:節(jié)點(diǎn) ID盾碗。一個(gè)40個(gè)字符的隨機(jī)字符串,當(dāng)一個(gè)節(jié)點(diǎn)被創(chuàng)建時(shí)不會(huì)再發(fā)生變化(除非CLUSTER RESET HARD被使用)舀瓢。
ip:port:客戶端應(yīng)該聯(lián)系節(jié)點(diǎn)以運(yùn)行查詢的節(jié)點(diǎn)地址廷雅。
flags:逗號(hào)列表分隔的標(biāo)志:myself,master,slave榜轿,fail幽歼,handshake,noaddr谬盐,noflags甸私。
master:如果節(jié)點(diǎn)是從屬節(jié)點(diǎn),并且主節(jié)點(diǎn)已知飞傀,則節(jié)點(diǎn)ID為主節(jié)點(diǎn)皇型,否則為“ - ”字符。
ping-sent:以毫秒為單位的當(dāng)前激活的ping發(fā)送的unix時(shí)間砸烦,如果沒有掛起的ping弃鸦,則為零。
pong-recv:毫秒 unix 時(shí)間收到最后一個(gè)ping幢痘。
config-epoch:當(dāng)前節(jié)點(diǎn)(或當(dāng)前主節(jié)點(diǎn)唬格,如果該節(jié)點(diǎn)是從節(jié)點(diǎn))的配置時(shí)期(或版本)。每次發(fā)生故障切換時(shí)颜说,都會(huì)創(chuàng)建一個(gè)新的购岗,唯一的,單調(diào)遞增的配置時(shí)期门粪。如果多個(gè)節(jié)點(diǎn)聲稱服務(wù)于相同的哈希槽喊积,則具有較高配置時(shí)期的節(jié)點(diǎn)將獲勝。
link-state:用于節(jié)點(diǎn)到節(jié)點(diǎn)集群總線的鏈路狀態(tài)玄妈。我們使用此鏈接與節(jié)點(diǎn)進(jìn)行通信乾吻。可以是connected或disconnected拟蜻。
slot:散列槽號(hào)或范圍绎签。從參數(shù)9開始,但總共可能有16384個(gè)條目(限制從未達(dá)到)瞭郑。這是此節(jié)點(diǎn)提供的散列槽列表辜御。如果條目?jī)H僅是一個(gè)數(shù)字鸭你,則被解析為這樣屈张。如果它是一個(gè)范圍,它是在形式start-end袱巨,并且意味著節(jié)點(diǎn)負(fù)責(zé)所有散列時(shí)隙從start到end包括起始和結(jié)束值阁谆。

模擬主節(jié)點(diǎn)故障

模擬端口為8082的主節(jié)點(diǎn)發(fā)送故障,執(zhí)行 docker stop redis-8082 后再次進(jìn)入端口為8081的節(jié)點(diǎn)查看集群信息愉老〕÷蹋可以看到端口為8082的節(jié)點(diǎn)的flag 標(biāo)志為:master,fail;link-state 為disconnected嫉入。再看端口為8088的節(jié)點(diǎn)變?yōu)橹鞴?jié)點(diǎn)焰盗,因此可以判斷原先端口為8082的主節(jié)點(diǎn)下線后璧尸,故障轉(zhuǎn)移由其從節(jié)點(diǎn)替代。

主節(jié)點(diǎn)下線后故障轉(zhuǎn)移從節(jié)點(diǎn)成為新的主節(jié)點(diǎn)

此時(shí)我再執(zhí)行 docker start redis-8082 熬拒,可以發(fā)現(xiàn)端口為8082的服務(wù)在集群中connect爷光,而且成為端口8088的從節(jié)點(diǎn)。

主節(jié)點(diǎn)下線后重新上線成為從節(jié)點(diǎn)

總結(jié)

以上就是使用Docker容器的技術(shù)搭建Redis集群澎粟,主要描述了Redis集群搭建的過程和模擬故障轉(zhuǎn)移的實(shí)踐蛀序。具體Redis命令背后的原理和詳細(xì)的執(zhí)行過程,推薦閱讀黃健宏老師寫的《Redis 設(shè)計(jì)與實(shí)現(xiàn)》活烙,個(gè)人感覺寫的十分通俗易懂徐裸,給了我很多啟示!

參考資料:
https://cloud.tencent.com/developer/section/1374002

《Redis 設(shè)計(jì)與實(shí)現(xiàn)》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啸盏,一起剝皮案震驚了整個(gè)濱河市重贺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌回懦,老刑警劉巖檬姥,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異粉怕,居然都是意外死亡健民,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門贫贝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秉犹,“玉大人,你說我怎么就攤上這事稚晚〕缍拢” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵客燕,是天一觀的道長(zhǎng)鸳劳。 經(jīng)常有香客問我,道長(zhǎng)也搓,這世上最難降的妖魔是什么赏廓? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮傍妒,結(jié)果婚禮上幔摸,老公的妹妹穿的比我還像新娘。我一直安慰自己颤练,他們只是感情好既忆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般患雇。 火紅的嫁衣襯著肌膚如雪跃脊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天苛吱,我揣著相機(jī)與錄音匾乓,去河邊找鬼。 笑死又谋,一個(gè)胖子當(dāng)著我的面吹牛拼缝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播彰亥,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼咧七,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了任斋?” 一聲冷哼從身側(cè)響起继阻,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎废酷,沒想到半個(gè)月后瘟檩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澈蟆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年墨辛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片趴俘。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡睹簇,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寥闪,到底是詐尸還是另有隱情太惠,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布疲憋,位于F島的核電站凿渊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏缚柳。R本人自食惡果不足惜埃脏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喂击。 院中可真熱鬧剂癌,春花似錦淤翔、人聲如沸翰绊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)监嗜。三九已至谐檀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間裁奇,已是汗流浹背桐猬。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留刽肠,地道東北人溃肪。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像音五,于是被迫代替她去往敵國(guó)和親惫撰。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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