Consul

Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由HashiCrop公司用Go语言开发,基于Mozilla Public License 2.0的协议进行开源。Consul支持健康检查,并允许http和dns协议调用APi存储键值对。

命令行超级好用的虚拟机管理软件被感染他也是HashiCrop公司开发的产品。一致性协议采用Raft算法,用来保证服务的高可用性,使用gossip协议管理成员和广播消息,并支持acl访问控制。

下载安装

官网下载:https://www.consul.io/downloads.html

下载一个对应的版本,得到一个zip压缩包。

在你想要安装的位置解压就行,只有一个 consul.exe 文件(我的解压位置是:D:\consul)

记得设置环境变量(在 path 中新增一条)

运行dos窗口,cmd 命令窗口启动:输入:consul agent -dev

consul 自带 UI 界面,打开网址:http://localhost:8500 ,可以看到服务界面。

Consul 优势


1. 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 2.采用的是 Paxos, 而 etcd 使用的则是 Raft.

3. 支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网      络延迟, 分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持.

4. 支持健康检查. etcd 不提供此功能.

5. 支持 http 和 dns 协议接口. zookeeper 的集成较为复杂, etcd 只支持 http 协议.

6. 官方提供web管理界面, etcd 无此功能.

 综合比较, Consul 作为服务注册和配置管理的新星, 比较值得关注和研究.

一、Consul是什么?


Consul有多个组件,但总体而言,它是基础架构中的一款服务发现和配置的工具,他提供了几个关键功能:

  1. 服务发现:Consul client可以提供服务,例如api或mysql,也可以使用Consul client来发现指定服务的提供者。使用DNS或HTTp,应用程序可以轻松找到他们所以来的服务。
  2. 健康检查:Consul client可以提供任何数量的健康检查,或者与给定的服务(Web服务器是否返回200 OK),或与本地节点(“内存利用率是否低于90%”)相关联。可以使用次信息来监控集群运行状况,服务器发现组件使用此信息将流量从有问题的主机中移除出去。
  3. KV Store:应用程序可以使用Consul 的分层键/值存储,包括动态配置,功能标记,协调,leader选举等等。简单的HTTP API可以让它易于使用。
  4. 多数据中心:Consul支持多个数据中心。这就意味着Consul用户不必担心构建额外的抽象层以扩展到多个区域。

   Consul旨在对DevOps社区和应用程序开发人员友好,使其成为现代化,弹性基础架构的完美选择。

二、Consul 基本架构


Consul 是一个分布式,高可用的系统。

向Consul提供服务的每个节点都运行一个Consul代理。 发现其他服务或获取/设置键/值数据不需要运行代理。 代理负责健康检查节点上的服务以及节点本身。

     代理与一个或多个Consul服务器通信。Consul 服务器是数据存储和复制的地方。 服务器自己选出一个 leader。 虽然Consul可以在一台服务器上运行,但推荐使用3到5台来避免数据丢失的情况。 每个数据中心都建议使用一组Consul服务器。

  需要发现其他服务或节点的基础架构组件可以查询任何Consul服务器或任何Consul代理。 代理自动将查询转发到服务器。

  每个数据中心都运行Consul服务器集群。 当跨数据中心服务发现或配置请求时,本地Consul服务器将请求转发到远程数据中心并返回结果。

三、Consul 与 “其它软件” 相比较


Consul解决的问题是多种多样的,但是每个单独的特征已经被许多不同的系统解决了。 尽管没有单一的系统提供Consul的所有功能,但还有其他的选择可以来解决这些问题。

1、Consul 与 ZooKeeper, doozerd, etcd


ZooKeeper,doozerd和etcd在他们的架构中都是相似的。 所有这三个服务器节点都需要一定数量的节点才能运行(通常是简单多数)。 它们是高度一致的,并且公开了可以通过应用程序中的客户端库来构建复杂的分布式系统的各种基元。

Consul 还使用单个数据中心内的服务器节点。 在每个数据中心,Consul服务器都需要一个仲裁来操作并提供强大的一致性。 不过,Consul拥有对多个数据中心的本地支持,以及连接服务器节点和客户端的功能丰富的系统。

 所有这些系统在提供“键/值”存储时都具有大致相同的语义:读取具有强烈的一致性,为了在网络分区的情况下保持一致性,牺牲了可用性。 但是,当这些系统用于高级案例时,这些差异会变得更加明显。

