Consul Session
consul馆提供session机制,可用于构建分布式锁。 session作为节点,健康检查和key/value数据之间的绑定层。 它们旨在提供粒度锁定,并受到“The Chubby Lock Service for Loosely-Coupled Distributed Systems的极大启发。
Session Design
consulsession代表了具有非常具体语义的contract。 当构建session时,可以提供节点名称,健康检查列表,行为,TTL和lock-delay 。 新建的session中提供了一个可以用来识别它的命名ID。 该ID可与KV存储一起使用以获取锁定:相互排斥的咨询机制。
以下是显示这些组件之间关系的图表:

consul提供的contract是,在下列任何一种情况下,session将被invalidated :
- 节点被注销
- 任何健康检查都被注销
- 任何健康检查都进入危急状态
- session被明确地销毁
- 如果适用,TTL过期
session invalidated时,会被破坏,无法再使用。 关联的锁会发生什么事情取决于创建时指定的行为。 Consul支持release和delete行为。 如果没有指定,则release行为是默认的。
如果正在使用release行为,与session相关联的任何锁将被释放,并且键的ModifyIndex将递增。 或者,如果使用delete行为,则与任何所保持的锁相对应的键被简单地删除。 这可以用于创建由consul自动删除的临时条目。
虽然这是一个简单的设计,它可以实现多种使用模式。 默认情况下,使用gossip based failure detector作为相关的健康检查。 该故障检测器允许Consul检测持有锁的节点何时发生故障并自动释放锁。 这种能力为consul锁提供了活力 ;
那就是在失败的情况下,系统可以继续取得进展。 然而,由于没有完美的故障检测器,因此即使锁所有者仍然存在,也可能存在一个假阳性(检测到故障),导致锁释放。 这意味着我们正在牺牲一些安全 。
相反,可以创建一个没有关联的健康检查的session。 这消除了对于安全性的假阳性和交易活动的可能性。 即使现有的所有者失败,您也可以绝对地确定consul不会释放锁定。 由于consulAPI允许强制破坏session,因此允许构建系统,
要求操作员在发生故障的情况下进行干预,同时排除split-brain的可能性。
第三个健康检查机制是sessionTTL。 创建session时,可以指定TTL。 如果TTL间隔到期而不更新,则session已过期,并且触发invalidated。 这种类型的故障检测器也称为心跳失效检测器。 它比基于gossip的故障检测器的可扩展性更低,因为它对服务器造成了更大的负担,
但在某些情况下可能适用。 TTL的contract是它代表invalidated的下限; 也就是说,在达到TTL之前,consul不会过期session,但允许延迟超过TTL的期限。 在session创建,session更新和领导者故障转移时,更新TTL。 当使用TTL时,客户端应该意识到时钟偏移问题:
即时间可能不会像在consul服务器上那样在客户端上以相同的速率进展。 最好设置保守的TTL值,并在TTL之前更新以考虑网络延迟和时间偏移。
最后的细微差别是session可能会提供lock-delay 。 这是0到60秒之间的持续时间。 当发生sessioninvalidated时,Consul防止在lock-delay时间间隔内重新获取先前保存的任何锁; 这是Google Chubby的灵感来源。 这种延迟的目的是允许潜在的活着的领导者检测到invalidated,
并停止可能导致不一致状态的处理请求。 虽然不是一个防弹方法,但它确实避免了将睡眠状态引入到应用程序逻辑中,并且可以帮助减轻许多问题。 默认情况下是使用15秒延迟,客户端可以通过提供零延迟值来禁用此机制。
K/V Integration
KV存储和session之间的集成是session使用的主要场所。 session必须在使用前创建,然后由其ID引用。
扩展KV API以支持acquire和release操作。 acquire操作的作用类似于Check-And-Set操作,只有当没有现有的锁定保持器(当前的锁定保持器可以重新acquire ,见下文)时,它才能成功。 成功时,有一个正常的key更新,但是LockIndex也有一个增量,并且Session值被更新以反映持有该锁的session。
如果在acquire期间锁已经被给定的session保持,则LockIndex不会递增,但key内容将被更新。 这使得当前的锁持有人更新key内容,而不必放弃锁并重新获取它。
一旦保持,可以使用相应的release操作释放锁,从而提供相同的session。 同样,这样做就像一个Check-And-Set操作,因为如果给定invalidatedsession,请求将失败。 一个关键的注意事项是锁可以被释放,而不是session的创建者。 这是设计,因为它允许操作员干预和强制终止一个session,如果必要的话。 如上所述,sessioninvalidated还将导致所有持有的锁被释放或删除。 当锁释放时, LockIndex不会改变; 但是, Session被清除,并且ModifyIndex递增。
这些语义(从Chubby大量借用)允许(Key,LockIndex,Session)的元组作为一个独特的“顺控程序”。 该定sequencer器可以传递,并用于验证请求是否属于当前的锁持有者。 因为LockIndex在每次acquire递增,即使相同的session重新获取锁定,定sequencer也可以检测到一个陈旧的请求。 类似地,如果session被invalidated,则与给定的LockIndex对应的session将为空。
要清楚,这个锁定系统是纯粹的咨询 。 没有执行客户端必须获取锁来执行任何操作。 任何客户端都可以读取,写入和删除key,而不拥有相应的锁。 consul不是为了防止不良行为客户的目标。
Consul Session的更多相关文章
- 【Consul】Consul架构-Session会话
Consul提供session会话机制--可以用于构建分布式锁,session可以绑定到节点.健康检查.KV数据.目的是提供颗粒锁--受 The Chubby LockService for Loos ...
- 一个基于Consul的.NET Leader选举类库
前段时间有传言说Consul将不能在我国继续使用,后被查明是因法律问题Vault企业版产品不能在国内销售.Valut和Consul都是HashiCorp公司的产品,并且都推出了开源版本,继续使用开源版 ...
- 使用C# 和Consul进行分布式系统协调
随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式的服务,如何在分布式的系统中对这些服务做协调变成了一个很棘手的问题.今天我们就来看看如何使用C# ,利用开源对分布式服务 ...
- Consul文档简要整理
什么是Consul? Consul是一个用来实现分布式系统的服务发现与配置的开源工具.他主要由多个组成部分: 服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用 ...
- consul实现分布式锁
分布式一致性问题: 分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tole ...
- MySQL MGR+ Consul之数据库高可用方案
背景说明: 基于目前存在很多MySQL数据库单点故障,传统的MHA,PXC等方案用VIP或者DNS切换的方式可以实现.基于数据库的数据强一致性考虑,采用MGR集群,采用consul服务注册发现 ...
- Docker+Consul+Registrator 实现服务注册与发现
Docker+Consul+Registrator实现服务注册与发现 逻辑图 实现nginx节点自动化加入容器IP代理 1.三台Consul agent server作为高可用通过Consul Tem ...
- 什么是Consul
什么是Consul Consul文档简要整理 什么是Consul? Consul是一个用来实现分布式系统的服务发现与配置的开源工具.他主要由多个组成部分: 服务发现:客户端通过Consul提供服务,类 ...
- Consul之:key/value存储
key/value作用 动态修改配置文件 支持服务协同 建立leader选举 提供服务发现 集成健康检查 除了提供服务发现和综合健康检查,Consul还提供了一个易于使用的键/值存储.这可以用来保存动 ...
随机推荐
- <<APUE>> 编译方法
/********************************************************************************第0种-最简单实用********** ...
- CentOS7 安装mysql(YUM方式)
1.下载mysql源安装包 shell> wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm 2 ...
- Druid 连接池 JDBCUtils 工具类的使用
Druid工具介绍 它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. 支持所有JDBC兼容的数据库,包括Oracle.MySQL. ...
- Zabbix 命令:zabbix_get
zabbix_get 作用总有人在群里提问,为什么 zabbix 获取不到数据,为什么 zabbix 提示 Not Support,怎么办?别老问,用 zabbix_get 试着获取数据即可.在 za ...
- unittest框架进坑系列_(含selenium数据分离的坑)
1.测试用例的执行顺序 有默认的顺序的,不是按你自己的排列执行,注意. 进坑原因,没有先执行制造变量的测试用例,导致其他用例无法找到变量值 2.数据分离的坑 在控制层 有函数嵌套,2个函数都必须带se ...
- ASP.NET Web Pages:目录
ylbtech-.Net-ASP.NET Web Pages:目录 1. 官网返回顶部 1. https://www.asp.net/web-pages 2. https://msdn.microso ...
- Mysql 锁技术要点【转载】
MyISAM和InnoDB的区别 MySQL默认采用的是MyISAM. MyISAM不支持事务,而InnoDB支持.InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事 ...
- skopt超参数优化实例
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_boston from skl ...
- pandas的merge函数
pandas.merge(left,right,how='inner',on=None,left_on=None,right_on=None,left_index=False,right_index= ...
- Java 运算符-=,+=混合计算详解
+=与-=运算符混合计算解析: int x = 3; x += x -= x -= x += x -= x; 详解:算数运算按运算符优先级运算,从右至左计算. 1. x=x-x; 实际为 3 - 3 ...