Redis05-集群方案

目录

Redis集群方案

主从复制

主从复制的基本原理

主从复制的工作流程

乐观复制

主从复制的优势

哨兵机制

哨兵的关键作用

服务状态监控

哨兵选举Master规则

分片集群

分片集群中的数据读写

数据写入

数据读取

一致性哈希和客户端分片


Redis集群方案

微服务时代背景下,现实中我们的项目往往需要多台Redis服务器的支持:

  • 结构上:单个Redis容易引发单点故障,一台服务器需要承载所有请求。所以需要多个节点同步复制。

  • 容量上:单个Redis的内存很容易成为存储瓶颈。所以需要进行数据分片。

针对Redis的集群方案,常见的有:主从复制、哨兵模式、分片集群。

主从复制

Redis的主从复制是一种常见的数据复制和高可用性的机制。它通过将一个Redis节点的数据复制到其他节点,实现数据的备份和读写分离。

主从复制的基本原理
  1. 全量复制: 初始阶段,从节点会向主节点发送一次SYNC命令,主节点会将自己的数据库快照发送给从节点。从节点接收到快照后,会清空自己的数据库,然后将接收到的快照数据加载到自己的数据库中,完成全量复制。

    • Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid,slave则会继承master节点的replid。

    • offset:偏移量,随着记录在repl_baklog中的数据增多而逐渐增大。slave完成同步时也会记录当前同步的offset。如果slave的offset小于master的offset,说明slave数据落后于master,需要更新。

  2. 增量复制: 一旦从节点完成全量复制,主节点会继续将自己的写操作(写命令)发送给从节点。这样从节点就能保持自己的数据库和主节点保持一致。增量复制通过主节点将执行的写命令传播给从节点来实现。

主从复制的工作流程
  1. 从节点连接到主节点: 从节点通过发送PING命令或PSYNC命令与主节点建立连接。PSYNC命令是增量复制的一部分,它用于在断线重连时,从节点告知主节点自己的复制偏移量。

  2. 主节点创建快照: 一旦从节点连接到主节点,主节点会执行BGSAVE命令创建一个RDB快照。这个快照包含了当前主节点数据库的全部数据。

  3. 从节点加载快照: 主节点创建快照后,会将快照数据传输给从节点。从节点接收到快照后,会清空自己的数据库,然后加载主节点传来的快照数据,完成全量复制。

  4. 增量复制: 从节点完成全量复制后,主节点会将自己的写操作(写命令)发送给从节点。从节点接收到写命令后,会执行相同的写操作,保持与主节点数据的一致性。

  5. 心跳和断线重连: 主节点和从节点会通过心跳机制保持连接。如果从节点与主节点的连接断开,从节点会尝试重新连接,并使用PSYNC命令告知主节点自己的复制偏移量,主节点会根据从节点的复制偏移量发送缺失的写命令,从而实现断线重连时的增量同步。

乐观复制

乐观复制(Optimistic Replication)通常是指一种基于版本控制的复制策略,其核心思想是节点在进行数据复制时,不需要先获取到全局锁,而是通过版本号等机制来进行冲突的检测和解决。在Redis中,乐观复制并非官方的特性,但是可以通过一些手段实现类似的效果。

  1. 版本号: 在Redis中,你可以使用自定义的版本号,通过 INCR 等命令来增加节点的版本号。在写操作时,将写操作和对应的版本号发送给其他节点。

  2. 冲突检测: 在节点接收到写操作时,检查接收到的写操作的版本号是否比自己的版本号大。如果大,执行写操作并更新版本号;如果小,则发生冲突,需要进行冲突解决。

  3. 冲突解决: 冲突解决可以采用一些策略,例如最后一次写操作覆盖之前的写操作,或者保留所有冲突的写操作等。

需要注意的是,这种自定义的乐观复制机制需要谨慎设计,因为在分布式环境中,冲突的发生是不可避免的,需要考虑如何解决冲突、保证数据的一致性等问题。另外,Redis本身提供的主从复制和哨兵机制已经能够满足大部分应用场景,使用官方提供的复制机制通常更为稳妥。

主从复制的优势
  1. 数据备份: 主从复制可以用作数据的备份机制,当主节点发生故障时,从节点可以升级为主节点,确保数据的可用性。

  2. 读写分离: 从节点可以处理读请求,实现读写分离,分担主节点的读负载,提高系统的并发处理能力。

  3. 容灾性: 当主节点发生故障时,可以快速切换到从节点,提高系统的容灾性。

  4. 故障恢复: 当主节点恢复正常工作时,可以将从节点重新配置为主节点的从节点,实现故障恢复。

哨兵机制

Redis提供了哨兵(Sentinel)机制:哨兵通过协调多个哨兵进程的工作来实现主从集群的自动故障恢复。

