Ubuntu 上搭建 Redis 3 节点集群(6 实例:3主3从)

Redis集群是Redis官方提供的一种分布式解决方案,旨在通过将数据分散存储在多个节点上来实现高可用性、高性能和可扩展性。

核心原理

  1. 数据分片:

    • Redis集群将整个数据集划分为16384个哈希槽(0~16383)。
    • 每个键通过公式CRC16(key) % 16384计算所属的槽位。
    • 槽位分配:集群启动时,管理员或工具(如redis-cli --cluster)将16384个槽位分配给主节点。例如,3个主节点各分约5461个槽。
    • 槽位映射表:集群维护一个槽位映射表,记录每个槽位由哪个主节点负责。
  2. 节点角色:

    • 主节点(Master):负责存储数据分片的主份,并处理读写请求。同时,参与故障转移投票(选举新主节点)。
    • 从节点(Slave):异步复制主节点的数据,用于故障转移和读写分离。当主节点宕机时,符合条件的从节点可晋升为新主节点,接管原主节点的槽位。
  3. 节点间通信:

    • Gossip协议:Redis集群使用Gossip协议进行节点间的通信和状态更新。每个节点通过一个额外的TCP端口(默认端口号+10000,如16379)进行通信,称为集群总线(Cluster Bus)。
    • 消息类型 :
      • MEET:节点间初次握手。
      • PING/PONG:定期交换状态信息。
      • FAIL:通知其他节点某个节点已下线。
  4. 故障检测与自动故障转移:

    • 故障检测 :节点通过Gossip协议检测其他节点的存活状态。如果某个节点在cluster-node-timeout时间内未响应,会被标记为主观下线(PFail)。当大多数主节点同意某节点已下线时,标记为客观下线(Fail)。
    • 自动故障转移:故障主节点的从节点发起选举(基于Raft算法变种),选出新主节点。新主节点接管原主节点的槽位,并同步数据(全量同步或增量同步)。

客户端路由

  1. 重定向机制:

    • MOVED:槽位已永久迁移到其他节点,客户端更新本地缓存。
    • ASK:槽位正在迁移,客户端临时重定向到目标节点(不更新缓存)。
  2. Smart客户端:

    • 客户端缓存槽位→节点的映射关系,直接访问目标节点。
    • 使用支持Smart客户端的库(如Redisson、Lettuce)可以优化路由效率。

集群特性

  1. 高可用性:

    • 主从复制+故障自动转移,保障业务连续性。
    • 数据冗余备份,当部分节点不可用时,集群仍然可以继续提供服务。
  2. 高性能:

    • 通过多主节点分担请求压力,提升吞吐量。
    • 数据自动分片,实现负载均衡,避免单个节点过载。
  3. 可扩展性:

    • 动态扩容:添加新节点后,通过迁移槽位(CLUSTER SLOTS命令)将数据分布到新节点。
    • 动态缩容:下线节点前需迁移其负责的槽位到其他节点,再通过CLUSTER FORGET命令移除。

部署与运维

  1. 推荐配置:

    • 至少3个主节点+3个从节点(每个主节点一个从节点),以提供更高的可用性和容错能力。
    • 节点间网络稳定,避免Gossip消息延迟导致的故障误判。
  2. 监控与告警:

    • 使用工具(如Redis自带的CLUSTER命令、Prometheus)监控节点状态和槽位分布。
    • 设置合理的告警阈值,及时发现并处理潜在问题。
  3. 备份策略:

    • 定期备份RDB/AOF文件,防止数据丢失。
    • 在异地或不同存储介质上保存备份文件,以提高数据安全性。

一、环境准备

  • 操作系统:Ubuntu 20.04 / 22.04
  • 服务器数量:3 台(IP 示例):
    • node1: 192.168.174.129
    • node2: 192.168.174.130
    • node3: 192.168.174.131
  • 每台服务器开放端口:7000(主)、7001(从)
  • Redis 版本:7.x(推荐)或 6.x(支持集群)

