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支持releasedelete行为。 如果没有指定,则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以支持acquirerelease操作。 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的更多相关文章

  1. 【Consul】Consul架构-Session会话

    Consul提供session会话机制--可以用于构建分布式锁,session可以绑定到节点.健康检查.KV数据.目的是提供颗粒锁--受 The Chubby LockService for Loos ...

  2. 一个基于Consul的.NET Leader选举类库

    前段时间有传言说Consul将不能在我国继续使用,后被查明是因法律问题Vault企业版产品不能在国内销售.Valut和Consul都是HashiCorp公司的产品,并且都推出了开源版本,继续使用开源版 ...

  3. 使用C# 和Consul进行分布式系统协调

    随着大数据时代的到来,分布式是解决大数据问题的一个主要手段,随着越来越多的分布式的服务,如何在分布式的系统中对这些服务做协调变成了一个很棘手的问题.今天我们就来看看如何使用C# ,利用开源对分布式服务 ...

  4. Consul文档简要整理

    什么是Consul? Consul是一个用来实现分布式系统的服务发现与配置的开源工具.他主要由多个组成部分: 服务发现:客户端通过Consul提供服务,类似于API,MySQL,或者其他客户端可以使用 ...

  5. consul实现分布式锁

    分布式一致性问题: 分布式的CAP理论告诉我们"任何一个分布式系统都无法同时满足一致性(Consistency).可用性(Availability)和分区容错性(Partition tole ...

  6. MySQL MGR+ Consul之数据库高可用方案

    背景说明:     基于目前存在很多MySQL数据库单点故障,传统的MHA,PXC等方案用VIP或者DNS切换的方式可以实现.基于数据库的数据强一致性考虑,采用MGR集群,采用consul服务注册发现 ...

  7. Docker+Consul+Registrator 实现服务注册与发现

    Docker+Consul+Registrator实现服务注册与发现 逻辑图 实现nginx节点自动化加入容器IP代理 1.三台Consul agent server作为高可用通过Consul Tem ...

  8. 什么是Consul

    什么是Consul Consul文档简要整理 什么是Consul? Consul是一个用来实现分布式系统的服务发现与配置的开源工具.他主要由多个组成部分: 服务发现:客户端通过Consul提供服务,类 ...

  9. Consul之:key/value存储

    key/value作用 动态修改配置文件 支持服务协同 建立leader选举 提供服务发现 集成健康检查 除了提供服务发现和综合健康检查,Consul还提供了一个易于使用的键/值存储.这可以用来保存动 ...

随机推荐

  1. VS2010程序调试

    http://blog.csdn.net/kingzone_2008/article/details/8133048 调试初识及实例.

  2. dedecms问答模块时间显示1970-01-01的解决办法

    在使用dedecms的问答模块的时候,很多人希望能在模板上加上问题的时间,一般我们采用这样的dede标签: {dede:ask row=24 titlelen='50' sort='ok'}   &l ...

  3. linux 线程的同步 二 (互斥锁和条件变量)

    互斥锁和条件变量 为了允许在线程或进程之间共享数据,同步时必须的,互斥锁和条件变量是同步的基本组成部分. 1.互斥锁 互斥锁是用来保护临界区资源,实际上保护的是临界区中被操纵的数据,互斥锁通常用于保护 ...

  4. 如何随机从数据库表中抽一条数据的SQL语句

    NewID() 方法返回一个 GUID,如:EE95A489-B721-4E8A-8171-3CA8CB6AD9E4 在 select 表的时候,再增加一列为 NewID() 就可以了. SQL 语句 ...

  5. SpringAOP基础 - 静态代理设计模式

    代理模式在实现过程中,要创建一个接口(社交技巧-接口),代理类(经纪人 - 类)和真实类(范冰冰 - 类)同时实现这个接口. 举个例子: 我们想要找范冰冰吃饭,但是呢,她是大明星,不可能轻易见我们,我 ...

  6. 高通QMI协议

    QMI(Qualcomm MSM Interface,官方名称应该是Qualcomm Message Interface)是高通用来替代OneRPC/DM的协议,用来与modem通信. QMI协议定义 ...

  7. matlab批量修改图片大小

    转自:http://blog.csdn.net/cike0cop/article/details/53087995 %author:coplin %time:2016-10-10 %function: ...

  8. 洛谷 P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...

  9. vb 读取指定路径文件名

    Private Sub ExportCostSheetData() InsertRow("") InsertRow("Run 2:Export CostingSheet= ...

  10. tornado--同步异步

    同步:指两个或两个以上随时间变化的量在变化过程中保持一定的相对关系 现象:有一个共同的时钟,按来的顺序一个一个处理 异步:双方不需要共同的时钟,也就是接收方不知道发送方什么时候发送,所以在发送的信息中 ...