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

前段时间有传言说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选举效果的处置方式。

以控制台程序为例:

白嫖永久免费云服务器教程,永久免费虚拟主机、永久免费云数据库、搭建FTP服务器、服务器安装Linux / windows操作系统、服务器部署网站、宝塔一键部署多网站、独立ip、永久国内高速云服务器

    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有优先选举权,制止数据同步和加速系统恢复。

5、源码开放

这么好的器械固然要开源:https://github.com/bosima/FireflySoft.LeaderElection

参考文档

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

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/14735.html