分布式系统之Lease机制

2024-03-19 12:18

本文主要是介绍分布式系统之Lease机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇文章2.3节primary副本切换中,我们提到了利用Lease机制进行节点状态判断;在这篇文章中,我们围绕Lease机制进行阐述。

1. Lease机制介绍

首先,先认识发音和基本含义,英[li:s],美[lis];n. 租约; 租契; 租赁物; 租赁权。

我们首先介绍一种问题背景,并利用Lease机制来进行解决。在上节提到的中心化的分布式系统中,节点的元数据信息需要一个中心化的节点进行维护,该节点容易成为整个系统的瓶颈。为此,设计一种在各节点中缓存(Cache)元数据信息的分布式系统,降低对中心元数据节点的访问,分散压力。同时,系统的正确运行依赖于各个节点cache中的数据与中心节点数据的一致性。而且,系统也需要具有一定的容错性和可用性。

利用Lease机制设计分布式Cache系统,基本原理:中心节点在向各节点发送数据的同时发送一个Lease,Lease具有一个有效时长,一旦超过该时长,Lease失效。假设系统全局时钟一致,在发出Lease后的有效时长内,中心节点保证不对相应的数据进行修改。 节点在收到数据与Lease之后,将数据置于本地Cache,当对应Lease超时,删除相应Cache数据。当中心节点需要修改数据时,先阻塞所有的读请求,并等待之前为该数据发出的Lease超时,然后对数据进行修改。

1.1 Lease机制读取和修改数据流程

基于Lease的分布式Cache系统,当客户端读取元数据时:

if(元数据在本地cache  &&  Lease有效){return 本地cache中元数据
}else{request read 元数据 from 中心节点if(客户端成功接收中心节点元数据及对应Lease){将元数据与对应Lease置于本地Cachereturn 本地cache中元数据}else{//失败或者超时读取失败,重试}
}

当客户端节点修改元数据时:

1. 当前节点向中心节点发起修改元数据请求
2. 中心节点收到修改请求后,阻塞所有的读请求(接收但不返回)
3. 中心节点等待所有与该元数据相关的Lease超时//(约束:Lease有效时长内,中心节点保证不会修改对应数据)
4. 中心节点修改元数据并通知客户端节点修改成功

容错关键点:在中心节点发出Lease后,无论客户端是任意情况(宕机,网络分化),中心节点只需等待Lease超时,就可以保证客户端不会再继续cache数据,同时保证修改数据不会破坏cache一致性。

在上述的流程中,系统任存在着一些问题:
1. 在中心节点修改元数据时需要阻塞所有读请求,造成没有读服务。 这样做是为了防止读请求时发出新Lease从而引起不断有新客户端节点持有Lease并缓存数据,形成“活锁”。解决方案:当进入修改流程,中心节点颁发的Lease有效期为已发出Lease剩余最大有效期(最大Lease倒计时)。
2. 修改中心节点元数据需要等待所有Lease超时,操作时延较大。解决方案:中心节点在修改后主动通知所有Lease节点放弃存放在cache中的相应数据,中心节点收到客户端返回的确认放弃消息,则跳过该Lease超时。

Lease机制依赖于有效期,这要求中心节点与客户端的时钟始终是同步的。

2. 基于Lease机制确定节点状态

在上一篇文章《分布式系统之中心副本控制协议(Primary-secondary协议)》中,2.3节提到了利用Lease机制确定节点状态。在这一节我们给出如何利用Lease机制来确定节点状态。首先需要明确的内容是:节点的状态是无法通过网络通信来确定的,因为网络通信存在不可靠的问题(如网络分化)。网络分化问题在primary-secondary协议系统中可能引出“双主”问题。针对该问题,有两种解决方案:

1. 容忍双主问题;实质是弃用中心化协议,改用去中心化协议
2. 利用Lease机制;

举例:X为中心节点,X向A、B、C节点发送Lease,节点持有Lease,则认为可以正常提供服务。
节点A、B、C周期性地发送“心跳”报告自身状态,中心节点X收到心跳后发送一个Lease,允许节点在Lease有效期正常工作。中心节点X给primary节点颁发特殊的Lease,一旦中心节点X希望切换新primary,则只需要等待primary的Lease过期,即可颁发新的Lease给新primary节点,从而可以避免双主问题。
与此同时,单个的中心节点X颁发Lease存在风险,一旦中心节点X宕机,则系统停服务;工程实践中,中心节点X将转变为中心集群,节点互为副本,提供Lease颁发服务。

3.Lease有效时长

Lease有效期是一个确定的时间点,中心节点颁发Lease时将当前时间加一个固定时长得出Lease有效期。工程实践中,Lease固定时长一般在10秒级别,该时长可供参考选用。

参考:

  • 《分布式系统原理介绍》

这篇关于分布式系统之Lease机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/825967

相关文章

基于Redis自动过期的流处理暂停机制

《基于Redis自动过期的流处理暂停机制》基于Redis自动过期的流处理暂停机制是一种高效、可靠且易于实现的解决方案,防止延时过大的数据影响实时处理自动恢复处理,以避免积压的数据影响实时性,下面就来详... 目录核心思路代码实现1. 初始化Redis连接和键前缀2. 接收数据时检查暂停状态3. 检测到延时过

Redis中哨兵机制和集群的区别及说明

《Redis中哨兵机制和集群的区别及说明》Redis哨兵通过主从复制实现高可用,适用于中小规模数据;集群采用分布式分片,支持动态扩展,适合大规模数据,哨兵管理简单但扩展性弱,集群性能更强但架构复杂,根... 目录一、架构设计与节点角色1. 哨兵机制(Sentinel)2. 集群(Cluster)二、数据分片

深入理解go中interface机制

《深入理解go中interface机制》本文主要介绍了深入理解go中interface机制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前言interface使用类型判断总结前言go的interface是一组method的集合,不

基于Redisson实现分布式系统下的接口限流

《基于Redisson实现分布式系统下的接口限流》在高并发场景下,接口限流是保障系统稳定性的重要手段,本文将介绍利用Redisson结合Redis实现分布式环境下的接口限流,具有一定的参考价值,感兴趣... 目录分布式限流的核心挑战基于 Redisson 的分布式限流设计思路实现步骤引入依赖定义限流注解实现

C# async await 异步编程实现机制详解

《C#asyncawait异步编程实现机制详解》async/await是C#5.0引入的语法糖,它基于**状态机(StateMachine)**模式实现,将异步方法转换为编译器生成的状态机类,本... 目录一、async/await 异步编程实现机制1.1 核心概念1.2 编译器转换过程1.3 关键组件解析

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

Go语言并发之通知退出机制的实现

《Go语言并发之通知退出机制的实现》本文主要介绍了Go语言并发之通知退出机制的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、通知退出机制1.1 进程/main函数退出1.2 通过channel退出1.3 通过cont

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程