Redis集群部署方案

Posted by     "zengchengjie" on Sunday, January 4, 2026

Redis集群部署方案

一台云服务器上部署Redis集群,让云服务器上的Java程序你本地电脑的Java程序都能访问。以下是完整的解决方案:

1. Docker Compose 配置文件

# docker-compose-redis-cloud.yml
version: '3.8'

services:
  redis-node-1:
    image: redis:7.2-alpine
    container_name: redis-node-1
    restart: always
    ports:
      - "7001:7001"      # Redis服务端口
      - "17001:17001"    # 集群总线端口
    volumes:
      - ./data/redis-7001:/data
      - ./conf/redis-7001.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-network  # 只保留网络名称,去掉IP
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "7001", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis-node-2:
    image: redis:7.2-alpine
    container_name: redis-node-2
    restart: always
    ports:
      - "7002:7002"
      - "17002:17002"
    volumes:
      - ./data/redis-7002:/data
      - ./conf/redis-7002.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-network  # 只保留网络名称,去掉IP
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "7002", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis-node-3:
    image: redis:7.2-alpine
    container_name: redis-node-3
    restart: always
    ports:
      - "7003:7003"
      - "17003:17003"
    volumes:
      - ./data/redis-7003:/data
      - ./conf/redis-7003.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-network  # 只保留网络名称,去掉IP
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "7003", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis-node-4:
    image: redis:7.2-alpine
    container_name: redis-node-4
    restart: always
    ports:
      - "7004:7004"
      - "17004:17004"
    volumes:
      - ./data/redis-7004:/data
      - ./conf/redis-7004.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-network  # 只保留网络名称,去掉IP
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "7004", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis-node-5:
    image: redis:7.2-alpine
    container_name: redis-node-5
    restart: always
    ports:
      - "7005:7005"
      - "17005:17005"
    volumes:
      - ./data/redis-7005:/data
      - ./conf/redis-7005.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-network  # 只保留网络名称,去掉IP
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "7005", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

  redis-node-6:
    image: redis:7.2-alpine
    container_name: redis-node-6
    restart: always
    ports:
      - "7006:7006"
      - "17006:17006"
    volumes:
      - ./data/redis-7006:/data
      - ./conf/redis-7006.conf:/usr/local/etc/redis/redis.conf
    command: redis-server /usr/local/etc/redis/redis.conf
    networks:
      - redis-cluster-network  # 加入同一个网络
    healthcheck:
      test: ["CMD", "redis-cli", "-p", "7006", "ping"]
      interval: 30s
      timeout: 10s
      retries: 3

networks:
  redis-cluster-network:  # 网络定义保持不变
    driver: bridge
    # 删除 ipam 配置,让Docker自动管理IP

2. 一键部署脚本(在云服务器上执行)

#!/bin/bash
# deploy-redis-cloud.sh

set -e

echo "🚀 开始部署云服务器Redis集群..."

# 1. 获取云服务器公网IP
echo "📡 获取服务器IP地址..."
PUBLIC_IP=$(curl -s --max-time 5 ifconfig.me || curl -s --max-time 5 ipinfo.io/ip)
if [ -z "$PUBLIC_IP" ]; then
    # 尝试获取内网IP
    PUBLIC_IP=$(hostname -I | awk '{print $1}')
    if [ -z "$PUBLIC_IP" ]; then
        PUBLIC_IP="127.0.0.1"
    fi
fi

echo "✅ 服务器IP地址: $PUBLIC_IP"
echo "请确认这是你的公网IP(如果是内网IP,请手动修改)"
read -p "按回车继续,或 Ctrl+C 取消..." 

# 2. 创建目录结构
echo "📁 创建目录结构..."
mkdir -p {conf,data,scripts,backup}
mkdir -p data/redis-{7001..7006}

# 3. 生成Redis配置文件
echo "⚙️  生成Redis配置文件..."

for port in 7001 7002 7003 7004 7005 7006; do
    cat > conf/redis-${port}.conf << EOF
# 基础配置
port ${port}
bind 0.0.0.0
protected-mode no
daemonize no

# 认证配置(生产环境建议使用强密码)
requirepass "RedisCloud@2024"
masterauth "RedisCloud@2024"

# 持久化配置
appendonly yes
appendfsync everysec
dir /data
dbfilename dump-${port}.rdb
save 900 1
save 300 10
save 60 10000

# 集群配置 - 关键!使用公网IP让外部能访问
cluster-enabled yes
cluster-config-file nodes-${port}.conf
cluster-node-timeout 15000
cluster-require-full-coverage yes
cluster-announce-ip ${PUBLIC_IP}      # 这里用公网IP
cluster-announce-port ${port}
cluster-announce-bus-port 1${port}

# 内存和性能配置
maxmemory 2gb
maxmemory-policy allkeys-lru
maxclients 10000
timeout 0
tcp-keepalive 300
tcp-backlog 511

# 慢查询日志
slowlog-log-slower-than 10000
slowlog-max-len 128

# 日志配置
loglevel notice
logfile "/data/redis-${port}.log"

# 连接限制(可选)
# maxmemory-samples 5
# replica-read-only yes
EOF
    echo "✅ 生成配置文件: conf/redis-${port}.conf"
done

# 4. 创建数据目录权限
echo "🔧 设置目录权限..."
chmod -R 777 data/

# 5. 检查防火墙/安全组
echo "🔥 检查防火墙配置..."
echo "================================================"
echo "⚠️  重要:请确保云服务器安全组已开放以下端口:"
echo "  7001-7006 (Redis服务端口)"
echo "  17001-17006 (集群总线端口)"
echo "================================================"
read -p "确认端口已开放?按回车继续..."

# 6. 启动Docker容器
echo "🐳 启动Docker容器..."
docker-compose -f docker-compose-redis-cloud.yml up -d

# 7. 等待容器启动
echo "⏳ 等待容器启动..."
sleep 10

# 8. 创建Redis集群
echo "🔗 创建Redis集群(三主三从)..."
NODES=""
for port in 7001 7002 7003 7004 7005 7006; do
    NODES="${NODES} ${PUBLIC_IP}:${port}"
done

echo "集群节点: ${NODES}"

# 执行集群创建命令
docker exec redis-node-1 redis-cli -a "RedisCloud@2024" --cluster create \
    ${NODES} \
    --cluster-replicas 1 \
    --cluster-yes

echo "✅ Redis集群创建完成!"

# 9. 验证集群状态
echo "📊 验证集群状态..."
sleep 5

cat > scripts/check-cluster.sh << 'CHECK_EOF'
#!/bin/bash
echo "1. 集群节点信息:"
docker exec redis-node-1 redis-cli -a "RedisCloud@2024" -p 7001 cluster nodes | head -10

echo -e "\n2. 集群状态:"
docker exec redis-node-1 redis-cli -a "RedisCloud@2024" -p 7001 cluster info | grep -E "(cluster_state|cluster_slots_assigned|cluster_known_nodes)"

echo -e "\n3. 测试数据操作:"
docker exec redis-node-1 redis-cli -a "RedisCloud@2024" -p 7001 -c set "test:$(date +%s)" "success"
docker exec redis-node-2 redis-cli -a "RedisCloud@2024" -p 7002 -c get "test:*"
CHECK_EOF

chmod +x scripts/check-cluster.sh
./scripts/check-cluster.sh

# 10. 生成连接信息
cat > connection-info.txt << INFO_EOF
===============================================
✅ Redis集群部署成功!
===============================================

📌 服务器信息:
公网IP: ${PUBLIC_IP}
Redis密码: RedisCloud@2024

🔌 连接方式:
1. 从云服务器内部连接:
   redis-cli -c -a RedisCloud@2024 -h 127.0.0.1 -p 7001

2. 从本地电脑连接(使用公网IP):
   redis-cli -c -a RedisCloud@2024 -h ${PUBLIC_IP} -p 7001

3. Spring Boot 配置:
spring:
  redis:
    cluster:
      nodes:
        - ${PUBLIC_IP}:7001
        - ${PUBLIC_IP}:7002
        - ${PUBLIC_IP}:7003
        - ${PUBLIC_IP}:7004
        - ${PUBLIC_IP}:7005
        - ${PUBLIC_IP}:7006
      max-redirects: 3
    password: RedisCloud@2024
    timeout: 5000ms

4. Java客户端代码:
   JedisCluster jedisCluster = new JedisCluster(
       new HostAndPort("${PUBLIC_IP}", 7001),
       new HostAndPort("${PUBLIC_IP}", 7002),
       new HostAndPort("${PUBLIC_IP}", 7003),
       5000, 5000, 3, "RedisCloud@2024", new GenericObjectPoolConfig<>()
   );

🛠️ 管理命令:
# 检查集群状态
docker exec redis-node-1 redis-cli -a RedisCloud@2024 --cluster check ${PUBLIC_IP}:7001

# 查看集群节点
docker exec redis-node-1 redis-cli -a RedisCloud@2024 -p 7001 cluster nodes

# 停止集群
docker-compose -f docker-compose-redis-cloud.yml down

# 启动集群
docker-compose -f docker-compose-redis-cloud.yml up -d

⚠️  安全提醒:
1. 定期修改默认密码
2. 开启云服务器防火墙,只允许必要IP访问
3. 定期备份数据: docker exec redis-node-1 redis-cli -a RedisCloud@2024 bgsave

===============================================
INFO_EOF

echo ""
echo "✨ 部署完成!"
echo "详细连接信息已保存到: connection-info.txt"
echo ""
echo "🔍 快速测试本地连接:"
echo "redis-cli -c -a RedisCloud@2024 -h ${PUBLIC_IP} -p 7001"
echo ""
echo "如果连接失败,请检查:"
echo "1. 云服务器安全组是否开放端口"
echo "2. 本地网络是否能访问该IP"
echo "3. 防火墙是否允许Redis连接"

3. 本地电脑测试脚本

在你本地电脑上创建测试脚本:

#!/bin/bash
# test-local-connection.sh

# 请修改为你的云服务器公网IP
SERVER_IP="你的云服务器公网IP"
PASSWORD="RedisCloud@2024"

echo "测试从本地连接到云服务器Redis集群..."

# 测试连接
echo "1. 测试连接到节点1:"
redis-cli -c -a ${PASSWORD} -h ${SERVER_IP} -p 7001 ping

echo -e "\n2. 测试写入数据:"
redis-cli -c -a ${PASSWORD} -h ${SERVER_IP} -p 7001 set "local_test_$(date +%s)" "from_local_machine"

echo -e "\n3. 测试读取数据:"
redis-cli -c -a ${PASSWORD} -h ${SERVER_IP} -p 7002 keys "local_test*"

echo -e "\n4. 测试集群信息:"
redis-cli -c -a ${PASSWORD} -h ${SERVER_IP} -p 7003 cluster info | head -10

4. 管理脚本(在云服务器上)

#!/bin/bash
# manage-redis-cluster.sh

SERVER_IP=$(curl -s ifconfig.me || hostname -I | awk '{print $1}')
PASSWORD="RedisCloud@2024"

