当前位置: 首页 > news >正文

搭建Redis群集模式

Redis 集群模式搭建全攻略:从环境准备到故障处理

在高并发、大数据量的业务场景中,单节点 Redis 面临存储容量有限、性能瓶颈明显、无高可用保障等问题。Redis 集群(Redis Cluster)通过分片存储(将数据分散到多个节点)和自动故障转移(主节点故障时从节点自动升级为主),完美解决了这些痛点,成为生产环境的首选方案。本文将带大家从零开始,一步步完成 Redis 集群的搭建与验证,同时分享关键运维技巧。

一、集群核心原理快速理解

在动手搭建前,先明确 Redis 集群的两个核心概念,避免后续配置时 “知其然不知其所以然”:

  1. 分片机制:Redis 集群将所有数据划分为 16384 个哈希槽(Hash Slot),每个主节点负责一部分槽位(例如 3 个主节点时,可能分别负责 0-5460、5461-10922、10923-16383 槽)。客户端访问时,会根据CRC16(key) % 16384计算键对应的槽位,再路由到对应主节点。
  1. 主从复制与故障转移:为保证高可用,每个主节点至少配置 1 个从节点。当主节点宕机时,集群会通过投票机制从其从节点中选举新主节点,自动完成故障转移,整个过程无需人工干预。

本次搭建目标:3 主 3 从 Redis 集群(生产环境推荐最少 3 主,避免单点风险)。

二、环境准备

2.1 服务器配置

本次使用 6 台 CentOS 7 虚拟机(也可在单台机器上通过不同端口模拟多节点,生产环境建议独立服务器),配置如下:

节点角色

IP 地址

端口

作用

主节点 1

192.168.1.10

6379

负责部分哈希槽,存储数据

从节点 1

192.168.1.11

6379

同步主节点 1 数据,备用

主节点 2

192.168.1.12

6379

负责部分哈希槽,存储数据

从节点 2

192.168.1.13

6379

同步主节点 2 数据,备用

主节点 3

192.168.1.14

6379

负责部分哈希槽,存储数据

从节点 3

192.168.1.15

6379

同步主节点 3 数据,备用

2.2 依赖安装

所有节点需先安装 Redis 编译依赖(GCC):

 

# 安装GCC(CentOS系统)

yum install -y gcc-c++

# 验证GCC版本(需4.8及以上)

gcc --version

2.3 关闭防火墙与 SELINUX

为避免端口被拦截,临时关闭防火墙(生产环境建议按需开放 6379 端口,而非直接关闭):

 

# 关闭防火墙

systemctl stop firewalld

# 禁止防火墙开机启动

systemctl disable firewalld

# 关闭SELINUX

setenforce 0

# 永久关闭SELINUX(需重启生效)

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

三、Redis 安装与节点配置

3.1 下载并编译 Redis

所有节点执行以下步骤,安装 Redis 6.2.6(稳定版,兼容性好):

 

# 1. 下载Redis源码包

wget https://download.redis.io/releases/redis-6.2.6.tar.gz

# 2. 解压源码包

tar -zxvf redis-6.2.6.tar.gz -C /usr/local/

# 3. 进入编译目录

cd /usr/local/redis-6.2.6/

# 4. 编译(PREFIX指定安装路径)

make PREFIX=/usr/local/redis install

# 5. 复制配置文件模板到安装目录

cp redis.conf /usr/local/redis/

3.2 集群节点核心配置

每个节点需修改/usr/local/redis/redis.conf,关键配置项如下(所有节点均需配置,无需区分主从,集群会自动分配主从角色):

 

# 1. 绑定IP(0.0.0.0允许所有机器访问,生产环境建议指定具体IP)

bind 0.0.0.0

# 2. 关闭保护模式(允许跨机器访问)

protected-mode no

# 3. 端口号(默认6379,若单台机器模拟多节点需修改)

port 6379

# 4. 开启后台运行

daemonize yes

# 5. 启用集群模式(核心配置)

cluster-enabled yes

# 6. 集群节点配置文件(自动生成,无需手动编辑)

cluster-config-file nodes.conf

# 7. 集群节点超时时间(毫秒,超时未响应则认为节点宕机)

cluster-node-timeout 15000

