Redis | Redis集群模式技术原理介绍

关注:CodingTechWork

Redis 集群模式概述

  Redis 集群(Cluster)模式是 Redis 官方提供的分布式解决方案,旨在解决单机 Redis 在数据量和性能上的限制。它通过数据分片、高可用性和自动故障转移等特性,提供了水平扩展和高可用性。

技术原理

Hash Slot 分片机制

  Redis 集群采用 Hash Slot(哈希槽) 机制进行数据分片。集群中共有 16384 个槽位,每个键通过 CRC16 算法映射到一个槽位上,槽位再分配到不同的节点上。这种机制支持动态迁移允许在运行时调整槽位分配,从而实现水平扩展。

去中心化架构

  Redis 集群采用 去中心化架构,没有中心节点。每个节点都保存集群的部分数据,并通过 Gossip 协议 与其他节点通信,维护集群的状态。这种架构提高了系统的可扩展性和容错能力。

Master-Replica 模型

  每个槽位至少包含一个主节点(Master)和多个从节点(Replica)。主节点负责处理写操作,从节点则提供数据冗余和读扩展。当主节点故障时,从节点会自动提升为主节点,确保服务的高可用性。

故障检测与自动转移

  Redis 集群通过 Raft 协议 选举新的主节点。当一个节点被判定为故障时,其他节点会通过投票机制选出一个新的主节点,整个过程通常在 200 毫秒内完成。客户端会自动重定向到新的主节点,确保业务无感知。

使用方式

环境准备

假设我们有三台主机,分别用于部署 Redis 集群的主节点和从节点:

IP主机名角色
192.168.182.110local-168-182-110主节点、从节点
192.168.182.111local-168-182-111主节点、从节点
192.168.182.112local-168-182-112主节点、从节点

配置 Redis 集群

  1. 创建配置文件:为每个节点创建独立的配置文件。

    mkdir -p /opt/software/redis-7.0.3/cluster/redis_{7001..7003}
    cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7001.conf
    cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7002.conf
    cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7003.conf
    
  2. 修改配置文件:以 cluster_redis_7001.conf 为例。

    bind 192.168.182.110
    port 7001
    daemonize yes
    pidfile "/var/run/cluster_redis_7001.pid"
    logfile "/usr/local/redis/cluster_redis_7001.log"
    dir "/opt/software/redis-7.0.3/cluster/redis_7001"
    masterauth "123456"
    requirepass "123456"
    appendonly yes
    cluster-enabled yes
    cluster-config-file nodes_7001.conf
    cluster-node-timeout 15000
    
  3. 复制配置文件:将配置文件复制到其他主机,并修改 IP 地址。

    scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-111:/usr/local/redis/
    scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-112:/usr/local/redis/
    

启动 Redis 服务

在每台主机上启动 Redis 服务。

redis-server /usr/local/redis/cluster_redis_7001.conf
redis-server /usr/local/redis/cluster_redis_7002.conf
redis-server /usr/local/redis/cluster_redis_7003.conf

创建集群

使用 redis-cli 创建集群。

redis-cli -a 123456 --cluster create \
192.168.182.110:7001 192.168.182.110:7002 192.168.182.110:7003 \
192.168.182.111:7001 192.168.182.111:7002 192.168.182.111:7003 \
192.168.182.112:7001 192.168.182.112:7002 192.168.182.112:7003 \
--cluster-replicas 2

常用命令

  • 查看集群信息

    redis-cli -c -h 192.168.182.110 -p 7001
    CLUSTER INFO
    CLUSTER NODES
    
  • 增加节点

    CLUSTER MEET <IP> <PORT>
    
  • 删除节点

    CLUSTER FORGET <node_id>
    
  • 更改节点角色

    CLUSTER REPLICATE <master_node_id>
    
  • 保存配置

    CLUSTER SAVECONFIG
    

Redis 集群的优势

横向扩展能力

  Redis 集群支持数据分片,数据按槽位均匀分布,单集群理论上可支持 1000+ 节点。相比单机,集群模式在查询和写入性能上有显著提升。

高可用性

  • 故障自动检测:节点故障判定仅需 15 秒(可配置)。
  • 智能故障转移:通过 Raft 协议选举新主节点,切换过程平均 200 毫秒。
  • 服务不中断:客户端自动重定向机制确保业务无感知。

