深入分布式缓存-Raft & Lease机制

简介: 深入分布式缓存-Raft & Lease机制

前言

之前我们学习了Paxos,(世界上只有一种一致性协议),虽然大名鼎鼎,但是确实比较难理解。Raft提供了和Paxos一致性算法相同的功能和性能,但它的算法结构更加容易理解并且更加容易构建实际的系统。大量的应用通过Raft实现一致性,像百度的Braft、TiKV-分布式数据库、etcd等等。

Raft将一致性算法分成了几个关键模块,例如领导人选举、事情处理(日志复制)、安全性。同时,包括了新的机制来允许集群成员动态变化,利用大多数保证数据安全性。

Lease机制是一种租约、承诺机制,后续会有详细的介绍与实践操作。

Raft vs Paxos

Paxos与Raft 都是为了实现一致性这个目标,不同点在于Raft在任何时候一个服务器中都可以扮演下面角色之一:

  • 领导者:处理所有客户端的交互,等于数据真正提交者,一般一次只有一个领导者
  • 选民:完全被动接受通知,告知要进行选举,投票
  • 候选人:选举过程中提名自己的实体,一旦选举成功,就成为领导者

\

Raft算法分为两个阶段:

1)任何一个服务器理论上都是候选人,向其他服务器发出请求选举请求

2)其他服务器同意选举请求,回复ok响应指令。

3)候选者成为领导者,可以真正发送执行指令

4)如果该领导者宕机,则剩下的会进行新一轮选举,新的候选者变成领导者,进入下一轮

\

时序图如下:

1.png

Lease机制

在分布式系统环境中,Lease是授权者授予分布式环境一段时间的租约、承诺。

image.png

以缓存服务器举例说明Lease机制原理。\

缓存服务器,分发NodeA服务器数据为a,颁布约期12:00,;分发NodeB服务器数据为a,约期为12:00;分发NodeC服务器数据为b,约期为12:10

此时,缓存服务器会有约定,颁发的所有lease,在所有的都失效之前,不会有更新操作。

到了12:05,此时,对于NodeA NodeB,认为数据a,已经不可信,因为缓存服务器颁发的约期已过期。会删除本地存储的数据a

到了12:11,此时,NodeC数据b,也会失效,删除本地数据。缓存服务器,检测到所有的颁发的Lease都失效,允许更新操作。

存在的问题,优化:

  1. 已经过期的Lease,像NodeA 在12:05,删除本地数据之后,请求再请求到缓存,此时就查询为空,会造成缓存穿透,容易引发雪崩。我们可以通过,缓存服务器会照常传输数据,但是不颁发Lease去优化这个问题
  2. 对于颁发的所有Lease不失效不更新阻塞问题,可以采用主动通知机制,主动失效策略。如果检测到有数据更新,涉及到已经颁发的节点,那么通知失效,重新颁发Lease
  3. 基于资源锁定,数据a、数据b应该把资源锁定粒度缩小,控制到数据上。数据a,所有的节点都失效,即可对数据a进行新的操作

\

Lease实践

分布式系统中,常常通过主备来实现高可用。

image.png

如图所示,当主机宕机之后,备机会通过一些策略,进行升级为主机,接受请求者请求。\

此时,就会存在一个脑裂问题。

脑裂(split-brain),指的是在一个高可用系统中,两个相互联系的节点断开联系时,本来整体系统变成独立的个体系统,会造成竞争公共资源,导致严重的系统bug。主备系统中,常常通过心跳检测策略,来实行主备机切换。心跳检测,就是造成脑裂的一个重要原因。当备机slave,开始升级成主机,提供服务,此时,主机master复活,就会分割独立,造成竞争共享资源。

有一种解决方案,为设立仲裁机制,告知,判定死亡。类似于,法庭中,案件审理,需要最终判官,裁定最终结果。

image.png

设立一个monitor监控,当主机宕机,备机slave想要切换为主机,monitor先对主机进行ping,最终如果判定主机确认死亡,才让备机切换;\

主机本身,运行过程中,要短间隔周期内ping monitor slave保证都存活,如果出现异常,则不能进行业务执行,重试多次,若失败,则退出

此时,该解决方案,就会出现monitor高可用的问题。

通过我们上述聊得Lease机制,会进一步处理脑裂问题。

image.png

假设,备机已经成功切换,且正在提供服务。利用Lease,备机提供服务,且颁发Lease;此时老主机如果复活,也提供服务,也颁发Lease;此时,server1等接受服务服务器,会对Lease颁发的与本地比较,造成老主机颁发的Lease始终处于失效状态。在频繁失效,可以配置监控点触发报警机制,人工介入,让老主机放弃主机,切换为备机。\

《end》


目录
相关文章
|
1月前
|
存储 缓存 算法
分布式锁服务深度解析:以Apache Flink的Checkpointing机制为例
【10月更文挑战第7天】在分布式系统中,多个进程或节点可能需要同时访问和操作共享资源。为了确保数据的一致性和系统的稳定性,我们需要一种机制来协调这些进程或节点的访问,避免并发冲突和竞态条件。分布式锁服务正是为此而生的一种解决方案。它通过在网络环境中实现锁机制,确保同一时间只有一个进程或节点能够访问和操作共享资源。
69 3
|
2月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
3月前
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
345 1
|
1月前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现
消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
消息中间件 存储 监控
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
【10月更文挑战第2天】消息队列系统中的确认机制在分布式系统中如何实现
|
1月前
|
存储 缓存 负载均衡
Nginx代理缓存机制
【10月更文挑战第2天】
71 4
|
1月前
|
存储 缓存 NoSQL
深入理解后端缓存机制的重要性与实践
本文将探讨在后端开发中缓存机制的应用及其重要性。缓存,作为提高系统性能和用户体验的关键技术,对于后端开发来说至关重要。通过减少数据库访问次数和缩短响应时间,缓存可以显著提升应用程序的性能。本文将从缓存的基本概念入手,介绍常见的缓存策略和实现方式,并通过实例展示如何在后端开发中有效应用缓存技术。最后,我们将讨论缓存带来的一些挑战及其解决方案,帮助您在实际项目中更好地利用缓存机制。
|
1月前
|
消息中间件 存储 监控
消息队列系统中的确认机制在分布式系统中如何实现?
消息队列系统中的确认机制在分布式系统中如何实现?
|
2月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
70 8
|
2月前
|
缓存 Java Python
python垃圾回收&缓存机制
python垃圾回收&缓存机制

热门文章

最新文章

下一篇
无影云桌面