这些系统提供的语义对于构建服务发现系统是有吸引力的,但重要的是要强调必须构建这些功能。 ZooKeeper等软件仅提供原始K / V存储,并要求应用程序开发人员构建自己的系统以提供服务发现。 相比之下,Consul为服务发现提供了一个可用的框架,并且消除了猜测工作和开发工作。 客户端只需注册服务,然后使用DNS或HTTP接口执行发现。 其他系统需要一个自己定制的解决方案。

ZooKeeper提供临时节点,这些节点是客户端断开连接时删除的K / V条目。 这些比心跳系统更复杂,但仍然存在固有的可扩展性问题,并增加了客户端的复杂性。 所有客户端必须保持与ZooKeeper服务器的活动连接并执行保持活动。 另外,这需要“厚厚的客户端”,这些客户端很难编写,经常导致调试难题。

Consul 使用非常不同的体系结构进行健康检查。 Consul客户端不是只有服务器节点,而是在集群中的每个节点上运行。 这些客户端是gossip pool的一部分,可以提供多种功能,包括分布式健康检查。 gossip协议实现了一个高效的故障检测器,可以扩展到任何规模的集群,而不用将任务集中在任何选定的服务器组上。 客户端还可以在本地运行更丰富的运行状况检查,而ZooKeeper临时节点对活跃性进行非常原始的检查。 通过Consul,客户端可以检查Web服务器是否返回200的状态码,内存使用情况,有足够的磁盘空间等。和ZooKeeper一样,Consul客户端公开一个简单的HTTP接口,避免将系统的复杂性暴露给客户端。

  Consul为服务发现,运行状况检查,K / V存储和多个数据中心提供一流的支持。 为了支持比简单K / V存储更多的功能,所有这些其他系统都需要额外的工具和库。 通过使用客户端节点,Consul提供了一个简单的API,只需要客户端。 另外,完全可以通过使用配置文件和DNS接口完全避免使用API,以获得完整的服务发现解决方案,而完全没有任何开发。

2、Consul 与 Chef, Puppet等


使用Chef,Puppet和其他配置管理工具的人来构建服务发现机制并不罕见。 这通常通过查询全局状态来在定期收敛运行期间在每个节点上构建配置文件来完成。

 不幸的是,这种方法有一些陷阱。 配置信息是静态的,不能比收敛运行更频繁地更新。 一般这是在几分钟或几小时的间隔。 另外,没有机制将系统状态结合到配置中:不健康的节点可能进一步接收流量,进一步加剧问题。 使用这种方法还可以支持多个数据中心,因为中央服务器组必须管理所有数据中心。

Consul专门设计为服务发现工具。 因此,它对集群的状态更具有动态性和响应性。 节点可以注册和注销他们提供的服务,使得依赖的应用程序和服务能够快速发现所有提供者。 通过使用集成的健康检查,Consul可以将流量从不健康的节点发送出去,从而使系统和服务能够正常恢复。 可以通过配置管理工具提供的静态配置可以移动到动态键/值存储中。 这允许应用程序配置更新,而不会收敛缓慢。 最后,由于每个数据中心独立运行,支持多个数据中心与单个数据中心没有区别。

也就是说,Consul并不是配置管理工具的替代品。 这些工具对于设置应用程序(包括Consul本身)至关重要。 静态配置最好由现有工具管理,而动态状态和发现则由Consul更好地管理。 配置管理和集群管理的分离也有一些有利的副作用:Chef和Puppet在没有全局状态的情况下变得更简单,服务或配置更改不再需要定期运行,并且由于配置管理运行 不需要全局状态。

3、Consul与 Nagios, Sensu


