Redis集群部署Ubuntu步骤

一、下载Redis

准备工作

开启root权限(可选,也可以使用sudo)

sudo -i

创建工作目录

mkdir redis && cd redis

下载Redis

wget https://github.com/redis/redis/archive/refs/tags/8.2.2.tar.gz

解压并进入目标文件夹

mkdir redis && tar -zxvf 8.2.2.tar.gz -C redis --strip-components=1 && cd redis

安装编译工具

sudo apt update
sudo apt install -y build-essential

编译安装Redis

cd redis
make
sudo make install

自动化安装脚本(可选)

AI基于以上步骤生成的自动化安装脚本:

#!/bin/bash
set -e  # 遇到错误立即退出

# 1️⃣ 创建工作目录
WORKDIR="$HOME/redis"
echo "创建工作目录: $WORKDIR"
mkdir -p "$WORKDIR"
cd "$WORKDIR"

# 2️⃣ 下载 Redis 8.2.2
REDIS_VERSION="8.2.2"
REDIS_TAR="$WORKDIR/$REDIS_VERSION.tar.gz"

if [ ! -f "$REDIS_TAR" ]; then
    echo "下载 Redis $REDIS_VERSION ..."
    wget -O "$REDIS_TAR" "https://github.com/redis/redis/archive/refs/tags/$REDIS_VERSION.tar.gz"
else
    echo "Redis 压缩包已存在: $REDIS_TAR"
fi

# 3️⃣ 创建目标解压目录并解压
REDIS_DIR="$WORKDIR/redis"
echo "解压 Redis 到 $REDIS_DIR"
mkdir -p "$REDIS_DIR"
tar -zxvf "$REDIS_TAR" -C "$REDIS_DIR" --strip-components=1
cd "$REDIS_DIR"

# 4️⃣ 安装编译依赖
echo "安装编译依赖 build-essential ..."
sudo apt update
sudo apt install -y build-essential

# 5️⃣ 编译并安装 Redis
echo "编译 Redis ..."
make
echo "安装 Redis ..."
sudo make install

echo "Redis $REDIS_VERSION 安装完成!"
echo "Redis 可执行文件位置: $(which redis-server) $(which redis-cli)"

二、搭建分片集群

创建集群目录结构

sudo mkdir /home/redis/ && cd /home/redis
sudo mkdir 7001 7002 7003 8001 8002 8003

配置Redis集群

创建基础配置文件

创建redis.conf文件,直接复制即可,待会儿批量修改:

port 6379
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file /home/redis/6379/nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir /home/redis/6379
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
cluster-announce-ip 192.168.234.131
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile /home/redis/6379/run.log

分发配置文件

拷贝redis.conf到各个目录下:

echo 7001 7002 7003 8001 8002 8003 | xargs -t -n 1 cp redis.conf

修改端口配置

修改各个端口文件的端口:

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's/6379/{}/g' {}/redis.conf

修改持久化文件地址(可选)

s|/home/redis\(/{})\) 是要修改的目录
|/data/redis\1|g' 是修改的目标目录

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t sed -i 's|/home/redis\(/{})\)|/data/redis\1|g' {}/redis.conf

或者可以直接使用shell脚本(可选)

AI基于以上步骤生成的自动化安装脚本:

#!/bin/bash
# make-cluster-dirs.sh
# 一键创建 7001-7003 8001-8003 目录 + 生成对应 redis.conf

set -e

###################  可改变量  ###################
BASE_DIR="/home/redis"        # 根目录
CLUSTER_IP="192.168.234.132"  # 本机 IP
PORTS=(7001 7002 7003 8001 8002 8003)
##################################################

mkdir -p "$BASE_DIR"
for port in "${PORTS[@]}"; do
  dir="$BASE_DIR/$port"
  mkdir -p "$dir"

  # 生成配置
  cat > "$dir/redis.conf" <<EOF
port $port
# 开启集群功能
cluster-enabled yes
# 集群的配置文件名称,不需要我们创建,由redis自己维护
cluster-config-file nodes.conf
# 节点心跳失败的超时时间
cluster-node-timeout 5000
# 持久化文件存放目录
dir $dir
# 绑定地址
bind 0.0.0.0
# 让redis后台运行
daemonize yes
# 注册的实例ip
cluster-announce-ip $CLUSTER_IP
# 保护模式
protected-mode no
# 数据库数量
databases 1
# 日志
logfile $dir/run.log
EOF

  echo "已生成 $dir/redis.conf"
