高薪Offer收割机之redis集群

单节点的redis并发能力是有限的,如果需要进一步提高redis的并发能力,就需要搭建集群。

Redis中的集群分为三种:

主从复制,哨兵模式,分片集群

先来看一下主从复制:

5713914d5766f11656ba7f475a727a0f.jpeg

在主从集群中一个主节点可以有多个从节点,一个从节点只能有一个主节点。主节点负责写数据,从节点负责读数据。当数据写入主节点以后会被同步到从节点,从而保证所有节点上的数据一致性。

主节点的数据同步到从节点有两种方式:全量同步和增量同步。

先来看一下全量同步,全量同步分为三个阶段:

f40b9a4a499cba7c4de0e181f6b3d8ee.jpeg

第一阶段:建立连接

Slave(从)服务器执行slaveof ip host和master(主)服务器建立连接,其中ip、host 是 master 服务器的 IP 地址和端口号。比如:slaveof 127.0.0.1 6376

第二阶段:数据同步

在 slave 初次连接 master 后,复制 master 中的所有数据到 slave,步骤如下:

1.slave 发送 psync 指令到 master 请求同步数据(psync ? -1)。psync 指令包含两个参数,完整的格式为 psync {replid} {offset},其中 replid为replid,offset 为复制的偏移量,因为现在是首次复制,所以 replid并不知道,设为『?』,offset设置为 -1。

2.master判断是否是第一次同步,判断方法为比较自己的replid和从服务器发送过来的replid看看是否一致,如果不一致则是第一次同步,主服务器会 将自己的 replid发送给从服务器(FULLRESYNC {replid} {offset}),从服务器收到后会记录 replid和 offset。

3 master 执行 bgsave 生成 RDB 文件,并通过 socket 发送给 slave,同时将 bgsave 之后的命令写进repl_baklog日志文件。

4 slave 接收 RDB 文件后,清空本地数据,并加载 RDB 文件,加载完毕之后,向 slave 请求部分同步数据。

5 master 将repl_baklog日志文件的信息发送给 slave。

6 slave 接收到信息后,执行这些命令,恢复数据。

这里的Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每一个master都有唯一的replid。

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

再来看一下增量同步:

slave节点重启或者后期数据发生变化的时候可以使用增量同步.

增量同步的步骤如下:

1.当slave节点重启以后向master发送命令psync {replid} {offset}

2.master判断是否第一次同步,如果replid相同则不是第一次同步,返回continue

3.master会从repl_baklong中获取到slave发送的offset之后的数据并将命令发送给slave

4.slave接收到后执行命令完成增量同步。

接下来看一下哨兵模式:

在Redis主从复制模式中,因为系统不具备自动恢复的功能,所以当主服务器(master)宕机后,需要手动把一台从服务器(slave)切换为主服务器。在这个过程中,不仅需要人为干预,而且还会造成一段时间内服务器处于不可用状态,同时数据安全性也得不到保障,因此主从模式的可用性较低,不适用于线上生产环境。

Redis Sentinel 哨兵模式,它弥补了主从模式的不足。Sentinel 通过监控的方式获取主机的工作状态是否正常,当主机发生故障时, Sentinel 会自动进行 Failover(即故障转移),并将其监控的从机提升主服务器(master),从而保证了系统的高可用性。

哨兵的结构和作用如下:

监控:Sentinel 会不断检查master和slave是否按预期工作

自动故障恢复:如果master故障,Sentinel会将一个slave提升为master,然后使用 PubSub 发布订阅模式,通知其他的从节点,修改配置文件,跟随新的主服务器

通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端

87af7cf8171c5efba21c11cfbf54d7a3.jpeg04e97cd2ff098b833e2310e8741690bb.jpeg

下面详细讲解一下服务状态监控:

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

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

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

再来看一下哨兵的选主规则:

1.首先判断一下主与从节点断开的时间长短,如果超过指定值说明断开时间过长,数据丢失过多,于是排除该从节点。

2.判断从节点的优先级(slave-priority)该值越小优先级越高。

3.如果优先级一样则判断该从节点的offset值,offset值越大说明该从节点和主节点的数据越接近,被选主的优先级也就越高。

哨兵模式下的脑裂问题:

efab5d07b3ff0d0dddacad1e325135ba.jpeg

什么是脑裂问题,一旦网络发生了故障,master和sentinel及slave分别处于不同的网络,sentinel检测不到master于是从slave中选择一个提升为master,于是就有了两个master,这也是脑裂名称的由来,此时客户端还在向master中写入数据,等故障恢复以后原来的master被降级为slave,它会将自己的数据清空然后从新的master同步数据这样就会有一部分数据丢失。

怎么解决脑裂问题呢?

可以通过两个配置参数来解决:

min-replicas-to-write 1 表示最少的salve节点为1个

min-replicas-max-lag 5 表示数据复制和同步的延迟不能超过5秒

配置这两个参数以后当发生脑裂时,原来的master会拒绝数据的写入。

主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决:海量数据存储问题,高并发写的问题

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

集群中有多个master,每个master保存不同数据这样就解决了高并发写的问题。

每个master都可以有多个slave节点,可以解决海量数据的存储和高并发读的问题

master之间通过ping监测彼此健康状态,master起到了哨兵的作用。

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

b8d25a922af17ec5e4d553f69596aa5f.jpeg