case "$1" in
    status)
        echo "容器状态:"
        docker-compose -f docker-compose-redis-cloud.yml ps
        echo -e "\n集群状态:"
        docker exec redis-node-1 redis-cli -a ${PASSWORD} -p 7001 cluster info | grep cluster_state
        ;;
        
    check)
        echo "检查集群健康状态..."
        docker exec redis-node-1 redis-cli -a ${PASSWORD} --cluster check ${SERVER_IP}:7001
        ;;
        
    nodes)
        echo "集群节点信息:"
        docker exec redis-node-1 redis-cli -a ${PASSWORD} -p 7001 cluster nodes
        ;;
        
    restart)
        echo "重启集群..."
        docker-compose -f docker-compose-redis-cloud.yml restart
        sleep 5
        docker exec redis-node-1 redis-cli -a ${PASSWORD} -p 7001 cluster info | grep cluster_state
        ;;
        
    stop)
        echo "停止集群..."
        docker-compose -f docker-compose-redis-cloud.yml down
        ;;
        
    start)
        echo "启动集群..."
        docker-compose -f docker-compose-redis-cloud.yml up -d
        ;;
        
    logs)
        docker-compose -f docker-compose-redis-cloud.yml logs -f --tail=50 ${2:-redis-node-1}
        ;;
        
    backup)
        BACKUP_DIR="backup/redis-$(date +%Y%m%d-%H%M%S)"
        mkdir -p ${BACKUP_DIR}
        echo "备份数据到 ${BACKUP_DIR}..."
        for port in 7001 7002 7003 7004 7005 7006; do
            docker exec redis-node-${port: -1} redis-cli -a ${PASSWORD} save
            docker cp redis-node-${port: -1}:/data ${BACKUP_DIR}/redis-${port}
            echo "✅ redis-${port} 备份完成"
        done
        ;;
        
    monitor)
        echo "监控集群实时状态 (Ctrl+C 退出)..."
        watch -n 2 "docker exec redis-node-1 redis-cli -a ${PASSWORD} -p 7001 cluster info | grep -E '(cluster_state|cluster_slots_assigned|cluster_size)'"
        ;;
        
    *)
        echo "用法: $0 [command]"
        echo "命令:"
        echo "  status    查看状态"
        echo "  check     检查集群"
        echo "  nodes     查看节点"
        echo "  restart   重启集群"
        echo "  stop      停止集群"
        echo "  start     启动集群"
        echo "  logs      查看日志"
        echo "  backup    备份数据"
        echo "  monitor   实时监控"
        ;;
esac

5. 部署步骤

在云服务器上执行:

# 1. 上传文件到云服务器
# docker-compose-redis-cloud.yml
# deploy-redis-cloud.sh

# 2. 给脚本执行权限
chmod +x deploy-redis-cloud.sh

# 3. 执行部署脚本
./deploy-redis-cloud.sh

# 4. 查看部署结果
cat connection-info.txt

在你本地电脑上执行:

# 1. 确保本地已安装redis-cli
# macOS: brew install redis
# Ubuntu: sudo apt install redis-tools

# 2. 修改测试脚本中的IP地址
# 编辑 test-local-connection.sh,将SERVER_IP改为你的云服务器IP

# 3. 测试连接
chmod +x test-local-connection.sh
./test-local-connection.sh

6. Spring Boot 配置示例

# application.yml (云服务器上的Java程序)
spring:
  redis:
    cluster:
      nodes:
        - 127.0.0.1:7001
        - 127.0.0.1:7002
        - 127.0.0.1:7003
        - 127.0.0.1:7004
        - 127.0.0.1:7005
        - 127.0.0.1:7006
      max-redirects: 3
    password: RedisCloud@2024
    lettuce:
      pool:
        max-active: 20
        max-idle: 10
        min-idle: 5
# application.yml (你本地电脑的Java程序)
spring:
  redis:
    cluster:
      nodes:
        - 你的云服务器IP:7001
        - 你的云服务器IP:7002
        - 你的云服务器IP:7003
        - 你的云服务器IP:7004
        - 你的云服务器IP:7005
        - 你的云服务器IP:7006
      max-redirects: 3
    password: RedisCloud@2024
    timeout: 10000ms  # 本地连接需要更长的超时时间

关键注意事项

  1. 安全组/防火墙:必须开放7001-7006和17001-17006端口
  2. 密码安全:生产环境请修改默认密码
  3. 网络延迟:本地连接云服务器会有网络延迟,适当调整超时时间
  4. 备份策略:定期备份数据
  5. 监控:建议配置Redis监控

这个配置专门针对你的场景优化,确保云服务器内外部都能正常访问Redis集群。