Nagios和Sensu都是用于监控的工具。 当问题发生时,它们用于快速通知操作员。

  Nagios使用一组配置为在远程主机上执行检查的中央服务器。 这种设计使Nagios难以规模化,因为大型船队迅速达到垂直尺度的限制,Nagios不容易水平缩放。 Nagios在现代DevOps和配置管理工具中也非常难以使用,因为在添加或删除远程服务器时必须更新本地配置。

  Sensu有一个更现代化的设计,依靠当地的代理商运行支票,并推动结果AMQP经纪人。 许多服务器从代理获取并处理健康检查的结果。 这个模型比Nagios更具可扩展性,因为它允许更多的水平缩放和服务器和代理之间的较弱耦合。 但是,中央经纪人已经具有扩展限制,并且是系统中的单一故障点。

  Consul提供与Nagios和Sensu相同的健康检查能力,对现代DevOps友好,并避免了其他系统固有的扩展问题。 Consul在本地运行所有检查,如Sensu,避免给中央服务器造成负担。 检查状态由Consul服务器维护,这是容错的,没有单点故障。 最后,Consul可以扩展到更多的检查,因为它依赖于边缘触发的更新。 这意味着更新仅在检查从“通过”转换为“失败”或反之亦然时才被触发。

  在一个大型的船队里,大部分的支票都是通过的,连失败的少数人都是执着的。 通过仅捕获更改,Consul减少了运行状况检查所使用的网络和计算资源的数量,从而使系统具有更高的可扩展性。

  一个精明的读者可能会注意到,如果一个Consul代理死亡,那么没有边缘触发更新将会发生。 从其他节点的角度来看,所有的检查都会显示为稳定状态。 不过,Consul也是这样的。 客户端和服务器之间使用的gossip协议集成了一个分布式故障检测器。 这意味着如果一个Consul代理失败,将会检测到失败,并且因此所有由该节点运行的检查都可以被假定为失败。 这个故障检测器将工作分配到整个集群中,而最重要的是使边缘触发结构能够工作。

4、Consul 与 Eureka


Eureka是一个服务发现工具。 该体系结构主要是客户机/服务器,每个数据中心有一套Eureka服务器,通常每个可用性区域一个。 通常Eureka的客户端使用嵌入式SDK来注册和发现服务。 对于不是本地集成的客户端,使用Ribbon等来透明地发现通过Eureka的服务。

  Eureka提供了一个弱一致的服务观点,使用尽力而为复制。 当客户端向服务器注册时,该服务器将尝试复制到其他服务器,但不提供保证。 服务注册有一个短的生存时间(TTL),要求客户端向服务器发送心跳。 不健康的服务或节点将停止心跳,使他们超时并从注册表中删除。 发现请求可以路由到任何服务,由于尽力而为的复制,服务可能会陈旧或丢失数据。 这个简化的模型允许简单的集群管理和高可扩展性。

  Consul提供了一套超级功能,包括更丰富的健康检查,key/value存储以及多数据中心意识。 Consul在每个数据中心都需要一组服务器,每个客户端都有一个代理,类似于使用像Ribbon这样的。 Consul代理允许大多数应用程序成为Consul不知道的,通过配置文件执行服务注册,并通过DNS或负载平衡器sidecars发现。

  Consul提供强大的一致性保证,因为服务器使用Raft协议复制状态。 Consul支持丰富的健康检查,包括TCP,HTTP,Nagios / Sensu兼容脚本或基于Eureka的TTL。 客户端节点参与基于gossip的健康检查,该检查分配健康检查的工作,而不像集中式心跳一样成为可扩展性挑战。 发现请求被路由到当选的Consul leader,这使得他们在默认情况下是非常一致的。 允许陈旧读取的客户端使得任何服务器能够处理他们的请求,从而允许像Eureka这样的线性可伸缩性。

  Consul强烈的一致性意味着它可以作为领导选举和集群协调的锁定服务。 Eureka不提供类似的保证,并且通常需要运行ZooKeeper来获得需要执行协调或具有更强一致性需求的服务。

  Consul提供了支持面向服务的体系结构所需的工具包。 这包括服务发现,还包括丰富的健康检查,锁定,key/value,多数据中心联合,事件系统和ACL。 Consul和consul-template和envconsul等工具的生态系统都尽量减少集成所需的应用程序更改,以避免需要通过SDK进行本地集成。 Eureka是一个更大的Netflix OSS套件的一部分,该套件预计应用程序相对均匀且紧密集成。 因此,Eureka只解决了一小部分问题,希望ZooKeeper等其他工具可以一起使用。

