
# 创建统一目录
mkdir -p /data/redis/data
mkdir -p /data/redis/sentinel
mkdir -p /data/redis/backup
# 创建docker内网(三台全部创建)
docker network create redis-net
/data/redis/datadocker run -d \
--name redis \
--network redis-net \
-p 6379:6379 \
-v /data/redis/data:/data \
--restart always \
redis:latest \
redis-server \
--requirepass "Redis@123" \
--masterauth "Redis@123" \
--appendonly yes \
--save 60 10
docker run -d \
--name redis \
--network redis-net \
-p 6379:6379 \
-v /data/redis/data:/data \
--restart always \
redis:latest \
redis-server \
--requirepass "Redis@123" \
--masterauth "Redis@123" \
--replicaof 192.168.1.19 6379 \
--appendonly yes \
--save 60 10
docker run -d \
--name redis \
--network redis-net \
-p 6379:6379 \
-v /data/redis/data:/data \
--restart always \
redis:latest \
redis-server \
--requirepass "Redis@123" \
--masterauth "Redis@123" \
--replicaof 192.168.1.19 6379 \
--appendonly yes \
--save 60 10
docker exec -it redis redis-cli -a Redis@123
info replication
主库能看到2个slave,代表主从搭建成功。
路径:/data/redis/sentinel/sentinel.conf
port 26379
daemonize no
bind 0.0.0.0
sentinel monitor mymaster 192.168.1.19 6379 2
sentinel auth-pass mymaster Redis@123
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
参数解释:quorum=2,三台哨兵至少2个投票才判定下线。
docker run -d \
--name redis-sentinel \
--network redis-net \
-p 26379:26379 \
-v /data/redis/sentinel/sentinel.conf:/etc/redis/sentinel.conf \
--restart always \
redis:latest \
redis-sentinel /etc/redis/sentinel.conf
docker exec -it redis-sentinel redis-cli -p 26379
info sentinel
正常显示:1主2从、3个哨兵节点即为成功。
业务禁止硬编码主库IP,直接连接哨兵集群自动获取主库:
问题:如果其中一台服务器关机,该节点Redis和哨兵同时宕机,程序是否直接报错?
答案:程序完全不受影响,依旧正常运行,原理如下:
错误(禁止使用):程序只配置单个哨兵地址,单点故障直接导致业务无法获取主库地址。
# 错误:只写19单节点,19关机直接GG
spring:
redis:
sentinel:
master: mymaster
nodes: 192.168.1.19:26379
正确(生产强制规范):完整写入3台哨兵节点,实现哨兵层面高可用。
# 正确写法
spring:
redis:
sentinel:
master: mymaster
nodes:
- 192.168.1.19:26379
- 192.168.1.20:26379
- 192.168.1.21:26379
password: Redis@123
/data/redis/data(rdb+aof)BAK=$(date +%Y%m%d_%H%M)
tar -zcvf /data/redis/backup/redis_${BAK}.tar.gz /data/redis/data
# 自动清理7天旧备份
find /data/redis/backup -name "redis_*.tar.gz" -mtime +7 -delete
docker stop redisrm -rf /data/redis/data/*tar -zxvf 备份包 -C /data/redis/datadocker start redis