什么是consul
Consul是一个用golang开发的分布式高可用服务治理与与服务配置的工具,它有以下功能:
服务发现:Consul客户端可以提供服务,其他客户端可以使用服务名称通过DNS以及http等协议来发现服务,有助于提高服务的可扩展性。
健康检查:Consul的客户端可以通过多种方式来检查某个服务或当前节点是否处于健康状态,比如查看一个服务是否可以返回200 OK,或者是查看client当前部署的机器的内存使用是否在80%以下。
key/value存储:Consul客户端可以使用http api来存储、修改、删除一些k/v键值对。
consul的安装
Consul的安装十分简单,只要到官网下载对应版本的应用,然后解压后即可使用。
部署
consul可以在启动时通过命令行进行配置,不过为了方便起见,我们将配置写入配置文件中并指定配置文件启动。在生产环境下,consul的文档建议配置3-5个consul server以保证数据高可用。consul server是完成consul功能的主要部分,一般应该配置奇数个防止在选举leader时陷入“僵局”。
除了server外,还可以有部分实例以consul agents模式运行,consul agents仅仅将请求转发给consul server,可以将consul server与其他client隔离开。
下面是我的机器,运行着ubuntu16.04:
主机 | IP 地址 | 运行模式 |
---|---|---|
server1 | 192.168.0.101 | bootstrap consul server |
server2 | 192.168.0.102 | consul server |
server3 | 192.168.0.103 | consul server |
agent | 192.168.0.104 | consul agent |
创建配置文件
consul的配置信息可以在文档-配置查看,其中部分选项如下:
-advertise:通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader。
-bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-config-file:明确的指定要加载哪个配置文件
-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-dc:该标记控制agent允许的datacenter的名称,默认是dc1
-encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
-join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。
-retry-join:和join类似,但是允许你在第一次失败后进行尝试。
-retry-interval:两次join之间的时间间隔,默认是30s
-retry-max:尝试重复join的次数,默认是0,也就是无限次尝试
-log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err。
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-protocol:consul使用的协议版本
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
-syslog:开启系统日志功能,只在linux/osx上生效
-pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent
注意配置文件中的watches选项,可以提供一个脚本来根据脚本是否返回0判断健康检查是否通过。
{
"datacenter": "east-aws",
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "foobar",
"server": true,
"watches": [
{
"type": "checks",
"handler": "/usr/bin/health-check-handler.sh"
}
],
"telemetry": {
"statsite_address": "127.0.0.1:2180"
}
}
更多配置项及其含义可以在官网文档中查看。
按照惯例,我们将配置文件放在/etc/consul.d/目录下,分别在几个机器上创建该目录。在以bootstrap模式启动的server1上,我们创建/etc/consul.d/bootstrap和/etc/consul.d/server目录,在server2和server3上我们创建/etc/consul.d/server目录,在agent上,我们创建/etc/consul.d/agent目录。
bootstrap目录下的配置文件config.json
为:
{
"bootstrap": true,
"server": true,
"datacenter": "sh",
"data_dir": "/tmp/consul",
"advertise_addr":"192.168.0.101",
"encrypt": "h+TjXojPyilna4eO+dCeow==",
"log_level": "INFO",
"enable_syslog": true
}
其中encrypt可以用命令consul keygen
生成。
server目录下config.json
为:
{
"bootstrap": false,
"server": true,
"datacenter": "sh",
"data_dir": "/tmp/consul",
"advertise_addr":"192.168.0.101",
"encrypt": "h+TjXojPyilna4eO+dCeow==",
"log_level": "INFO",
"enable_syslog": true,
"start_join": ["192.168.0.102","192.168.0.103","192.168.0.104"]
}
对于其他server,配置文件相同,只是将对应的advertise_addr和start_join修改一下。
agent目录下的config.json
为:
{
"server": true,
"datacenter": "sh",
"data_dir": "/tmp/consul",
"ui" : true, //开启web ui
"encrypt": "h+TjXojPyilna4eO+dCeow==",
"log_level": "INFO",
"advertise_addr":"192.168.0.104",
"addresses": {
"http": "0.0.0.0"
},
"enable_syslog": true
}
这样,首先启动server1上的consul:consul agent -config-dir /etc/consul.d/bootstrap
,然后依次启动server2,server3上的consul:consul agent -config-dir /etc/consul.d/server
。这样,三个consul server就组成了一个cluster。此时server1上的consul运行在bootstrap状态下,可以在不与server2以及server3商议的情况下直接执行决议,此时我们终结server1上运行的consul,并执行consul agent -config-dir /etc/consul.d/server
,让server1以普通server的身份重新加入cluster。最后启动agent模式的consul consul agent -config-dir /etc/consul.d/agent
。
在server4上,我们访问 http://localhost:8500/, 即可看到目前consul集群的情况。
至此,consul集群就搭建完成了。