# Redis集群部署参考手册(三主三从Cluster模式)

# 概要说明

Redis服务用于协同集群部署模式时的缓存数据存放,建议使用Redis 6.x及以上版本

标准产品支持单机Redis,也支持集群Redis。

集群Redis标准适配三主三从集群(官方称为Cluster模式),可以实现高可用+分布式存储,诸如哨兵及其他模式未做标准适配!!!

Redis三种集群模式可参考网上相关文档 https://cloud.tencent.com.cn/developer/article/2272116

# 系统架构图

Redis三主三从模式最低需要3台服务器,资源充足推荐6台服务器,相关架构图如下:

方案一:3台服务器部署Redis三主三从集群

1744366271161.png

方案二:6台服务器部署Redis三主三从集群

1744366283721.png

# 环境准备

  • 请准备至少3台Linux服务器,或6台Linux服务器;请使用相同的硬件配置及操作系统版本

  • 3台服务器时,每台服务器部署同时存在一个redis主节点和一个redis从节点

# 方案一:3台机器部署三主三从集群

# 服务器IP地址

  • 192.168.0.91
  • 192.168.0.92
  • 192.168.0.93

# 创建redis集群目录

  • 192.168.0.91:/usr/local/redis-cluster/node01
  • 192.168.0.91:/usr/local/redis-cluster/node02
  • 192.168.0.92:/usr/local/redis-cluster/node03
  • 192.168.0.92:/usr/local/redis-cluster/node04
  • 192.168.0.93:/usr/local/redis-cluster/node05
  • 192.168.0.93:/usr/local/redis-cluster/node06

# 方案二:6台机器部署三主三从集群

# 服务器IP地址

  • 192.168.0.91
  • 192.168.0.92
  • 192.168.0.93
  • 192.168.0.94
  • 192.168.0.95
  • 192.168.0.96

# 创建redis集群目录

  • 192.168.0.91:/usr/local/redis-cluster/node01
  • 192.168.0.92:/usr/local/redis-cluster/node02
  • 192.168.0.93:/usr/local/redis-cluster/node03
  • 192.168.0.94:/usr/local/redis-cluster/node04
  • 192.168.0.95:/usr/local/redis-cluster/node05
  • 192.168.0.96:/usr/local/redis-cluster/node06

# 安装redis服务

参考 'Redis单机部署' 手册,在其中一个服务器上部署Redis单节点,并将其拷贝到其他服务器上 https://open.seeyoncloud.com/#/faq/vuepressFile/v1/share?url=Z2ptZkplPjIzMzc=

例如: 在服务器192.168.0.91上编译安装redis,安装完成后,redis二进制执行文件默认会存放在/usr/local/bin 目录 将 192.168.0.91:/usr/local/bin/redis-* 拷贝到其他服务器的 /usr/local/bin/ 目录下

1753686265538.png

参考命令:

rsync -av --progress /usr/loca/bin/redis-* root@192.168.0.92:/usr/local/bin/
rsync -av --progress /usr/loca/bin/redis-* root@192.168.0.93:/usr/local/bin/
...

