张子阳的博客

首页 读书 技术 店铺 关于
张子阳的博客 首页 读书 技术 店铺 关于

Consul 安装和配置Server - Part.1

2018-12-25 作者: 张子阳 分类: 分布式系统

在实践微服务的过程中,通常使用Consul来进行服务发现和健康检查。这篇文章将简单介绍在Linux(CentOS 7.0)下安装和配置一个3节点的Consul集群。

安装

下载zip安装包,前往https://www.consul.io/downloads.html,下载对应的安装包:

# cd ~/downloads; wget https://releases.hashicorp.com/consul/1.4.0/consul_1.4.0_linux_amd64.zip

解压缩得到consul,就一个文件(可执行程序)。移动到 /usr/bin 目录下(也可以移动到其他目录,但是要修改PATH环境变量):

# unzip consul_1.4.0_linux_amd64.zip; mv consul /usr/bin

在控制台输入consul,如果正确安装,会显示consul的用法。

# consul Usage: consul [--version] [--help] <command> [<args>] Available commands are: acl Interact with Consul's ACLs agent Runs a Consul agent catalog Interact with the catalog connect Interact with Consul Connect ...

启动consul

consul进程称作agent,agent有两种类型:server和client。server保存所有的状态,多个server只有一个Leader,leader负责各个server之间的协调和同步。client是一个轻量化进程,主要负责:1、监控本地的服务进程,对其进行健康检查;2、将服务进程的状态转发至server;3、将请求(例如服务注册)转发至server。

整体的结构图如下所示(来自官网):

Consul 架构

server建议以2n+1的方式部署,并且允许n个容错。例如,部署3台,允许1台出错;部署5台,允许2台出错。这篇文章以3台作为例子,3台的IP分别为:192.168.1.56~58。

这篇文章部署的3台都是SERVER,不是CLIENT。

启动server

启动之前,先创建两个目录,一个用于存放consul数据,一个用于存放consul配置,一个用于存放脚本:

# mkdir -p /opt/consul/data /opt/consul/config /opt/consul/scripts

接下来执行命令行,启动服务进程:

# consul agent -server \ -bootstrap-expect=3 \ -data-dir=/opt/consul/data \ -node=consul1 \ -bind=192.168.1.56 \ -enable-local-script-checks=true \ -config-dir=/opt/consul/config \ -client='127.0.0.1 192.168.1.56' \ -ui

红色字体是复制粘贴时容易出错的地方,切记替换。

consul的启动配置非常多,具体可以参考官方文档:Consul agent options。除了使用命令行来设置参数以外,还可以通过配置文件。

这里仅对常用到的这几个说明一下:

将红色部分改为对应的名称和ip,对三台机器执行同样的操作。

加入集群

启动后,这3台机器都是独立运行的,并不知道彼此的存在,没有Leader,也不属于任何集群。这是合乎逻辑的。此时在一大段的日志输出最后,可以看到这样的信息:

2018/12/25 14:31:33 [ERR] agent: Coordinate update error: No cluster leader 2018/12/25 14:31:41 [ERR] agent: failed to sync remote state: No cluster leader

接下来,重新开一个控制台,在任意一台服务器上执行下面的命令,将这三台服务器构成一个集群:

# consul join 192.168.1.56 192.168.1.57 192.168.1.58 Successfully joined cluster by contacting 3 nodes.

之后,在3台服务器的某一台,可以看到这样的输出:

2018/12/25 14:32:45 [INFO] consul: cluster leadership acquired 2018/12/25 14:32:45 [INFO] consul: New leader elected: consul1

说明这台服务器被选中Leader了。其他两台服务器上,则可以看到这样的输出:

2018/12/25 14:32:45 [INFO] consul: New leader elected: consul1

查看状态

至此,有着3个server节点的consul集群就搭建完成了。可以通过下面的命令行查看集群成员:

