Redis高可用部署-搭建redis哨兵模式

背景

最近在使用中有遇到redis的哨兵模式,这种模式能够做到主节点异常自动切换,保证了服务的高可用,在生产部署使用比较多。为更深入了解相关模式和配置,以及熟悉和方便问题的排查,在本地部署一套redis服务。

准备工作

基础信息

版本为7.0.0 , 部署方式为docker。

部署

部署主从模式

version: '3'
services:
  master:
    image: redis
    container_name: redis-master
    command: redis-server --requirepass redis_pwd  --masterauth redis_pwd
    ports:
      - 6380:6379
  slave1:
    image: redis
    container_name: redis-slave-1
    ports:
      - 6381:6379
    command:  redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd
  slave2:
    image: redis
    container_name: redis-slave-2
    ports:
      - 6382:6379
    command: redis-server --slaveof redis-master 6379 --requirepass redis_pwd --masterauth redis_pwd

启动后如图

image.png

部署哨兵

version: '3.7'
services:
  sentinel1:
    image: redis
    container_name: redis-sentinel-1
    restart: always
    ports:
      - 26379:26379
    command: redis-sentinel /usr/local/etc/redis/conf/sentinel1.conf
    volumes:
      # - ./conf1/sentinel1.conf:/usr/local/etc/redis/conf/sentinel.conf
      - ./data1:/data
      - ./conf1:/usr/local/etc/redis/conf
  sentinel2:
    image: redis
    container_name: redis-sentinel-2
    restart: always
    ports:
    - 26380:26379
    command: redis-sentinel /usr/local/etc/redis/conf/sentinel2.conf
    volumes:
      # - ./conf2/sentinel2.conf:/usr/local/etc/redis/conf/sentinel.conf
      - ./data2:/data
      - ./conf2:/usr/local/etc/redis/conf
  sentinel3:
    image: redis
    container_name: redis-sentinel-3
    ports:
      - 26381:26379
    command: redis-sentinel /usr/local/etc/redis/conf/sentinel3.conf
    volumes:
      # - ./conf3/sentinel3.conf:/usr/local/etc/redis/conf/sentinel.conf
      - ./data3:/data
      - ./conf3:/usr/local/etc/redis/conf
networks:
  default:
    external:
      name: redis_default

注意!
哨兵模式在部署的时候挂载配置文件使用目录的形式,否则会有文件无权修改的警告!

sentinel模式配置文件

//三个节点都一致

# 自定义集群名,其中10.80.20.22 为 redis-master 的 "主机" ip,6379 为 redis-master 的端口,2 为最小投票数(因为有 3 台 Sentinel 所以可以设置成 2)
port 26379
dir "/tmp"
sentinel monitor mymaster 10.80.20.22 6380 2
sentinel auth-pass mymaster redis_pwd
sentinel deny-scripts-reconfig yes

#如下是自动生成的
# Generated by CONFIG REWRITE
latency-tracking-info-percentiles 50 99 99.9
user default on nopass sanitize-payload ~* &* +@all
sentinel myid a9c271090d6ea265ab42cf63a1655b64eef17a7d
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
sentinel current-epoch 0

sentinel known-replica mymaster 172.22.0.2 6379

sentinel known-replica mymaster 172.22.0.3 6379

sentinel known-sentinel mymaster 172.21.0.3 26379 69603b62ad821b18a5fae6646ace568ef53d0630

sentinel known-sentinel mymaster 172.21.0.2 26379 b6567ba64e321991b85762a0707c51d173b998e0

注意其中的
sentinel monitor mymaster 10.80.20.22 6380 2
10.80.20.22 是宿主机的IP,如果配置容器IP,可能导致外部无法访问。

启动后如图

image.png

验证

登录主从

# Replication
role:master
connected_slaves:2
slave0:ip=172.22.0.2,port=6379,state=online,offset=468205,lag=1
slave1:ip=172.22.0.3,port=6379,state=online,offset=468341,lag=0
master_failover_state:no-failover
master_replid:a6d8f07d488ea5769117bc4497d05f38f438aa30
master_replid2:7dd4ecc3aabefbf7cf6ac859eb6c24fd03ae6321
master_repl_offset:468477
second_repl_offset:225
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:225
repl_backlog_histlen:468253

登录哨兵

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_tilt_since_seconds:-1
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=10.80.20.22:6380,slaves=2,sentinels=4

参考

  1. luckyxue.github.io
  2. https://www.developers-notebook.com/development/using-redis-sentinel-with-docker-compose/
  3. cloud.tencent.com/developer/article/1615281
  4. https://redis.io/docs/management/replication/
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容