Consul 安装和配置Server - Part.1
在实践微服务的过程中,通常使用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。
整体的结构图如下所示(来自官网):
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。除了使用命令行来设置参数以外,还可以通过配置文件。
这里仅对常用到的这几个说明一下:
- -server:说明是以server模式启动,如果没有此选项,则以client模式启动。
- -bootstrap-expect:说明预期有3台服务器,此时启动后,该server就不会将自己选为Leader,否则会出现俗称的“脑裂”现象(多个服务都认为自己是leader而导致的数据不一致)
- -data-dir:存放数据的目录
- -node:节点名称,默认是主机名,有时候主机名比较复杂或者随意,可以起一个简短好记的名字。
- -bind:集群内部通信的ip,集群内的所有服务器应该都能访问到才行。默认是0.0.0.0,意思是绑定本机所有ip,然后将可用的第一个IPv4地址广播至其他服务器。
- -enable-local-script-checks:是否启用本地脚本检查,当开启时,可以执行配置文件中的脚本进行健康检查。还有一个enable-script-checks,这个默认不开启,它可以允许执行通过http api提交的脚本,因此存在非常大的安全隐患,要特别小心!
- -config-dir:配置文件的目录,会加载所有后缀为.json或者.hcl的文件。
- -client:对外提供Http和DNS的地址,默认是“127.0.0.1”,如果希望在局域网内可以调用API服务,则可以设置此项(支持多个地址,用空格分开)。注意不需要在集群的每台Server上都开启。
- -ui:启动Web UI服务,注意不需要在集群中的每台Server上都开启。UI开启后,默认只能通过localhost访问(如果想通过局域网地址访问,配置上面的-client)。
将红色部分改为对应的名称和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/,可以查看到类似下面的界面:
这里可以通过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并查看其状态。
感谢阅读,希望这篇文章能给你带来帮助!