【Consul】Consul架构-Session会话
Consul提供session会话机制——可以用于构建分布式锁,session可以绑定到节点、健康检查、KV数据。目的是提供颗粒锁——受 The Chubby LockService for Loosely-Coupled
Distributed Systems启发。
本节主要讲解consul内部技术细节,使用consul不需要必须了解这些细节的。这些文章是为那些不愿意深入源代码但是希望技术细节的人准备的。
1.1 session设计
Consulsession代表一个有非常具体的语义——合约,当构建一个session时,需要提供节点名称,健康检查列表,行为, TTL,锁期限。。新建session返回唯一的标识ID。此ID可用于作为与KV操作的锁:互斥机制。
下面一个各部分间的关系图:
Consul提供的合约,发生如下任一情况,session都会被销毁:
•节点销毁
•任何的健康检查,注销
•任何健康检查都要进入Critical状态
•会话被显式销毁
•TTL到期,如果适用
当session失效后,会被销毁,不能再使用。关联的锁发生什么行为,取决于创建时指定的修饰符。Consul支持release和delete两种处理方式。如果没有指定,默认为release。
如果使用release,任何与该session相关的锁都会被释放,并且持有该锁的key的ModifyIndex也会递增。
如果使用了Delete,持有该锁的KEY将会被删除。
虽然这只是说简单的设计,但启用了众多的使用模式。默认情况下,基于故障检测的gossip可用协同健康检查。这种故障检测允许Consul自动释放故障节点持有的锁。为Consul locks提供liveness特性(活性),也就是说,在系统故障后,集群可以继续运转。然而,由于没有完美的故障检测器,它可能有一个假阳性(伪故障),这导致锁被释放,即使锁的所有者仍然活着。这意味着我们牺牲了一些安全。
第二,可以创建一个健康检查无关的会话。这消除安全隐患。即使现有的持有者已经故障,consul也不会释放锁。由于Consul API允许会话强制销毁。此时,就绪管理员手骨干预,以防止出现脑裂。
第三,使用TTL创建于健康检查有关的session。创建一个会话时,指定TTL。如果TTL时间到期没有续签,会话会过期或失效。这种类型的故障检测器也被称为一个心跳故障检测器。由于增加server节点的负担,但是其扩展性不如基于gossip的故障检测,但在这种机制适合某些场景。TTL合约代表了下界失效,也就是说,在TTL到达之前,consul session不会失效,允许 TTL进行延期——会话创建(create),重新开始(renew),leader故障。当使用TTL时,client需要注意时钟偏移问题:即在client与server间要保证时间同步,最好的是,在设置TTL值时,考虑网络延迟和时间偏移因素。
最后的细微差别在于会话可能会提供一个锁的延迟。这是一个持续时间,在0到60秒之间。当一个会话失效发生,consul防止在lock-delay间隔内先前的锁持有重新持有锁。这是设计灵感来自Google'sChubby。这种delay的目的是让潜在的仍然活的Leader来检测无效请求和停止处理可能导致不一致状态的请求。While not a bulletproof method, it does avoid the need
to introducesleep states into application logic and can help mitigate many issues. Whilethe default is to use a 15 second delay, clients are able to disable thismechanism by providing a zero delay value.
1.2 K/V集成
KV存储和会话的集成是使用会话的主要场景。必须在使用之前创建一个会话,然后使用它的ID。
KV API支持acquire和release操作,acquire操作类似检查-设置(Check-And-Set)操作——只有当锁不存在持有者时才会返回成功。当成功时,某个normal标识会更新,也会递增LockIndex,当然也会更新session的信息。
如果在acquire操作时,与session相关的锁已经持有,那么LockIndex就不会递增,但是key值会更新,这就允许锁的当前持有者无需重新获得锁就可以更新key的内容。
一旦获得锁,所需要经release操作来释放(使用相同的session)。Release操作也类似于检查-设置(Check-And-Set)操作。如果给定的session无效,那么请求会失败。需要特别注意的是,无需经过session的创建者,lock也是可以被释放的。这种设计是允许操作者干预来终止会话,在需要的时候。如上所述,会话无效也将导致所有被持有的锁被释放或删除。当锁被释放时,LockIndex不会变化,但是session会被清空,并且ModifyIndex递增。
这些语义允许元组(Key,LockIndex,Session)作为一个独特的“序列”。这个序列可以被传递和用于验证请求是否属于当前的锁持有者。因为每次acquire 都会导致LockIndex递增,即使同一会话中重新获取锁,该序列能够检测到陈旧的请求。同样,如果会话失效,相应的LockIndex将为空。
要清楚的是,这种锁系统是纯粹的咨询。并不是强制Client必须获取锁再能执行操作作。任何客户端都可以在未获得锁的情况下读取、写入和删除Key操作。它不是Consul用于保护系统的方法。
1.3 Leader选举
通过Session提供的原语和KV存储的lock机制可以用来建立client端的leader选举算法。详细细节可以参照《leader Electionguide》。
【Consul】Consul架构-Session会话的更多相关文章
- .NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现
先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访问系统的组件. 参考 本文将使用 Ocelot 构建统一入口的 Gateway. 关于 IdentityS ...
- 【转】.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现
作者:Zhang_Xiang 原文地址:.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现 先决条件 关于 Ocelot 针对使用 .NET 开发 ...
- PHP漏洞之session会话劫持
本文主要介绍针对PHP网站Session劫持.session劫持是一种比较复杂的攻击方法.大部分互联网上的电脑多存在被攻击的危险.这是一种劫持tcp协议的方法,所以几乎所有的局域网,都存在被劫持可能. ...
- 基于redis实现tomcat的session会话保持 (转)
出处:https://cloud.tencent.com/developer/article/1402997 基于redis实现tomcat的session会话保持 在实际生产中,我们经常部署应用服务 ...
- 负载均衡session会话保持方法
负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法:1.使用cookie将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在该用 ...
- PHP中的session会话创建打印释放销毁;
PHP Session PHP session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置.Session 变量存储单一用户的信息,并且对于应用程序中的 ...
- 跨域请求,关于后端session会话丢失的解决办法
目前使用前后端分离的模式开发,后端提供跨域接口.前端jsonp调用,绑定数据,但是在该站点下有个人中心模块存在的情况下,服务端的session会话会被跨域请求覆盖改掉 大家都知道tomcat使用coo ...
- SESSION会话技术
以下对session会话技术详解: 要了解点http协议理解更佳--->http请求头和http相应头 在session_start的时候,浏览器会向服务器发出请求 在请求的同时,如果是第一次a ...
- 在Windows环境中使用Nginx, Consul, Consul Template搭建负载均衡和服务发现服务
搭建负载均衡和服务发现服务的目的 随着网站业务的不断提升,单个服务器的性能越来越难满足客户的业务需求,所以很多情况下,需要使用多服务器实例和负载均衡器来满足业务需要. Nginx 什么是Nginx N ...
随机推荐
- 我的HTML总结之常用基础便签
HTML:是Hyper Text Markup Language(超级文本标记语言)的缩写,HTML不是一种程序,只是一种控制网页中数据显示的标识语言. HTML由一组标签组成. HTML的基本结构 ...
- python入门21 pip安装、更新、卸载第三方包,验证包是否安装成功;pip自身更新升级
1 安装第三方包 python3自带安装工具pip,且在安装时勾选添加path也会将pip.exe所在目录加入到环境变量(python安装目录\Scripts). 因此安装第三方软件特别简单,打开命令 ...
- kahadb设计
Kahadb设计思想 简介 hakadb是activemq的持久化数据库,作为消息队列的存储,每个消息有一个消息ID,提供了对消息的快速的查找,更新,以及消息的事物支持,以及意外磬机之后的恢复.丰 ...
- JVM文章学习
JVM 文章 Java虚拟机学习 - 体系结构 内存模型http://blog.csdn.net/java2000_wl/article/details/8009362 Java虚拟机学习 - 对象 ...
- python:生产者与消费者模型
1,生产者与消费者模型的矛盾在于数据供需的不平衡 import time import random from multiprocessing import Queue from multiproce ...
- 树的直径的求法即相关证明【树形DP || DFS】
学习大佬:树的直径求法及证明 树的直径 定义: 一棵树的直径就是这棵树上存在的最长路径. 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之间的距 ...
- c#写入配置文件(text)
1.获取当前时间 System.DateTime currentTime = new System.DateTime(); currentTime = System.DateTime.Now; 写入配 ...
- 机器学习基础(HGL的机器学习笔记1)
统计学习:统计学习是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科,统计学习也成为统计机器人学习[1]. 统计学习分类:有监督学习与无监督学习[2]. 统计学习三要素:模型 ...
- 超简单,快速修改Oracle10g的默认8080端口
因为Oracle数据库默认的端口是8080,这也是tomcat服务器的默认端口. 为了避免端口冲突,我们通常会修改掉其中一个. 这里我们选择修改Oracle数据库的端口. 第一步:以管理员身份运行cm ...
- 【题解】洛谷P1006传纸条
链接 https://www.luogu.org/problemnew/show/P1006 日常牢骚 过年前最后一节课上完了坐标DP 也接触了一点区间DP(noi1995石子合并)下次做做看看吧 老 ...