Consul的使用姿势

一. Consul的介绍

1.1 什么是Consul

image

图 - Consul的Logo

“Consul is a service networking solution to connect and secure services across any runtime platform and public or private cloud.” 这句是官网[1]给的定义。当然!它是开源的。

image

图 - HashiCorp公司Logo

在官网上笔者发现了HashiCorp的公司Logo。由于是第一次看知道这个公司,特意百度了一下[2]:HashiCorp是由Mitchell Hashimoto和Armon Dadgar联合创办,总部位于美国旧金山,致力于为企业提供服务,通过数据中心管理技术研发,让开发者通过工具构建完整的开发环境,提高开发效率。公司所提供的主要企业服务包括应用程序开发、交付和维护,使用的DevOps 基础设施工具主要包括Vagrant、Packer 、 Terraform 、Serf 、Consul , Vault 和 Nomad 等。根据18年的新闻[3],公司估值19亿美元。

Consul 使用 Go 语言编写,因此具有天然可移植性,安装的时候只有一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。[5]

1.2 Consul的角色

agent: 客户端, 无状态, 将 HTTP 和 DNS 接口请求转发给局域网内的服务端集群。

server: 服务端, 保存配置信息, 高可用集群, 在局域网内与本地客户端通讯, 通过广域网与其他数据中心通讯。每个数据中心的 server 数量推荐为 3 个或是 5 个。

Consul 使用 Go 语言编写,因此具有天然可移植性,安装的时候只有一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。[5]

二. Consul集群部署

2.1 在ubuntu上部署Consul

(1)下载Consul软件包(本文使用的Consul版本为1.5.1),解压缩[6]

(2)上传至各台机器

(3)mv consul /usr/local/bin

(4)配置如下环境变量/etc/profile

        export CONSUL_HOME=/usr/local/bin/consul 

        export PATH=$PATH:CONSUL_HOME

        source /etc/profile # 使配置生效

2.2 启动server

启动第一个server:

consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=agent-1 -client=0.0.0.0 -bind=IP-1 -datacenter=dc1

启动第二个server:

consul agent -server -ui -bootstrap-expect=3 -data-dir=/data/consul -node=agent-2 -client=0.0.0.0 -bind=IP-2 -datacenter=dc1 -join IP-1

参数解释:

  • bootstrap-expect:集群期望的节点数,只有节点数量达到这个值才会选举leader。

  • server:运行在server模式

  • data-dir:指定数据目录,其他的节点对于这个目录必须有读的权限

  • node:指定节点的名称

  • bind:为该节点绑定一个地址

  • config-dir:指定配置文件,定义服务的,默认所有.json结尾的文件都会读

  • enable-script-checks=true:设置检查服务为可用

  • datacenter: 数据中心没名称,

  • join:加入到已有的集群中

2.3 启动agent

consul agent -data-dir=/data/consul -node=agent-4 -client=0.0.0.0 -bind=IP -datacenter=dc1 -join IP-1

2.4 查看集群的各个节点

consul members:

image

图 - consul members 命令行示意图

image

图 - Consul节点UI示意图

三. 有了Consul能做什么?

  • 1. 服务注册和服务发现

  • 2. 健康检查

  • 3. 统一配置中心

3.1 服务注册和服务发现

“注册”这个词让笔者马上想到的是“新生注册”,根据百度汉语释义:“把名字记入簿册”;所以可以将服务注册看作“把服务信息存储到某个地方”的过程。如果这个地方是数据库,那注册不就是“Insert”嘛。而服务发现其实就是一次将服务名称作为查询条件的“Query”。

为什么需要服务注册和发现呢?

image

图 - 一种常见的架构

上图最常见的架构之一。以NGINX为例,在NGINX的配置文件中写入{serviceB1,serviceB2...}的IP,端口等信息,{serviceC/frontend/...}只需要“知道”NGINX的地址而不用关心它调用服务的信息。

该架构的问题在于:

(1)当性能不足需要增加实例时,NGINX需要修改配置文件并reload。

(2)当{serviceB,...}中有某些实例“挂了”,NGINX并不能“察觉”,仍然会有Request被分发到这些服务上,这些Request显然不能被正常处理。

问题(1)中“修改配置文件并reload”的过程其实可以立即为“注册和发现”的过程,显然这会增加运维的负担。“DRP”是一个很多人都知道的原则,一个很好的提升效率的方式就是避免重复劳动,所以需要将“注册和发现”过程抽象为一个服务,让程序自动完成这些工作。能完成“注册和发现”任务的服务需要有哪些特点呢?我们先给这个服务命名为ServiceCenter。

  • 由于所有的服务数据都会在ServiceCenter,所以它必须是分布式,高可用的。

  • 几乎都有的服务都会对并发有要求,所以ServiceCenter不能成为并发的“瓶颈”。

业界常用的服务注册与服务发现工具有 ZooKeeper、etcd、Consul 和 Eureka等,这些工具基本都符合上述两个特点。

image

图 - 服务注册,服务发现和健康检查的一般架构

image

图-Consul的服务注册展示页面

3.2 健康检查(Health Check)

只有服务注册和服务发现还是没办法解决前文的问题(2),注册只能保证“一段时间”内服务是可用的。好比:在外地工作需要办居住证,隔一段时间就需要年审,年审之后居住证才能继续生效,在现实生活中,这个时效一般是一年。但在计算机的世界里,对服务的“年审”一般是秒级的,通过的做法是定时(eg.每5s)像服务实例发送HTTP请求,服务如果返回正确的信息(eg.HTTP状态码为200)则“年审”通过,否则判定服务实例出现异常,需要将该实例下线(从数据库的角度就是Update或者Delete操作),Request不再发送到该实例。

image

图 - Consul健康检查

3.3 统一配置中心

配置文件是编程中绕不开的一部分。简单的代码或者写得糙一些,配置可能直接写死在代码里了,当涉及到复杂的项目,配置往往冗长,而且项目可能部署为多个实例(instance),所以配置的修改就会成为一个问题,所以需要统一配置中心。统一配置的方式没有定法,本质也是一个服务。所有的其它服务都需要去从这个服务读取配置,这就要求:

(1)决不能有单点故障问题,分布式几乎是唯一选择;

(2)需要能够支撑高并发。其实mysql,redis等等已经可以满足上述两点了,但是为什么不?配置文件相对于业务数据来说占用的空间实在是太小了,笔者认为没有必要用专门的数据库工具来解决这个问题。

Consul已经可以在实践中帮助我们解决服务注册和发现的问题,又可以成为我们的统一配置中心,实在是一个非常nice的工具。

image

图 - Consul kv配置中心的UI

四. Consul的特点

(1)Consul的功能非常完整,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案[5]

(2)一般,服务向本机所在Consul agent进行注册,该agent将服务数据同步到server集群,并且由该agent对服务进行健康检查,其它agent和server集群并不参与对该agent的健康检查,所以当agent“挂了”之后,由该agent注册的所有服务会不可用,其它agent和server集群也不会对这些服务进行“接管”;当然agent“挂了”的概率会远远小于服务崩溃的概率。

image

图 - Consul服务注册,发现与健康检查架构图

(3)与其他类似工具的比较,可参考[5],有时间以后再谈。

Reference

[1]Consul官网

[2]HashiCorp百度百科

[3]投资者将HashiCorp作为下一个值得关注的初创公司

[4]百度汉语-注册

[5]Eureka 2.X停止开发,注册中心Consul使用详解

[6]Consul初探-从安装到运行

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容