高薪Offer收割机之redis集群

news2024/11/23 12:52:05

单节点的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.coloradmin.cn/o/773436.html

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

相关文章

Qt应用开发——QLabel的使用

目录 一、构造函数 二、属性和方法 三、实例一 显示内容和设置样式 四、实例二 使用html处理超链接 五、实例三 显示图像 六、实例四 显示GIF 七、实例五 伙伴机制 QLabel继承于QFrame,作为Qt Wdiget最基础也是最常用的控件,在实际开发中&#xf…

【C++】STL优先级队列(priority_queue)功能介绍以及模拟实现

优先级队列 前言正式开始priority_queue 基本介绍优先级队列的适配器第三个模板参数compare模拟实现priority_queue仿函数 前言 点进来的小伙伴不知道学过数据结构里的堆没有,如果学过的话,那就好说了,优先级队列就是堆,如果没学…

ViewModel实例什么时候被回收

作者:TechMix 一、ViewModel存在的意义? ViewModel做为JetPack中重要的组件,翻译成中文就是“视图模型”,根据分离关注点原则,ViewModel的出现,主要是为了分担Activity中的职责,专门用于存放和…

谷歌云 | Document AI 引入了强大的新自定义文档拆分器来自动化文档处理

【本文由Cloud Ace整理发布。Cloud Ace是谷歌云全球战略合作伙伴,拥有 300 多名工程师,也是谷歌最高级别合作伙伴,多次获得 Google Cloud 合作伙伴奖。作为谷歌托管服务商,我们提供谷歌云、谷歌地图、谷歌办公套件、谷歌云认证培训…

Orange:一个基于 Python 的数据挖掘可视化平台

本篇介绍一个适合初学者入门的机器学习工具。 Orange 简介 Orange 是一个开源的数据挖掘和机器学习软件。Orange 基于 Python 和 C/C 开发,提供了一系列的数据探索、可视化、预处理以及建模组件。 Orange 拥有漂亮直观的交互式用户界面,非常适合新手进…

测试用例(3)

功能测试用例方法: 等价类 边界值 因果图 正交实验分解法 判定表驱动分析方法 非功能性的测试用例方法: 错误推测法 功能图分析方法 场景: 场景设计方法 1) 在任何情况下都必须使⽤边界值分析⽅法,经验表明⽤这种⽅法设…

CGT Asia嘉年华|3D细胞培养与类器官研发峰会10月广州召开

类器官指利用成体干细胞或多能干细胞进行体外三维(3D)培养而形成的具有一定空间结构的组织类似物,是近10年来干细胞领域发展最快的研究热点之一。2022年,FDA 通过现代化法案 2.0,批准全球首个完全基于“类器官芯片”研…

pandas 笔记:pivot_table 数据透视表\pivot

1 基本使用方法 pandas.pivot_table(data, valuesNone, indexNone, columnsNone, aggfuncmean, fill_valueNone, marginsFalse, dropnaTrue, margins_nameAll, observedFalse, sortTrue)2 主要参数 dataDataFramevalues要进行聚合的列index在数据透视表索引(index…

# Linux下替换删除文件中的颜色等控制字符的方法

Linux下替换删除文件中的颜色等控制字符的方法 文章目录 Linux下替换删除文件中的颜色等控制字符的方法1 Linux下的控制字符(显示的文字并不是他本身):2 颜色字符范例:3 替换4 最后 我们在shell编程显示输出时,会定义文…

【Java】一个简单的接口例子(帮助理解接口+多态)

要求: 请实现笔记本电脑使用USB鼠标、USB键盘的例子 1. USB 接口:包含打开设备、关闭设备功能 2. 笔记本类:包含开机功能、关机功能、使用 USB 设备功能 3. 鼠标类:实现 USB 接口,并具备点击功能 4. 键盘类&am…

人才输送|我的“捷码低代码工程师”转型之路!

最新职位 招聘岗位:低代码工程师 需求公司:上海北斗西虹桥基地 应聘条件:1、本科以上,最好硕士;2、有三年以上开发经验; 工作内容:带领团队用捷码低代码平台进行项目开发。 工作地点&#xff1a…

长城汽车Hi4技术品牌成果初现,大象转身必将势不可挡

今年1-6月,长城汽车销售52万辆,新能源车型销售9.3万辆,同比增长47%;智能新能源新产品密集上市,新能源销量与占比逐月攀升,6月销售超2.6万辆,占比突破25%,皆创历史新高; 全…

文档翻译成中文怎么弄?今天分享文档翻译免费要怎么弄

有一天,小华来到了一个外国小镇。然而,他发现镇上的路牌、菜单和旅游手册都是用外语写的,让他感到非常困扰。他不知道该去哪里游玩,也无法理解当地的文化和历史。他非常喜欢这个小镇的风景,但是他无法读懂他们这里的一…

【Linux -- 查看进程--ps,top,pstree】

Linux – 查看进程 文章目录 Linux -- 查看进程一、查看进程 -- ps二、动态查看进程的变化 -- top三、pstree -- 可以找进程之间的相关性总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、查看进程 – ps 更详细的可以通过man ps查看 ps aux …

深入理解Java虚拟机(三)垃圾收集器与内存分配策略

Java与C之间有一堵由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。 Java内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生,随线程而灭,栈中的栈帧随…

echarts图例对齐

富文本不生效,是没有设置lineHeight

【运维】shell监控脚本结合钉钉机器人实现服务及服务器监控告警

文章目录 前言一、监控shell脚本和钉钉机器人二、创建钉钉机器人:1.在钉钉群聊里点击设置2.在设置里点击机器人选项3.再点击添加机器人4.再点击选择自定义机器人5.设置机器人名称、是否加密、是否限制ip、以及触发关键字6.获取机器人的Webhook地址 三、编写监控脚本…

MySQL表关联更新

背景: 有两张表,一张class信息表,一张student信息表,但student表里的信息存在错误,需要用class表中的信息去更新student表数据。 方法一: update student_info s set class_name (select class_name fr…

一本通12951917:装箱问题

不知道说什么废话好了 题目 装箱问题 描述 有一个箱子容量为V(正整数,0<=V<=20000),同时有n个物品(0<n<=30),每个物品…

Spring 的依赖注入

Spring 的依赖注入 文章目录 Spring 的依赖注入每博一文案1. 依赖注入1.1 构造注入1.1.1 通过参数名进行构造注入1.1.2 通过参数的下标,进行构造注入1.1.3 不指定参数下标,不指定参数名字,通过自动装配的方式 1.2 set 注入 2. set注入的各种方…