1. 说明
Redis高可用的模式分为两种:哨兵模式与分片模式。
哨兵模式是分布式里面通过主从模式(Master-Slave)进行高可用的,由sentinel进行监控、选主、通知保障主节点正常。
分片模式则是分布式里面的去中心化模式,即数据分散到集群的所有节点中。
选择部署的区别:如果业务中有Lua脚本这种,涉及多个Key的事务操作,选择哨兵模式;如果是简单的缓存数据存储,可以选择分片模式。
本次部署的版本:6.2.7
使用 3 台机器进行 3 主 3 从 6 节点搭建,默认 3 台机器已安装好 docker 环境。涉及的配置文件、镜像文件等可以私信我,文中涉及的IP、端口等可自行修改。
3 台主机 ip 分别为 192.168.50.9、192.168.50.18、192.168.50.245、具体分布如下:
机器 |
部署端口 |
假设 ip |
A |
6371、6372 |
192.168.50.9 |
B |
6373、6374 |
192.168.50.18 |
C |
6375、6376 |
192.168.50.245 |
2. 配置文件
一共需要 6 个配置文件,分别是 redis-6371.conf、redis-6372.conf、redis-6373.conf、redis-6374.conf、redis-6375.conf、redis-6376.conf。
注意:requirepass参数,后续连接redis使用。可以自行调整redis的持久化策略。
#bind 127.0.0.1 -::1
protected-mode yes
port 6371
tcp-backlog 511
timeout 3600
tcp-keepalive 300
# in docker this must no
daemonize no
pidfile /var/run/redis_6371.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
proc-title-template "{title} {listen-addr} {server-mode}"
# save 3600 1
# save 300 100
# save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename iot_redis.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
requirepass 3er4#ER$
maxclients 10000
maxmemory 4000000000
maxmemory-policy noeviction
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
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-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events "Ex"
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
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.50.9
cluster-announce-port 6371
cluster-announce-bus-port 16371
masterauth 3er4#ER$
需要将 cluster-announce-ip 的更改为其部署机器的 ip。
3. 构建 Redis-Cluster
3.1. 启动各个节点
在 192.168.50.9 机器执行如下命令(注意:该执行目录需要在那 6 个配置文件的那个目录):
for port in $(seq 6371 6372); do
mkdir -p /home/redis-cluster/${port}/conf
cp -r redis-${port}.conf /home/redis-cluster/${port}/conf/redis.conf
docker run -di --log-opt max-size=100m --log-opt max-file=3 --restart always --name redis-${port} --net host
-v /home/redis-cluster/${port}/conf/redis.conf:/etc/redis/redis.conf
-v /home/redis-cluster/${port}/data:/data
redis:6.2.7 redis-server /etc/redis/redis.conf;
done
在 192.168.50.18 机器执行如下命令
for port in $(seq 6373 6374); do
mkdir -p /home/redis-cluster/${port}/conf
cp -r redis-${port}.conf /home/redis-cluster/${port}/conf/redis.conf
docker run -di --log-opt max-size=10m --log-opt max-file=3 --restart always --name redis-${port} --net host
-v /home/redis-cluster/${port}/conf/redis.conf:/etc/redis/redis.conf
-v /home/redis-cluster/${port}/data:/data
redis:6.2.7 redis-server /etc/redis/redis.conf;
done
在 192.168.50.245 机器执行如下命令
for port in $(seq 6375 6376); do
mkdir -p /home/redis-cluster/${port}/conf
cp -r redis-${port}.conf /home/redis-cluster/${port}/conf/redis.conf
docker run -di --log-opt max-size=10m --log-opt max-file=3 --restart always --name redis-${port} --net host
-v /home/redis-cluster/${port}/conf/redis.conf:/etc/redis/redis.conf
-v /home/redis-cluster/${port}/data:/data
redis:6.2.7 redis-server /etc/redis/redis.conf;
done
3.2. 构建分片集群
在 192.168.50.9 机器上执行如下命令,进入 redis docker 容器内:
docker exec -it redis-6371 bash
在容器内执行(其中的 ip 与端口需要调整为跟前面部署的 6 个节点的一致):
redis-cli -a 3er4#ER$ --cluster create 192.168.50.9:6371 192.168.50.9:6372 192.168.50.18:6373 192.168.50.18:6374 192.168.50.245:6375 192.168.50.245:6376 --cluster-replicas 1
看到如下画面,输入 yes 构建集群。
集群构建
4. 最后说明
集群不可用的情况是两台机器同时宕机,造成1主1从同时挂了,集群则不可用。
对于 redis-cluster 的扩容与缩容,都是需要人工干预的,进行分片的手动处理,并不能做到新节点加入后系统自动进行平衡的。