停掉現有的redis集群
因為這篇文章我是在 搭建完redis主從集群之后寫的,如果要是沒有搭建過這些,可以直接略過。要是從我上一篇 搭建redis主從集群過來的,可以執行下。
docker compose down
查找下redis相關進程
ps -ef | grep redis
可以看到前面的 7001 7002 7003 這三個端口已經沒有了
上傳sentinel.conf 文件
sentinel announce-ip "192.168.200.128"
sentinel monitor sdemaster 192.168.200.128 7001 2
sentinel down-after-milliseconds sdemaster 5000
sentinel failover-timeout sdemaster 60000
這里面就是sentinel.conf 文件的內容。
端口號要改成自己的
說明
sentinel announce-ip "192.168.200.128" :聲明當前sentinel的IP
sentinel monitor hmaster sdemaster 192.168.200.128 7001 2 :指定集群的主節點信息。
????????sdemaster:主節點名稱,自定義,任意寫的。
????????192.168.200.128 7001 :主節點的ip和端口
????????2 :認定 master 下線時的 quorm 值
sentinel down-after-milliseconds sdemaster :聲明master節點超時多久后被標記下線
sentinel failover-timeout sdemaster : 故障轉移的超時時間
在虛擬機的 /home/sde/modules/redis 目錄下創建 3個文件夾, s1 s2 s3
目錄具體位置,要根據自己情況而定。
mkdir s1 s2 s3
把sentinel.conf 文件分別拷貝到 上述的3個文件夾中。
for dir in s1 s2 s3; docp /home/sde/modules/redis/sentinel.conf /home/sde/modules/redis/$dir/
done
具體的目錄要改成你自己的
查看s1
查看s2
查看s3
修改 docker-compose.yml 文件
version: "3.2"services:r1:image: rediscontainer_name: r1network_mode: "host"entrypoint: ["redis-server", "--port", "7001"]r2:image: rediscontainer_name: r2network_mode: "host"entrypoint: ["redis-server", "--port", "7002","--slaveof","192.168.200.128","7001"]r3:image: rediscontainer_name: r3network_mode: "host"entrypoint: ["redis-server", "--port", "7003","--slaveof","192.168.200.128","7001"]s1:image: rediscontainer_name: s1volumes:- /home/sde/modules/redis/s1:/etc/redisnetwork_mode: "host"entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27001"]s2:image: rediscontainer_name: s2volumes:- /home/sde/modules/redis/s2:/etc/redisnetwork_mode: "host"entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27002"]s3:image: rediscontainer_name: s3volumes:- /home/sde/modules/redis/s3:/etc/redisnetwork_mode: "host"entrypoint: ["redis-sentinel", "/etc/redis/sentinel.conf", "--port", "27003"]
/home/sde/modules/redis 是我自己創建的目錄,這個文件要根據你們自己的目錄更改。
解讀:
image:redis 執行使用的redis鏡像
container_name:s1 指定容器的名稱為s1
volumes 講宿主機上的 /home/sde/modules/redis/s1 目錄掛載到容器內的 /etc/redis 目錄。
????????作用:講sentinel的配置文件 sentinel.conf 存儲在宿主機上,方便持久化和修改。
????????注意:確保宿主機上的 s1 目錄已經存在 sentinel.conf 文件
network_mode:"host" 使用宿主機的網絡模式,而不是docker默認橋接模式,這樣容器可以直接使用宿主機的網絡線,避免端口映射問題。
entrypoint 覆蓋默認的容器啟動命令,指定啟動 Redis Sentinel 的方式
????????redis-sentinel:Redis Sentinel 的啟動方式。
????????/home/sde/modules/redis/sentinel.conf 指定Sentinel的配置文件路徑(掛載的宿主機路徑)。
????????--port 27001 指定sentinel監聽的端口號為 27001
s2 s3 服務的配置依次類推。
啟動集群
docker compose up -d
以s1為例,查看運行日志。
docker logs -f s1
s1
s2
s3
可以看到sentinel已經聯系到了7001這個節點,并且與其它幾個哨兵也建立了鏈接。哨兵信息如下:
27001
:Sentinel ID
是b59bad2b0876679bf6155f9aaec3a0ad1f386b5b
27002
:Sentinel ID
是bdc690efab03792689dc7ba1cb2fe92f973dc3d9
27003
:Sentinel ID
是bb02acb3ffaa1ee4e542d79c8dbc1bc111d057c8
演示failover
接下來,我們演示一下當主節點故障時,哨兵是如何完成集群故障恢復(failover)的。
我們停止7001
這個master
節點,然后再啟動模擬宕機重啟:
docker stop r1
稍微等待一段時間后,會發現sentinel節點觸發了failover:可以使用 docker logs -f s1 等查看各個容器的日志:
啟動 r1
docker start r1
看看 s1 日志
看看 r2 信息
docker exec -it r2 redis-cli -p 7002
可以看到 r2 成為了新的主節點