docker搭建redis集群(3主3從、4主4從、擴容、縮容、容錯切換遷移)

2022-02-05 全棧開發那些事


1、3主3從集群配置1.1 關閉防火牆+啟動docker後臺服務
 systemctl stop firewalld
 systemctl start docker

1.2 集群規劃

1.3 新建6個docker容器redis實例
 docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
 
 docker run -d --name redis-node-2 --net host --privileged=true -v /data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
 
 docker run -d --name redis-node-3 --net host --privileged=true -v /data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
 
 docker run -d --name redis-node-4 --net host --privileged=true -v /data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
 
 docker run -d --name redis-node-5 --net host --privileged=true -v /data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
 
 docker run -d --name redis-node-6 --net host --privileged=true -v /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

參數解釋如下:

docker run 創建並運行docker容器實例

--name redis-node-6 容器名字

--net host 使用宿主機的IP和埠,默認

--privileged=true 獲取宿主機root用戶權限

-v /data/redis/share/redis-node-6:/data 容器卷,宿主機地址:docker內部地址

redis:6.0.8 redis鏡像和版本號

--cluster-enabled yes 開啟redis集群

--appendonly yes 開啟持久化

--port 6386 redis埠號

運行成功的效果如下:

1.4 進入容器redis-node-1並為6臺機器構建集群關係

進入容器

 docker exec -it redis-node-1 /bin/bash

構建主從關係

 redis-cli --cluster create 192.168.159.33:6381 192.168.159.33:6382 192.168.159.33:6383 192.168.159.33:6384 192.168.159.33:6385 192.168.159.33:6386 --cluster-replicas 1

--cluster-replicas 1 表示為每個master創建一個slave節點

由上圖可知,哈希槽被分為三段,0-5460,5461-10922,10923-16383

並且可以看到集群節點的主從關係,

192.168.159.33:6385--->192.168.159.33:6381

192.168.159.33:6386--->192.168.159.33:6382

192.168.159.33:6384--->192.168.159.33:6383

這裡三主三從已經搭建完畢了。

注意:上面的集群關係是隨機分配的,所以沒有明確指定的情況下,映射關係可能有出入。

1.5 查看集群狀態

連接進入6381作為切入點,查看集群狀態

 redis-cli -p 6381
 cluster info

 cluster nodes

可以很清楚的看到集群的主從關係

192.168.159.33:6385--->192.168.159.33:6381

192.168.159.33:6386--->192.168.159.33:6382

192.168.159.33:6384--->192.168.159.33:6383

2、主從容錯切換遷移案例2.1 數據讀寫存儲


啟動6個節點構成的集群並通過exec進入

 docker exec -it redis-node-1 /bin/bash
 redis-cli -p 6381

對6381埠的節點添加幾個key測試

可以看到,我們每存儲一個key,都會先計算哈希槽的落點,有的落點超過了分配的哈希槽區域,就會存儲失敗,其實我們現在要連接的是整個集群,而不是單個節點,上面的連接命令是錯誤的。

正確的連接集群的命令是:

 redis-cli -p 6381 -c

新增幾個key測試

可以很明顯地看到,每次存儲一個值,都要根據計算出的哈希槽落點去存儲,落到哪個節點就會重定向到落點所在的集群節點。

查看集群信息

 redis-cli --cluster check 192.168.159.33:6381

這裡也可以看清除各個節點數據存儲情況以及主從映射關係。

2.2 容錯切換遷移

我們現在將6381節點掛掉,規劃圖如下:

先停止6381節點,

 docker stop redis-node-1

這個時候進入6382這個節點查看下集群信息

 docker exec -it redis-node-2 /bin/bash
 redis-cli -p 6382 -c

  cluster nodes

可以看到,6381節點已經宕機了,此時它原來的從節點6385上位,成為了master節點。

此時如果將6381節點恢復,那麼集群的狀態會不會發生變化呢?

 docker start redis-node-1

查看集群狀態

可以看到,就算此時6381恢復了,它也只能是從節點,6385依舊是主節點。

