使用 Docker 基于哨兵模式搭建高可用 Redis

最近在學習Redis中間件,了解Redis為什么如此高性能高可用。強烈推薦一本書《Redis設計與實現(xiàn)》,這對于我學習Redis帶來很對幫助和啟迪!

Redis為什么如此高可用呢?這一篇文章就來介紹基于Docker容器搭建Redis集群,并使用哨兵(Sentinel)機制保證Redis集群的高可用。

哨兵(Sentinel)機制

哨兵機制就是開啟一個或多個進程作為哨兵(Sentinel),監(jiān)控著所有的主從服務器,定時的ping服務器。當主服務器宕機或者網(wǎng)絡中斷,Sentinel實例無法ping成功,Sentinel實例會選舉一個從服務器作為主服務器;如果宕機后的服務器重新上線或者原先的主服務器網(wǎng)絡恢復,會作為新的主服務器的從服務器。很繞口是吧?看下面的圖就清楚了。

Sentinel

使用Sentinel的好處有以下幾點:

監(jiān)控(Monitoring): Sentinel 會不斷地檢查你的主服務器和從服務器是否運作正常。
提醒(Notification): 當被監(jiān)控的某個 Redis 服務器出現(xiàn)問題時, Sentinel 可以通過 API 向管理員或者其他應用程序發(fā)送通知。
自動故障遷移(Automatic failover):當一個主服務器不能正常工作時,Sentinel 會開始一次自動故障遷移操作,它會將失效主服務器的其中一個從服務器升級為新的主服務器,并讓失效主服務器的其他從服務器改為復制新的主服務器;當客戶端試圖連接失效的主服務器時,集群也會向客戶端返回新主服務器的地址, 使得集群可以使用新主服務器代替失效服務器。

使用Docker搭建Redis集群

1.首先使用docker下載最新版本的Redis

docker pull redis

2.啟動一主二從(一個master,兩個slave),為了啟動方便,都省略了密碼

docker run -p 8080:8080 --name master -d -v /root/redis/master/data:/data -v /root/redis/master/conf/redis.conf:/etc/redis/redis.conf redis --port 8080 --appendonly yes
docker run -p 8081:8081 --name slave1 -d -v /root/redis/slave1/data:/data -v /root/redis/slave1/conf/redis.conf:/etc/redis/redis.conf redis --port 8081 --appendonly yes --slave-read-only yes --slaveof 主服務器ip 8080
docker run -p 8082:8082 --name slave2 -d -v /root/redis/slave2/data:/data -v /root/redis/slave2/conf/redis.conf:/etc/redis/redis.conf redis --port 8082 --appendonly yes --slave-read-only yes --slaveof 主服務器ip 8080

啟動主從服務

簡單解釋docker命令吧。

-p:Redis 服務端口映射到外網(wǎng)可訪問的端口(譬如 slave1 服務設置的端口是8081,所以設置對外服務的端口命令為 對外的端口:8081)
-d:后臺運行
-v:掛載宿主機的目錄
--port:Redis 的啟動命令,設置 Redis 服務的端口
--appendonly yes:開啟 Redis 持久化方式為 AOF

我在學習Sentinel集群時候的一個誤區(qū),我看到很多博客,文章提到啟動Redis設置的對外端口命令為 對外端口:6379,這是在沒有使用Redis的--port命令的情況下,默認使用Redis服務的6379端口。一旦手動設置 Redis 服務端口,在 Docker 容器設置端口映射的時候要注意設置為你改后的端口!

3.下載redis.conf文件,用來配置Sentinel服務

mkdir /redis
cd /redis
wget https://raw.githubusercontent.com/antirez/redis/5.0/redis.conf -O redis.conf

4.配置redis.conf文件:執(zhí)行vim redis.conf后在最下面添加以下配置

sentinel monitor 主機別名 主機ip 主機端口 2
sentinel down-after-milliseconds 主機別名 30000
sentinel parallel-syncs 主機別名 1
sentinel failover-timeout 主機別名 180000

sentinel monitor:指當前監(jiān)控主節(jié)點,最后的“2”代表當主服務器宕機后至少需要兩個sentinel服務投票同意
sentinel down-after-milliseconds:如果當前主服務器超過設定的時間沒有回復,則判斷主服務器不可用
sentinel parallel-syncs:限制從服務器向新的主服務器發(fā)起復制的個數(shù)。若發(fā)起復制的從服務器過多,那么可能會造成主服務器阻塞。若發(fā)起復制的從服務器過少,可能會造成數(shù)據(jù)在復制期間不一致的情況。
sentinel failover-timeout:故障轉(zhuǎn)移的時間

除了上面的配置之外,redis.conf還有幾項配置需要更改!

ps.一定要知道為什么要更改這些配置,否則參照別人的配置胡亂更改,啟動后有可能出現(xiàn)各種情況!

4.1.注釋bind配置
打開redis.conf文件,查找到一項配置為 bind 127.0.0.1 ,這個配置說明只可以在本機訪問Redis服務;注釋后可以接收任意ip的連接,這樣的話,可以接收到監(jiān)控的節(jié)點回復。

#bind 127.0.0.1

4.2.修改protected-mode配置
默認的protected-mode為yes,將yes設置為no,此時外部網(wǎng)絡可以直接訪問

protected-mode no

4.3.修改daemonize配置
默認daemonize為no,將daemonize注釋可以讓Redis服務后臺運行。

#daemonize no

5.使用 -v 命令將Sentinel容器配置文件掛載到自定義的redis.conf文件,啟動Sentinel服務后就可以監(jiān)控Redis的服務啦?。ㄗ⒁鈘edis.conf的權限,權限不夠的話會報Permission denied)

docker run --name sentinel -p 9001:6379 -v /redis/redis.conf:/etc/redis/redis.conf -v /root/redis/sentinel/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes --sentinel

查看sentinel容器日志,通過日志可以知道sentinel啟動后監(jiān)控了主從服務器。

運行sentinel容器

再次打開掛載的redis.conf文件,可以發(fā)現(xiàn)配置文件的底部記錄了主從服務器的信息,也就是說成功的監(jiān)控各個服務器!


啟動Sentinel后配置文件

進入sentinel容器執(zhí)行sentinel masters可以看到監(jiān)控的主服務器信息;執(zhí)行sentinel slaves
master 可以看到從服務器的信息。

docker exec -it sentinel redis-cli
sentinel masters
sentinel slaves master

進入sentinel容器

模擬主服務器故障,從服務器成為主服務器的操作。

docker stop master

關閉master容器,模擬主服務器宕機,再次進入sentinel容器執(zhí)行sentinel masters查看主服務器的信息,經(jīng)過設定的故障轉(zhuǎn)移時間,你會發(fā)現(xiàn)slave1或者slave2成為了主服務器。

選舉新主服務器

再次啟動master容器,進入sentinel容器執(zhí)行sentinel masters查看主服務器的信息可以發(fā)現(xiàn)主服務器的信息不變,執(zhí)行sentinel slaves master 可以發(fā)現(xiàn)重新上線的服務器成為了從服務器。

重啟原先主服務器成為從服務器

好了,以上就是使用 Docker 搭建 Redis 哨兵模式。

參考資料
https://www.cnblogs.com/kevingrace/p/9004460.html

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容