Redis集群之AKF架构原理

news/2024/4/29 16:59:27/文章来源:https://blog.csdn.net/xhaimail/article/details/128429997

当我们搭建集群之前,先要想明白需要解决哪些问题,搞清楚这个之前先回想一下单节点、单实例、单机有哪些问题?

  1. 单点故障:只有一台Redis的话,如果出现故障,那么整个服务都不可用
  2. 缓存容量:单台Redis的缓存容量有限,在多数据的场景下不适合使用
  3. 访问压力:单台Redis在高并发的生产环境下是会承受很大压力,有可能压力过高而崩溃

问题是知道了,那么怎么解决这些问题呢?为了解决这些问题,我们需要对服务器进行集群,这儿引入一个概念:AKF拆分原则。

在了解AKF拆分原则前,先分析单节点的单点故障这个问题。既然单节点容易宕机,那么就可以进行复制,一变多。就会涉及到三个概念:主从、主主、主备。

主主:多台服务器同时对外提供读写。

 主从:主机可以读写,但是一般只对外提供写,从机对外提供读:

主备:主机提供读写,备机不对外提供服务,当主机挂了的时候,备机通过选举产生主机对外提供服务。

AKF拆分原则

AKF是从X、Y、Z三个轴方向去尝试解决上述3个问题。

X轴

从X角度,可以使用多台 Redis,做第一台Redis的副本,这种拆分可以看成另一台机器的镜像。这个主要是为了解决单点故障的问题!

 如上图所示,将 Redis 的数据复制到多台 Redis 上,这样就算其中一台Redis出故障了,也还有其他Redis可以提供服务。

随着发展,客户端还可以对主Redis进行增删改,对副Redis进行只读,这就要实现了读写分离。

基于X轴的解决方案,是全量镜像。

X轴上的主Redis和副Redis的容量是一样的,意思是主Redis有40G,其他其他的副Redis同样也是40G,因此数据容量有限问题就出来了。

Y轴

从Y轴角度,对库中的数据按照业务进行划分不同的实例去存储,不同的数据就会存到不同的Redis中去。

例如一台服务器中被频繁访问,涉及到的数据频繁读写,其他数据基本不怎么访问,这时候可以将这部分数据独立出来,根据功能、业务继续拆分服务器,这种拆解就是AFK中的Y轴拆分,因此就可以解决数据容量有限的问题。这个维度主要是为了解决Redis缓存容量不够大的问题!

Y轴一般是按照业务、功能等来划分数据,但Y轴上的每个节点也要解决单点故障问题,所以就需要X轴、Y轴同时部署Redis实例矩阵。

Z轴

X轴和Y轴拆分之后,对节点做了主从主备复制,然后拆分不同的业务,根据不同的节点分配负责不同的业务请求。而从Z轴角度,是对Y轴进行再次拆分。

如果Y轴上一个节点访问特别大时,就需要对请求进行AFK的Z轴拆分。例如根据数据情况或访问来源分为华北、华中、华东、华南等。虽然不同的Redis虽然是负责不同的数据,但是负责的业务是一样的。

 Z轴的出现是按照优先级或者特定的逻辑再进行拆分,是为了确保解决数据容量有限和访问压力的问题。

结论

经过X、Y、Z轴拆分之后,每台实例能够发挥单机的性能,再也没有了容量的限制,而且主Redis都还有多台副Redis,就不会出现单点故障问题,访问量自然不会大。

  • X轴拆分:水平复制,就是讲单体系统多运行几个实例,做集群加负载均衡的模式,主主、主备、主从。
  • Y轴拆分:基于不同的业务拆分
  • Z轴拆分:基于数据拆分。

AFK三轴拆分后,会涉及到数据一致性问题

强一致性

当客户端对Redis进行写的时候,主Redis先不返回客户端是否写入成功,而是先去通知副Redis同步复制写入,主Redis在阻塞等待着,直到数据全部一致,主Redis再返回客户端写入成功。

强一致性的缺陷也很明显,当有一个节点出现问题,就会导致所有的写入失败,所以强一致性极容易破坏可用性。

弱一致性

主Redis写入成功后就直接和客户端说返回成功了,然后副Redis异步复制写入Redis数据。

弱一致性的缺陷在于,有可能主Redis写入成功,但是副Redis没有成功写入,就导致副Redis丢失部分数据。

最终一致性

为了解决强一致性和弱一致性问题,可以在主Redis和众多副Redis钟搭建MQ去解决问题。主Redis和MQ是阻塞的,主Redis必须等MQ返回成功才可以向客户端返回成功,而MQ中的数据副Redis自己从中去取,然后写入库中。

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

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

相关文章

【Django】第一课 基于Django超市订单管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架,采用的是MTV架构模式进行分层架构。 项目搭建 打开pycharm开发软件,打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径,并使用创建django项…

54三数之和55 56有无重复元素的全排列

54 三数之和 首先想到的就是之前的两数之和,只要在外层遍历一遍,对每个元素用之前的两数之和的哈希做法,就刚好是O(n^2) 但是有坑的地方在于需要去重,并且输出的三元组也是需要顺序的!!然后我用set去重和重…

史上最强,这份在各大平台获百万推荐的Java核心手册实至名归

又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而,面试人群众多,技术市场却相对冷淡,…

flutter 环境搭建

