1. 部署说明

本文档用于在一台裸金属服务器上部署 Redis 6.2.20 Cluster。

本方案部署 3 个 Redis 进程:

192.168.200.2:7000
192.168.200.2:7001
192.168.200.2:7002

集群模式:

3 master,0 replica

说明:

该方案可以实现 Redis Cluster 分片。
该方案没有副本节点,因此不具备 Redis Cluster 高可用能力。
任意一个节点停止后,对应 hash slot 将不可用。

Redis 安装根目录:

/server/cluster/redis-6.2.20

Redis 密码:

Redis@123456

如需修改密码,三个 Redis 配置文件和脚本中的密码需要保持一致。

2. 目录规划

进入 Redis 根目录:

cd /server/cluster/redis-6.2.20

创建目录:

mkdir -p /server/cluster/redis-6.2.20/opt/7000
mkdir -p /server/cluster/redis-6.2.20/opt/7001
mkdir -p /server/cluster/redis-6.2.20/opt/7002

mkdir -p /server/cluster/redis-6.2.20/data/7000
mkdir -p /server/cluster/redis-6.2.20/data/7001
mkdir -p /server/cluster/redis-6.2.20/data/7002

mkdir -p /server/cluster/redis-6.2.20/var/log
mkdir -p /server/cluster/redis-6.2.20/var/run
mkdir -p /server/cluster/redis-6.2.20/sh

最终目录结构:

/server/cluster/redis-6.2.20
├── bin
├── data
│   ├── 7000
│   ├── 7001
│   └── 7002
├── opt
│   ├── 7000
│   ├── 7001
│   └── 7002
├── sh
└── var
    ├── log
    └── run

3. Redis 7000 配置

配置文件:

vi /server/cluster/redis-6.2.20/opt/7000/redis.conf

内容:

port 7000
bind 0.0.0.0
protected-mode no

daemonize yes
pidfile /server/cluster/redis-6.2.20/var/run/redis-7000.pid
logfile /server/cluster/redis-6.2.20/var/log/redis-7000.log
dir /server/cluster/redis-6.2.20/data/7000

cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.200.2
cluster-announce-port 7000
cluster-announce-bus-port 17000

requirepass Redis@123456
masterauth Redis@123456

appendonly yes
appendfilename "appendonly-7000.aof"

tcp-backlog 511
timeout 0
tcp-keepalive 300
databases 16

save 900 1
save 300 10
save 60 10000

maxmemory-policy noeviction

ignore-warnings ARM64-COW-BUG

4. Redis 7001 配置

配置文件:

vi /server/cluster/redis-6.2.20/opt/7001/redis.conf

内容:

port 7001
bind 0.0.0.0
protected-mode no

daemonize yes
pidfile /server/cluster/redis-6.2.20/var/run/redis-7001.pid
logfile /server/cluster/redis-6.2.20/var/log/redis-7001.log
dir /server/cluster/redis-6.2.20/data/7001

cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.200.2
cluster-announce-port 7001
cluster-announce-bus-port 17001

requirepass Redis@123456
masterauth Redis@123456

appendonly yes
appendfilename "appendonly-7001.aof"

tcp-backlog 511
timeout 0
tcp-keepalive 300
databases 16

save 900 1
save 300 10
save 60 10000

maxmemory-policy noeviction

ignore-warnings ARM64-COW-BUG

5. Redis 7002 配置

配置文件:

vi /server/cluster/redis-6.2.20/opt/7002/redis.conf

内容:

port 7002
bind 0.0.0.0
protected-mode no

daemonize yes
pidfile /server/cluster/redis-6.2.20/var/run/redis-7002.pid
logfile /server/cluster/redis-6.2.20/var/log/redis-7002.log
dir /server/cluster/redis-6.2.20/data/7002

cluster-enabled yes
cluster-config-file nodes-7002.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.200.2
cluster-announce-port 7002
cluster-announce-bus-port 17002

requirepass Redis@123456
masterauth Redis@123456

appendonly yes
appendfilename "appendonly-7002.aof"

tcp-backlog 511
timeout 0
tcp-keepalive 300
databases 16

save 900 1
save 300 10
save 60 10000

maxmemory-policy noeviction

ignore-warnings ARM64-COW-BUG