Consul入门初识的更多相关文章

  1. Consul 入门-初识

    背景 现状:单体架构逐渐被微服务架构所替代,原本两个功能模被拆分成了两个服务.原本两个模块块间的通信只需要函数调用就能够实现,现在却做不到了,因为它们不在同一个进程中,甚至两个服务都可能部署到不同的机 ...

  2. Consul 入门-运行

    HashiCorp Consul 是由 HashiCorp 公司开发的,它是一家专注于 DevOps 工具链的公司,旗下的明星级产品包括 Vagrant.Terraform.Vault.Nomad 以 ...

  3. Java入门——初识Java

    Java入门——初识Java 摘要:本文主要对Java这门编程语言进行简单的介绍. Java简介 说明 Java语言历时十多年,已发展成为人类计算机史上影响深远的编程语言,从某种程度上来看,它甚至超出 ...

  4. Linux入门——初识Linux

    Linux入门——初识Linux 摘要:本文主要说明了Linux是什么,Linux发展历史,以及同Linux系统有关的一些基本知识. 简介 操作系统 Linux系统同Windows系统.Mac系统一样 ...

  5. RabbitMQ入门-初识RabbitMQ

    初识RabbitMQ 要说RabbitMQ,我们不得不先说下AMQP.AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面 ...

  6. mybatis入门--初识mybatis

    初识mybatis 今天,一起来说说mybits这个框架吧.这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. ...

  7. MySQL使用入门--初识数据库

    MySQL使用入门 数据库概述 数据库是存放数据的仓库.在应用的开发中总是离不开数据的查询.处理.存储,例如图书管理系统就需要操纵和存储大量的数据.没有数据库之前我们使用文件存储数据,但是文件存储有很 ...

  8. Spring Cloud Consul入门

    1. Consul介绍 Consul是一套开源的分布式服务发现和配置管理系统,支持多数据中心分布式高可用.Consul是HashiCorp( Vagrant的创建者)开发的一个服务发现与配置项目,用G ...

  9. springMvc入门--初识springMvc

    springMvc是什么 springmvc是表现层的框架,是一个spring的表现层组件.是整个spring框架的一部分,但是也可以不使用springmvc.跟struts2框架功能类似.其中的mv ...

随机推荐

  1. Android_存储访问框架SAF

    概念 存储访问框架---Storage Access Framework (SAF),这是在Android4.4(API level 19)之后引入的. 借助 SAF,用户可轻松在其所有首选文档存储提 ...

  2. 循序渐进VUE+Element 前端应用开发(4)--- 获取后端数据及产品信息页面的处理

    在前面随笔<循序渐进VUE+Element 前端应用开发(3)--- 动态菜单和路由的关联处理>中介绍了在Vue + Element整合框架中,实现了动态菜单和动态路由的处理,从而可以根据 ...

  3. [JavaWeb基础] 020.Velocity 模板引擎简单示例

    1.什么是Velocity 一种J2EE的前端模版技术,和JSP,Freemarker差不多,都是用来展示网页内容的.和JSP不同的是velocity只能显示Action中的数据,不能处理数据.不能写 ...

  4. C#线程 入门

    Threading in C#   第一部分: 入门 介绍和概念 C#支持通过多线程并行执行代码.线程是一个独立的执行路径,能够与其他线程同时运行.C#客户端程序(控制台,WPF或Windows窗体) ...

  5. 五、Java - 集合

    一.集合 Java 中的集合类存放于 java.util 包中,是一个存放对象的容器. 集合存放的是对对象的引用,对象本身还是存在于 JVM 堆内存中. 存放的是对象,即引用数据类型,对于基本数据类型 ...

  6. C实现进程间通信(管道; 共享内存,信号量)

    最近学习了操作系统的并发:以下是关于进程间实现并发,通信的两个方法. 例子: 求100000个浮点数的和.要求: (1)随机生成100000个浮点数(父进程). (2)然后创建4个后代进程,分别求25 ...

  7. Rocket - jtag - JtagStateMachine

    https://mp.weixin.qq.com/s/cFXVOBHayV2w27jpT5RglA 简单介绍JtagStateMachine的实现. 1. 简单介绍 根据IEEE 1149.1-200 ...

  8. Rocket - diplomacy - DUEB参数模型的设计

    https://mp.weixin.qq.com/s/9PEEpe1pkQDN9RWpOGSUCQ   介绍DUEB参数模型的设计,不包含实现(实现对设计做了简化).     1. DUEB   di ...

  9. SpringBoot 定制 starter 启动器

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 在实际项目开发中,我们常常会用到各种各样的 starter,这些starter 有的是有 springb ...

  10. java实现Floyd算法

    1 问题描述 何为Floyd算法? Floyd算法功能:给定一个加权连通图,求取从每一个顶点到其它所有顶点之间的最短距离.(PS:其实现功能也称完全最短路径问题) Floyd算法思想:将顶点i到j的直 ...