运维便捷性

  • 原生支持:无需第三方组件,如 Twemproxy。
  • 动态扩容:支持在线添加节点。
  • 平滑升级:支持滚动重启不影响服务。

性能提升

  集群模式支持多个主节点和从节点,查询和写入操作可以分散到多个节点,提升系统的并发处理能力。

适用场景

适用场景

  1. 数据规模超过单机内存容量(如 500GB+)。
  2. 需要 99.99% 以上可用性保障。
  3. 业务允许最终一致性。

不适用场景

  1. 需要强事务保证的金融业务。
  2. 频繁跨分片查询的复杂分析场景。
  3. 超低延迟要求的实时交易系统。

最佳实践

容量规划

  • 每个分片预留 20% 内存缓冲。
  • 控制单个分片不超过 30GB。

客户端配置

JedisClusterConfig config = new JedisClusterConfig.Builder().setMaxRedirects(5)  // 设置最大重定向次数,防止在故障转移期间客户端重定向过多.setPassword("123456")  // 设置连接密码,如果集群启用了密码认证.build();// 定义集群节点
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.182.110", 7001));
nodes.add(new HostAndPort("192.168.182.110", 7002));
nodes.add(new HostAndPort("192.168.182.110", 7003));
nodes.add(new HostAndPort("192.168.182.111", 7001));
nodes.add(new HostAndPort("192.168.182.111", 7002));
nodes.add(new HostAndPort("192.168.182.111", 7003));
nodes.add(new HostAndPort("192.168.182.112", 7001));
nodes.add(new HostAndPort("192.168.182.112", 7002));
nodes.add(new HostAndPort("192.168.182.112", 7003));// 创建 JedisCluster 实例
JedisCluster jedisCluster = new JedisCluster(nodes, config);// 使用 JedisCluster 进行操作
try (JedisCluster jedisCluster) {// 设置键值对jedisCluster.set("key", "value");// 获取键值对String value = jedisCluster.get("key");System.out.println("Retrieved value: " + value);// 执行其他操作...
} catch (Exception e) {e.printStackTrace();
}

监控与报警

  1. 监控集群状态

    • 使用 Redis 提供的 INFOCLUSTER INFO 命令定期检查集群的状态。
    • 可以通过工具如 Prometheus 和 Grafana 监控集群的性能指标(如内存使用率、CPU 使用率、响应时间等)。
  2. 报警机制

    • 设置报警阈值,当节点故障、性能下降或数据迁移失败时,通过邮件、短信或即时通讯工具通知管理员。
    • 使用开源工具如 Alertmanager 配合 Prometheus 实现报警功能。

备份与恢复

  1. 定期备份

    • 配置 Redis 的持久化机制(如 RDB 和 AOF),确保数据可以定期备份到磁盘。
    • 使用工具如 redis-backup 定期备份集群数据。
  2. 灾难恢复

    • 制定灾难恢复计划,确保在重大故障时能够快速恢复服务。
    • 定期测试备份数据的恢复流程,确保备份数据的完整性和可用性。

性能优化

  1. 连接池管理

    • 使用连接池管理连接,提高资源利用率,减少连接创建和销毁的开销。
    • 配置合理的连接池参数,如最大连接数、最小空闲连接数等。
  2. 负载均衡

    • 通过客户端或代理层实现负载均衡,确保请求均匀分布到各个节点。
    • 使用 Redis Cluster 的自动负载均衡功能,动态调整槽位分配。
  3. 缓存策略

    • 合理配置缓存策略,避免缓存穿透和缓存雪崩问题。
    • 使用分布式锁等机制,确保缓存操作的线程安全。

安全措施

  1. 网络隔离

    • 使用防火墙和安全组限制对 Redis 集群的访问,仅允许信任的客户端连接。
    • 配置 Redis 的 bind 参数,限制监听的 IP 地址。
  2. 数据加密

    • 使用 SSL/TLS 加密客户端与服务器之间的通信,防止数据在传输过程中被窃取。
    • 配置 Redis 的 tls 参数,启用加密通信。
  3. 访问控制

    • 配置 Redis 的 user 命令,为不同用户分配不同的权限,限制对敏感操作的访问。
    • 使用密码认证机制,确保只有授权用户可以访问集群。

