天天看點

基于Docker-compose搭建Redis高可用哨兵模式(Redis-Sentinel)

作者:劉悅技術分享

我們知道,Redis的叢集方案大緻有三種:1)redis cluster叢集方案;2)master/slave主從方案;3)哨兵模式來進行主從替換以及故障恢複。

sentinel系統可以監視一個或者多個redis master服務,以及這些master服務的所有從服務;當某個master服務下線時,自動将該master下的某個從服務更新為master服務替代已下線的master服務繼續處理請求。

基于Docker-compose搭建Redis高可用哨兵模式(Redis-Sentinel)

同樣,我們使用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搭建Redis高可用哨兵模式(Redis-Sentinel)

在項目根目錄下,啟動服務:

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-compose搭建Redis高可用哨兵模式(Redis-Sentinel)

沒有問題,現在我們來測一下哨兵模式是否好用,如果主庫由于某種原因當機了,從庫是否能自動切換角色

我們可以手動停止主庫的容器程序,來模拟當機的情況

docker stop redissentinel_master_1           
基于Docker-compose搭建Redis高可用哨兵模式(Redis-Sentinel)

此時主庫已經連接配接不上了,此時如果連結逾時超過5秒,我們再次進入從庫,使用info指令來檢視從庫的角色

基于Docker-compose搭建Redis高可用哨兵模式(Redis-Sentinel)

發現之前6380本來是從庫(slave)角色,現在已經變成主庫了(master)了

其實這就是所謂的高負載高可用架構,在使用叢集承擔高負載的同時,也能進行高可用的容災機制。

相關視訊攻略:

繼續閱讀