如何通过两台服务器完成六个节点的redis缓存。Redis Cluster(3主3从)完整部署文档

Redis Cluster(3主3从)完整部署文档

一、环境说明
  • 服务器A:192.168.0.4(部署节点1、2、3)

  • 服务器B:192.168.0.7(部署节点4、5、6)

  • 节点规划:

    服务器 节点ID 角色 服务端口 总线端口 容器名
    192.168.0.4 node1 主节点 6379 16379 redis-node1-4
    192.168.0.4 node2 主节点 6380 16380 redis-node2-4
    192.168.0.4 node3 从节点 6381 16381 redis-node3-4
    192.168.0.7 node4 主节点 6379 16379 redis-node4-7
    192.168.0.7 node5 从节点 6380 16380 redis-node5-7
    192.168.0.7 node6 从节点 6381 16381 redis-node6-7
二、服务器A(192.168.0.4)配置
1. 创建目录结构
bash 复制代码
mkdir -p /data/redis-cluster/{node1,node2,node3}
cd /data/redis-cluster
2. 编写Redis配置文件

node1/redis.conf(主节点):

conf 复制代码
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"

# Cluster配置
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.4
cluster-announce-port 6379
cluster-announce-bus-port 16379

# 持久化
appendonly yes
appendfsync everysec

node2/redis.conf(主节点):

conf 复制代码
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.4
cluster-announce-port 6380
cluster-announce-bus-port 16380

appendonly yes
appendfsync everysec

node3/redis.conf(从节点):

conf 复制代码
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.4
cluster-announce-port 6381
cluster-announce-bus-port 16381

appendonly yes
appendfsync everysec
3. 编写docker-compose.yml
yaml 复制代码
version: '3.8'

services:
  # 节点1(主)
  redis-node1:
    image: redis:7.2-alpine
    container_name: redis-node1-4
    restart: always
    ports:
      - "6379:6379"
      - "16379:16379"
    volumes:
      - ./node1/data:/data
      - ./node1/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net
    sysctls:
      - net.core.somaxconn=1024

  # 节点2(主)
  redis-node2:
    image: redis:7.2-alpine
    container_name: redis-node2-4
    restart: always
    ports:
      - "6380:6379"
      - "16380:16379"
    volumes:
      - ./node2/data:/data
      - ./node2/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net
    depends_on:
      - redis-node1

  # 节点3(从)
  redis-node3:
    image: redis:7.2-alpine
    container_name: redis-node3-4
    restart: always
    ports:
      - "6381:6379"
      - "16381:16379"
    volumes:
      - ./node3/data:/data
      - ./node3/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net
    depends_on:
      - redis-node2

networks:
  redis-net:
    driver: bridge
4. 启动节点
bash 复制代码
docker-compose up -d
三、服务器B(192.168.0.7)配置
1. 创建目录结构
bash 复制代码
mkdir -p /data/redis-cluster/{node4,node5,node6}
cd /data/redis-cluster
2. 编写Redis配置文件

node4/redis.conf(主节点):

conf 复制代码
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.7
cluster-announce-port 6379
cluster-announce-bus-port 16379

appendonly yes
appendfsync everysec

node5/redis.conf(从节点):

conf 复制代码
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.7
cluster-announce-port 6380
cluster-announce-bus-port 16380

appendonly yes
appendfsync everysec

node6/redis.conf(从节点):

conf 复制代码
bind 0.0.0.0
port 6379
daemonize no
logfile ""
dir /data
requirepass "ZkhwRS321"
masterauth "ZkhwRS321"

cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
cluster-announce-ip 192.168.0.7
cluster-announce-port 6381
cluster-announce-bus-port 16381

appendonly yes
appendfsync everysec
3. 编写docker-compose.yml
yaml 复制代码
version: '3.8'

services:
  # 节点4(主)
  redis-node4:
    image: redis:7.2-alpine
    container_name: redis-node4-7
    restart: always
    ports:
      - "6379:6379"
      - "16379:16379"
    volumes:
      - ./node4/data:/data
      - ./node4/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net
    sysctls:
      - net.core.somaxconn=1024

  # 节点5(从)
  redis-node5:
    image: redis:7.2-alpine
    container_name: redis-node5-7
    restart: always
    ports:
      - "6380:6379"
      - "16380:16379"
    volumes:
      - ./node5/data:/data
      - ./node5/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net
    depends_on:
      - redis-node4

  # 节点6(从)
  redis-node6:
    image: redis:7.2-alpine
    container_name: redis-node6-7
    restart: always
    ports:
      - "6381:6379"
      - "16381:16379"
    volumes:
      - ./node6/data:/data
      - ./node6/redis.conf:/etc/redis/redis.conf
    command: redis-server /etc/redis/redis.conf
    networks:
      - redis-net
    depends_on:
      - redis-node5