# consul members Node Address Status Type Build Protocol DC Segment consul1 192.168.1.56:8301 alive server 1.4.0 2 dc1 <all> consul2 192.168.1.57:8301 alive server 1.4.0 2 dc1 <all> consul3 192.168.1.58:8301 alive server 1.4.0 2 dc1 <all>

通过下面的命令可以查看整体的配置情况:

# consul info agent: check_monitors = 0 check_ttls = 0 checks = 0 services = 0 build: prerelease = revision = 0bddfa23 version = 1.4.0 ...

离开集群

如果因为故障想要离开集群,可以直接Ctrl+C(前台运行时),或者执行consul leave(后台运行时)。

# consul leave

通过Http Api/WebUI查看集群

通过Http api查看集群

除了使用命令行界面(Comman Line Interface,CLI),Consul还提供了Http API来访问集群。除此以外,还提供了一个Web UI界面。当使用Http api访问集群时,不论访问集群中的哪一台服务器,都可以访问到整个集群。默认情况下,只能通过localhost访问:

例如,我们在192.168.1.57上执行下面的语句,查看集群的节点信息:

# curl localhost:8500/v1/catalog/nodes?pretty [ { "ID": "240740d5-f602-5f28-66b5-b115c8b175a5", "Node": "consul1", "Address": "192.168.1.56", "Datacenter": "dc1", "TaggedAddresses": { "lan": "192.168.1.56", "wan": "192.168.1.56" }, "Meta": { "consul-network-segment": "" }, "CreateIndex": 7, "ModifyIndex": 10 }, { "ID": "01e7354f-7449-6a57-7495-8ca6d2955962", "Node": "consul2", "Address": "192.168.1.57", "Datacenter": "dc1", "TaggedAddresses": { "lan": "192.168.1.57", "wan": "192.168.1.57" }, "Meta": { "consul-network-segment": "" }, "CreateIndex": 8, "ModifyIndex": 9 }, { "ID": "342e6add-2f1a-6946-f09e-1d7b42a7b5c6", "Node": "consul3", "Address": "192.168.1.58", "Datacenter": "dc1", "TaggedAddresses": { "lan": "192.168.1.58", "wan": "192.168.1.58" }, "Meta": { "consul-network-segment": "" }, "CreateIndex": 5, "ModifyIndex": 6 } ]

上面的语句在集群内的任何一台服务器上,例如192.168.1.56或者58上执行,都可以返回相同的结果。

如果将上面语句中的localhost改为192.168.1.57或者58,则会返回下面的错误:

# curl http://192.168.1.57:8500/v1/catalog/nodes?pretty

curl: (7) Failed connect to 192.168.1.57:8500; 拒绝连接

这是因为在上面的-client配置项,我只针对192.168.1.56配置了,而没有针对57和58配置。因此它们无法通过局域网IP访问,而如果是56,则可以继续返回结果。

通过Web UI访问

在上面的配置中,我通过-ui对192.168.1.56开启了WebUI,因此,在局域网内的一台Mac/Windows上打开浏览器,输入 http://192.168.1.56:8500/ui/,可以查看到类似下面的界面:

Consul WebUI 1
Consul WebUI 2
这里可以通过IP访问,同样是因为192.168.1.56配置了-client。

如果在192.168.1.57和58上,通过curl访问它们的Web UI,因为并未开启,所以返回了404:

# curl -v http://localhost:8500/ui/

* About to connect() to localhost port 8500 (#0)
*   Trying ::1...
* 拒绝连接
*   Trying 127.0.0.1...
* Connected to localhost (127.0.0.1) port 8500 (#0)
> GET /ui/ HTTP/1.1
> User-Agent: curl/7.29.0
> Host: localhost:8500
> Accept: */*
>
< HTTP/1.1 404 Not Found
< Date: Tue, 25 Dec 2018 12:01:27 GMT
< Content-Length: 0
<
* Connection #0 to host localhost left intact

总结

至此就完成了consul server集群的安装和配置。接下来,我们学习一下如何启动consul client并查看其状态。

感谢阅读,希望这篇文章能给你带来帮助!