# 8. 数据持久化方式(AOF+RDB混合模式,推荐生产环境使用)

appendonly yes

appendfilename "appendonly.aof"

save 900 1

save 300 10

save 60 10000

# 9. 设置密码(所有节点密码必须一致,否则集群通信失败)

requirepass 123456

# 10. 集群节点间通信密码(与requirepass保持一致)

masterauth 123456

3.3 启动所有 Redis 节点

所有节点执行启动命令,验证进程是否正常运行:

 

# 启动Redis(指定配置文件)

/usr/local/redis/bin/redis-server /usr/local/redis/redis.conf

# 验证进程(出现redis-server即为成功)

ps -ef | grep redis

# 验证端口(6379端口监听即为成功)

netstat -tulnp | grep 6379

四、创建 Redis 集群

Redis 5.0 + 版本内置redis-cli集群命令,无需额外安装 ruby 环境,操作更简单。

4.1 执行集群创建命令

任意一个节点(例如主节点 1:192.168.1.10)执行以下命令,将 6 个节点组成集群:

 

/usr/local/redis/bin/redis-cli -a 123456 --cluster create \

192.168.1.10:6379 \

192.168.1.12:6379 \

192.168.1.14:6379 \

192.168.1.11:6379 \

192.168.1.13:6379 \

192.168.1.15:6379 \

--cluster-replicas 1

命令参数说明:
  • -a 123456:指定 Redis 密码(与requirepass一致);
  • --cluster create:表示创建集群;
  • 前 3 个 IP: 端口:默认作为主节点
  • 后 3 个 IP: 端口:默认作为从节点(对应前 3 个主节点);
  • --cluster-replicas 1:表示每个主节点分配 1 个从节点。

4.2 确认集群创建

执行命令后,Redis 会自动分配哈希槽并提示确认,输入yes即可:

 

>>> Performing hash slots allocation on 6 nodes...

Master[0] -> Slots 0-5460

Master[1] -> Slots 5461-10922

Master[2] -> Slots 10923-16383

Adding replica 192.168.1.11:6379 to 192.168.1.10:6379

Adding replica 192.168.1.13:6379 to 192.168.1.12:6379

Adding replica 192.168.1.15:6379 to 192.168.1.14:6379

>>> Trying to optimize slaves allocation for anti-affinity

[OK] All nodes agree about slots configuration.

>>> Check for open slots...

>>> Check slots coverage...

[OK] All 16384 slots covered.

看到[OK] All 16384 slots covered.表示集群创建成功,所有哈希槽已分配完成。

五、集群验证与功能测试

5.1 查看集群状态

在任意节点执行以下命令,连接集群并查看状态:

 

# 连接集群(-c表示集群模式,否则无法路由到对应节点)

/usr/local/redis/bin/redis-cli -a 123456 -c -h 192.168.1.10 -p 6379

# 查看集群信息(重点关注cluster_state:ok,表示集群正常)

192.168.1.10:6379> cluster info

cluster_state:ok

cluster_slots_assigned:16384

cluster_slots_ok:16384

cluster_slots_pfail:0

cluster_slots_fail:0

...

# 查看所有节点信息(可看到主从角色、槽位分配)

192.168.1.10:6379> cluster nodes

# 输出示例(末尾带"master"为从节点,带"slave"为从节点,且标注了对应主节点ID)

abc123... 192.168.1.10:6379@16379 master - 0 1695000000000 1 connected 0-5460

def456... 192.168.1.11:6379@16379 slave abc123... 0 1695000001000 2 connected

...

5.2 数据读写测试

集群模式下,客户端会自动根据键的哈希槽路由到对应主节点,测试如下:

 

# 1. 写入数据(会自动路由到负责对应槽位的主节点)

192.168.1.10:6379> set user:1 zhangsan

-> Redirected to slot [14598] located at 192.168.1.14:6379

OK

# 2. 读取数据(同样会自动路由)

192.168.1.14:6379> get user:1

"zhangsan"

# 3. 查看数据所在槽位

192.168.1.14:6379> cluster keyslot user:1

(integer) 14598

5.3 故障转移测试

