天天看點

redis搭建主、從、哨兵叢集(docker建構)

redis主從:

主從複制,從隻讀模式。

哨兵sentinel:

  • 監控(Monitoring): Sentinel會不斷地檢查你的主伺服器和從伺服器是否運作正常。
  • 提醒(Notification): 當被監控的某個 Redis 伺服器出現問題時, Sentinel 可以通過 API 向管理者或者其他應用程式發送通知。
  • 自動故障遷移(Automatic failover): 當一個主伺服器不能正常工作時, Sentinel 會開始一次自動故障遷移操作,它會将失效主伺服器的其中一個從伺服器更新為新的主伺服器, 并讓失效主伺服器的其他從伺服器改為複制新的主伺服器;

    當用戶端試圖連接配接失效的主伺服器時, 叢集也會向用戶端傳回新主伺服器的位址, 使得叢集可以使用新主伺服器代替失效伺服器。

主從切換過程:

(1) slave leader更新為master

(2) 其他slave修改為新master的slave

(3) 用戶端修改連接配接

(4) 老的master如果重新開機成功,變為新master的slave

搭建過程

安裝docker-ce(略)

拉取鏡像:

docker pull redis

主配置檔案:

bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6379
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass "12345678"
masterauth "12345678"
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly no
appendfsync always

           

啟動一個master:

  • 這裡雖然在前面dir中設定了工作目錄dir,但是在redis啟動指令加載配置檔案的時候,還是加載不到,是以,我給配置檔案加了容器内的路徑,才得以找到配置檔案。
docker run --name redis_master \
-p 6379:6379  \
-v /qj/redis/master/:/data/ \
-v /etc/localtime:/ete/localtime \
-v /etc/timezone:/etc/timezone \
--restart=always -d redis:latest \
redis-server /data/redis_master.conf --appendonly yes
           

從配置檔案:

bind 0.0.0.0
daemonize no
pidfile "/var/run/redis.pid"
port 6380
timeout 300
loglevel warning
logfile "redis.log"
databases 16
rdbcompression yes
dbfilename "redis.rdb"
dir "/data"
requirepass "12345678"
masterauth "12345678"
maxclients 10000
maxmemory 1000mb
maxmemory-policy allkeys-lru
appendonly no
appendfsync always            
slaveof  172.17.0.1 6379#master的容器位址和端口
           

啟動一個slave:

  • 因為是同一個主控端,是以端口我改成了6380,企業生産環境或者虛拟機中不必這樣。
docker run --name redis_slave \
-p 6380:6380 \
-v /qj/redis/slave/:/data/ \
-v /etc/localtime:/ete/localtime \
-v /etc/timezone:/etc/timezone \
--restart=always -d redis:latest \
redis-server /data/redis_slave.conf --appendonly yes
           

主從搭建完成。

sentinel配置檔案

daemonize no
protected-mode no
port 26379
dir "/tmp"
sentinel monitor mymaster 172.17.0.1 6379 1
sentinel down-after-milliseconds mymaster 10000
sentinel auth-pass mymaster 12345678
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
           

啟動sentinel:

docker run --name sentinel --network host \
-p 26379:26379 \
-v /qj/redis/sentinel/sentinel.conf:/data/sentinel.conf \
-v /etc/localtime:/ete/localtime \
-v /etc/timezone:/etc/timezone \
--restart=always -d redis:latest redis-sentinel sentinel.conf
           

哨兵搭建完成。

測試:

進入主redis寫入資料

[email protected]:~$ docker exec -it redis_master bash
 redis-cli \\進入redis終端
172.17.0.1:6379> AUTH 12345678 \\登入
OK
172.17.0.1:6379> info replication \\檢視role角色是否為master

172.17.0.1:6379> set aaa 123 \\設定鍵值對
OK
172.17.0.1:6379>  keys * \\檢視所有資料
1) "aaa"
OK
172.17.0.1:6379>exit

           

進入從redis檢視資料

[email protected]:~$ docker exec -it redis_slave bash
 redis-cli -p 6380 \\進入redis終端
172.17.0.1:6380> AUTH 12345678 \\登入
OK
172.17.0.1:6380> info replication \\檢視role角色是否為slave

172.17.0.1:6380>  keys * \\檢視所有資料
1) "aaa"
172.17.0.1:6380>exit
           

主從複制成功。

先動态加載sentinel日志:

docker logs -f sentinel

停掉master的容器:

docker stop redis_master

觀看日志變化。

再次進入從redis,用

info replication

檢視狀态,這裡省略,參考上面。

master再次啟動,進入master容器,

info replication

檢視狀态為slave。

這個簡單的實驗,可以了解redis主、從、哨兵的工作機制。

更多詳細資料參考:

https://www.cnblogs.com/kevingrace/p/9004460.html

繼續閱讀