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