networks:
  redis-net:
    driver: bridge
4. 启动节点
bash 复制代码
docker-compose up -d
四、初始化3主3从集群
1. 执行集群创建命令(任意服务器执行)
bash 复制代码
docker exec -it redis-node1-4 redis-cli -a ZkhwRS321 --cluster create \
192.168.0.4:6379 \
192.168.0.4:6380 \
192.168.0.4:6381 \
192.168.0.7:6379 \
192.168.0.7:6380 \
192.168.0.7:6381 \
--cluster-replicas 1 \
--cluster-yes
2. 命令说明
  • --cluster-replicas 1:自动为每个主节点分配1个从节点;
  • --cluster-yes:自动确认集群配置;
  • 执行后Redis会自动分配哈希槽(3主节点各持5461/5461/5462个槽位),并将3个从节点关联到主节点。
五、验证集群状态
1. 检查集群健康
bash 复制代码
docker exec -it redis-node1-4 redis-cli -a ZkhwRS321 cluster info

输出cluster_state:ok表示集群正常。

2. 查看节点角色
bash 复制代码
docker exec -it redis-node1-4 redis-cli -a ZkhwRS321 cluster nodes

输出中会显示:

  • 3个节点标记为master(主节点),各持有哈希槽;
  • 3个节点标记为slave(从节点),并关联到对应主节点。
当你看到这一步,那么恭喜你,成功建立集群
六、配置Nginx统一入口(8015端口)
1. 服务器A创建Nginx配置
bash 复制代码
mkdir -p /data/redis-cluster/nginx

nginx/nginx.conf

nginx 复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

# Redis TCP协议代理(移除错误的keepalive指令)
stream {
    upstream redis-cluster {
        server 192.168.0.4:6379;   # 主节点1
        server 192.168.0.7:6379;   # 主节点2
        server 192.168.0.4:6380;   # 主节点3
    }

    server {
        listen 18888;
        proxy_pass redis-cluster;
        proxy_timeout 30s;
        proxy_connect_timeout 5s;
    }
}

# 关闭HTTP服务
http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        return 403 "Forbidden";
    }
}
2. 修改docker-compose.yml添加Nginx服务
yaml 复制代码
services:
  # 新增Nginx服务
  nginx-proxy:
    image: nginx:latest
    container_name: redis-nginx-4
    restart: always
    ports:
      - "8115:18888"
    volumes:
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    networks:
      - redis-net
3. 启动Nginx
bash 复制代码
docker-compose up -d 
七、故障测试
1. 模拟主节点故障
bash 复制代码
docker stop redis-node1-4  # 停止服务器A的主节点
2. 验证自动切换
bash 复制代码
docker exec -it redis-node2-4 redis-cli -a ZkhwRS321 cluster nodes

查看原从节点是否晋升为主节点。

八、客户端访问示例(Python)
python 复制代码
from rediscluster import RedisCluster

startup_nodes = [{"host": "192.168.0.4", "port": 8015}]
rc = RedisCluster(
    startup_nodes=startup_nodes,
    password="ZkhwRS321",
    decode_responses=True,
    skip_full_coverage_check=True
)

rc.set("test_key", "hello_redis_cluster")
print(rc.get("test_key"))

注意事项

  1. 所有节点密码必须一致(requirepass/masterauth);
  2. 开放端口:6379-6381、16379-16381、8015;
  3. 生产环境建议增加节点内存限制(maxmemory 4g)和垃圾回收策略(maxmemory-policy allkeys-lru)。

此文档涵盖从节点配置、集群初始化、高可用验证到业务接入的全流程,可直接落地部署!

相关推荐
韩立学长1 小时前
基于Springboot儿童福利院规划管理系统o292y1v8(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
可爱又迷人的反派角色“yang”1 小时前
Mysql数据库(二)
运维·服务器·前端·数据库·mysql·nginx·云计算
kkkkkkkkl241 小时前
数据库系统概论
数据库·oracle
从零开始学习人工智能1 小时前
PDF解析双雄对决:Unstructured vs PyMuPDF 深度对比与选型指南
数据库·人工智能·机器学习
W***83201 小时前
SQL 中UPDATE 和 DELETE 语句的深入理解与应用
数据库·sql
找不到、了1 小时前
关于Redis的List 到 Stream:下一代轻量级消息队列
redis
凌~风1 小时前
001-计算机实验报告之数据库原理实验报告
数据库·sql
m***56721 小时前
MySQL 创建新用户及授予权限的完整流程
数据库·mysql
马克学长1 小时前
SSM散酒营销系统w5at6(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·企业信息化·ssm 框架·散酒营销系统