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

简介:

应用背景

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

云服务是HiAR平台中重要的基础设施。无论从高可用,还是到可扩展,服务发现都发挥着不可或缺的作用。在没有使用服务发现之前,我们遇到的几个痛点:

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

◆ 应用服务发布新版本,我们还是需要手工修改Nginx的配置文件把节点下线、等待发布成功后,再次修改Nginx的配置文件把服务上线。

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

◆ 内网DNS出了故障,我们需要对DNS服务进行维护。

◆ 没有服务注册,限制了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的使用可以归纳到四个方面:部署、应用、管理、升级。

部署

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

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

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

实验环境:

 
 
  1. server01 192.168.1.11 
  2. server02 192.168.1.12 
  3. server03 192.168.1.13 
  4. client01 192.168.1.21 

分别登录Server01、Server02、Server03,并启动agent。

 
 
  1. [worker@server01 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.11 -node=server01 
  2. [worker@server02 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.12 -node=server02 
  3. [worker@server03 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.13 -node=server03 

新开窗口登录Server03,加入Server01、Server02的集群。

 
 
  1. [worker@server03 ~]$ consul join 192.168.1.11 192.168.1.12 

上面几步就完成了初始化Server节点,以后通过-rejoin参数启动,可以重新加入集群。

 
 
  1. [worker@server01 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.11 -node=server01 -rejoin 
  2. [worker@server02 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.12 -node=server02 -rejoin 
  3. [worker@server03 ~]$ consul agent -server -bootstrap-expect 2 -data-dir /tmp/consul -bind=192.168.1.13 -node=server03 -rejoin 

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

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

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

 
 
  1. [worker@client01 ~]$ consul join 192.168.1.11 

Client01节点日后的维护,通过-rejoin参数启动,便可重新加入集群。

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

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

应用

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是实现弹性扩展的关键步骤:

 
 
  1. $ 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是该配置文件对应的模板。下面是模板在负载均衡上的代码片段:

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

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

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

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

 
 
  1.     "service":  
  2.     { 
  3.         "name" : "test"
  4.         "port" : 9999, 
  5.         "check":  
  6.         { 
  7.           "tcp""127.0.0.1:9999"
  8.           "interval""10s" 
  9.         } 
  10.     } 

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

 
 
  1. $ 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提供了可视化管理界面。可以查看所有的服务和节点,以及它们的健康检测和当前状态。

升级

由于Consul关系到整个系统的正常运作,所以升级的时候还是要很小心。最好在测试环境试验多几次,再到生产环境升级。升级的状况可以归纳为下面三种,需要对号入座之后再进行升级。

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

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

◆ 标准的升级。如果上面两种情况都不是,那么恭喜你,你需要做的只是简单的标准升级。即:停止旧版本的agent,然后启动新版本的agent。PS:其实大多数情况都是标准升级。

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

结语

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






作者:杜威
来源:51CTO
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
4月前
|
人工智能 自然语言处理 搜索推荐
AI原生企业级Agent构建平台具备哪些特性?一篇文章看明白
AI原生企业级Agent构建平台有哪些特性?澜码正式发布AskXBOT平台为业界揭晓答案。
226 0
|
6月前
|
敏捷开发 Kubernetes Docker
《深度解析Docker与微服务架构:构建灵活可扩展的现代应用》
《深度解析Docker与微服务架构:构建灵活可扩展的现代应用》
409 0
|
18天前
|
存储 缓存 监控
构建高效可扩展的后端服务架构
在当今互联网时代,构建高效可扩展的后端服务架构对于企业的业务发展至关重要。本文将探讨如何通过合理设计和优化后端服务架构,实现系统的高性能、高可用性和易扩展性,从而满足不断增长的业务需求和用户规模。
15 0
|
5天前
|
缓存 负载均衡 NoSQL
构建高效可扩展的RESTful API:后端开发的最佳实践
【4月更文挑战第14天】在当今快速发展的网络应用时代,一个结构良好且高效的RESTful API是确保后端服务可靠性和性能的关键。本文深入探讨了设计和实现高效可扩展RESTful API的最佳实践,涵盖了API设计原则、数据库优化、缓存策略以及负载均衡等关键方面。文中不仅提供了具体的技术建议,还通过案例分析展示了如何应对实际开发中的挑战。
|
22天前
|
安全 API 开发者
构建高效可扩展的RESTful API服务
在数字化转型的浪潮中,构建一个高效、可扩展且易于维护的后端API服务是企业竞争力的关键。本文将深入探讨如何利用现代后端技术栈实现RESTful API服务的优化,包括代码结构设计、性能调优、安全性强化以及微服务架构的应用。我们将通过实践案例分析,揭示后端开发的最佳实践,帮助开发者提升系统的响应速度和处理能力,同时确保服务的高可用性和安全。
25 3
|
监控 TensorFlow 算法框架/工具
阿里云超算:高性能容器方案实战之Singularity
除了自动化整合IaaS层硬件资源为用户提供云上HPC集群外,E-HPC还致力于巩固云上HPC服务的高可用性,先后推出了“集谛多维性能监控”、“低成本断点续算”等新特性,帮助用户更好、更省地使用云上HPC服务。本文主要介绍阿里云超算推出的弹性高性能容器方案以及在分子动力学领域和AI领域的实战案例。
8140 0
|
2月前
|
存储 监控 持续交付
构建可扩展的阿里云 RPA 架构
随着企业业务的增长和变化,构建一个可扩展的机器人流程自动化(RPA)架构变得至关重要。本文将介绍如何利用阿里云 RPA 构建一个可扩展的架构,以适应不断变化的业务需求。
|
4月前
|
Kubernetes Cloud Native NoSQL
TuGraph Analytics云原生部署:基于K8S Operator的轻量级作业启动方案
TuGraph Analytics作业可以通过Console提交部署到K8S集群,但Console是一个独立的Web系统,部署形态上相对较重。在平台工具系统接入或大数据生态集成场景中,需要更轻量级的快速接入TuGraph Analytics的方案。
|
5月前
|
存储 分布式计算 监控
在云原生环境中构建可扩展的大数据平台:方法和策略
在云原生环境中构建可扩展的大数据平台:方法和策略
136 0
|
7月前
|
Oracle 关系型数据库 MySQL
超简单的C#可配置可扩展基础框架示例
超简单的C#可配置可扩展基础框架示例