一、简介 Flutter 是谷歌开发的一款开源、免费的,基于 Dart 语言的U1框架,可以快速在i0S和Android上构建高质量的原生应用。 它最大的特点就是跨平台和高性能。Dart是由谷歌,在2011 年开发的计算机编程语言,它可以被用于Web、服务器、移动应…

服务注册配置中心Nacos

文章目录一. 前言二. 下载安装1. 下载安装包2. Windows环境安装3. Linux环境安装1. 单击模式启动2. 集群模式启动3. 远程web控制4. 注册为系统服务三. 基本使用1. 添加依赖2. 服务注册3. 配置实例集群属性4. 实例权重负载均衡5. 环境隔离6. 临时实例与非临时实例四. Nacos配置管…

python常用模块

time模块 常用操作 1.直接获取时间 time.time() #获取结果是秒数,即从1970年1月1日8:00起计#1671856010.9592516 2.获取结构化时间 time.localtime() #获取本地时间,中国为东八区,为上海时间 time.gmtime() …

3.2 Static Terrestrial Laser Scanners 静态地基激光扫描仪

本章节介绍的静态地基激光扫描系统指的是那些在一个固定位置的位置上对周边场景地物特征进行扫描的设备。该类型设备的扫描测量机制是,通过激光测距仪进行斜距测量,与此同时通过水平和竖直两个方向上同步运动的角度编码器来记录角度变化值(如…

C#大型医院HIS系统源码 医院信息管理系统源码 C/S架构 VS2013+sql2012

了解更多源码内容,可私信我。 开发环境:VS2013sql2012 C/S架构 一、门诊系统: 1、挂号与预约系统:实现了医院门诊部挂号处所需的各种功能,包括门诊安排的管理,号表的生成及维护,门诊预约管理和挂号处理&…

一文带你深入理解【Java基础】· 网络编程(下)

写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正&#xff0…

AQS学习

1.1 AQS 简单介绍 AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。 AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广泛的大量的同步器, 比如我们提…

五、Arduino IDE开发esp8266环境搭建

1、安装驱动程序 (1)安装USB转串口驱动程序。 (2)根据板载的USB转串口驱动芯片选择合适驱动安装。USB转串口芯片负责和电脑之间进行数据通信。 (3)常见USB转串口驱动 CP210x驱动:CP210x USB 至 UART 桥 VCP 驱动器 - 芯科科技 CH340驱动 2、Arduino IDE环境搭建 要想使用Ar…

K8S-存储-Volume

问题 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃 时,kubelet 会重启它,但是容器中的文件将丢失——容器以干净的状态(镜像最初的状态)重新启动。…

【kafka】学习笔记(三)

学习笔记七、Kafka-Eagle 监控7.1 环境准备7.2 Eagle 安装7.3、修改配置文件7.4、添加环境变量7.5、启动Eagle八、Kafka-Kraft 模式8.1、Kafka-Kraft 集群部署8.2、初始化集群数据目录8.3、启动 kafka 集群8.4、测试8.5、集群启动脚本九、SpringBoot集成Kafka七、Kafka-Eagle 监…

支持设备的待机唤醒功能

系统待机唤醒功能 1 说明背景 1.1 需求 支持 GPU 进入低功耗模式,让用户选择降低设备的功耗 1.2 概念 上位词:APM, ACPI 同类词:睡眠模式, S0~S5 下位词:系统挂起, 系统唤醒, 运行时设备电源管理 1)ACPI 在计算机…

第10章_索引优化与查询优化

第10章_索引优化与查询优化 都有哪些维度可以进行数据库调优?简言之: 索引失效、没有充分利用到索引——索引建立关联查询太多JOIN (设计缺陷或不得已的需求)——SQL优化服务器调优及各个参数设置(缓冲、线程数等)———调整my.cnf。数据过多――分库分表 关于数据库调优的…

net/http 库的客户端实现(下)

前言 上一篇文章我们讲了 net/http 库客户端 request 的构建,接下来继续讲构建HTTP请求之后的处理操作 net/http 库的客户端实现(上) net/http 库的客户端实现(下) net/http 库的服务端实现 启动事务 构建 HTTP 请求后,接着需要开启HTTP事务进行请…

Python——几个常用的数学函数

1. min()函数:取出给定参数的最小值 说明:获取指定数值或者指定序列中最小值。 print(min(1, 5)) print(min(1, 2, 3, 4, 5, 6)) print(min([2, 3, 4, 5])) 2.max()函数:取出给定参数的最大值 说明:获取指定数值或者指定序列中…

XDocReport使用入门

XDocReport 简介 XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法(Freemarker、Velocity)转换为另外一种格式文档(Doc、Docx、XHTML、PDF)。 XDocR…

前端小知识:控制台打印(console)- 模拟Java日志打印、表格形式打印美化输出对象、代码运行时间统计

文章目录6. 控制台打印(Console)模拟Java日志打印格式美化对象打印(表格形式打印输出)日志等级输出(让其在控制台显示时有颜色提示)代码运行时间统计打印输出6. 控制台打印(Console)…

用树莓派4B安装gitlab,亲测可用~

最近成功在CentOS7上安装了gitlab,忽然想到是不是可以把吃灰的树莓派4B也装上gitlab,于是研究了一下,做个分享。 树莓派是4B 8G版本。本身装的是官方的64位系统。之前可能还装过一些乱七八糟的东西,这里就不提了。 上gitlab官网…