总结

  Redis 集群模式通过数据分片、高可用性和自动故障转移等特性,提供了水平扩展和高可用性。它适用于数据量大、对高可用性和性能要求较高的场景。通过合理配置和管理,Redis 集群可以大大增强系统的扩展性和可靠性,满足大规模生产环境的需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Servlet小结

视频链接&#xff1a;黑马servlet视频全套视频教程&#xff0c;快速入门servlet原理servlet实战 什么是Servlet&#xff1f; 菜鸟教程&#xff1a;Java Servlet servlet&#xff1a; server applet Servlet是一个运行在Web服务器&#xff08;如Tomcat、Jetty&#xff09;或应用…

数据库进阶之MySQL 程序

1.目标 1> 了解mysqlId服务端程序 2> 掌握mysql客户端程序的使用 3> 了解工具包中的其他程序 2. MySQL程序简介 本章介绍 MySQL 命令⾏程序以及在运⾏这些程序时指定选项的⼀般语法(如:mysql -uroot -p)。 对常⽤程序进⾏详细的讲解(实用工具的使用方法)&#xf…

VS2022 设置 Qt Project Settings方法

本文解决的问题&#xff1a;创建完成后&#xff0c;如需要用到Sql或者Socket等技术&#xff0c;需要设置Qt Project Settings&#xff1b; 1、打开VS2022编译器&#xff0c;创建QT项目工程 2、创建完成后&#xff0c;点击 解决方案 →右键属性 3、选择 Qt Project Settings →…

React:封装一个评论回复组件

分析 用户想要一个能够显示评论列表&#xff0c;并且允许用户进行回复的组件。可能还需要支持多级回复&#xff0c;也就是对回复进行再回复。然后&#xff0c;我要考虑组件的结构和功能。 首先&#xff0c;数据结构方面&#xff0c;评论应该包含id、内容、作者、时间&#xf…

wx读书某sign算法详解

未加固 版本&#xff1a;9.2.3 前置知识&#xff1a; (v41 & 0xFFFFFFFFFFFFFFFELL) 是一种高效的奇偶检查方法&#xff0c;用于判断数值 v41 是否为奇数。 std::sort<std::lessstd::string,std::string &,std::string>(a1, v6, s); 排序算法 # 完全等价的字…

Django的异步任务队列管理_Celery

1 基本原理 Celery 是一个异步任务队列&#xff0c;能够将耗时操作&#xff08;如发邮件、处理图片、网络爬虫等&#xff09;从 Django 主线程中分离出来&#xff0c;由后台的 worker 处理&#xff0c;避免阻塞请求。Celery 作为独立运行的后台进程&#xff08;Worker&#xf…

【计算机网络】Linux网络的几个常用命令

&#x1f4da; 博主的专栏 &#x1f427; Linux | &#x1f5a5;️ C | &#x1f4ca; 数据结构 | &#x1f4a1;C 算法 | &#x1f152; C 语言 | &#x1f310; 计算机网络 相关文章&#xff1a;计算机网络专栏 目录 ping&#xff08;检测网络连通性&#xff09;…

全开源、私有化部署!轻量级用户行为分析系统-ClkLog

ClkLog是一款支持私有化部署的全开源埋点数据采集与分析系统&#xff0c;兼容Web、App、小程序多端埋点&#xff0c;快速洞察用户访问路径、行为轨迹&#xff0c;并生成多维用户画像。助力中小团队搭建轻量灵活的用户行为分析平台。 为什么需要一款私有化的埋点分析系统&#x…

golang定时器的精度

以 go1.23.3 linux/amd64 为例。 定时器示例代码&#xff1a; package mainimport ("context""fmt""time" )var ctx context.Contextfunc main() {timeout : 600 * time.Secondctx, _ context.WithTimeout(context.Background(), timeout)dea…

svn 远程服务搜索功能

svn服务器没有远程搜索功能&#xff0c;靠人工检索耗时耗力&#xff0c;当服务器文件过多时&#xff0c;全部checkout到本地检索&#xff0c;耗时太久。 1. TortoiseSVN 安装注意事项 下载官网地址&#xff1a;https://tortoisesvn.en.softonic.com/download 安装时选中 co…

