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-serverredis-cliredis-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
相关推荐
chxii1 小时前
在 Spring Boot 中,MyBatis 的“自动提交”行为解析
java·数据库·mybatis
wind_one12 小时前
13.基础--SQL--DQL-聚合函数
数据库·sql
猿小喵2 小时前
浅谈MySQL的redo日志
数据库·mysql
陳陈陳2 小时前
AIGC 时代,用自然语言操作数据库:SQLite + LLM 的轻量级实践
前端·数据库·python
知其然亦知其所以然2 小时前
别再被问住!Redis Cluster 一文彻底讲透(Java 面试必背)
redis·后端·面试
AI绘画小333 小时前
【网络安全】Wireshark 抓包过滤:源 / 目的 IP 过滤 + 命令大全
数据库·tcp/ip·测试工具·安全·web安全·wireshark
007php0073 小时前
Redis面试题解析:Redis的数据过期策略
java·网络·redis·缓存·面试·职场和发展·php
数据知道3 小时前
FastAPI项目:构建打字速度测试网站(MySQL版本)
数据库·python·mysql·fastapi·python项目
y***54884 小时前
GitLab CI缓存配置
缓存·ci/cd·gitlab