背景
最近在使用中有遇到redis的哨兵模式,這種模式能夠做到主節(jié)點(diǎn)異常自動(dòng)切換,保證了服務(wù)的高可用,在生產(chǎn)部署使用比較多。為更深入了解相關(guān)模式和配置,以及熟悉和方便問題的排查,在本地部署一套redis服務(wù)。
準(zhǔn)備工作
基礎(chǔ)信息
版本為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
啟動(dòng)后如圖

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
注意!
哨兵模式在部署的時(shí)候掛載配置文件使用目錄的形式,否則會(huì)有文件無權(quán)修改的警告!
sentinel模式配置文件
//三個(gè)節(jié)點(diǎn)都一致
# 自定義集群名,其中10.80.20.22 為 redis-master 的 "主機(jī)" ip,6379 為 redis-master 的端口,2 為最小投票數(shù)(因?yàn)橛?3 臺(tái) Sentinel 所以可以設(shè)置成 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
#如下是自動(dòng)生成的
# 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是宿主機(jī)的IP,如果配置容器IP,可能導(dǎo)致外部無法訪問。
啟動(dòng)后如圖

image.png
驗(yàn)證
登錄主從
# 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/