拷贝时如果目标服务器没有/usr/local/bin目录,请提前手动创建(mkdir /usr/local/bin -p

# 创建配置文件

# 方案一:3台机器部署三主三从集群

# 服务器:192.168.0.91

# 创建node01配置文件
cat > /usr/local/redis-cluster/node01/redis.conf << EOF
# 监听的网卡地址,改为实际内网ip地址
bind 192.168.0.91
# 监听端口,同一个服务器部署2个redis节点时,端口不要冲突
port 6371
# 后台运行
daemonize yes
# 开启集群模式
cluster-enabled yes
# 集群节点配置文件
cluster-config-file  "/usr/local/redis-cluster/node01/nodes.conf"
# 集群超时时间设置
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node01/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node01/redis.log"
# rdb持久化目录
dir "/usr/local/redis-cluster/node01"
# 关闭AOF持久化
appendonly no
# redis实例密码
requirepass Seeyon@123456
# 主节点密码,适用于从节点连接到主节点时进行身份验证
masterauth Seeyon@123456
EOF

# 创建node02配置文件
cat > /usr/local/redis-cluster/node02/redis.conf << EOF
bind 192.168.0.91
port 6372
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node02/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node02/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node02/redis.log"
dir "/usr/local/redis-cluster/node02"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.92

# 创建node03配置文件
cat > /usr/local/redis-cluster/node03/redis.conf << EOF
bind 192.168.0.92
port 6373
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node03/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node03/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node03/redis.log"
dir "/usr/local/redis-cluster/node03"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 创建node04配置文件
cat > /usr/local/redis-cluster/node04/redis.conf << EOF
bind 192.168.0.92
port 6374
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node04/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node04/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node04/redis.log"
dir "/usr/local/redis-cluster/node04"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.93

# 创建node05配置文件
cat > /usr/local/redis-cluster/node05/redis.conf << EOF
bind 192.168.0.93
port 6375
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node05/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node05/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node05/redis.log"
dir "/usr/local/redis-cluster/node05"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 创建node06配置文件
cat > /usr/local/redis-cluster/node06/redis.conf << EOF
bind 192.168.0.93
port 6376
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node06/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node06/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node06/redis.log"
dir "/usr/local/redis-cluster/node06"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 方案二:6台机器部署三主三从集群

# 服务器:192.168.0.91

# 创建node01配置文件
cat > /usr/local/redis-cluster/node01/redis.conf << EOF
# 监听的网卡地址,改为实际内网ip地址
bind 192.168.0.91
# 监听端口,同一个服务器部署2个redis节点时,端口不要冲突
port 6371
# 后台运行
daemonize yes
# 开启集群模式
cluster-enabled yes
# 集群节点配置文件
cluster-config-file  "/usr/local/redis-cluster/node01/nodes.conf"
# 集群超时时间设置
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node01/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node01/redis.log"
# rdb持久化目录
dir "/usr/local/redis-cluster/node01"
# 关闭AOF持久化
appendonly no
# redis实例密码
requirepass Seeyon@123456
# 主节点密码,适用于从节点连接到主节点时进行身份验证
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.92

# 创建node02配置文件
cat > /usr/local/redis-cluster/node02/redis.conf << EOF
bind 192.168.0.92
port 6372
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node02/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node02/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node02/redis.log"
dir "/usr/local/redis-cluster/node02"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.93

# 创建node03配置文件
cat > /usr/local/redis-cluster/node03/redis.conf << EOF
bind 192.168.0.93
port 6373
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node03/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node03/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node03/redis.log"
dir "/usr/local/redis-cluster/node03"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.94

# 创建node04配置文件
cat > /usr/local/redis-cluster/node04/redis.conf << EOF
bind 192.168.0.94
port 6374
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node04/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node04/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node04/redis.log"
dir "/usr/local/redis-cluster/node04"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.95

# 创建node05配置文件
cat > /usr/local/redis-cluster/node05/redis.conf << EOF
bind 192.168.0.95
port 6375
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node05/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node05/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node05/redis.log"
dir "/usr/local/redis-cluster/node05"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 服务器:192.168.0.96

# 创建node06配置文件
cat > /usr/local/redis-cluster/node06/redis.conf << EOF
bind 192.168.0.96
port 6376
daemonize yes
cluster-enabled yes
cluster-config-file  "/usr/local/redis-cluster/node06/nodes.conf"
cluster-node-timeout 15000
pidfile "/usr/local/redis-cluster/node06/redis.pid"
loglevel warning
logfile "/usr/local/redis-cluster/node06/redis.log"
dir "/usr/local/redis-cluster/node06"
appendonly no
requirepass Seeyon@123456
masterauth Seeyon@123456
EOF

# 启动redis实例

# 方案一:3台机器部署三主三从集群

  • 192.168.0.91
# 启动redis-node01
/usr/local/bin/redis-server /usr/local/redis-cluster/node01/redis.conf
# 启动redis-node02
/usr/local/bin/redis-server /usr/local/redis-cluster/node02/redis.conf
  • 192.168.0.92
# 启动redis-node03
/usr/local/bin/redis-server /usr/local/redis-cluster/node03/redis.conf
# 启动redis-node04
/usr/local/bin/redis-server /usr/local/redis-cluster/node04/redis.conf
  • 192.168.0.93
# 启动redis-node05
/usr/local/bin/redis-server /usr/local/redis-cluster/node05/redis.conf
# 启动redis-node06
/usr/local/bin/redis-server /usr/local/redis-cluster/node06/redis.conf

# 方案二:6台机器部署三主三从集群

  • 192.168.0.91
# 启动redis-node01
/usr/local/bin/redis-server /usr/local/redis-cluster/node01/redis.conf
  • 192.168.0.92
# 启动redis-node02
/usr/local/bin/redis-server /usr/local/redis-cluster/node02/redis.conf
  • 192.168.0.93
# 启动redis-node03
/usr/local/bin/redis-server /usr/local/redis-cluster/node03/redis.conf
  • 192.168.0.94
# 启动redis-node04
/usr/local/bin/redis-server /usr/local/redis-cluster/node04/redis.conf
  • 192.168.0.95
# 启动redis-node05
/usr/local/bin/redis-server /usr/local/redis-cluster/node05/redis.conf
  • 192.168.0.96
# 启动redis-node06
/usr/local/bin/redis-server /usr/local/redis-cluster/node06/redis.conf

# 启动后可以通过以下命令查看进程

ps -ef|grep redis

# Redis集群配置

# (参考)防火墙配置

集群配置前需要开启redis端口和redis集群总线端口(redis端口+10000)

举例,一个节点部署了两个redis实例,端口分别为6371、6372,则需要同步放行16371、16372端口:

# 开放端口
firewall-cmd --add-port=6371/tcp --permanent
firewall-cmd --add-port=16371/tcp --permanent
firewall-cmd --add-port=6372/tcp --permanent
firewall-cmd --add-port=16372/tcp --permanent
firewall-cmd --reload

# 查看防火墙开放的端口
firewall-cmd --list-ports
firewall-cmd --query-port=6371/tcp

# 防火墙配置中移除6377端口
firewall-cmd --permanent --remove-port=6371/tcp

# 方案一:3台机器部署三主三从集群

提示:

Redis 创建集群时并不是自动交叉分布的,当设置--cluster-replicas不为0时,默认规则是:前 N 个主,后 N 个从。

为保证Redis集群能够高可用,生产环境建议在创建集群时 手动控制顺序或手动 add-node

验证Redis节点是否交叉分布,可以参考 redis三主三从集群高可用检查维护文档 (opens new window) ,建议部署完成后检查一下,生产环境建议设置监控告警并定期巡检。

本文档提供以下2种方式,在任意一台redis节点上执行即可

方法1、简单做法

通过一条命令直接控制顺序,前3个节点做主,后3个依次做主的从

./redis-cli --cluster create \
192.168.0.91:6371 \
192.168.0.92:6373 \
192.168.0.93:6375 \
192.168.0.92:6374 \
192.168.0.93:6376 \
192.168.0.91:6372 \
--cluster-replicas 1 \
-a Seeyon@123456

效果

Master Replica
192.168.0.91:6371 192.168.0.92:6374
192.168.0.92:6373 192.168.0.93:6376
192.168.0.93:6375 192.168.0.91:6372

方法2、先创建主,再手动指定对应的从

# 创建3主集群
./redis-cli --cluster create \
192.168.0.91:6371 \
192.168.0.92:6373 \
192.168.0.93:6375 \
--cluster-replicas 0 -a Seeyon@123456

# 为每个master手动指定slave,设置交叉
./redis-cli --cluster add-node \
192.168.0.92:6374 \
192.168.0.91:6371 \
--cluster-slave -a Seeyon@123456

./redis-cli --cluster add-node \
192.168.0.93:6376 \
192.168.0.92:6373 \
--cluster-slave -a Seeyon@123456

./redis-cli --cluster add-node \
192.168.0.91:6372 \
192.168.0.93:6375 \
--cluster-slave -a Seeyon@123456

查看集群状态

cd /usr/local/redis-cluster
./redis-cli --cluster check 192.168.0.91:6371 -a Seeyon@123456

# 方案二:6台机器部署三主三从集群

./redis-cli --cluster create 192.168.0.91:6371 192.168.0.92:6372 192.168.0.93:6373 192.168.0.94:6374 192.168.0.95:6375 192.168.0.96:6376 --cluster-replicas 1 -a Seeyon@123456

cd /usr/local/redis-cluster
./redis-cli --cluster check 192.168.0.91:6371 -a Seeyon@123456

如果创建失败,删除每个redis节点的/usr/local/redis-cluster/node0{x}/nodes.conf文件,重启redis服务,再重新创建。

# Redis集群状态相关命令

# 进入redis节点
redis-cli -h 192.168.0.91 -p 6371 -a Seeyon@123456

# 查看集群相关信息
cluster info

# 查看节点相关信息
cluster nodes

# 常见问题

一、make编译redis时报错:

gcc版本过低导致该错误。检查gcc版本:4.8.5

解决方法:升级gcc版本(gcc版本一定要5.3以上)

二、从节点无数据,或者主从切换后,新的从节点无数据

【解决方法】:redis.conf增加配置masterauth Seeyon123456

此配置为验证主节点密码。

三、创建集群卡在Waiting for the cluster to jion

此问题常出现在主机之间端口不通导致。主机之间互相telnet 6379端口和16379端口是否通。

解决方法:

  1. 检查主机防火墙是否关闭

  2. 主机如开启防火墙,检查防火墙是否配置redis端口和redis集群总线端口(redis端口+10000)放行

    编撰人:zhangshuang、wangyxyf、het、admin