動(dòng)手實(shí)踐Redis主從復(fù)制寞秃、Sentinel主從切換斟叼、Cluster分片

背景簡(jiǎn)介

Redis 提供的如下技術(shù)「Redis Sentinel『主從切換』、Redis Cluster『分片』」春寿,有效實(shí)現(xiàn)了 Redis 的高可用朗涩、高性能、高可伸縮性绑改,本文對(duì)以上技術(shù)進(jìn)行親自動(dòng)手實(shí)踐谢床。

1. Redis Sentinel「主從切換」

  • 監(jiān)控主從節(jié)點(diǎn)的在線狀態(tài),并根據(jù)配置自行完成切換「基于raft協(xié)議」厘线。
  • 主從復(fù)制從容量角度來說识腿,還是單機(jī)。

2. Redis Cluster「分片」

  • 通過一致性 hash 的方式造壮,將數(shù)據(jù)分散到多個(gè)服務(wù)器節(jié)點(diǎn):設(shè)計(jì)了 16384 個(gè)哈希槽渡讼,并分配到多臺(tái) redis-server。
  • 當(dāng)需要在 Redis Cluster 中存取一個(gè) key 時(shí)耳璧,Redis 客戶端先對(duì) key 使用 CRC16 算法計(jì)算一個(gè)數(shù)值成箫,然后對(duì) 16384 取模,這樣每個(gè) key 都會(huì)對(duì)應(yīng)一個(gè)編號(hào)在 0-16383 之間的哈希槽旨枯,然后在此槽對(duì)應(yīng)的節(jié)點(diǎn)上操作蹬昌。

一、主從復(fù)制

設(shè)置詳情

# 已知網(wǎng)關(guān) IP 為:172.17.0.1

# 啟動(dòng) master 節(jié)點(diǎn)
docker run -it --name redis-6380  -p 6380:6379 redis
docker exec -it redis-6380 /bin/bash
redis-cli -h 172.17.0.1 -p 6380

# 啟動(dòng)slave節(jié)點(diǎn) 1
docker run -it --name redis-6381  -p 6381:6379 redis
docker exec -it redis-6381 /bin/bash
redis-cli -h 172.17.0.1 -p 6381
replicaof 172.17.0.1 6380

# 啟動(dòng)slave節(jié)點(diǎn) 2
docker run -it --name redis-6382  -p 6382:6379 redis
docker exec -it redis-6382 /bin/bash
redis-cli -h 172.17.0.1 -p 6382
replicaof 172.17.0.1 6380

之后可查看 master 節(jié)點(diǎn)的信息召廷,在 master-redis 下凳厢,執(zhí)行:

> info Replication

# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.1,port=6379,state=online,offset=686,lag=0
slave1:ip=172.17.0.1,port=6379,state=online,offset=686,lag=1
master_replid:79187e2241015c2f8ed98ce68caafa765796dff2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:686
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:686

之后操作 master 節(jié)點(diǎn),slave 節(jié)點(diǎn)會(huì)自動(dòng)同步竞慢。

slave-redis 下執(zhí)行 replicaof no one 可重新改為主節(jié)點(diǎn)先紫。

關(guān)鍵點(diǎn)

  1. 查看網(wǎng)絡(luò)相關(guān)信息:
docker network ls
docker network inspect bridge
  1. 容器之間互訪問,可使用內(nèi)部端口號(hào)筹煮,也可使用外部映射端口號(hào)遮精;

  2. 執(zhí)行 docker network inspect bridge 后,可查看到網(wǎng)關(guān) IP 以及各容器 IP,可使用 網(wǎng)關(guān) IP : 外部映射端口本冲,或 容器 IP : 6379 訪問 Redis准脂;

參考資料

  1. 命令:SLAVEOF

二、Sentinel 高可用

當(dāng)前狀態(tài):

  1. 網(wǎng)關(guān)IP:172.17.0.1
  2. master端口:6390
  3. slave端口:6391檬洞,6392

操作步驟

1. 重新創(chuàng)建 redis 的 docker 容器:

redis.conf 配置內(nèi)容如下:

# 默認(rèn)端口6379
port 6390

# 綁定ip狸膏,如果是內(nèi)網(wǎng)可以直接綁定 127.0.0.1, 或者忽略, 0.0.0.0 是外網(wǎng)
bind 0.0.0.0

# 守護(hù)進(jìn)程啟動(dòng)
daemonize no

變更監(jiān)聽端口號(hào),并重新創(chuàng)建 redis 容器:

docker run -p 6390:6390 -v D:\develop\shell\docker\redis\conf6390:/usr/local/etc/redis --name redis-conf-6390 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6390 /bin/bash
redis-cli -h 172.17.0.1 -p 6390

