使用Consul打造弹性可扩展的PaaS平台

本文根据高效运维专家群友文章整理并发布。欢迎关注“高效运维”公众号,以抢先赏阅诚意满满的各类原创文章。node

做者介绍

杜威

程序员,混迹互联网研发和运维近十年。《Linux系统案例精解》合著者之一。就任亮风台,专一DevOps、云计算、大数据等相关领域。nginx

应用背景

HiAR 是亮风台打造的新一代加强现实(AR)开发平台,提供简单易用、功能强大、跨平台的 AR 服务。让广大开发者能够轻松使用最前沿的计算机视觉技术、计算机图形学技术,快速搭建个性化的 AR 应用。程序员

7b0323749d1b3f05cf8f3aeb32b21cc5.png

云服务是HiAR平台中重要的基础设施。不管从高可用,仍是到可扩展,服务发现都发挥着不可或缺的做用。在没有使用服务发现以前,咱们遇到的几个痛点:json

  • 系统添加一个服务节点,咱们须要手工修改Nginx/LVS的配置文件、修改DNS记录。bootstrap

  • 应用服务发布新版本,咱们仍是须要手工修改Nginx的配置文件把节点下线、等待发布成功后再次修改Nginx的配置文件把服务上线。架构

  • 尽管后来咱们对上面两种场景的运维作了改进,编写脚本把过程改良为半自动半手动的方式,但还不是很方便,而结合服务注册就能够作到全自动。并发

  • 内网DNS出了故障,咱们须要对DNS服务进行维护。app

  • 没有服务注册,限制了Docker的发挥,只能当轻量级虚拟机来用。负载均衡

如今有了服务发现,一切都变得简单有趣。增减服务节点能够自动更新Nginx/LVS的配置文件;DNS丢一边吧,用IP就好;接入Mesos+Docker玩弹性扩展。运维

为何选择 Consul

已经有不少文章对Zookeeper、etcd、Consul进行比较,这里就不重复类比了。没有什么比合适更重要!Consul 的运维成本低,部署简单、使用方便、五脏俱全,这对于中小型团队应该是性价比很高的。

在进入实战前,先看看 Consul 都有哪些特性。

  • 服务注册。经过HTTP API或DNS,告诉服务注册中心有新的服务加入;

  • 服务发现。经过HTTP API或DNS,能够知道目标服务的地址和端口;

  • 健康检查。支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控;

  • 配置模板。Consul Template 负责按期从服务注册中心获取信息,若是有变化自动更新配置文件并从新加载;

以上四点已经能知足不少企业的需求。固然这不是Consul的全部,Consul还有不少锦上添花的特性,好比:可视化Web界面、支持多数据中心。

实战经验

咱们对Consul的使用能够概括到四个方面:部署、应用、管理、升级。

部署

d50b4fefc3e06594c12153949baeaa9b.jpeg

Consul Cluster有Server和Client两种角色。Server通常是3~5台,这也是官方推荐的。Consul Client就是须要进行服务注册或服务发现的节点。

Consul的部署简单、开箱即用,一个consul可执行文件,尚未乱七八糟的依赖。在官网下载编译好的Consul agent可执行文件,并上传到全部Server和Client角色的节点,便随时可启动consul agent了。

下面一块儿来看看如何启动一个Consul集群(3台Server、1台Client)。

实验环境:
    server01 192.168.1.11
    server02 192.168.1.12
    server03 192.168.1.13
    client01 192.168.1.21

分别登陆Server0一、Server0二、Server03,并启动agent。

