前段时间有传言说Consul将不能在我国继续使用,后被查明是因法律问题Vault企业版产品不能在国内销售。Valut和Consul都是HashiCorp公司的产品,并且都推出了开源版本,继续使用开源版本都是没有问题的,虚惊一场。Consul是一款优秀的服务发现和配置管理产品,基于其提供的Session机制,可以很方便的实现Leader选举功能。这篇文章将介绍我编写的一个基于Consul的.NET Leader选举类库。

基于Consul的Leader选举原理

1、参加选举的程序可以在Consul中创建一个Session,这个Session的存活状态依赖于当前程序的Consul健康检查状态, 一旦健康检查处于Critical状态,则对应的Session就会失效。

2、使用这个Session去锁定某个Consul Key/Value,只有一个Session能成功锁住KV,拥有这个Session的程序即为Leader。

3、Leader选举成功后,所有节点还要继续阻塞查询上边的Consul Key/Value,如果KV绑定的Session失效了, 所有节点可以立即发现并发起一次Leader选举,并选举出1个Leader。

使用说明

1、启动本机Consul

当前的版本依赖本机Consul,后续会支持配置远程Consul地址。

如果本地环境已经配置Consul,保证其正常运行即可。

如果本地环境没有配置Consul,可以下载后以开发模式快速启动,以方便体验Leader选举功能。

下载地址:https://www.consul.io/downloads

启动命令:./consul agent -dev

2、安装Nuget包

NuGet包地址:https://www.nuget.org/packages/FireflySoft.LeaderElection

3、编写Leader选举代码

首先创建LeaderElectionManager的一个实例,传入服务名称、服务Id、leader选举选项等参数,然后调用Watch方法参与选举,并在Watch方法中传入Leader选举结果的处理方法。

以控制台程序为例:

    class Program
{
static void Main(string[] args)
{
Console.WriteLine("I am ElectionService1."); // 参与Leader选举的多个程序应该使用相同的服务名
// 参与Leader选举的每个程序应该有唯一的服务Id
LeaderElectionManager electionManager = new LeaderElectionManager("ElectionService", "ElectionService1", new LeaderElectionOptions());
electionManager.Watch(LeaderElectCompletedEventHandler); Console.WriteLine("Start Election..."); Console.Read();
} private static void LeaderElectCompletedEventHandler(LeaderElectionResult result)
{
// 在这里处理Leader选举结果。
Console.WriteLine($"LeaderElectCompleted, Result: {result.IsSuccess}, Current Leader: {result.State.CurrentLeaderId}.");
}
}

4、注意事项

选举沉默期

LeaderElectionOptions中提供了一个重新选举沉默期:ReElectionSilencePeriod,默认15s。应用场景如下:

当一个程序的Leader状态失效时,它可能仍在处理某些事务,并且不能立即中止。 这时候如果其它节点马上选举成为Leader,并且开始处理数据,则可能导致数据不一致的状态。

Leader优先选举权

此类库为Leader增加了优先选举权。应用场景如下:

Leader状态失效可能只是一种短暂的中断导致的,系统会很快自动恢复,而业务事务的的启动和中止需要进行复杂的处理, 所以我们仍然期望下一次Leader选举时之前的Leader有优先选举权,避免数据同步和加快系统恢复。

参考文档

1、Consul Session机制参考:

https://blog.bossma.cn/consul/consul-leader-election-solution/

https://www.consul.io/docs/internals/sessions

2、基于Session的Leader选举机制参考:

https://learn.hashicorp.com/consul/developer-configuration/elections

如果你有关于Consul的任何使用问题欢迎加入千人Consul QQ交流群:234939415

最新文章

  1. winform窗体(一)——基本属性
  2. Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升
  3. spa 单页面解决浏览器back front 问题
  4. winform之excel导入和导出
  5. 宏os_file_read_func
  6. Calendar GData API / Google Calendar Connectors deprecation
  7. 在iOS中怎样创建可展开的Table View?(上)
  8. ACM1228_STL的应用
  9. LDAP错误代码221
  10. 布局文件提示错误“No orientation specified, and the default is horizontal. This is a common so...”
  11. javascript日历插件
  12. easyui 动态渲染
  13. eclipse下出现奇怪字符的解决方法
  14. js注入攻击
  15. python 列表去重的几种方法
  16. 兼容浏览器的div透明
  17. Effective Java 第三版——83. 明智谨慎地使用延迟初始化
  18. spring boot集成MyBatis
  19. WPF 介绍一种在MVVM模式下弹出子窗体的方式
  20. Dubbo中只订阅与只注册

热门文章

  1. html,body设置高度100%后底部有空白的bug
  2. Unity3D的UGUI布局锚点自动绑定关系
  3. Angular知识点复习
  4. Angular第三方UI组件库------ionic
  5. 织梦DEDECMS网站如何生成xml格式网站地图
  6. PLC可编程控制器的结构和工作原理
  7. mysql中的联合查询(内联、左联、外联、右联、全联)
  8. ORCLE 列转行
  9. SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'xxx' already exists
  10. SQL SERVER修改为sa登陆权限报错,233,18456接连出现【抓狂ing】