done

echo "全部目录 & 配置创建完成!"

启动Redis集群

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-server {}/redis.conf

验证集群状态

查看Redis进程:

ps -ef | grep redis

成功启动后应显示类似以下内容:

root@ubuntu:/home/redis# ps -ef | grep redis
root      163143       1  0 07:21 ?        00:00:00 redis-server 0.0.0.0:7001 [cluster]
root      163145       1  0 07:21 ?        00:00:00 redis-server 0.0.0.0:7002 [cluster]
root      163147       1  0 07:21 ?        00:00:00 redis-server 0.0.0.0:7003 [cluster]
root      163156       1  0 07:21 ?        00:00:00 redis-server 0.0.0.0:8001 [cluster]
root      163166       1  0 07:21 ?        00:00:00 redis-server 0.0.0.0:8002 [cluster]
root      163178       1  0 07:21 ?        00:00:00 redis-server 0.0.0.0:8003 [cluster]
ubuntu    163422  163396  0 07:21 pts/3    00:00:00 watch redis-cli -p 7001 cluster nodes
root      163802  151830  0 07:22 pts/2    00:00:00 grep --color=auto redis

关闭集群

ps -ef | grep redis | awk '{print $2}' | xargs kill

或者

printf '%s\n' 7001 7002 7003 8001 8002 8003 | xargs -I{} -t redis-cli -p {} shutdown

三、创建集群

执行集群创建命令

将IP地址换为自己服务器的IP:

redis-cli --cluster create --cluster-replicas 1 192.168.234.131:7001 192.168.234.131:7002 192.168.234.131:7003 192.168.234.131:8001 192.168.234.131:8002 192.168.234.131:8003

命令参数说明

  • redis-cli --cluster:代表集群操作命令
  • create:代表是创建集群
  • --cluster-replicas 1:指定集群中每个master的副本个数为1,此时节点总数 ÷ (replicas + 1) 得到的就是master的数量。因此节点列表中的前n个就是master,其它节点都是slave节点,随机分配到不同master

集群创建输出示例

root@ubuntu:/home/redis# redis-cli --cluster create --cluster-replicas 1 192.168.234.131:7001 192.168.234.131:7002 192.168.234.131:7003 192.168.234.131:8001 192.168.234.131:8002 192.168.234.131:8003
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 192.168.234.131:8002 to 192.168.234.131:7001
Adding replica 192.168.234.131:8003 to 192.168.234.131:7002
Adding replica 192.168.234.131:8001 to 192.168.234.131:7003
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 82d6ad26c1d83f551fc3b2a5083cd9919052eddd 192.168.234.131:7001
   slots:[0-5460] (5461 slots) master
M: 3043457cd69070ec257c1f985f128de47ee97eab 192.168.234.131:7002
   slots:[5461-10922] (5462 slots) master
M: 44b601c14c7f3ab477e51045640d3e2d2dfd9271 192.168.234.131:7003
   slots:[10923-16383] (5461 slots) master
S: 01b67c84c39dd98ca4cf14c3db1853494c667cbe 192.168.234.131:8001
   replicates 44b601c14c7f3ab477e51045640d3e2d2dfd9271
S: ba93a8419a73a1c5cd2ae57ed4c584ce33530164 192.168.234.131:8002
   replicates 82d6ad26c1d83f551fc3b2a5083cd9919052eddd
S: d14f67067c78c815d71b35caeebeb1366c7ff220 192.168.234.131:8003
   replicates 3043457cd69070ec257c1f985f128de47ee97eab
Can I set the above configuration? (type 'yes' to accept):

输出说明

插槽分配:

Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383

这里指是是每个Redis的插槽数量

主从关系:

Adding replica 192.168.234.131:8002 to 192.168.234.131:7001
Adding replica 192.168.234.131:8003 to 192.168.234.131:7002
Adding replica 192.168.234.131:8001 to 192.168.234.131:7003
  • 192.168.234.131:700170027003 被选为主节点(Master)
  • 192.168.234.131:800180028003 被分配为从节点(Replica/Slave)

节点信息:

M: 82d6ad26c1d83f551fc3b2a5083cd9919052eddd 192.168.234.131:7001
   slots:[0-5460] (5461 slots) master
  • M指的是主节点,S是从节点
  • 字母后面的第一串字符串代表的是该实例的ID
  • replicates 后的代表主实例的ID

确认无误后输入yes将会自动创建集群。

