基於Docker搭建Redis一主兩從三哨兵

參考連接:

https://cloud.tencent.com/developer/article/1474195redis

https://juejin.im/post/5d26b03de51d454fa33b1960docker

環境:

一、CentOS Linux release 7.6.1810 (Core)bash

二、三臺主機:192.168.3.10三、192.168.3.80、192.168.3.81服務器

三、安裝好的docker:Docker version 19.03.4, build 9013bf583a網絡

四、redis爲最新版本(latest)框架

框架與思路:

 

啓動搭建容器主從

從docker官方公共倉庫拉取redis鏡像,而後修改redis服務的配置文件,最後啓動容器,啓動redis服務器。在多臺機器上運行redis服務器,並創建主從關係。工具

redis的主從是實現redis集羣和redis哨兵高可用的基礎,redis的主從結構使從能夠複製主上的數據,若是從與主之間網絡斷開,從會自動重連到主上。post

  

獲取最新redis鏡像

#docker pull redis測試

查看鏡像:ui

#docker image ls

  

注:三臺機器都作上述操做

獲取並修改redis配置文件

redis官方提供了一個配置文件樣例,經過wget工具下載下來。我用的root用戶,就直接下載到/root目錄裏了

注:無wget命令,需提早下載

#yum -y install wget

#wget http://download.redis.io/redis-stable/redis.conf

打開下載下來的文件後,能夠看到配置有不少。我只是搭建服務進行試驗因此只修改必要的幾項。若是要運用到線上,那必須將全部配置都按需求進行修改。

其中redis服務器的master和slave角色使用的配置文件還會有些不一樣,下面分別進行說明。

對於master而言,配置文件修改如下幾項

# 註釋這一行,表示Redis能夠接受任意ip的鏈接

# bind 127.0.0.1 

# 關閉保護模式

protected-mode no 

# 讓redis服務後臺運行

daemonize yes 

# 設定密碼(可選,若是這裏開啓了密碼要求,slave的配置裏就要加這個密碼. 只是練習配置,就不使用密碼認證了)

# requirepass masterpassword 

# 配置日誌路徑,爲了便於排查問題,指定redis的日誌文件目錄

logfile "/var/log/redis/redis.log"

對於slave而言,配置文件修改如下幾項:

# 註釋這一行,表示Redis能夠接受任意ip的鏈接

# bind 127.0.0.1

 # 關閉保護模式

protected-mode no

 # 讓redis服務後臺運行

daemonize yes

 # 設定密碼(可選,若是這裏開啓了密碼要求,slave的配置裏就要加這個密碼)

requirepass masterpassword 

# 設定主庫的密碼,用於認證,若是主庫開啓了requirepass選項這裏就必須填相應的密碼

masterauth <master-password> 

# 設定master的IP和端口號,redis配置文件中的默認端口號是6379

# 低版本的redis這裏會是slaveof,意思是同樣的,由於slave是比較敏感的詞彙,因此在redis後面的版本中不在使用slave的概念,取而代之的是replica

# 將192.168.3.103做爲主,其他兩臺機器作從。ip和端口號按照機器和配置作相應修改。

replicaof 192.168.3.103 6379 

# 配置日誌路徑,爲了便於排查問題,指定redis的日誌文件目錄

logfile "/var/log/redis/redis.log"

啓動redis對應的容器

三臺機器上分別將容器別名指定爲

192.168.3.103 ------>redis_master

192.168.3.80 -------->redis_slave1

192.168.3.81 -------->redis_slave2

要注意master的配置文件和slave不一樣。不過首先要啓動主服務器,也就是r redis_master容器。

啓動redis_master

# docker run --name redis_master -v /redis/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis

 

# 經過ps命令查看容器的狀態,能夠看到redis_master已經啓動

  

啓動redis_slave1

#docker run --name redis_slave1 -v /redis/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis

# 經過ps命令查看容器的狀態,能夠看到redis_slave1已經啓動

   

啓動redis_slave2

# docker run --name redis_slave2 -v /redis/redis.conf:/usr/local/etc/redis/redis.conf -d -p 6379:6379 redis

# 經過ps命令查看容器的狀態,能夠看到redis_slave2已經啓動

  

上面已經啓動了容器,接下來進入容器裏啓動redis服務器

# 以交互模式進入容器redis_master

#docker exec -it redis_master

# 建立日誌文件目錄

#mkdir -p /var/log/redis/

#touch /var/log/redis/redis.log

# 啓動redis服務器,若是沒有任何輸出,就說明成功了

#redis-server /usr/local/etc/redis/redis.conf

# 在容器裏啓動一個redis客戶端

#redis-cli

# 執行info命令,查看服務器狀態

127.0.0.1:6379> info

...

# 若是是主,這裏的role的值會是master,若是是從,這裏的role的值會是slave