既然分片集群有多个master节点,那么如果我要写一个数据究竟会被写到哪个节点上呢?

Redis分片集群引入了哈希槽的概念,redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。

ea50a23bd8fbad51a6cfad893d0c7a9b.jpeg

比如集群中有三个master第一个master的哈希槽为0-5460第二个为5461-10922第三个为10923到16383.

假如要执行set name hello 将name hello存入,则会使用CRC16算法计算name的hash值得到666666对16384取模结果为11306,11306处于10923到16383之间,所以该值会被存储到第三个master节点。

如果想将多个键值对放到同一个节点,可以通过设置键的前缀的方式,比如set name hello可以给键name一个前缀set {aaa}name hello用CRC16算法计算其前缀aaa的hash值得到888888,对16384取模结果为4152根据区间放在第一个master节点。如果需要再存入set city Beijing 也可以设置前缀set {aaa}city Beijing这样该键值对也会写入第一个master节点。


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

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

相关文章

智安网络|移动安全的转型:零信任如何重新定义格局

数字化转型和远程/移动办公的常态化已经成为许多企业的现实。这一转变为企业带来了许多便利,但同时也引入了前所未有的风险,涉及员工的隐私、个人身份和特权访问凭证。尤其是在经济衰退和疫情的持续影响下,许多企业不得不在提高生产力的同时面…

Linux: USB Gadget 驱动简介

文章目录 1. 前言2. 背景3. USB Gadget 驱动3.1 什么是 USB Gadget 驱动?3.2 USB Gadget 驱动框架3.3 USB 设备控制器(UDC) 驱动3.3.1 USB 设备控制器(UDC) 驱动 概述3.3.2 USB 设备控制器(UDC) 驱动示例 3.4 USB Gadget Function 驱动3.5 USB Gadget 驱动3.5.1 USB…

Vector - CANoe - VCDL与SomeIP

目录 一、基础介绍 二、vCDL介绍 1、vCDL工程创建 2、 vCDL编辑器关键字介绍 3、创建命名空间Datatype 接口示例 4、创建命名空间ICalculate 5、创建命名空间Participants 一、基础介绍 SomeIP作为车载以太网一个重要的组成部分,因为它的测试也是我们作为总…

Socket--七层协议与Socket原生框架

Socket 一、网络七层协议 / OSI 七层模型 2.1 物理层 解决两个硬件之间怎么通信的问题,常见的物理媒介有光纤、电缆、中继器等。它主要定义物理设备标准,如网线的接口类型、光纤的接口类型、各种传输介质的传输速率等。 它的主要作用是传输比特流(就是由1、0转化为电流强…

C#中的HashTable和Dictionary之间的区别

面试基础:C#中的HashTable和Dictionary之间的区别 HashTable和Dictionary都是用于存储数据的数据结构的类型。这两个数据结构都将存储的数据保存为键值对。

视频融合平台EasyCVR级联后上级平台播放失败的问题排查与优化

EasyCVR视频融合平台基于云边端智能协同架构,具有强大的数据接入、处理及分发能力,平台可提供视频监控直播、云端录像、云存储、录像检索与回看、智能告警、平台级联、云台控制等视频能力与服务,可支持多协议、多类型的海量设备接入与分发。 …

TPS61021A 具有 0.5V 超低输入电压的3A升压转换器

1 特性 1 • 输入电压范围:0.5V至4.4V • 启动时的最小输入电压为0.9V • 可设置的输出电压范围:1.8V到4.0V • 效率高达91%(VIN2.4V、VOUT3.3V 且IOUT 1.5A 时) • 2.0MHz 开关频率 • IOUT > 1.5A,VOUT 3.…

JavaWeb(3)——HTML、CSS、JS 快速入门

一、JavaScript 运算符 • 赋值运算符( ) 赋值运算符执行过程? 将等号右边的值赋予给左边, 要求左边必须是一个容器 出现是为了简化代码, 比如让 let age 18 ,age 加 2 怎么写呢 let age 18age 2console.log(age)age * 2con…

Android Studio Flutter 开发配置

近来比较闲,就研究下Flutter 开发,在此记录下studio 配置过程,时间是2023.7.19 在 Windows 操作系统上安装和配置 Flutter 开发环境 1.首先下载 Flutter SDKhttps://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/…

STM32MP157驱动开发——设备树知识

文章目录 概述开发板中设备树文件目录结构设备树文件语法设备树文件参考实例:Devicetree 格式DTS 文件的格式node 的格式properties 的格式 dts 文件包含 dtsi 文件常用的属性#address-cells 、#size-cellscompatiblemodelstatusreginterruptgpio属性name( 过时了&a…

二、DDL-1.数据库操作

一、查询 1、查询所有数据库 show databases; MySQL自带的默认的数据库有四个: 二、创建 1、创建一个新的数据库itcast(不区分大小写): create database itcast; 查询所有数据库:多了itcast 2、再创建同名的数据库…

[高通平台][WLAN] IEEE802.11mc 介绍

IEEE802.11mcWi-Fi协议(即Wi-FiRound-Trip-Time,RTT),利用此项技术及可以进行室内定位,因此为了使用此项技术,只有在硬件支持的设备上,应用才可以使用最新的RTT API以测量附近具有RTT功能的Wi-FiAP。 单面RTT :  距离是通过发送的分组和接收到的ACK之间的时间差来计算的…