四、集群管理

查看集群状态

redis-cli -p 7001 cluster nodes

测试集群功能

# 连接集群
redis-cli -c -p 7001

# 存储数据
set num 123

# 读取数据
get num

# 再次存储
set a 1

五、使用脚本一键执行 搭建分片集群

使用AI基于以上步骤生成的自动化脚本:

#!/bin/bash
# setup-redis-cluster.sh
# 一键交互式部署 Redis 集群(手动确认创建集群,可自定义根目录,统一 emoji 风格)

set -e

echo "==============================="
echo "🧩 Redis 集群自动部署脚本"
echo "==============================="

# === 交互式输入 ===
read -rp "🌐 请输入本机 IP:" CLUSTER_IP
if [ -z "$CLUSTER_IP" ]; then
  echo "❌ IP 不能为空!"
  exit 1
fi

read -rp "🔢 请输入节点总数量(例如 6):" NODE_COUNT
if ! [[ "$NODE_COUNT" =~ ^[0-9]+$ ]] || [ "$NODE_COUNT" -lt 3 ]; then
  echo "❌ 节点数量必须为整数且 >= 3"
  exit 1
fi

read -rp "📝 请输入每个主节点的副本数量(例如 1):" REPLICA_COUNT
if ! [[ "$REPLICA_COUNT" =~ ^[0-9]+$ ]]; then
  echo "❌ 副本数量必须为整数"
  exit 1
fi

read -rp "⚙️ 请输入端口起始号(例如 7001):" START_PORT
if ! [[ "$START_PORT" =~ ^[0-9]+$ ]]; then
  echo "❌ 起始端口必须为整数"
  exit 1
fi

read -rp "📂 请输入 Redis 根目录(默认 /home/redis):" BASE_DIR
BASE_DIR=${BASE_DIR:-/home/redis}  # 默认值

# === 配置信息确认 ===
echo ""
echo "📋 配置信息确认:"
echo "  🌐 IP 地址         :$CLUSTER_IP"
echo "  🔢 节点数量         :$NODE_COUNT"
echo "  📝 每主节点副本数   :$REPLICA_COUNT"
echo "  ⚙️ 端口起始号       :$START_PORT"
echo "  📂 根目录           :$BASE_DIR"
echo "==============================="
read -rp "✅ 确认继续?(y/n): " CONFIRM
[ "$CONFIRM" != "y" ] && echo "❌ 已取消。" && exit 0

# === 生成端口列表 ===
PORTS=()
for ((i = 0; i < NODE_COUNT; i++)); do
  PORTS+=($((START_PORT + i)))
done

# === 创建 Redis 节点目录与配置 ===
echo ""
echo "📁 创建 Redis 节点目录与配置..."
mkdir -p "$BASE_DIR"
for port in "${PORTS[@]}"; do
  dir="$BASE_DIR/$port"
  mkdir -p "$dir"

  cat > "$dir/redis.conf" <<EOF
port $port
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
dir $dir
bind 0.0.0.0
daemonize yes
cluster-announce-ip $CLUSTER_IP
protected-mode no
databases 1
logfile $dir/run.log
EOF

  echo "✅ 已生成配置:$dir/redis.conf"
done

# === 启动 Redis 实例 ===
echo ""
echo "🚀 启动 Redis 实例..."
for port in "${PORTS[@]}"; do
  redis-server "$BASE_DIR/$port/redis.conf"
done

# 根据节点数量调整等待时间
WAIT_TIME=$((NODE_COUNT))
echo ""
echo "⏳ 等待节点启动中(约 $WAIT_TIME 秒)..."
sleep "$WAIT_TIME"

# === 手动确认创建集群 ===
echo ""
echo "📌 即将创建 Redis 集群"
HOST_PORTS=$(for p in "${PORTS[@]}"; do echo -n "$CLUSTER_IP:$p "; done)
echo "📋 节点列表:$HOST_PORTS"
echo "📋 副本数量:$REPLICA_COUNT"
read -rp "✅ 请确认是否创建集群?输入 yes 开始创建: " CLUSTER_CONFIRM

if [ "$CLUSTER_CONFIRM" = "yes" ]; then
  redis-cli --cluster create $HOST_PORTS --cluster-replicas $REPLICA_COUNT
  echo ""
  echo "🎉 Redis 集群创建完成!"
  echo "📂 节点目录位于:$BASE_DIR"
else
  echo "❌ 已取消集群创建。"
fi