6. 启动 Redis 节点脚本

脚本文件:

vi /server/cluster/redis-6.2.20/sh/start-redis.sh

内容:

#!/bin/bash

/server/cluster/redis-6.2.20/bin/redis-server /server/cluster/redis-6.2.20/opt/7000/redis.conf
/server/cluster/redis-6.2.20/bin/redis-server /server/cluster/redis-6.2.20/opt/7001/redis.conf
/server/cluster/redis-6.2.20/bin/redis-server /server/cluster/redis-6.2.20/opt/7002/redis.conf

授权:

chmod +x /server/cluster/redis-6.2.20/sh/start-redis.sh

启动:

/server/cluster/redis-6.2.20/sh/start-redis.sh

检查端口:

ss -lntp | grep -E '7000|7001|7002|17000|17001|17002'

正常应看到:

7000
7001
7002
17000
17001
17002

7. 创建 Redis Cluster 脚本

注意:该脚本只需要执行一次。集群创建成功后,后续重启只执行 start-redis.sh

脚本文件:

vi /server/cluster/redis-6.2.20/sh/start-cluster.sh

内容:

#!/bin/bash

/server/cluster/redis-6.2.20/bin/redis-cli -a Redis@123456 --cluster create \
  192.168.200.2:7000 \
  192.168.200.2:7001 \
  192.168.200.2:7002 \
  --cluster-replicas 0 \
  --cluster-yes

授权:

chmod +x /server/cluster/redis-6.2.20/sh/start-cluster.sh

创建集群:

/server/cluster/redis-6.2.20/sh/start-cluster.sh

成功标志:

[OK] All 16384 slots covered.

其中 --cluster-yes 表示自动确认,不需要手动输入 yes

8. 停止 Redis Cluster 脚本

脚本文件:

vi /server/cluster/redis-6.2.20/sh/stop-cluster.sh

内容:

#!/bin/bash

REDIS_HOME=/server/cluster/redis-6.2.20
REDIS_CLI=$REDIS_HOME/bin/redis-cli
PASSWORD=Redis@123456

PORTS=(7000 7001 7002)

for PORT in "${PORTS[@]}"; do
  echo "Stopping Redis node on port ${PORT}..."

  $REDIS_CLI -p ${PORT} -a ${PASSWORD} shutdown

  sleep 1

  if ss -lntp | grep -q ":${PORT} "; then
    echo "Redis ${PORT} is still running, try killing by pidfile..."

    PID_FILE=$REDIS_HOME/var/run/redis-${PORT}.pid

    if [ -f "$PID_FILE" ]; then
      PID=$(cat "$PID_FILE")
      kill "$PID"
      echo "Killed Redis ${PORT}, pid=${PID}"
    else
      echo "PID file not found for Redis ${PORT}: $PID_FILE"
    fi
  else
    echo "Redis ${PORT} stopped."
  fi
done

echo "Redis cluster stopped."

授权:

chmod +x /server/cluster/redis-6.2.20/sh/stop-cluster.sh

停止:

/server/cluster/redis-6.2.20/sh/stop-cluster.sh

检查端口:

ss -lntp | grep -E '7000|7001|7002|17000|17001|17002'

没有输出表示停止完成。

9. 验证集群

连接集群:

/server/cluster/redis-6.2.20/bin/redis-cli -c -h 192.168.200.2 -p 7000 -a Redis@123456

查看集群信息:

cluster info

正常结果包含:

cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384

查看节点:

cluster nodes

测试读写:

set name zhangsan
get name

也可以直接用命令测试:

/server/cluster/redis-6.2.20/bin/redis-cli -c -h 192.168.200.2 -p 7000 -a Redis@123456 set k1 v1
/server/cluster/redis-6.2.20/bin/redis-cli -c -h 192.168.200.2 -p 7000 -a Redis@123456 get k1

10. Spring Boot 连接配置

Spring Boot 2.x 常用配置:

spring:
  redis:
    password: Redis@123456
    timeout: 3000ms
    cluster:
      nodes:
        - 192.168.200.2:7000
        - 192.168.200.2:7001
        - 192.168.200.2:7002
      max-redirects: 3

Spring Boot 3.x 常用配置:

spring:
  data:
    redis:
      password: Redis@123456
      timeout: 3000ms
      cluster:
        nodes:
          - 192.168.200.2:7000
          - 192.168.200.2:7001
          - 192.168.200.2:7002
        max-redirects: 3

11. 常见问题

11.1 提示 17000 端口被占用

报错:

Could not create server TCP listening socket 0.0.0.0:17000: bind: Address already in use
Failed listening on port 7000 (cluster), aborting.

原因:

Redis Cluster 节点会使用两个端口。
7000 是客户端端口。
17000 是集群总线端口。
17000 默认等于 7000 + 10000。

处理:

ss -lntp | grep 17000
ps -ef | grep redis

如确认是旧 Redis 进程,停止后重新启动。

11.2 创建集群时 Connection refused

报错:

Could not connect to Redis at 192.168.200.2:7000: Connection refused

原因:

7000 端口没有 Redis 进程监听。

处理:

ss -lntp | grep -E '7000|7001|7002|17000|17001|17002'
cat /server/cluster/redis-6.2.20/var/log/redis-7000.log

确认节点启动成功后再执行创建集群脚本。

11.3 ARM64-COW-BUG 报错

报错:

WARNING Your kernel has a bug that could lead to data corruption during background save.
Redis will now exit to prevent data corruption.
ignore-warnings ARM64-COW-BUG

处理:

在三个 Redis 配置文件中加入:

ignore-warnings ARM64-COW-BUG

本手册中的配置已经包含该参数。

11.4 创建集群时卡在 yes

提示:

Can I set the above configuration? (type 'yes' to accept):

处理:

创建集群命令增加:

--cluster-yes

本手册中的 start-cluster.sh 已经包含该参数。

11.5 密码命令行安全提示

提示:

Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

说明:

这是 redis-cli 的安全提醒,不影响部署和使用。

12. 日常操作命令

启动 Redis 进程:

/server/cluster/redis-6.2.20/sh/start-redis.sh

首次创建集群:

/server/cluster/redis-6.2.20/sh/start-cluster.sh

停止集群:

/server/cluster/redis-6.2.20/sh/stop-cluster.sh

查看进程:

ps -ef | grep redis

查看端口:

ss -lntp | grep -E '7000|7001|7002|17000|17001|17002'

查看日志:

tail -100 /server/cluster/redis-6.2.20/var/log/redis-7000.log
tail -100 /server/cluster/redis-6.2.20/var/log/redis-7001.log
tail -100 /server/cluster/redis-6.2.20/var/log/redis-7002.log

连接集群:

/server/cluster/redis-6.2.20/bin/redis-cli -c -h 192.168.200.2 -p 7000 -a Redis@123456

查看集群状态:

/server/cluster/redis-6.2.20/bin/redis-cli -c -h 192.168.200.2 -p 7000 -a Redis@123456 cluster info

13. 端口说明

本部署需要使用以下端口:

7000   Redis 客户端端口
7001   Redis 客户端端口
7002   Redis 客户端端口
17000  Redis Cluster 总线端口
17001  Redis Cluster 总线端口
17002  Redis Cluster 总线端口

如果服务器启用了防火墙,需要放行以上端口。

14. 重新部署说明

如果需要彻底重建集群,先停止 Redis:

/server/cluster/redis-6.2.20/sh/stop-cluster.sh

清理旧集群数据:

rm -f /server/cluster/redis-6.2.20/data/7000/nodes-7000.conf
rm -f /server/cluster/redis-6.2.20/data/7001/nodes-7001.conf
rm -f /server/cluster/redis-6.2.20/data/7002/nodes-7002.conf

rm -f /server/cluster/redis-6.2.20/data/7000/appendonly-7000.aof
rm -f /server/cluster/redis-6.2.20/data/7001/appendonly-7001.aof
rm -f /server/cluster/redis-6.2.20/data/7002/appendonly-7002.aof

rm -f /server/cluster/redis-6.2.20/data/7000/dump.rdb
rm -f /server/cluster/redis-6.2.20/data/7001/dump.rdb
rm -f /server/cluster/redis-6.2.20/data/7002/dump.rdb

重新启动:

/server/cluster/redis-6.2.20/sh/start-redis.sh

重新创建集群:

/server/cluster/redis-6.2.20/sh/start-cluster.sh
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