背景
最近在使用中有遇到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
启动后如图
部署哨兵
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,可能导致外部无法访问。
启动后如图
验证
登录主从
# 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
参考
- luckyxue.github.io
- https://www.developers-notebook.com/development/using-redis-sentinel-with-docker-compose/
- cloud.tencent.com/developer/article/1615281
- https://redis.io/docs/management/replication/