docker run -p 6391:6391 -v D:\develop\shell\docker\redis\conf6391:/usr/local/etc/redis --name redis-conf-6391 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6391 /bin/bash
redis-cli -h 172.17.0.1 -p 6391
slaveof 172.17.0.1 6390

docker run -p 6392:6392 -v D:\develop\shell\docker\redis\conf6392:/usr/local/etc/redis --name redis-conf-6392 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6392 /bin/bash
redis-cli -h 172.17.0.1 -p 6392
slaveof 172.17.0.1 6390

之后可查看 master 節(jié)點(diǎn)的信息添怔,可看到 master 獲取到的 slave 的端口號(hào)恢復(fù)了正常湾戳。在 master-redis 下,執(zhí)行:

> info Replication

# Replication
role:master
connected_slaves:2
slave0:ip=172.17.0.1,port=6391,state=online,offset=84,lag=0
slave1:ip=172.17.0.1,port=6392,state=online,offset=84,lag=0
master_replid:ed2e513ceed2b48a272b97c674c99d82284342a1
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84

2. 創(chuàng)建配置文件

創(chuàng)建 sentinel.conf广料,文件中寫入如下內(nèi)容:

sentinel monitor bitkylin-master 172.17.0.1 6390 2
sentinel down-after-milliseconds bitkylin-master 5000
sentinel failover-timeout bitkylin-master 10000
sentinel parallel-syncs bitkylin-master 1

命令詳解:指示 Sentinel 去監(jiān)視一個(gè)名為 bitkylin-master 的主服務(wù)器砾脑,將這個(gè)主服務(wù)器標(biāo)記為客觀下線至少需要 2 個(gè) Sentinel 同意;
響應(yīng)超時(shí) 5 秒標(biāo)記為主觀下線艾杏,主觀下線后就開始了遷移流程韧衣,超時(shí) 10 秒為遷移超時(shí),暫不知用途购桑。

3. 再創(chuàng)建兩個(gè) redis-docker 容器

將配置文件復(fù)制到 docker 容器內(nèi)畅铭,共兩個(gè)容器需要復(fù)制該文件:

docker run -it --name redis-6490 redis
docker run -it --name redis-6491 redis
docker cp ./sentinel.conf dcbd015dbc0e:/data/sentinel.conf
docker cp ./sentinel.conf 7c8307730bcc:/data/sentinel.conf

4. 執(zhí)行 redis-sentinel 命令

 redis-sentinel sentinel.conf

5. 最終效果

此時(shí)任意啟停 redis 容器,可以看到 sentinel 自動(dòng)完成 redis 的主從切換其兴,主從配置等不需要人工操作顶瞒。

參考資料

  1. Redis 的 Sentinel 文檔
  2. Docker 容器的文件操作
  3. > 覆蓋寫入; >> 追加寫入

三、Cluster 集群

操作步驟

1. 更新 redis 配置文件

主要追加集群配置信息元旬,示例配置文件如下:

# 默認(rèn)端口6379
port 6390

# 綁定 ip榴徐,如果是內(nèi)網(wǎng)可以直接綁定 127.0.0.1, 或者忽略, 0.0.0.0 是外網(wǎng)
bind 0.0.0.0

# 守護(hù)進(jìn)程啟動(dòng)
daemonize no

# 集群配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

2. 創(chuàng)建 6 個(gè)容器

以第二節(jié)作為基礎(chǔ),基于最新的配置文件匀归,創(chuàng)建 6 個(gè)容器坑资,注意新增集群總線端口映射:

docker run -p 6390:6390 -p 16390:16390 -v D:\develop\shell\docker\redis\conf6390:/usr/local/etc/redis --name redis-conf-6390 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6390 /bin/bash
redis-cli -h 172.17.0.1 -p 6390

docker run -p 6391:6391 -p 16391:16391 -v D:\develop\shell\docker\redis\conf6391:/usr/local/etc/redis --name redis-conf-6391 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6391 /bin/bash
redis-cli -h 172.17.0.1 -p 6391

docker run -p 6392:6392 -p 16392:16392 -v D:\develop\shell\docker\redis\conf6392:/usr/local/etc/redis --name redis-conf-6392 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6392 /bin/bash
redis-cli -h 172.17.0.1 -p 6392

docker run -p 6393:6393 -p 16393:16393 -v D:\develop\shell\docker\redis\conf6393:/usr/local/etc/redis --name redis-conf-6393 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6393 /bin/bash
redis-cli -h 172.17.0.1 -p 6393

docker run -p 6394:6394 -p 16394:16394 -v D:\develop\shell\docker\redis\conf6394:/usr/local/etc/redis --name redis-conf-6394 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6394 /bin/bash
redis-cli -h 172.17.0.1 -p 6394

docker run -p 6395:6395 -p 16395:16395 -v D:\develop\shell\docker\redis\conf6395:/usr/local/etc/redis --name redis-conf-6395 redis redis-server /usr/local/etc/redis/redis.conf
docker exec -it redis-conf-6395 /bin/bash
redis-cli -h 172.17.0.1 -p 6395

3. 直接通過命令創(chuàng)建集群

> redis-cli --cluster create 172.17.0.1:6390 172.17.0.1:6391 172.17.0.1:6392 172.17.0.1:6393 172.17.0.1:6394 172.17.0.1:6395 --cluster-replicas 1

# 以下是命令執(zhí)行結(jié)果:

>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.17.0.1:6394 to 172.17.0.1:6390
Adding replica 172.17.0.1:6395 to 172.17.0.1:6391
Adding replica 172.17.0.1:6393 to 172.17.0.1:6392
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: a9678b062663957e59bc3b4beb7be4366fa24adc 172.17.0.1:6390
   slots:[0-5460] (5461 slots) master
M: 41a4976431713cce936220fba8a230627d28d40c 172.17.0.1:6391
   slots:[5461-10922] (5462 slots) master
M: 1bf83414a12bad8f2e25dcea19ccea1c881d28c5 172.17.0.1:6392
   slots:[10923-16383] (5461 slots) master
S: 3d65eadd3321ef34c9413ae8f75d610c4228eda7 172.17.0.1:6393
   replicates 41a4976431713cce936220fba8a230627d28d40c
S: b604356698a5f211823ada4b45a97939744b1d57 172.17.0.1:6394
   replicates 1bf83414a12bad8f2e25dcea19ccea1c881d28c5
S: 2c1cc93221dc3830aa1eb28601ac27e22a6801cc 172.17.0.1:6395
   replicates a9678b062663957e59bc3b4beb7be4366fa24adc
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 172.17.0.1:6390)
M: a9678b062663957e59bc3b4beb7be4366fa24adc 172.17.0.1:6390
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: b604356698a5f211823ada4b45a97939744b1d57 172.17.0.1:6394
   slots: (0 slots) slave
   replicates 1bf83414a12bad8f2e25dcea19ccea1c881d28c5
M: 41a4976431713cce936220fba8a230627d28d40c 172.17.0.1:6391
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
S: 3d65eadd3321ef34c9413ae8f75d610c4228eda7 172.17.0.1:6393
   slots: (0 slots) slave
   replicates 41a4976431713cce936220fba8a230627d28d40c
M: 1bf83414a12bad8f2e25dcea19ccea1c881d28c5 172.17.0.1:6392
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 2c1cc93221dc3830aa1eb28601ac27e22a6801cc 172.17.0.1:6395
   slots: (0 slots) slave
   replicates a9678b062663957e59bc3b4beb7be4366fa24adc
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

集群創(chuàng)建成功

注意點(diǎn)

  1. 需要開放集群總線端口號(hào),默認(rèn)為 業(yè)務(wù)端口號(hào) + 10000
  2. cluster reset 命令可以將當(dāng)前節(jié)點(diǎn)從集群中移除

參考資料

  1. redis-cluster 集群 - 安裝與狀態(tài)驗(yàn)證
  2. Redis 集群教程
  3. Redis 命令參考 - 集群教程
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末穆端,一起剝皮案震驚了整個(gè)濱河市袱贮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌体啰,老刑警劉巖攒巍,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異荒勇,居然都是意外死亡柒莉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門沽翔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兢孝,“玉大人窿凤,你說我怎么就攤上這事】缧罚” “怎么了雳殊?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)窗轩。 經(jīng)常有香客問我夯秃,道長(zhǎng)痢艺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任腹备,我火速辦了婚禮斤蔓,結(jié)果婚禮上植酥,老公的妹妹穿的比我還像新娘。我一直安慰自己弦牡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布卸留。 她就那樣靜靜地躺著,像睡著了一般椭豫。 火紅的嫁衣襯著肌膚如雪耻瑟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天赏酥,我揣著相機(jī)與錄音,去河邊找鬼框都。 笑死,一個(gè)胖子當(dāng)著我的面吹牛魏保,可吹牛的內(nèi)容都是我干的摸屠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼餐塘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了税手?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤艺挪,失蹤者是張志新(化名)和其女友劉穎兵扬,沒想到半個(gè)月后麻裳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體器钟,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傲霸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穆役。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梳凛。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖韧拒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蹈集,我是刑警寧澤雇初,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站靖诗,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鄙才。R本人自食惡果不足惜促绵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一嘴纺、第九天 我趴在偏房一處隱蔽的房頂上張望浓冒。 院中可真熱鬧,春花似錦稳懒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顶岸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蜕琴,已是汗流浹背宵溅。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工恃逻, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留雏搂,地道東北人寇损。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓矛市,卻偏偏與公主長(zhǎng)得像芙沥,于是被迫代替她去往敵國(guó)和親浊吏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

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