分布式系统之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

相关文章

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

MySQL 缓存机制与架构解析(最新推荐)

《MySQL缓存机制与架构解析(最新推荐)》本文详细介绍了MySQL的缓存机制和整体架构,包括一级缓存(InnoDBBufferPool)和二级缓存(QueryCache),文章还探讨了SQL... 目录一、mysql缓存机制概述二、MySQL整体架构三、SQL查询执行全流程四、MySQL 8.0为何移除查

一文详解Java Condition的await和signal等待通知机制

《一文详解JavaCondition的await和signal等待通知机制》这篇文章主要为大家详细介绍了JavaCondition的await和signal等待通知机制的相关知识,文中的示例代码讲... 目录1. Condition的核心方法2. 使用场景与优势3. 使用流程与规范基本模板生产者-消费者示例

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Java如何通过反射机制获取数据类对象的属性及方法

《Java如何通过反射机制获取数据类对象的属性及方法》文章介绍了如何使用Java反射机制获取类对象的所有属性及其对应的get、set方法,以及如何通过反射机制实现类对象的实例化,感兴趣的朋友跟随小编一... 目录一、通过反射机制获取类对象的所有属性以及相应的get、set方法1.遍历类对象的所有属性2.获取

MySQL中的锁和MVCC机制解读

《MySQL中的锁和MVCC机制解读》MySQL事务、锁和MVCC机制是确保数据库操作原子性、一致性和隔离性的关键,事务必须遵循ACID原则,锁的类型包括表级锁、行级锁和意向锁,MVCC通过非锁定读和... 目录mysql的锁和MVCC机制事务的概念与ACID特性锁的类型及其工作机制锁的粒度与性能影响多版本

Spring使用@Retryable实现自动重试机制

《Spring使用@Retryable实现自动重试机制》在微服务架构中,服务之间的调用可能会因为一些暂时性的错误而失败,例如网络波动、数据库连接超时或第三方服务不可用等,在本文中,我们将介绍如何在Sp... 目录引言1. 什么是 @Retryable?2. 如何在 Spring 中使用 @Retryable

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization