`

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

阅读更多

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

在对分布式的应用做协调的时候,主要会碰到以下的应用场景:

  • 业务发现(service discovery)

找到分布式系统中存在那些可用的服务和节点

  • 名字服务 (name service)

通过给定的名字知道到对应的资源

  • 配置管理 (configuration management)

如何在分布式的节点中共享配置文件,保证一致性。

  • 故障发现和故障转移 (failure detection and failover)

当某一个节点出故障的时候,如何检测到并通知其它节点, 或者把想用的服务转移到其它的可用节点

  • 领导选举(leader election)

如何在众多的节点中选举一个领导者,来协调所有的节点

  • 分布式的锁 (distributed exclusive lock)

如何通过锁在分布式的服务中进行同步

  • 消息和通知服务 (message queue and notification)

如何在分布式的服务中传递消息,以通知的形式对事件作出主动的响应

Consul

Consul是用Go开发的分布式服务协调管理的工具,它提供了服务发现,健康检查,Key/Value存储等功能,并且支持跨数据中心的功能。consul提供的一些关键特性:

  • service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
  • health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
  • key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
  • multi-datacenter:无需复杂的配置,即可支持任意数量的区域。

Consul基于HTTP的API可以方便的和各种语言进行绑定,C# 语言绑定https://github.com/PlayFab/consuldotnet

Consul在Cluster上的每一个节点都运行一个Agent,这个Agent可以使用Server或者Client模式。Client负责到Server的高效通信,相对为无状态的。 Server负责包括选举领导节点,维护cluster的状态,对所有的查询做出响应,跨数据中心的通信等等。

consul官网已经有编译好的二进制包,支持各种平台:win、linux等等,下载符合你平台的软件包:在这里,下载包:0.5.2_windows_386.zip。解压完毕后只有一个consul文件。

D:\GitHub\consuldotnet\Consul.Test>consul

usage: consul [--version] [--help] <command> [<args>]

Available commands are:

agent Runs a Consul agent

configtest Validate config file

event Fire a new event

exec Executes a command on Consul nodes

force-leave Forces a member of the cluster to enter the "left" state

info Provides debugging information for operators

join Tell Consul agent to join cluster

keygen Generates a new encryption key

keyring Manages gossip layer encryption keys

leave Gracefully leaves the Consul cluster and shuts down

lock Execute a command holding a lock

maint Controls node or service maintenance mode

members Lists the members of a Consul cluster

monitor Stream logs from a Consul agent

reload Triggers the agent to reload configuration files

version Prints the Consul version

watch Watch for changes in Consul

consul安装完毕后,agent就可以启动了,agent可以运行在server或者client模式,每个数据中心至少有一个agent运行在server模式,一般建议是3或者5个server。部署单个server是非常不好的,因为在失败场景中出现数据丢失是不可避免的。本文涵盖的是创建一个新的数据中心,所有其他的agents都运行在client模式,这是一个非常轻量级的服务注册进程,它会运行健康监测,并将查询结果转发到服务。agent必须运行在集群中的每一个节点上。

consul.exe agent -config-file test_config.json

我们先运行一个agent在server模式:

D:\GitHub\consuldotnet\Consul.Test> consul.exe agent -config-file test_config.json

==> WARNING: Bootstrap mode enabled! Do not enable unless necessary

==> WARNING: Windows is not recommended as a Consul server. Do not use in production.

==> WARNING: It is highly recommended to set GOMAXPROCS higher than 1

==> Starting Consul agent...

==> Starting Consul agent RPC...

==> Consul agent running!

Node name: 'GEFFZHANG-NB'

Datacenter: 'dc1'

Server: true (bootstrap: true)

Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)

Cluster Addr: 192.168.1.4 (LAN: 8301, WAN: 8302)

Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false

Atlas: <disabled>

 

==> Log data will now stream in as it occurs:

 

2015/08/09 09:14:48 [INFO] serf: EventMemberJoin: GEFFZHANG-NB 192.168.1.4

2015/08/09 09:14:48 [INFO] serf: EventMemberJoin: GEFFZHANG-NB.dc1 192.168.1.4

2015/08/09 09:14:48 [INFO] raft: Node at 192.168.1.4:8300 [Follower] entering Follower state

2015/08/09 09:14:48 [INFO] consul: adding server GEFFZHANG-NB (Addr: 192.168.1.4:8300) (DC: dc1)

2015/08/09 09:14:48 [INFO] consul: adding server GEFFZHANG-NB.dc1 (Addr: 192.168.1.4:8300) (DC: dc1)

2015/08/09 09:14:48 [ERR] agent: failed to sync remote state: No cluster leader

2015/08/09 09:14:50 [WARN] raft: Heartbeat timeout reached, starting election

2015/08/09 09:14:50 [INFO] raft: Node at 192.168.1.4:8300 [Candidate] entering Candidate state

2015/08/09 09:14:50 [DEBUG] raft: Votes needed: 1

2015/08/09 09:14:50 [DEBUG] raft: Vote granted. Tally: 1

2015/08/09 09:14:50 [INFO] raft: Election won. Tally: 1

2015/08/09 09:14:50 [INFO] raft: Node at 192.168.1.4:8300 [Leader] entering Leader state

2015/08/09 09:14:50 [INFO] consul: cluster leadership acquired

2015/08/09 09:14:50 [INFO] consul: New leader elected: GEFFZHANG-NB

2015/08/09 09:14:50 [INFO] raft: Disabling EnableSingleNode (bootstrap)

2015/08/09 09:14:50 [DEBUG] raft: Node 192.168.1.4:8300 updated peer set (2): [192.168.1.4:8300]

2015/08/09 09:14:50 [DEBUG] consul: reset tombstone GC to index 2

2015/08/09 09:14:50 [INFO] consul: member 'GEFFZHANG-NB' joined, marking health alive

2015/08/09 09:14:51 [INFO] agent: Synced service 'consul'

2015/08/09 09:16:03 [DEBUG] agent: Service 'consul' in sync

2015/08/09 09:17:30 [DEBUG] agent: Service 'consul' in sync

2015/08/09 09:18:38 [DEBUG] agent: Service 'consul' in sync

2015/08/09 09:19:47 [DEBUG] http: Request /v1/status/peers (0)

2015/08/09 09:19:52 [DEBUG] agent: Service 'consul' in sync

正如你看到的一样,consul agent已经启动了,并且打印了一些日志到终端上,从日志中可以看到我们的agent已经运行在server模式了,并且已经是整个集群的领导节点。而且,本地成员已经被标记为集群中的健康成员了。这时候你在另一个终端中运行consul members就可以看到整个集群中的成员了。这时候你只能看到你自己,因为我们的集群中还没加入其他成员。

输出已经显示了你自己的节点信息,有地址信息、健康状况、在集群中的角色、以及一些版本信息,如果要查看一些metadata,则可以加入-detailed标记

consul members命令输出的信息是基于gossip协议产生的,并且最终一致的。

 

KV基本操作

Consul提供了一个简单的K/V存储系统,这可以用来动态获取配置、进行服务协调、主节点选举,其他开发人员能想到的build过程等等。

var client = new Client();

var kv = client.KV;

var key = GenerateTestKeyName();

var value = Encoding.UTF8.GetBytes("test");

var getRequest = kv.Get(key);

Assert.IsNull(getRequest.Response);

var pair = new KVPair(key)

{

Flags = 42,

Value = value

};

var putRequest = kv.Put(pair);

Assert.IsTrue(putRequest.Response);

getRequest = kv.Get(key);

var res = getRequest.Response;

Assert.IsNotNull(res);

Assert.IsTrue(StructuralComparisons.StructuralEqualityComparer.Equals(value, res.Value));

Assert.AreEqual(pair.Flags, res.Flags);

Assert.IsTrue(getRequest.LastIndex > 0);

var del = kv.Delete(key);

Assert.IsTrue(del.Response);

getRequest = kv.Get(key);

Assert.IsNull(getRequest.Response);

服务发现(Service Discovery)和健康检查(Health Check)

Consul的另一个主要的功能是用于对分布式的服务做管理,用户可以注册一个服务,同时还提供对服务做健康检测的功能。

服务定义:一个服务可以通过提供服务定义配置文件或者通过调用HTTP API来动态的增加、删除、修改服务。

服务查询:一旦agent启动后,并且服务已经同步,我们就可以使用DNS或者HTTP API来进行查询了。

服务升级:服务定义的升级可以通过先修改服务定义配置文件,然后给agent发送一个SIGHUP信号即可,这样允许你在升级服务时,而不会产生agent宕机时间或者服务不可达。或者通过HTTP API接口来动态的增加、删除、修改服务。

Consul支持三种Check的模式:

  • 调用一个外部脚本(Script),在该模式下,consul定时会调用一个外部脚本,通过脚本的返回内容获得对应服务的健康状态。
  • 调用HTTP,在该模式下,consul定时会调用一个HTTP请求,返回2XX,则为健康;429 (Too many request)是警告。其它均为不健康
  • 主动上报,在该模式下,服务需要主动调用一个consul提供的HTTP PUT请求,上报健康状态。

C# API提供对应的接口

  • Client.Agent.Service
  • Client.Agent.Check

Consul的Health Check,通过调用脚本,HTTP或者主动上报的方式检查服务的状态,更为灵活,可以获得等多的信息,但是也需要做更多的工作。

故障检测(Failure Detection)

Consul提供Session的概念,利用Session可以检查服务是否存活。对每一个服务我们都可以创建一个session对象,注意这里我们设置了ttl,consul会以ttl的数值为间隔时间,持续的对session的存活做检查。对应的在服务中,我们需要持续的renew session,保证session是合法的。

var client = new Client();

var sessionRequest = client.Session.Create(new SessionEntry() { TTL = TimeSpan.FromSeconds(10) });

var id = sessionRequest.Response;

Assert.IsTrue(sessionRequest.RequestTime.TotalMilliseconds > 0);

Assert.IsFalse(string.IsNullOrEmpty(sessionRequest.Response));

var tokenSource = new CancellationTokenSource();

var ct = tokenSource.Token;

client.Session.RenewPeriodic(TimeSpan.FromSeconds(1), id, WriteOptions.Empty, ct);

tokenSource.CancelAfter(3000);

Task.Delay(3000, ct).Wait(ct);

var infoRequest = client.Session.Info(id);

Assert.IsTrue(infoRequest.LastIndex > 0);

Assert.IsNotNull(infoRequest.KnownLeader);

Assert.AreEqual(id, infoRequest.Response.ID);

Assert.IsTrue(client.Session.Destroy(id).Response);

这里注意,因为是基于ttl(最小10秒)的检测,从业务中断到被检测到,至少有10秒的时延,对应需要实时响应的情景,并不适用。

领导选举和分布式的锁

这篇文档介绍了如何利用Consul的KV存储来实现Leader Election,利用Consul的KV功能,可以很方便的实现领导选举和锁的功能。

WEB UI

consul同样也支持web界面,这个UI可以用来查看所有的服务和节点,所有的健康检测和它们当前的状态,读取设置K/V系统的值。UI默认自动支持多datacenter。这些UI是静态html你不需要单独运行一个web服务器,consul agent本身可以配置一个web服务。

下载UI组件:WEB UI

        下载完成后是一个0.5.2_web_ui.zip压缩文件,解压后是一个dist目录。然后添加-ui-dir参数和-client参数重新启动agent。

D:\GitHub\consuldotnet\Consul.Test> consul.exe agent -config-file test_config.json -ui-dir=D:\GitHub\consuldotnet\Consul.Test\0.5.2_web_ui\dist

在浏览器中输入http://127.0.0.1:8500,即可访问UI了

有services、nodes、K/V、acl、datacenter的管理,很完善的一个系统了。

总结

Consul作为使用Go语言开发的分布式协调,对业务发现的管理提供很好的支持,他的HTTP API也能很好的和不同的语言绑定,并支持跨数据中心的应用。缺点是相对较新,适合喜欢尝试新事物的用户。

https://github.com/anurse/Consulate

https://github.com/geffzhang/Consul-IO-WindowsDemo

https://github.com/catwithboots/Hortlak

https://github.com/catwithboots/Orek

https://github.com/geffzhang/Pk.OrleansUtils

http://blog.csdn.net/u010246789/article/category/6286612 

分享到:
评论

相关推荐

    C# consul 服务注册发现及健康检查以及consul写的分布式锁的实例demo

    在这个C# 实例中,我们将探讨如何使用 Consul 进行服务注册、服务发现以及实现分布式锁。 首先,让我们深入理解 C# 中 Consul 的服务注册和发现机制。服务注册是将应用程序实例的信息(如服务名、地址、端口等)...

    consul Windows版 分布式协调服务

    consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。...

    基于consul的分布式锁工具,包含:互斥锁、信号量等工具

    基于consul的分布式锁工具,包含:互斥锁、信号量等工具 基于Consul的分布式锁工具 在构建分布式系统的时候,我们经常需要控制对共享资源的访问。这个时候我们就涉及到分布式锁(也称为全局锁)的实现,本项目将...

    Springboot集成Consul实现分布式配置中心-源码

    3. **分布式一致性**:Consul使用Raft算法作为其分布式一致性协议,确保在分布式环境下数据的一致性和可靠性。它实现了强一致性模型,能够处理网络分区、故障恢复等场景,保证系统的可靠性。 4. **键值存储**:...

    C#分布式开发源码实例

    6. **状态管理和一致性**:学习CAP定理,理解分布式系统中的数据一致性问题,以及如何使用分布式锁、队列和事件驱动等机制来管理状态。 7. **测试与监控**:学会使用如Postman、WireShark等工具进行接口测试,以及...

    分布式系统设计 分布式系统设计

    分布式系统设计是现代互联网服务和企业级应用的核心技术之一,它涉及到多个计算机节点通过网络进行协同工作,共同处理任务和数据。在这个领域,我们需要深入理解并掌握一系列关键知识点,以构建高效、可扩展且容错的...

    杨波-分布式系统设计案例课材料.zip

    分布式系统设计是现代互联网技术的核心组成部分,它涉及多个计算节点通过网络进行协同工作,以处理大规模数据和提供高可用的服务。杨波的分布式系统设计案例课材料深入浅出地介绍了这个领域的关键概念和技术。 首先...

    分布式系统 概念与设计 习题答案(完整版).

    11. 微服务架构:将大型应用拆分为一系列小而自治的服务,每个服务都能独立部署、扩展和维护,提高开发效率和系统灵活性。 12. RESTful API:在分布式系统中,REST(Representational State Transfer)是一种常见的...

    分布式系统设计PDF

    例如,Zookeeper常用于分布式协调和故障检测,Prometheus和Grafana组合则提供了强大的监控和可视化能力。 最后,实践是检验理论的最好方式。通过阅读这份PDF,读者可以了解到实际项目中如何运用这些理论和组件,如...

    c#:Ocelot集成Consul初体验

    在本文中,我们将深入探讨如何在C#项目中集成Ocelot与Consul,以便实现微服务间的通信和治理。...通过实际操作,你将更好地掌握如何在自己的C#微服务项目中利用这两者的力量,构建出高效、稳定的分布式系统。

    C# .net core开发的分布式游戏服务端

    可以使用分布式事务(如2PC或TCC)或者事件驱动架构来保证数据的一致性。例如,基于Event Sourcing和CQRS(命令查询职责分离)的设计模式,能有效处理复杂的业务逻辑。 三、C# .NET Core中的关键技术和工具 1. **...

    大规模分布式系统架构与设计实战.完整版

    分布式系统是现代信息技术领域中的核心概念,它涉及多个计算节点通过网络进行协同工作,共同处理大规模数据和提供高可用服务。在"大规模分布式系统架构与设计实战.完整版"这本书中,作者深入探讨了构建高效、可靠且...

    Consul入门初体验

    Consul是一款由HashiCorp公司开发的开源工具,主要用于实现分布式系统的服务发现、健康检查、KV存储和多数据中心的解决方案。在本篇文章中,我们将深入探讨Consul的基础知识,包括其核心功能、工作原理以及如何在C#...

    分布式系统原理和范型第二版

    11. **分布式协调与一致性**:Zookeeper、Etcd等工具提供分布式一致性服务,用于命名服务、配置管理、分布式锁等。 12. **微服务架构**:将大型应用拆分为一组小而自治的服务,每个服务都可以独立部署和扩展,增强...

    Python-分布式系统资源大列表

    此外,分布式锁、分布式任务队列如Celery、分布式调度器如Airflow和Luigi,以及分布式文件系统如HDFS等,都是Python开发者在构建分布式系统时可能会用到的工具和库。 最后,学习和掌握这些资源需要时间和实践,建议...

    go-consul-distributed-loggers:简单的Go + Consul分布式系统

    简单的Go + Consul分布式系统 文章: 请勿在生产中使用这是概念证明,不能处理所有极端情况 成分 consul :为领队选举和服务发现提供支持的Consul实例 分布式日志记录器:分布式日志记录器节点公开了REST API,该...

Global site tag (gtag.js) - Google Analytics