二、在每台服务器上安装 Redis

1. 更新系统 & 安装依赖

复制代码
sudo apt update
sudo apt install -y build-essential tcl wget

2. 下载并编译 Redis(以 Redis 7.2 为例)

复制代码
cd /tmp
wget https://download.redis.io/releases/redis-7.2.4.tar.gz
tar xzf redis-7.2.4.tar.gz
cd redis-7.2.4
make
sudo make install

编译完成后,redis-server、redis-cli、redis-trib.rb(旧版)等命令会安装到 /usr/local/bin/

三、为每台服务器配置两个 Redis 实例(7000 和 7001)

1. 创建目录结构(在每台服务器执行)

复制代码
sudo mkdir -p /etc/redis/{7000,7001}
sudo mkdir -p /var/lib/redis/{7000,7001}

2. 创建配置文件

/etc/redis/7000/redis.conf
复制代码
port 7000
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /var/run/redis_7000.pid
logfile /var/log/redis/redis_7000.log
dir /var/lib/redis/7000
protected-mode no
/etc/redis/7001/redis.conf
复制代码
port 7001
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 5000
appendonly yes
daemonize yes
pidfile /var/run/redis_7001.pid
logfile /var/log/redis/redis_7001.log
dir /var/lib/redis/7001
protected-mode no

⚠️ 注意:确保 bind 包含本机 IP 或 0.0.0.0,否则其他节点无法通信。

3. 创建日志和 PID 目录权限

复制代码
sudo mkdir -p /var/log/redis
sudo chown -R $(whoami):$(whoami) /etc/redis /var/lib/redis /var/log/redis

4. 创建 redis 系统用户

复制代码
sudo adduser --system --group --no-create-home redis

5. 设置目录权限

复制代码
sudo chown -R redis:redis /var/log/redis*

四、启动所有 Redis 实例

在 每台服务器 上执行:

复制代码
sudo redis-server /etc/redis/7000/redis.conf
sudo redis-server /etc/redis/7001/redis.conf

验证是否启动:

复制代码
ps aux | grep redis
netstat -tuln | grep 700

五、创建 Redis 集群

使用任意一台服务器操作即可(需能访问所有 6 个节点)

1. 准备节点列表

6 个节点地址(3 台 × 2 端口):

复制代码
192.168.174.129:7000
192.168.174.129:7001
192.168.174.130:7000
192.168.174.130:7001
192.168.174.131:7000
192.168.174.131:7001

2. 使用 redis-cli 创建集群

复制代码
redis-cli --cluster create \
  192.168.174.129:7000 192.168.174.129:7001 \
  192.168.174.130:7000 192.168.174.130:7001 \
  192.168.174.131:7000 192.168.174.131:7001 \
  --cluster-replicas 1

六、验证集群状态

连接任意节点:

复制代码
redis-cli -c -h 192.168.174.129 -p 7000

执行:

复制代码
cluster info
cluster nodes
相关推荐
时间静止不是简史3 小时前
生产事故排查:Redis 宕机导致补偿队列消费线程死亡,通话录音未上送业务平台
java·redis
2301_32241428046 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
catoop9 小时前
API Key 设计与安全生成方案:结构拆解、数据库设计与 Java 实现
java·数据库·安全
Web极客码9 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
库库的数据库笔记9 小时前
国产信创数据库的MySQL兼容性深度对比解析
大数据·数据库·mysql·oceanbase·政务
microrain10 小时前
SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要
物联网·缓存·golang·sagooiot
姚远Oracle ACE10 小时前
为什么无法连接到 PostgreSQL?
数据库·postgresql
ss27310 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 22 PostgreSQL实例与集群
数据库·笔记·postgresql
ss27310 小时前
AI时代首先数据库-PostgreSQL实战笔记 | 21 PostgreSQL进程与内存架构介绍
数据库·笔记·postgresql