版权声明:本文为CSDN博主「帅骚贯彻一生」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39211866/article/details/88044546

主从

  1. version: '2'
  2. services:
  3. master:
  4. image: redis ## 镜像
  5. container_name: redis-master
  6. command: redis-server --requirepass 123456
  7. ports:
  8. - "6379:6379"
  9. networks:
  10. - sentinel-master
  11. slave1:
  12. image: redis ## 镜像
  13. container_name: redis-slave-1
  14. ports:
  15. - "6380:6379" ## 暴露端口
  16. command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
  17. depends_on:
  18. - master
  19. networks:
  20. - sentinel-master
  21. slave2:
  22. image: redis ## 镜像
  23. container_name: redis-slave-2
  24. ports:
  25. - "6381:6379" ## 暴露端口
  26. command: redis-server --slaveof redis-master 6379 --requirepass 123456 --masterauth 123456
  27. depends_on:
  28. - master
  29. networks:
  30. - sentinel-master
  31. networks:
  32. sentinel-master:

哨兵

第三行表示Redis监控一个叫做mymaster的运行在172.28.0.3:6379的 master,投票达到2则表示master以及挂掉了。
第四行设置主节点的密码
第五行表示在一段时间范围内sentinel向master发送的心跳PING没有回复则认为master不可用了。
第六行的parallel-syncs表示设置在故障转移之后,同时可以重新配置使用新master的slave的数量。数字越低,更多的时间将会用故障转移完成,但是如果slaves配置为服务旧数据,你可能不希望所有的slave同时重新同步master。因为主从复制对于slave是非阻塞的,当停止从master加载批量数据时有一个片刻延迟。通过设置选项为1,确信每次只有一个slave是不可到达的。
第七行表示10秒内mymaster还没活过来,则认为master宕机了。

  1. port 26379
  2. dir /tmp
  3. # 这个地址通过 docker inspect redis-master 来获取.
  4. sentinel monitor mymaster 172.28.0.3 6379 2
  5. sentinel auth-pass mymaster 123456
  6. sentinel down-after-milliseconds mymaster 30000
  7. sentinel parallel-syncs mymaster 1
  8. sentinel failover-timeout mymaster 10000
  9. sentinel deny-scripts-reconfig yes

粘贴出三份相同的配置:

  1. cp sentinel.conf sentinel1.conf
  2. cp sentinel.conf sentinel2.conf
  3. cp sentinel.conf sentinel3.conf

docker-compose.yml 的配置.

version: '2'
services:
  sentinel1:
    image: redis       ## 镜像
    container_name: redis-sentinel-1
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    ports:
    - "26380:26379"           
    volumes:
    - "./sentinel.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel2:
    image: redis                ## 镜像
    container_name: redis-sentinel-2
    ports:
    - "26380:26379"           
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - "./sentinel2.conf:/usr/local/etc/redis/sentinel.conf"
  sentinel3:
    image: redis                ## 镜像
    container_name: redis-sentinel-3
    ports:
    - "26381:26379"           
    command: redis-sentinel /usr/local/etc/redis/sentinel.conf
    volumes:
    - ./sentinel3.conf:/usr/local/etc/redis/sentinel.conf
# 把这组容器加入到要监控的集群中, 比较容易犯错的是这里, 
# 这个网络名是 "文件前缀+网络名", redis_sentinel-master, 所以需要自己修改.
networks:
  default:
    external:
      name: redis_sentinel-master

进入哨兵:

redis-cli -p 26379

检查配置:
进入 redis-sentinel-1 的 redis-shell 执行:

info sentinel

输出:

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=sdown,address=172.24.0.2:6379,slaves=2,sentinels=3