本文在Docker环境配置一主二从三哨兵的redis集群环境。
一、redis集群
镜像下载
下载redis镜像,我这里直接下载的是最新版本的镜像
docker pull redis
创建挂载目录和配置文件,这里参考的别人博客
mkdir -p /data/redis/conf
mkdir -p /data/redis/data
cd /data/redis/conf
vi redis.conf
mkdir -p /data/redis1/conf
mkdir -p /data/redis1/data
cd /data/redis1/conf
vi redis.conf
mkdir -p /data/redis2/conf
mkdir -p /data/redis2/data
cd /data/redis2/conf
vi redis.conf
主节点配置
master的redis.conf配置文件的内容如下
protected-mode no
port 6379
tcp-backlog 511
#redis密码 强烈建议设置复杂一些
requirepass qwe123
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 30
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes
appendfilename "appendonly.aof"
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
从节点配置
从节点的配置文件有点坑,最好是不要使用同一个端口,比如master使用了6379,slave容器使用其他端口。尽管容器是互相隔离的,但网络通信这一块,会有问题。如图:
我开始都使用了6379,映射宿主机的不同端口上,主从同步时是没有问题的,但是当主节点下线,或者重新加入节点时,哨兵节点会无法区分各个容器的。
虽然各个容器分配的ip不同,但sentinel通信时都使用了容器内部的回环地址172.17.0.1,这里可能是个bug。容器内直接使用不同端口,可以规避这个问题。
从节点配置文件,还需要加上主节点的ip端口和密码
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.25.2 6379
# 主服务器密码
masterauth qwe123
ps:5.0后slaveof改为replicaof,但原来的仍可以用,查了一下是为了避免slave“奴隶”的说法,难道是遭到某些群体的投诉了(狗头)?
启动容器
docker run -p 6379:6379 \
--name redis-master \
-v /data/redis/data/:/data \
-v /data/redis/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
docker run -p 6380:6380 \
--name redis-slave-1 \
-v /data/redis1/data/:/data \
-v /data/redis1/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
docker run \
-p 6381:6381 \
--name redis-slave-2 \
-v /data/redis2/data/:/data \
-v /data/redis2/conf/redis.conf:/etc/redis/redis.conf \
-d redis redis-server /etc/redis/redis.conf
二、哨兵集群
首先创建在各个redis conf目录创建sentinel.conf,配置文件我是直接从官网下的
地址:redis/sentinel.conf at 7.0.12 · redis/redis · GitHub
protected-mode no
port 6479
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor mymaster 192.168.25.2 6379 2
sentinel auth-pass mymaster qwe123
sentinel down-after-milliseconds mymaster 10000
sentinel failover-timeout mymaster 20000
acllog-max-len 128
sentinel parallel-syncs mymaster 1
sentinel deny-scripts-reconfig yes
SENTINEL resolve-hostnames no
SENTINEL announce-hostnames no
SENTINEL master-reboot-down-after-period mymaster 0
sentinel monitor mymaster 192.168.25.2 6379 2
sentinel auth-pass mymaster qwe123
这两个配置,前者是配置redis主节点的ip端口,最后的2是指两个哨兵节点投票确认主节点下线或者选出新主节点。后者是主节点的密码。sentinel能从主节点获取从节点的信息。
启动集群
docker run -p 6479:6479 \
--name redis-sentinel-3 \
-v /data/redis/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf
docker run -p 6480:6480 \
--name redis-sentinel-2 \
-v /data/redis1/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf
docker run -p 6481:6481 \
--name redis-sentinel-1 \
-v /data/redis2/conf/sentinel.conf:/etc/redis/sentinel.conf \
-d redis redis-sentinel /etc/redis/sentinel.conf
需要注意的是,如果主节点下线了,重新选出了主节点,重新上线时,自己就是从节点了,所以此时redis.conf需要配置主节点的ip和密码。