哨兵的关键作用
  1. 监控: 哨兵负责监控Redis主节点和从节点的健康状态。它通过周期性的检查节点的状态,包括网络连接状态、是否存活等。

  2. 故障检测: 当哨兵发现某个Redis节点不可用时,它会将这一信息广播给其他哨兵和客户端。哨兵根据一定的条件来判断一个节点是否处于不可用状态,例如在规定时间内未响应等。

  3. 故障转移: 在主节点不可用时,哨兵会自动进行故障转移。它会通过选举的方式选择一个从节点升级为新的主节点,保证系统的可用性。

  4. 自动发现: 哨兵可以通过 SENTINEL 命令进行自动发现,不需要手动配置所有哨兵的信息。这使得系统更加灵活,能够适应节点的动态变化。

服务状态监控

Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

  • 主观下线:如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线。

  • 客观下线:若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

哨兵选举Master规则

Redis哨兵进行主节点选举时,遵循一定的规则和条件,以确保选出的新主节点是可用的。以下是哨兵选举Master的基本规则:

  1. Quorum(仲裁):

    • 选举需要达到Quorum,Quorum的计算方式为 (哨兵总数 / 2) + 1。只有得到足够多的哨兵投票,选举才能生效。

    • Quorum的引入是为了防止因为网络分裂等问题导致多个主节点同时被选举。

  2. 哨兵优先级:

    • 每个哨兵节点都有一个配置的优先级,可以通过 sentinel.conf 文件中的 sentinel myid priority 配置项设置。默认为100。

    • 哨兵在选举时会选择优先级最高的哨兵作为领导者,由领导者发起主节点选举。

  3. 最高优先级的Slave:

    • 如果有多个从节点具有相同的优先级,哨兵将选择复制偏移量(replication offset)最大的从节点作为新的主节点。

    • 复制偏移量是指从节点的复制进度,选择复制偏移量最大的从节点有助于保持数据的一致性。

  4. 选举超时和投票:

    • 当一个哨兵发现主节点不可用后,它会发起一轮选举,设定一个选举超时时间。在这个时间内,哨兵会收集其他哨兵的投票。

    • 哨兵通过相互通信,进行选举投票,包括对自身的投票。哨兵节点可以投票给自己,也可以投票给其他哨兵。

  5. 领导者发起选举:

    • 选举开始时,哨兵中优先级最高的节点成为领导者,由领导者发起主节点选举。

    • 领导者向其他哨兵广播自己的选票,其他哨兵在收到选票后进行投票。

  6. 多轮投票:

    • 选举可能进行多轮,直到某个哨兵得到Quorum的支持为止。在每一轮选举中,哨兵都会尝试发起并参与投票。

  7. 新主节点确认:

    • 当一个哨兵获得Quorum的支持后,它会确认选出的新主节点。其他哨兵节点收到确认后,会更新配置并将新的主节点信息广播给其他节点。

  8. 客户端更新:

    • 一旦新的主节点选出,哨兵将通知客户端更新连接信息,使客户端连接到新的主节点。

通过这些规则,Redis哨兵确保了在主节点发生故障时,能够选出一个优先级高、复制偏移量最大的从节点作为新的主节点,从而确保系统的高可用性。

分片集群

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:

  • 海量数据存储问题

  • 高并发写的问题

使用分片集群可以解决上述问题,分片集群特征:

  • 集群中有多个master,每个master保存不同数据

  • 每个master都可以有多个slave节点

  • master之间通过ping监测彼此健康状态

  • 客户端请求可以访问集群任意节点,最终都会被转发到正确节点

分片集群中的数据读写

Redis分片集群使用了哈希槽(Hash Slot),Redis分片集群将整个数据集划分为16384个哈希槽,每个槽都有一个唯一的编号。这些哈希槽用于存储数据,同时也用于管理数据的分片。数据的键通过哈希算法映射到某个哈希槽上,决定了数据应该由哪个节点负责存储。

数据写入
  1. 计算哈希槽:

    • 当客户端向Redis集群发送写入请求时,Redis首先计算键对应的哈希槽。通过哈希算法,确定键属于哪个哈希槽。

  2. 选择节点:

    • 哈希槽确定后,根据哈希槽和集群中的节点分布,选择负责处理该哈希槽的节点。这个节点被称为槽的持有者。

  3. 发送写请求:

    • 客户端将写请求发送给被选择的节点。如果该节点是主节点,它将负责处理写请求;如果是从节点,写请求将被转发给主节点。

  4. 写入数据:

    • 主节点接收到写入请求后,将数据写入自己的数据存储。然后,主节点会将写入操作通过集群总线广播给其他从节点,以保持数据的一致性。

数据读取
  1. 计算哈希槽:

    • 当客户端向Redis集群发送读取请求时,同样需要计算键对应的哈希槽,确定数据所在的槽。

  2. 选择节点:

    • 根据哈希槽和节点分布,选择负责处理该哈希槽的节点。这个节点可能是主节点,也可能是从节点。

  3. 发送读请求:

    • 客户端将读请求发送给被选择的节点。如果是主节点,它将直接处理读请求;如果是从节点,读请求可能会被转发到主节点。

  4. 读取数据:

    • 节点处理读请求,如果是主节点,直接从自己的数据存储中读取数据并返回给客户端;如果是从节点,它可能会从主节点获取最新的数据并返回给客户端。

