10 集群

目录

[10 集群](#10 集群)

[10.1 概述](#10.1 概述)

[(1)分片存储:3 个主节点 "分工存数据"(不是全量复制,即不是把一个节点的所有数据,完整地拷贝到另一个节点)](#(1)分片存储:3 个主节点 “分工存数据”(不是全量复制,即不是把一个节点的所有数据,完整地拷贝到另一个节点))

比如:

注:

区别:

[(2)主从架构:每个主节点配 1 个从节点](#(2)主从架构:每个主节点配 1 个从节点)

[(3)去中心化:3 个主节点 "地位平等"](#(3)去中心化:3 个主节点 “地位平等”)

[10.2 示例](#10.2 示例)

创建集群目录结构

注:


10 集群

10.1 概述

下面以3主3从的节点为例

  1. Redis 集群的本质

    Redis 集群 = 数据分片存储(3 个主节点分不同数据) + 主从备份(每个主节点配 1 个从节点兜底) + 无中心协作(节点间平等通信)

核心目的:既解决单 Redis 存不下大量数据的问题,又解决单 Redis 挂了业务就崩的问题。

  1. 三大核心特性
(1)分片存储:3 个主节点 "分工存数据"(不是全量复制,即不是把一个节点的所有数据,完整地拷贝到另一个节点)

把所有要存的数据,按规则分成 16384 份(叫 "哈希槽"),3 个主节点各分一部分槽位,只存自己负责的那部分数据。

比如:
  • 主节点 7001:存第 0~5460 号槽位的数据(比如用户 ID 1-1000 的信息);
  • 主节点 7002:存第 5461~10922 号槽位的数据(比如用户 ID 1001-2000 的信息);
  • 主节点 7003:存第 10923~16383 号槽位的数据(比如用户 ID 2001-3000 的信息);
注:
  • 哈希槽是通过固定公式自动计算,且集群创建时会自动均分槽位给主节点,全程无需人工干预。但是也可以手动改。

  • 比如:当你执行set user:1000 zhangsan时,Redis 会用以下公式计算这个 key 该存在哪个槽位:

    槽位编号 = CRC16(key) % 16384

① CRC16(key):把 key(比如user:1000)转换成一个数字(比如假设算出来是 5000);
② % 16384:用这个数字除以 16384 取余数(5000 ÷ 16384 余 5000);
③ 余数 5000 落在 7001 的 0-5460 范围内 → 这个数据就存在 7001 上;

区别:
  • 主从复制是 "从节点全量拷贝主节点数据",而集群的主节点之间是 "分工存不同数据",每个主节点只存一部分。
(2)主从架构:每个主节点配 1 个从节点

3 个主节点(7001/7002/7003)各配 1 个从节点(7004/7005/7006),从节点的作用就是 "备份 + 兜底":

  • 备份:从节点会全量复制对应主节点的数据(比如 7004 复制 7001 的所有数据);
  • 兜底:如果 7001 崩了,7004 会自动顶替 7001 的位置,继续提供服务,业务不会中断;
    区别: "主从复制" 是集群的 "高可用基础",集群只是把单组主从扩展成了多组,且多组主节点分工存不同数据。
(3)去中心化:3 个主节点 "地位平等"

集群里没有 "总控节点",3 个主节点地位完全一样:

  • 节点间通过 "Gossip 协议"(可以理解成 "微信群聊")互相同步信息:比如 7001 知道 7002 存哪些数据、7003 是否活着;
  • 客户端访问任意节点都能拿到所有数据:比如你连 7001 查 7002 的数,7001 会告诉你 "这个数据在 7002,我帮你转过去";
    如果有中心节点(比如一个 "总节点" 管所有),总节点崩了整个集群就瘫了,去中心化就是为了避免这个问题。
  1. 核心点

|---------|--------------------|------------------------------------------------------|
| 知识点 | 总结 | 具体 |
| 集群最小规模 | 3 主 3 从(最少 3 个主节点) | Redis 集群最小需要 3 主 3 从共 6 个节点,3 个主节点保证分片存储,3 个从节点保证高可用 |
| 哈希槽的作用 | 给数据分 "编号",按编号分配 | 集群把数据分成 16384 个哈希槽,按 CRC16(键名)%16384 算编号,分配给不同主节点 |
| 主从的作用 | 主节点存数据,从节点当备胎 | 主节点负责读写数据,从节点复制主节点数据;主节点故障时,从节点自动升级为主节点 |
| 去中心化的好处 | 没有单点故障,节点平等 | 节点间通过 Gossip 协议通信,无中心节点,任意主节点崩了不影响集群整体通信 |

  1. 实践注意点
  • 不能跨主节点查多键:比如同时查 "用户 1000" 和 "用户 1001"(分别存在 7001 和 7002),直接查会报错,必须让两个键落在同一个主节点(比如给键加统一前缀:user:{1000}、user:{1001});
  • 集群里只能用 db0:不能用SELECT 1切换数据库,所有数据都存在默认库;
  • 事务不能跨节点:比如想给 7001 和 7002 的数同时执行事务,做不到,只能在单个主节点内执行。

10.2 示例

所有步骤均适配 Redis 5.0.14(弃用 redis-trib.rb,改用 redis-cli --cluster),基于云服务器环境,使用后台启动。

  1. 环境前置准备(无需 ruby 环境,Redis5.0 + 内置集群命令)

    #1. 确认Redis 5.0.14安装目录(以实际路径为准)
    #示例路径:/usr/local/src/redis/redis-5.0.14
    #2. 关闭防火墙/selinux(可选,避免端口拦截)
    systemctl stop firewalld && systemctl disable firewalld
    setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

  2. 集群目录与节点配置

创建集群目录结构
复制代码
#创建根目录+7001-7006节点目录(含数据/日志目录)
mkdir -p /usr/local/redis-cluster/700{1..6}/{data,logs}
cd /usr/local/redis-cluster  # 进入集群根目录

生成 7001-7006 节点配置文件

复制代码
#循环生成配置文件(一起复制,无需拆分)
for i in {1..6}
do
cat > 700${i}/redis.conf <<EOF
#核心配置
daemonize yes                    # 后台启动(关键)
port 700${i}                     # 节点端口
cluster-enabled yes              # 开启集群模式
cluster-config-file cluster-nodes-700${i}.conf  # 集群配置文件
cluster-node-timeout 15000       # 集群节点超时时间
appendonly yes                   # 开启AOF持久化
bind 0.0.0.0                     # 绑定所有IP(云服务器必改)
protected-mode no                # 关闭保护模式
requirepass LSL03699             # 访问密码
masterauth LSL03699              # 集群节点间认证密码
#持久化相关
dbfilename dump-700${i}.rdb
logfile /usr/local/redis-cluster/700${i}/logs/redis.log
pidfile /usr/local/redis-cluster/700${i}/data/redis.pid
dir /usr/local/redis-cluster/700${i}/data
appendfilename "appendonly-700${i}.aof"
EOF
done

复制 Redis 5.0.14 核心可执行文件到集群目录

复制代码
#替换为你的Redis 5.0.14源码src目录路径
cp /usr/local/src/redis/redis-5.0.14/src/redis-server ./
cp /usr/local/src/redis/redis-5.0.14/src/redis-cli ./
#给文件加执行权限
chmod +x ./redis-server ./redis-cli
  1. 编写 cluster.sh 启动脚本(适配后台启动 + 解决 GitLab 干扰)

    cat > cluster.sh <<EOF
    #!/bin/bash
    if [ "$1" = "start" ]; then
    #先清理残留进程(避免端口占用)
    pkill -9 redis-server > /dev/null 2>&1
    #循环后台启动7001-7006(适配daemonize yes)
    for port in 7001 7002 7003 7004 7005 7006
    do
    ./redis-server ./${port}/redis.conf
    done
    echo "6个Redis节点后台启动完成!"
    elif [ "$1" = "stop" ]; then
    ./redis-cli -a LSL03699 shutdown all > /dev/null 2>&1
    pkill -9 redis-server > /dev/null 2>&1
    echo "所有Redis节点已停止!"
    elif [ "$1" = "status" ]; then
    echo "当前Redis集群节点进程:"
    ps -ef | grep redis-server | grep -E "7001|7002|7003|7004|7005|7006" | grep -v grep
    else
    echo "用法:./cluster.sh start|stop|status"
    fi
    EOF

  2. 脚本赋权 + 启动节点

    #1. 给脚本加执行权限
    chmod 777 cluster.sh
    #2. 启动所有节点
    ./cluster.sh start 7001
    #3. 验证启动结果(必须看到7001-7006进程)
    ./cluster.sh status

注:

如果执行启动命令后无进程 ,需要确认配置文件的daemonize值,检查脚本是否匹配。

复制代码
#若启动后无进程,执行以下修正(一键执行)
cd /usr/local/redis-cluster
for port in 7001 7002 7003 7004 7005 7006
do
#确保配置文件参数正确
sed -i "s/daemonize no/daemonize yes/g" ./${port}/redis.conf
sed -i "s/bind .*/bind 0.0.0.0/g" ./${port}/redis.conf
sed -i "s/protected-mode yes/protected-mode no/g" ./${port}/redis.conf
#确保目录权限
mkdir -p ./${port}/data && chmod 777 ./${port}/data
done
#重新启动
pkill -9 redis-server
./cluster.sh start 7001
  1. 创建集群(3 主 3 从)

    cd /usr/local/redis-cluster
    #--cluster-replicas 1 就是"每1个主节点对应1个从节点",6个节点会自动分配为3主3从
    ./redis-cli -a LSL03699 --cluster create 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 --cluster-replicas 1

  1. 验证集群节点角色(确认 3 主 3 从)

    #以集群方式登录7001节点
    ./redis-cli -c -h 127.0.0.1 -p 7001 -a LSL03699
    #查看集群节点信息
    cluster nodes
    #查看集群状态
    cluster info

相关推荐
好家伙VCC1 小时前
# 发散创新:基于Python的轻量级测试框架设计与实践 在现代软件开发中,**自动化
java·开发语言·python·自动化
李老师的Java笔记1 小时前
深度解析 | SpringBoot源码解析系列(五):@ConfigurationProperties | 配置绑定核心原理+实战避坑
java·spring boot·后端
TDengine (老段)1 小时前
TDengine IDMP 数据可视化 7. 事件列表
大数据·数据库·人工智能·物联网·时序数据库·tdengine·涛思数据
❀͜͡傀儡师2 小时前
SpringBoot 4.0新特性Resilience重试机制和并发限制
java·spring boot·spring
NGC_66112 小时前
Java异常体系
开发语言·python
SQL必知必会2 小时前
SQL 条件聚合:超越基础 GROUP BY
数据库·sql
knighthood20012 小时前
PCL1.14.0+VTK9.3.0+Qt5.15.2实现加载点云遇到的问题解决
开发语言·qt
hacklf20082 小时前
数据库高安全—openGauss安全整体架构&安全认证
数据库·安全·架构
全栈前端老曹2 小时前
【Redis】 监控与慢查询日志 —— slowlog、INFO 命令、RedisInsight 可视化监控
前端·数据库·redis·缓存·全栈·数据库监控·slowlog