role:slave

# 對於slave,還要查看master_link_status這個屬性值。slave上這個屬性值爲up就說明主從複製是OK的,否者就有問題。若是從機狀態不爲up,首先排查主機的端口是否被限,而後查看redis日誌排查緣由

master_link_status:up

...

#最後退出容器

#exit

注:

另外兩臺機器操做同上

設置redis主從關係

分別進入redis_slave1/ redis_slave2(二者操做相同)

[root@localhost ~]# docker exec -it redis_slave1 bash

root@aa5bad0f8fea:/data# redis-cli

127.0.0.1:6379> SLAVEOF 192.168.3.103 6379

OK

查看確認:

在redis_master中輸入info查看

docker exec -it redis_master bash

redis-cli

info

 在redis_slave1中輸入info查看

docker exec -it redis_slave1 bash

redis-cli

info

 

redis_slave2中輸入info查看

docker exec -it redis_slave2 bash

redis-cli

info

  

驗證主從複製

主從搭建成功後,能夠經過在master上寫入一個key-value值,查看是否會同步到slave上,來驗證主從同步是否能成功。

# 以交互模式進入容器redis_master中

#docker exec -it redis_master bash

運行一個redis-cli,向test_key寫入一個值

redis-cli

set test_key hello-world

OK

 

在任意slave機器上進入容器,也運行一個redis-cli,查詢這個key的值。若是能查詢到這個值,且與主機上的值相同,說明主從同步成功。經測試,主動同步成功。

  

添加哨兵

主從結構搭建成功了,系統的可用性變高了,可是若是主發生故障,須要人工手動切換從機爲主機。這種切換工做不只浪費人力資源,更大的影響是主從切換期間這段時間redis是沒法對外提供服務的。所以,哨兵系統被開發出來了,哨兵能夠在主發生故障後,自動進行故障轉移,從從機裏選出一臺升級爲主機,並持續監聽着原來的主機,當原來的主機恢復後,會將其做爲新主的從機。

哨兵先監聽主,經過對主發送info命令,獲取到從的信息,而後也會監聽到從。另外哨兵都會像主訂閱__sentinel__:hello頻道,當有新的哨兵加入時,會向這個頻道發送一條信息,這條信息包含了該哨兵的IP和端口等信息,那麼其餘已經訂閱了該頻道的哨兵就會收到這條信息,就知道有一個新的哨兵加入。這些哨兵會與新加入和哨兵創建鏈接,選主是須要經過這個鏈接來進行投票。這個關係能夠用下面這個圖來描述

  

獲取並修改sentinel配置文件

經過wget命令獲取sentinel的配置文件

wget http://download.redis.io/redis-stable/sentinel.conf

修改配置文件如下幾項(三臺機器的sentinel.conf的配置文件相同)

# 讓sentinel服務後臺運行

daemonize yes

 # 修改日誌文件的路徑

logfile "/var/log/redis/sentinel.log"

# 修改監控的主redis服務器

# 最後一個2表示,兩臺機器斷定主被動下線後,就進行failover(故障轉移)

sentinel monitor mymaster 192.168.3.103 6379 2

啓動容器

與啓動redis容器相似,啓動一個別名爲sentinel的容器

sentinel_master

docker run -it --name sentinel_master -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis

sentinel_slave1

docker run -it --name sentinel_slave1 -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis

sentinel_slave2

docker run -it --name sentinel_slave1 -p 26379:26379 -v /root/sentinel.conf:/usr/local/etc/redis/sentinel.conf -d redis

運行哨兵

# 進入容器

#docker exec -it sentinel_master bash

# 建立日誌目錄和文件

# mkdir -p /var/log/redis

#touch /var/log/redis/sentinel.log

#啓動哨兵

redis-sentinel /usr/local/etc/redis/sentinel.conf

注:

在另外兩臺機器上按照一樣的方法在一個容器中運行sentinelsentinel都使用相同的配置文件。

驗證failover(故障轉移)

爲了驗證哨兵機制下的自動主從切換,咱們將主上的redis進程kill掉(或docker stop redis_master)。

稍等幾秒鐘後,就有另一臺從升級爲主機,實驗時是第三臺機器,也就是redis_slave2升級爲了主,用info命令查詢能夠看到redis_slave2服務器的角色變成的master。說明自動主從切換成功。

而後從新啓動以前被kill掉的master服務器,啓動後用info命令查看,能夠發現其變成了redis_slave2的從服務器。

能夠查看/var/log/redis/sentinel.log日誌

總結

redis經過主從複製來實現高可用,可是發生故障時須要人工進行主從切換,效率低下。哨兵機制實現了redis主從的自動切換,提升了redis集羣的可用性,提升了redis集羣的故障轉移效率。

相關文章
相關標籤/搜索