uniapp-商城-39-shop 购物车 选好了 进行订单确认4 配送方式2 地址页面

上面讲基本的样式和地址信息&#xff0c;但是如果没有地址就需要添加地址&#xff0c;如果有不同的地址就要选地址。 来看看处理方式&#xff0c; 1、回顾 在delivery-layout中 methods:{goAddress(){uni.navigateTo({url:"/pagesub/pageshop/address/addrlist"})…

Linux命令-iostat

iostat 命令介绍 iostat 是一个用于监控 Linux 系统输入/输出设备加载情况的工具。它可以显示 CPU 的使用情况以及设备和分区的输入/输出统计信息&#xff0c;对于诊断系统性能瓶颈&#xff08;如磁盘或网络活动缓慢&#xff09;特别有用。 语法&#xff1a; iostat [options…

vue2关于Node.js17及以上报digital envelope错误的解决办法

文章目录 简介错误原因解决方案设置环境变量修改package.json安装旧版本Node.js更新依赖项更改加密设置 简介 digital envelope routines::unsupported错误‌通常发生在Node.js版本升级到17或更高版本后&#xff0c;因为这些版本开始使用OpenSSL 3.0&#xff0c;它对算法和密钥…

LLM - Large Language Model

回顾2024&#xff1a;与LLM又相伴一年的经历与思考 - 知乎万字长文入门大语言模型&#xff08;LLM&#xff09; - 知乎“大模型本质就是两个文件&#xff01;”特斯拉前AI总监爆火LLM科普&#xff0c;时长1小时&#xff0c;面向普通大众 - 知乎大模型本质及趋势剖析&#xff0c…

Linux 内核网络协议栈中的关键数据结构:inet_skb_parm 与 ip_options

在 Linux 内核的网络协议栈中,数据包的高效处理依赖于一系列精心设计的数据结构。这些结构体不仅需要存储网络数据的元信息,还需支持复杂的协议逻辑(如路由、分片、安全策略等)。本文聚焦两个核心结构体 struct inet_skb_parm 和 struct ip_options,解析它们的设计原理、功…

如何修复卡在恢复模式下的 iPhone:简短指南

Apple 建议使用恢复模式作为最后的手段&#xff0c;以便在 iPhone 启动循环或显示 Apple 标志时恢复 iPhone。这是解决持续问题的简单方法&#xff0c;但您很少使用。但是&#xff0c;当您的 iPhone 卡住恢复模式本身时&#xff0c;您会怎么做&#xff1f;虽然 iPhone 卡在这种…

10前端项目----商品详情页/滚轮行为

商品详情页面 商品详情组件发送请求获取相应商品详情信息组件展示数据 优化一下路由配置代码滚轮自动置顶 商品详情组件 路由配置 点击商品进行跳转—将Detail组件变成路由组件 从商品到详情&#xff0c;肯定需要传参(产品ID)告诉Detail是哪个商品&#xff0c;需要展示哪个商品…

DIFY 又跟新了,来到 1.3.0 版本,看正文

欢迎来到 1.3.0 版本&#xff01;添加了各种巧妙的功能、修复了错误&#xff0c;并带来了一些新功能&#xff1a; 一、核心亮点&#xff1a; 结构化输出 1、LLM 节点新增JSON Schema编辑器&#xff0c;确保大语言模型能够返回符合预设格式的JSON数据。这一功能有助于提升数据…

git检查提交分支和package.json的version版本是否一致

这里写自定义目录标题 一、核心实现步骤‌1.安装必要依赖‌2.初始化 Husky‌3.创建校验脚本‌4.配置 lint-staged‌5.更新 Husky 钩子‌ 三、工作流程说明‌四、注意事项‌ 以下是基于 Git Hooks 的完整解决方案&#xff0c;通过 husky 和自定义脚本实现分支名与版本号一致性校…

react-navigation-draw抽屉导航

心得写在前面分享给大家&#xff1a; 我的实现方法&#xff0c;并没有完全安装官网来做&#xff0c;而是进行了简化&#xff0c;效果是一样的。没有按照官网说的修改metro.config.js文件&#xff0c;同时也没有 react-native-gesture-handler 的安装后&#xff0c;我们需要有条…