模拟主节点宕机,验证从节点是否自动升级为主:

  1. 停止主节点 1(192.168.1.10
 

/usr/local/redis/bin/redis-cli -a 123456 shutdown

  1. 查看集群节点状态
 

192.168.1.14:6379> cluster nodes

# 输出会显示192.168.1.11:6379(原从节点1)变为master,负责0-5460槽位

def456... 192.168.1.11:6379@16379 master - 0 1695000100000 7 connected 0-5460

abc123... 192.168.1.10:6379@16379 master,fail - 1695000090000 1695000088000 1 disconnected

  1. 验证数据可用性
 

# 写入原主节点1负责的槽位数据(会路由到新主节点192.168.1.11)

192.168.1.14:6379> set user:2 lisi

-> Redirected to slot [7412] located at 192.168.1.11:6379

OK

192.168.1.11:6379> get user:2

"lisi"

故障转移成功后,集群仍能正常提供服务,数据无丢失。

六、生产环境运维建议

  1. 节点扩容 / 缩容
    • 扩容:新增主从节点后,执行redis-cli --cluster add-node添加节点,再通过--cluster reshard重新分配槽位;
    • 缩容:先通过--cluster reshard将待删除主节点的槽位迁移到其他主节点,再执行--cluster del-node删除节点。
  1. 数据备份
    • 开启 AOF+RDB 混合持久化,确保数据不丢失;
    • 定期备份appendonly.aof和dump.rdb文件,建议存储到异地服务器。
  1. 监控告警
    • 使用 Redis 自带的info命令或第三方工具(如 Prometheus+Grafana)监控集群状态;
    • 配置告警规则:当cluster_state变为fail、节点宕机、槽位未覆盖时,及时发送告警。
  1. 密码与安全
    • 生产环境禁止使用bind 0.0.0.0,需指定允许访问的 IP;
    • 密码建议复杂度高(字母 + 数字 + 特殊符号),定期更换;
    • 开启 Redis 的rename-command功能,禁用CONFIG、FLUSHDB等危险命令。

七、常见问题排查

  1. 集群创建失败:Could not connect to Redis at xxx:6379: Connection refused
    • 检查防火墙是否关闭或端口是否开放;
    • 确认 Redis 配置中protected-mode为no,bind地址正确。
  1. 集群状态为 fail:cluster_state:fail
    • 查看是否有主节点宕机且无可用从节点;
    • 检查节点间密码是否一致(requirepass和masterauth必须相同)。
http://www.dtcms.com/a/391527.html

相关文章:

  • 视觉SLAM第13讲:实践,设计SLAM系统
  • 【论文阅读】WebWalker: Benchmarking LLMs in Web Traversal
  • 页面水印记录
  • 快速学习kotlin并上手 Android 开发指南
  • Linux进程控制(下):进程等待和进程替换
  • 如何检查数据库是否处于恢复模式
  • AI一周资讯 250913-250919
  • Livox-mid-360录制的.lvx2文件转化为.bag文件(TBC)
  • 【 svn】自动重试: cleanup + update
  • 有哪些Java学习书籍推荐?
  • 机动车登记证 OCR 识别:让车辆业务办理驶入 “快车道“
  • 在QT中使用FFmpeg实现录屏功能
  • 使用redisson实现延迟队列
  • 算法面试(1)-----两阶段检测器(如Faster R-CNN)和单阶段检测器(如YOLO、SSD)的区别与优劣?
  • 10cm钢板矫平机:一条“钢铁传送带”上的隐形战场
  • 数据结构与算法3:链式最基本的表示和实现——单链表
  • redisson延迟队列最佳实践
  • Netty ByteToMessageDecoder解码机制全解析
  • scrapy项目-爬取某招聘网站信息
  • 解决ubuntu下搜狗输入法在浏览器不可用的问题
  • 设计模式- 命令模式详解
  • 谈一谈Java成员变量,局部变量和静态变量的创建和回收时机
  • OSCP - Proving Grounds - Leyla
  • 9 月 19 日 IT 界热点大赏:科技浪潮下的创新与变革
  • 自动化脚本的零失误之路
  • Redis(三)Redis集群的三种模式
  • 网络环路:成因、影响与防环机制深度解析
  • 力扣刷题笔记(1)--面试150数组部分
  • 分割模型Maskformer
  • C# TCP的方式 实现上传文件