怎樣恢復原來的集群狀態,即讓6385重新成為6381的從節點呢?

查看6381是否已經成為主節點

由上圖可看出,6385此時已經掛掉,6381重新上位成為master節點。

可以看到,6381已經成為了master,6385是6381的slave節點,至此,集群已經恢復成了初始的3主3從的架構,即

查看集群狀態

 redis-cli --cluster check 192.168.159.33:6381

3、主從擴容案例(3主3從到4主4從)3.1 擴容規劃

將3主3從的集群擴容為4主4從的集群。

3.2 新建6387、6388兩個節點
 docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387

 docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

 docker ps

此時有8個節點。

3.3 進入容器實例內部
 docker exec -it redis-node-7 /bin/bash

3.4 將新增的6387節點(空槽號)作為master節點加入原集群
 redis-cli --cluster add-node 192.168.159.33:6387 192.168.159.33:6381

參數說明:

redis-cli --cluster add-node 自己實際IP位址:6387 自己實際IP位址:6381

6387 就是將要作為master新增節點

6381 就是原來集群節點裡面的領路人,相當於6387拜拜6381的碼頭從而找到組織加入集群

3.5 檢查集群情況第1次
 redis-cli --cluster check 192.168.159.33:6381

可以看到,此時雖然6387節點已經加入了集群,但並沒有分配哈希槽號。

3.6 重新分槽號
 redis-cli --cluster reshard 192.168.159.33:6381

參數說明:

命令:redis-cli --cluster reshard IP位址:埠號

我們為了平均分配哈希槽,所以為6387節點分配16384/master臺數=16384/4=4096

receiving node ID:就是6387這臺節點的容器ID

3.7 檢查集群情況第2次
 命令:redis-cli --cluster reshard IP位址:埠號

 redis-cli --cluster check 192.168.159.33:6381

可以看到,槽號已經重新分配

6381:[1365-5460]

6382:[6827-10922]

6383:[12288-16383]

6387:[0-1364],[5461-6826],[10923-12287]

為什麼6387是3個新的區間,以前的還是連續? 重新分配成本太高,所以前3家各自勻出來一部分,從6381/6382/6383三個舊節點分別勻出1364個坑位給新節點6387

3.8 為主節點6387分配從節點6388
 redis-cli --cluster add-node 192.168.159.33:6388 192.168.159.33:6387 --cluster-slave --cluster-master-id fe96386f9f5401836d67af25bf8549d2c9e20840

命令:redis-cli --cluster add-node ip:新slave埠 ip:新master埠 --cluster-slave --cluster-master-id 新主機節點ID

最後的新主機節點ID就是6387的容器ID

3.9 檢查集群情況第3次
 redis-cli --cluster check 192.168.159.33:6382

這裡從任意一臺節點執行都可以,不是非要6382埠的機器

可以看出,6388已經加入了集群,並且成為了6387節點的從節點,至此,3主3從的redis集群成功擴容為4主4從。

4、主從縮容案例4.1 目的

目的:讓6387和6388兩臺節點下線。

4.2 檢查集群情況1,獲得6388節點的ID
 redis-cli --cluster check 192.168.159.33:6382

暫時還是4主4從的集群

4.3 將6388刪除:從集群中將4號從節點6388刪除
 redis-cli --cluster del-node 192.168.159.33:6388 08620d4a6390ea8ff8ecdc135c556dde5abc15a1

命令:redis-cli --cluster del-node ip:從機埠 從機6388節點ID

檢查下發現,只剩下7臺機器了

 redis-cli --cluster check 192.168.159.33:6382

此時集群中只剩下7臺機器了。

4.4 將6387的槽號清空,重新分配

將6387的槽號清空,重新分配,本例將清出來的槽號都給6381

 redis-cli --cluster reshard 192.168.159.33:6381

4.5 檢查集群情況第二次
 redis-cli --cluster check 192.168.159.33:6381

