# 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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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配置文件
echo > /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-cli --cluster create 192.168.0.91:6371 192.168.0.91:6372 192.168.0.92:6373 192.168.0.92:6374 192.168.0.93:6375 192.168.0.93:6376 --cluster-replicas 1 -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、het、wangyxyf、admin