一致性哈希和客户端分片
  • 为了在节点变动时保持哈希槽的一致性,Redis使用一致性哈希算法。这确保了在节点加入或退出时,只有少量的槽需要迁移,而不是整个数据集。

  • 客户端也需要进行分片,以确保请求被正确发送到负责处理对应数据分片的节点。通常,客户端使用一致性哈希算法或其他分片策略来选择正确的节点。

通过上述过程,Redis分片结构实现了数据的分散存储和读写负载均衡,同时通过哈希槽的管理和一致性哈希算法保障了系统的一致性和可用性。

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

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

相关文章

从理论到实践:深度解读BIO、NIO、AIO的优缺点及使用场景

文章目录 BIO优缺点示例代码 NIO优缺点示例代码 AIO优缺点示例代码 总结 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 BIO、NIO和AIO是Java编程语言中用于处理输入输出(IO…

iOS OpenGL ES3.0入门实践

一、效果图 入门实践,做的东西比较简单,效果如下: 二、关于顶点坐标和纹理坐标 绘制图片需要设置顶点坐标和纹理坐标并加载像素数据,之所以要指定两组坐标是因为纹理和顶点使用不同的坐标系,就是告诉OpenGL&#xf…

GZ038 物联网应用开发赛题第3套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第3套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评…

【LIUNX】配置缓存DNS服务

配置缓存DNS服务 A.安装bind bind-utils1.尝试修改named.conf配置文件2.测试nslookup B.修改named.conf配置文件1.配置文件2.再次测试 缓存DNS服务器:只提供域名解析结果的缓存功能,目的在于提高数据查询速度和效率,但是没有自己控制的区域地…

后台系统更改主题【el-color-picker】

Element el-color-picker 颜色选择器的使用 设置的页面 <script setup lang"ts"> import { getThemeColor } from "../../utils/colorChange"; import { useUserStore } from "/store/index"; import { reactive } from "vue"…

高防IP可以抵御哪些恶意攻击

高防IP协议可以隐藏用户的站点&#xff0c;使得攻击者无法发现恶意攻击的目标网络资源&#xff0c;从而提高了源站的安全性。能够有效抵御常见的恶意攻击类型ICMPFlood、UDPFlood、 TCPFlood、SYNFlood、ACKFlood等&#xff0c;帮助游戏、金 融、电子商务、互联网、政企等行业抵…

Linux---(五)三大工具yum、vim、gcc/g++

文章目录 一、yum工具1.Linux中安装软件的方法&#xff1a;2.什么是yum?3.yum源更新 二、Linux编辑器--vim1.IDE例子2.vim&#xff08;1&#xff09;vim的常用模式及切换模式&#xff08;2&#xff09;底层模式常用命令&#xff08;3&#xff09;插入模式常用命令&#xff08;…

Mac安装与配置eclipse

目录 一、安装Java&#xff1a;Mac环境配置&#xff08;Java&#xff09;----使用bash_profile进行配置&#xff08;附下载地址&#xff09; 二、下载和安装eclipse 1、进入eclipse的官网 (1)、点击“Download Packages ”​ (2)、找到macOS选择符合自己电脑的框架选项&am…

比较LeNet、AlexNet、VGG和ResNet模型及其优缺点的实际实验。

一、说明 卷积神经网络&#xff0c;有很多种类&#xff0c;这不仅仅是各种试验或尝试。而且是已经设计好的网络存在若干不尽人意之处&#xff0c;需要弥补和改进。因此&#xff0c;本文就是记录这些网络的优缺点&#xff0c;从新意上说&#xff0c;本文全无&#xff0c;但是从启…

Java学习笔记(七)——面向对象编程(中级)

一、IDEA &#xff08;一&#xff09;常用的快捷键 &#xff08;二&#xff09;模版/自定义模版 二、包 &#xff08;一&#xff09;包的命名 &#xff08;二&#xff09;常用的包 &#xff08;三&#xff09;如何引入&#xff08;导入&#xff09;包 &#xff08;四&am…

spring cloud之网关

Gateway网关(*) 什么是网关 # 1.说明 - 网关统一服务入口&#xff0c;可方便实现对平台众多服务接口进行管控。 - 网关 路由转发 过滤器路由转发&#xff1a;接收一切外界请求&#xff0c;转发到后端的微服务上去过滤器&#xff1a;在服务网关中可以完成一系列的横切功能&a…

react Antd3以下实现年份选择器 YearPicker

项目antd版本低&#xff0c;没有直接可使用的年份选择器&#xff0c;参考此篇&#xff08;使用antd实现年份选择器控件 - 掘金&#xff09; 一开始在state里设置了time&#xff1a; this.state {isopen: false,time: null } 在类似onChange事件里this.setState({time: valu…