Redis中AKF问题

单机、单节点、单实例存在的问题

  • 单点故障(物理机挂了,要等很久才能可用)
  • 容量有限
  • 压力过大

解决方式
1、AKF有XYZ三个轴,可以只发生一个,可以多个维度一起发生

	X轴:解决单点故障,服务可用性的问题。也就是说沿着X轴,为服务多复制几个一样的实例(做备用节点),平时一个实例对外提供服务,
并将自己的数据复制到备份节点,也就是一主多从的方式。主节点提供服务并将数据保存到备用节点,一旦主节点宕机,备用节点立马升级
为主节点,保证服务的可用性。同时可以配置读写分离,降低主节点的压力。

注意:基于X轴做主从节点这种方式,一般都是全量镜像(备用节点中保存有主节点的所有数据)

	Y轴:对要存的数据按照不同的功能业务拆分,不同类别的数据分开存储,客户端实现指定查询哪个库,解决容量有限的问题
	
	Z轴:在按照业务拆分的前提下,如果又存不下了,可以基于一定的规则,将一个业务将数据再拆分,存储到不同的库里。就是将数据
根据优先级进行更细粒度的划分,进一步降低数据的耦合度

在这里插入图片描述

数据量足够小,更容易发挥单击性能;单机单点问题得到了解决;

新的问题
通过AKF实现一边多,产生数据一致性的问题:

方案1:所有节点阻塞,直到数据全部一致 - 强一致性,成本极高,并且难以达到。如果有一个节点因为网络问题挂了,整体就写失败了,对外表现出的是整个服务不可用。强一致性会破坏可用性。而我们将单redis拆分成多redis,本来就是要解决可用性的问题。
在这里插入图片描述

方案2:容忍数据丢失一部分,主redis直接返回ok,通过异步方式让两个从库同步。存在的问题是,如果两个从库都写失败,别人在查询的时候,会发现丢失了这个数据。
在这里插入图片描述

方案3:使用足够可靠的kafka,达到数据的最终一致性。如果客户端要取数据的话,有多种可能:在达到最终一致性之前,可能会取到不一致的数据。
在这里插入图片描述

   了解了数据一致性后,我们会发现一个新的问题:主redis只有一台,它down掉了怎么办?又回到最初的起点。但其实是有些不一样的。
如果主挂掉了,又导致整个服务不可用了。一般我们对主做HA(高可用),由于我们有了从redis,而数据又和主redis一致,显然我们可以
从中挑选一个新的主redis,其它redis继续跟随它,继续提供服务,这就牵扯redis的哨兵机制了。
   多台监控程序:多台盯着一个主,如果redis挂了,可能有监控发现它挂了,有监控没发现它挂,因为有网络延时的存在。一个redis
是好是坏,应该由多少台监控程序决定?这时不能使用强一致性,因为可能有的监控由于网络延迟卡住了。因此只要一部分给出ok,就立刻
确定redis挂了。那么,一部分应该是几个?这时候我们推导一下:

	假设我们有3个监控,有1个说redis挂了,就立刻把他踢掉,但可能是由于这个监控的连接有问题,这就误伤了。并且一个监控说话就
能算数的话,三个监控之间会产生不同的结果,产生竞争。会产生一个问题:网络分区(脑裂),不同的客户端拿到的是不同的数据,对外
表现为数据的不一致。

	脑裂问题(出现脑裂问题的前提是没有考虑过半机制)
	什么是脑裂?我们人只有一个大脑,在分布式服务中,多个实例也只能有一个主节点,这个主节点就是大脑。那么脑裂就是现在一个
大脑裂开了,变成了两个甚至三个大脑。映射到服务中就是出现了多个主节点。

	脑裂问题怎么出现的?
	前面我们分析了,为了实现高可用,要对主从节点搭建监控服务,监控主节点的心跳状态。比如说我们现在有五台服务,假设现在网络
出现问题了,然后五个监控程序分成了两个网段。有三台是一组,这三台之间可以互相通信,另外两台为一组,这两台之间也可以互相通信。
但是只有一组能够跟主节点通信,那么无法跟主节点通信的这一组,就会自成一派,然后俩人合计以分析主节点挂了,然后就将一个从节点
提成主节点了,那么这时就会造成一个服务中出现两个主节点,这两个主节点间无法通信,客户端每次访问时,可能访问这个主节点,也可能
访问另一个主节点,而且这两个主节点的信息是无法保证一致的,老得主节点中保存的是老得数据,新的主节点中保存新的数据。但是因为对
外表现高可用,客户端是不知道你服务有两个主节点的。那么对外表现是就是,我客户端调用服务,然后可能每次调用结果都不一样。
	
	分区容忍性
 	脑裂问题是由于网络分区引起的。其实这种服务对网络分区有一个分区容忍性的概念。也就是说能不能容忍脑裂时出现的数据不一致
问题。例如,在微服务中,都会有一个注册中心。注册中心就是用来存放提供服务的实例信息,例如有个订单业务,有十个实例,但是因为
出现了网络分区的问题,此时这边注册了八台,那边注册了两台,但是请求过来后,并不关心你总共多少台,只需要给我一个能用的实例我
去调用就行了,不管是八台的还是两台的,都可以提供一个服务给客户端调用,而且能够调用成功,这时就是可以容忍网络分区的。

	比如有3台服务,2个监控说redis挂了,1个监控说redis还活着,这2个监控的势力为2。势力为1的监控就没有决策权了。这时对外表现
出的就不是一种模棱两可的状态了。因此,当势力达到n/2+1,也就是过半的时候,就可以解决脑力问题。所以集群一般使用奇数台。

	为什么是奇数台?
	我们用3台和4台比较,它们都只允许挂一台。但4台比3台更容易挂一台,而且4台的价格更高。所以第4台是没有必要的。

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值