[worker@server01 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.11 -node=server01

[worker@server02 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.12 -node=server02

[worker@server03 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.13 -node=server03

新开窗口登陆Server03,加入Server0一、Server02的集群。

[worker@server03 ~]$ consul join 192.168.1.11 192.168.1.12

上面几步就完成了初始化Server节点,之后经过-rejoin参数启动,能够从新加入集群。

[worker@server01 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.11 -node=server01 -rejoin

[worker@server02 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.12 -node=server02 -rejoin

[worker@server03 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.13 -node=server03 -rejoin

就这样三个Server节点部署完毕。接下来部署Client节点,和Server节点同样,有初次启动、手工加入和从新加入集群三步。

[worker@client01 ~]$ consul agent -data-dir /tmp/consul -bind=192.168.1.21 -node=client01

仍是在Client01上,新开一个登陆窗口,加入Server01的集群。

[worker@client01 ~]$ consul join 192.168.1.11

Client01节点往后的维护,经过-rejoin参数启动,即可从新加入集群。

[worker@client01 ~]$ consul agent -data-dir /tmp/consul -bind=192.168.1.21 -node=client01 -rejoin

到这里为止,咱们已经搭建好了一个Consul集群。然而怎么进行服务注册和服务发现呢?这得跟实际需求紧密结合,在接下来的小节中进一步说明。

应用

051cd324b541a360f8942108bee0935b.jpeg

Consul不是单独存在的。为了充分发挥Consul的优点,能够结合Nginx、LVS、Docker等工具来应用。

Nginx、LVS是系统的基础组件,RecoService、FeatureService、SearchService是基于SOA的内部服务。前者向Consul集群发现服务,后者向Consul集群注册服务。Consul是粘合剂也是开关,让整个系统的运做起来,低成本的实现了弹性伸缩。

接入层,用的是Nginx,负责反向代理和负载均衡。Nginx节点上跑两个Consul相关服务。一个是Consul Agent,作Consul Client;另一个是Consul Template,作服务发现和配置更新。Consul Template负责按期查询本地Consul Agent,若是相关服务的注册信息有变化,则更新Nginx的配置文件并从新加载Nginx服务。

运行Consul Template是实现弹性扩展的关键步骤:

$ consul-template -consul 127.0.0.1:8500 -template "/etc/nginx/conf/vhosts/test.ctmpl:/etc/nginx/conf/vhosts/test.conf:nginx -s reload"

上面这句命令中,test.conf是Nginx的虚拟主机配置文件,test.ctmpl是该配置文件对应的模板。下面是模板在负载均衡上的代码片断:

upstream test-cluster { 
  ip_hash;{{range service "test"}} 
  server {{.Address}}:{{.Port}};{{end}}
}

逻辑层,基于SOA的内部服务集群。不一样的内部服务集群之间通讯须要作服务发现,这里引入LVS作服务发现。好处是不用在内部服务的代码里实现服务发现,并且规模大了还要作负载均衡。与接入层的Nginx相似,LVS也用Consul Template按期查询本地Consul Agent,更新相关配置文件而后重载服务。

内部服务如何向服务中心注册?有两种方式,一是经过Consul的服务注册HTTP API,由服务自身在启动后调用API注册本身,二是经过在配置文件中定义服务的方式进行注册。建议使用后面一种方式来作服务注册。怎么办到的?请继续往下看 :)

为项目添加一个配置文件consul.json,指定服务名称和服务端口,并加上健康检查,内容以下:

{
    "service": 
    {
        "name" : "test",
        "port" : 9999,
        "check": 
        {
          "tcp": "127.0.0.1:9999",
          "interval": "10s"
        }
    }
}

最后一步,对服务进行注册,须要在Consul agent启动时指定配置文件,以下:

$ consul agent -data-dir /tmp/consul -node=test -bind=192.168.1.21 -config-dir=/tmp/consul.json

管理

一是节点管理,也就是Consul进程的管理。因为Consul Agent自己不具有高可用能力,因此咱们要有必要对Consul进程进行接管,咱们用的是Systemd,你也能够选择Supervisord或者Upstart这些进程管理工具。

二是集群管理,Consul提供了可视化管理界面。能够查看全部的服务和节点,以及它们的健康检测和当前状态。

fffb211e43f9a89f5d90e5cef5f84da7.jpeg

升级

因为Consul关系到整个系统的正常运做,因此升级的时候仍是要很当心。最好在测试环境试验多几回,再到生产环境升级。升级的情况能够概括为下面三种,须要对号入座以后再进行升级。

  • 特殊版本的升级。在upgrade-specific页面查看当前升级的版本是否有特殊说明。好比:0.5.1以前的版本直接升级到0.6版本,要借助工具consul-migrate进行数据迁移。

  • 不兼容的升级。使用consul -v查看新版的向后兼容协议版本号,当出现与当前版本不兼容时,须要分两步升级。先经过参数-protocal=旧的协议版本号,把整个集群升级一次,再把启动命令中的参数-protocal去掉来重启全部节点。

  • 标准的升级。若是上面两种状况都不是,那么恭喜你,你须要作的只是简单的标准升级。即:中止旧版本的agent,而后启动新版本的agent。PS. 其实大多数状况都是标准升级。

升级节点的推荐顺序是,先升级Server的Follower节点,再升级Server的Leader节点,最后升级全部Client的节点。

结语

在系统中引入服务注册和发现,虽然是一发牵动全身的改造,但整个系统架构会所以受益,尤为是现代的微服务架构。相信不少系统都具有负载均衡、健康检查、心跳检测等能力,利用好服务发现,那么弹性伸缩、服务高可用、灰度发布,天然是水到渠成的事情。

相关文章
相关标签/搜索