我們知道,Redis的叢集方案大緻有三種:1)redis cluster叢集方案;2)master/slave主從方案;3)哨兵模式來進行主從替換以及故障恢複。
sentinel系統可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;當某個master服務下線時,自動将該master下的某個從服務更新為master服務替代已下線的master服務繼續處理請求。
同樣,我們使用docker進行搭建
建立一個mkdir redis-sentinel檔案夾
進入項目檔案夾 cd redis-sentinel,再建立一個sentinel專門來存放哨兵腳本,然後cd sentinel
建立sentinel.conf配置檔案:
sentinel monitor mymaster redis-master 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 5000
該配置的意思是,監控主伺服器的6379端口并且起兩個執行個體,如果哨兵5s内沒有收到主節點的心跳,哨兵就認為主節點當機了,預設是30秒,如果5秒以上連接配接不上主庫同步,則在5秒後進行選舉,對其他的從伺服器進行角色轉換
随後,建立sentinel-entrypoint.sh腳本檔案:
#!/bin/sh
sed -i "s/$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /etc/redis/sentinel.conf
sed -i "s/$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /etc/redis/sentinel.conf
sed -i "s/$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /etc/redis/sentinel.conf
exec docker-entrypoint.sh redis-server /etc/redis/sentinel.conf --sentinel
該腳本檔案會對配置檔案進行同步,用來啟動哨兵
然後我們來建立Dockerfile指定基礎鏡像,同時拷貝配置檔案到鏡像内部:
FROM redis
EXPOSE 26379
ADD sentinel.conf /etc/redis/sentinel.conf
RUN chown redis:redis /etc/redis/sentinel.conf
COPY sentinel-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/sentinel-entrypoint.sh
ENTRYPOINT ["sentinel-entrypoint.sh"]
最後退到項目根目錄 cd ..
建立docker-compose.yml配置檔案:
version: '2'
networks:
app-tier:
driver: bridge
services:
redis:
image: 'bitnami/redis:latest'
environment:
- REDIS_REPLICATION_MODE=master
- REDIS_PASSWORD=""
networks:
- app-tier
ports:
- '6379:6379'
redis-slave:
image: 'bitnami/redis:latest'
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis
- REDIS_MASTER_PASSWORD=""
- REDIS_PASSWORD=""
ports:
- '6380:6379'
depends_on:
- redis
networks:
- app-tier
redis-slave2:
image: 'bitnami/redis:latest'
environment:
- REDIS_REPLICATION_MODE=slave
- REDIS_MASTER_HOST=redis
- REDIS_MASTER_PASSWORD=""
- REDIS_PASSWORD=""
ports:
- '6381:6379'
depends_on:
- redis
networks:
- app-tier
redis-sentinel:
image: 'bitnami/redis-sentinel:latest'
environment:
- REDIS_MASTER_PASSWORD=""
depends_on:
- redis
- redis-slave
- redis-slave2
ports:
- '26379-26381:26379'
networks:
- app-tier
意思是,我們起三台redis服務,使用橋接的方式分别跑在6379,6380,6381端口号上 ,一主兩從,并且會有哨兵執行個體來監控它們,最後項目結構是這樣的
在項目根目錄下,啟動服務:
docker-compose up --scale redis-sentinel=3
如果希望在背景運作可以加-d參數
此時我們可以測一下同步是否成功,分别開三個視窗登入到redis,redis-cli -p 6379,redis-cli -p 6380,redis-cli -p 6381
在主庫6379中set 123 123,然後分别在從庫get 123
沒有問題,現在我們來測一下哨兵模式是否好用,如果主庫由于某種原因當機了,從庫是否能自動切換角色
我們可以手動停止主庫的容器程序,來模拟當機的情況
docker stop redissentinel_master_1
此時主庫已經連接配接不上了,此時如果連結逾時超過5秒,我們再次進入從庫,使用info指令來檢視從庫的角色
發現之前6380本來是從庫(slave)角色,現在已經變成主庫了(master)了
其實這就是所謂的高負載高可用架構,在使用叢集承擔高負載的同時,也能進行高可用的容災機制。
相關視訊攻略: