Consul Sessions

Sessions(会话)

Consul提供了一种可用于构建分布式锁的会话机制。 会话充当节点,运行状况检查和键/值数据之间的绑定层。 它们旨在提供粒度锁定,并受到松散耦合分布式系统的Chubby Lock服务的极大启发。

»Session Design(会话设计)

Consul中的会话表示具有非常特定语义的合同。 当构造会话时,可以提供节点名称,健康检查列表,行为,TTL和锁定延迟。 新构建的会话具有可用于标识它的命名ID。 此ID可与KV存储一起使用以获取锁:互斥的咨询机制。

下面的图表显示了这些组件之间的关系:

Consul Sessions

Consul提供的合同是,在以下任何一种情况下,会话将失效:

  • 节点已取消注册
  • 任何健康检查都会被取消注册
  • 任何健康检查都会进入临界状态
  • 会话被明确销毁
  • 如果适用,TTL将过期

会话失效时,会被销毁,无法再使用。相关锁的作用取决于创建时指定的行为。 Consul支持发布和删除行为。如果未指定,则释放行为是默认行为。

如果正在使用释放行为,则释放与会话关联的任何锁定,并且密钥的ModifyIndex递增。或者,如果使用删除行为,则简单地删除与任何保持的锁相对应的密钥。这可用于创建由Consul自动删除的短暂条目。


虽然这是一个简单的设计,但它可以实现多种使用模式。默认情况下,基于gossip的故障检测器用作关联的健康检查。此故障检测器允许Consul检测持有锁的节点何时出现故障并自动释放锁。这种能力为Consul锁提供了活力;也就是说,在失败的情况下,系统可以继续取得进展。但是,由于没有完美的故障检测器,因此可能会出现误报(检测到故障),即使锁具所有者仍然存在,也会导致锁定被释放。这意味着我们正在牺牲一些安全性。

相反,可以创建没有相关健康检查的会话。这消除了误报的可能性并为了安全而交换活力。您可以绝对肯定即使现有所有者失败,Consul也不会释放锁定。由于Consul API允许会话被强制销毁,因此可以构建系统,这些系统需要操作员在发生故障时进行干预,同时排除裂脑的可能性。

第三种健康检查机制是会话TTL。创建会话时,可以指定TTL。如果TTL间隔在未更新的情况下到期,则会话已过期并触发失效。这种类型的故障检测器也称为心跳故障检测器。它比基于gossip的故障检测器的可扩展性更低,因为它增加了服务器的负担,但在某些情况下可能适用。 TTL的合同是它代表无效的下限;也就是说,Consul不会在达到TTL之前使会话到期,但允许延迟过期TTL。在会话创建,会话续订和领导者故障转移时更新TTL。当使用TTL时,客户端应该知道时钟偏差问题:即,时间可能不会在客户端上以与Consul服务器上相同的速率进行。最好设置保守的TTL值并在TTL之前更新以考虑网络延迟和时间偏差。

最后的细微差别是会话可能会提供锁定延迟。这是一段持续时间,介于0到60秒之间。当会话失效发生时,Consul会阻止在锁定延迟间隔内重新获取任何先前保持的锁定;这是受谷歌Chubby启发的保护措施。此延迟的目的是允许潜在仍然活着的领导者检测失效并停止处理可能导致状态不一致的请求。虽然不是一种防弹方法,但它确实避免了将睡眠状态引入应用程序逻辑的需要,并且可以帮助缓解许多问题。虽然默认使用15秒延迟,但客户端可以通过提供零延迟值来禁用此机制。
 

»K/V Integration(K/V集成)

KV存储和会话之间的集成是使用会话的主要场所。必须在使用之前创建会话,然后通过其ID引用。

扩展KV API以支持获取和释放操作。获取操作的作用类似于检查和设置操作,除非它只有在持有者没有锁时才能成功(当前锁持有者可以重新获取,见下文)。成功时,存在正常的密钥更新,但LockIndex也会增加,并且会话值会更新以反映持有锁的会话。

如果在获取锁期间,锁已由给定会话保持,则LockIndex不会递增,而是更新密钥内容。这使得当前的锁定持有者可以更新密钥内容,而无需放弃锁定并重新获取它。

一旦保持,就可以使用相应的释放操作释放锁,从而提供相同的会话。同样,这类似于检查和设置操作,因为如果给定无效会话,请求将失败。一个关键的注意事项是锁可以在不是会话的创建者的情况下被释放。这是设计的,因为它允许运营商在必要时进行干预并强制终止会话。如上所述,会话失效还将导致释放或删除所有持有的锁。释放锁时,LockIndex不会改变;但是,会话被清除并且ModifyIndex递增。

这些语义(大量借用了Chubby)允许(Key,LockIndex,Session)的元组充当唯一的“音序器”。可以传递此顺控程序并用于验证请求是否属于当前锁定持有者。因为LockIndex在每次获取时递增,即使同一会话重新获取锁,序列发生器也能够检测到陈旧请求。同样,如果会话无效,则与给定LockIndex对应的Session将为空。


需要明确的是,这种锁系统纯粹是建议性的。客户端必须获取锁才能执行任何操作。任何客户端都可以读取,写入和删除密钥,而无需拥有相应的锁。领事的目标不是防止行为不端的客户。
 

»Leader Election(领导选举)

会话提供的原语和KV存储的锁定机制可用于构建客户端领导者选举算法。 领导者选举指南中有更详细的介绍。

»Prepared Query Integration(准备好的查询集成)

准备好的查询可以附加到会话,以便在会话失效时自动删除准备好的查询。

猜你喜欢

转载自blog.csdn.net/longgeqiaojie304/article/details/85234469