可以看到,此時雖然6387的哈希槽已經被6381接手,但是6387節點還在集群當中沒有刪除。

4.6 將6387節點從集群中刪除

命令:redis-cli --cluster del-node ip:埠 6387節點ID

 redis-cli --cluster del-node 192.168.159.33:6387 fe96386f9f5401836d67af25bf8549d2c9e20840

4.7 檢查集群情況第三次
 redis-cli --cluster check 192.168.159.33:6381

可以看到,此時集群中只剩下3臺節點了,成功從3主3從縮容到4主4從

相關焦點

  • Docker 搭建 Redis Cluster 集群環境
    /redis-cluster# 切換至指定目錄cd /usr/local/docker-redis/redis-cluster/# 編寫 redis-cluster.tmpl 文件vi redis-cluster.tmpl編寫配置文件
  • 認識Redis集群——Redis Cluster
    Redis Cluster與其它集群模式的區別相比較sentinel模式,多個master節點保證主要業務(比如master節點主要負責寫)穩定性,不需要搭建多個sentinel實例監控一個master節點;相比較一主多從的模式,不需要手動切換,具有自我故障檢測,故障轉移的特點;相比較其他兩個模式而言
  • Redis的集群搭建,原來這麼簡單
    回歸正題,上篇主要說了下Redis的主從複製是如何做的,高可用集群有幾種方式部署(傳送門《原來你是這樣的高可用呀》)。其中針對Redis高可用cluster集群說明時,有一些遺漏的東西,會在本篇前半部分進行說明,後面的內容主要是說怎麼來搭建cluster集群。
  • redis 槽是什麼專題及常見問題 - CSDN
    當節點擴容或者縮容時,對數據槽進行重新分配遷移即可,數據不會丟失。ask重定向在對集群進行擴容和縮容時,需要對槽及槽中數據進行遷移當客戶端向某個節點發送命令,節點向客戶端返回moved異常,告訴客戶端數據對應的槽的節點信息如果此時正在進行集群擴展或者縮空操作,當客戶端向正確的節點發送命令時,槽及槽中數據已經被遷移到別的節點了,就會返回ask,這就是ask重定向機制步驟:
  • 面試官:Redis有哪幾種集群方案?原理和優缺點是什麼?
    在開發測試環境中,我們一般搭建Redis的單實例來應對開發測試需求,但是在生產環境,如果對可用性、可靠性要求較高,則需要引入Redis的集群方案
  • Redis5.0:簡單的集群模式——主從模式詳解
    屁話少說,上配置代碼,主伺服器不需要配置,只需簡單一句代碼配置從伺服器即可,聲明主伺服器是誰,餘下的redis會自行交流。slaveof 192.168.3.143 6379一主多從主伺服器:192.168.3.143從伺服器:192.168.3.144從伺服器:192.168.3.145從伺服器 redis.conf 配置文件加入slaveof 192.168.3.143 6379一主多從(鏈式結構),所謂鏈式結構就是可以從伺服器同步從伺服器
  • 走進 Redis:Redis 的安裝、使用以及集群的搭建
    四、Redis集群的搭建1.Redis集群特點Redis集群搭建的方式有多種,例如使用zookeeper等,但從redis3.0之後版本支持redis-cluster集群,Redis-Cluster採用無中心結構,每個節點保存數據和整個集群狀態
  • Redis Sentinel-深入淺出原理和實戰
    搭建Redis主從伺服器redis目錄下的docker-compose.yml內容如下。-12572ab587558        redis               "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:6382->6379/tcp   redis-slave-2f70a9d9809bc        redis               "docker-entrypoint.s
  • Docker集群管理之Docker Compose
    web服務的鏡像需要在當前目錄實時構建,其容器運行時需要在宿主機開放埠5000並映射到容器埠5000,並且掛載存儲卷/code以及關聯服務redis。redis服務通過鏡像redis啟動。我們可以看到redis服務先於web服務創建,這是因為docker-compose解析到服務間的依賴關係,web服務依賴於redis服務,所以進行了排序。我們來看一下docker compose up的工作流程。1.
  • 騰訊開源分布式存儲系統 Tendis,可完全兼容 Redis
    完全兼容 redis 協議,支持 redis 主要數據結構和接口,兼容大部分原生Redis命令。 持久化存儲。使用 rocksdb 作為存儲引擎,所有數據以特定格式存儲在 rocksdb 中,最大支持 PB 級存儲。 去中心化架構。
  • Redis系列 - 主從庫模式、哨兵和分片集群
    如果檢測的是從庫,那麼,哨兵簡單地把它標記為「主觀下線」就行了,因為從庫的下線影響一般不太大,集群的對外服務不會間斷。如果檢測的是主庫,那麼,哨兵還不能簡單地把它標記為「主觀下線」,開啟主從切換。因為很有可能存在這麼一個情況:那就是哨兵誤判了,其實主庫並沒有故障。可是,一旦啟動了主從切換,後續的選主和通知操作都會帶來額外的計算和通信開銷。
  • Redis 設計與實現 4:字典
    假設 k1 和 k2 算出的索引值都是 3,當 k2 發現 table[3] 已經有 dictEntry{k1,v1},那就 dictEntry{k1,v1}.next = dictEntry{k2,v2}。rehash隨著操作的不斷進行,哈希表的長度會不斷增減。
  • 雲計算核心技術Docker教程: Docker 安裝 Redis
    本文介紹通過docker安裝redis。1.我們用 docker search redis 命令來查看可用版本:2.取最新版的 Redis 鏡像,這裡我們拉取官方的最新版本的鏡像:$ docker pull redis:latest
  • 搭建一個高可用的鏡像倉庫,這是我見過最詳細、最簡單的教程
    篇幅較長,兄弟們不妨耐心看完~Harbor 部署架構圖harbor 使用 helm 部署在 k8s 集群中,通過 ingress-nginx 代理。pgsql 採用 Pgpool-II 代理,做主從切換、通過同步流式複製進行數據複製,客戶端請求通過 Pgpool-II 路由。
  • 運維 - 實踐篇(二)- 基礎 Docker 開發環境搭建
    運維 - 實踐篇(二)- 基礎 Docker 開發環境搭建一、Linux 搭建基礎 Docker 環境1.
  • 一不小心肝出了4W字的Redis面試教程
    主從模式不具備自動容錯和恢復的功能,一旦主資料庫,從節點晉升未主資料庫的過程需要人為操作,維護的成本就會升高,並且主節點的寫能力、存儲能力都會受到限制。.conf mkdir /root/redis-4.0.6/sentinel.conf  /root/redis/sentinel/sentinel2.conf mkdir /root/redis-4.0.6/sentinel.conf  /root/redis/sentinel/sentinel3.conf 分別在這三個文件中添加如下配置
  • cluster redis 分槽專題及常見問題 - CSDN
    如上圖所示,該集群中包含 6 個 Redis 節點,3主3從,分別為M1,M2,M3,S1,S2,S3。Redis 集群提供了靈活的節點擴容和收縮方案。在不影響集群對外服務的情況下,可以為集群添加節點進行擴容也可以下線部分節點進行縮容。
  • acl 框架中的 Redis 庫已經支持集群版 Redis 3.0
    據 redis 官方網站顯示,支持集群版的 redis3.0 快要發布了(現在已經到了redis3.0 rc4 版本),這樣使用者就不需要自己花很大力氣來針對
  • Redis 高可用篇:你管這叫 Sentinel 哨兵集群原理
    Redis哨兵集群65 哥你聽過「武當派」創始人張三瘋麼?Redis 主從架構就好比一個武當,掌門人就是 Master。結合 Redis 的 官方文檔:https://redis.io/topics/sentinel,可以知道 Redis 哨兵具備的能力有如下幾個:監控:持續監控 master 、slave 是否處於預期工作狀態。自動切換主庫:當 Master 運行故障,哨兵啟動自動故障恢復流程:從 slave 中選擇一臺作為新 master。