使用两台阿里云服务器尝试搭建consul集群(主机间内网互通,端口开放),这里集群都是server模式:
1.安装
wget https://releases.hashicorp.com/consul/1.7.2/consul_1.7.2_linux_amd64.zip
##上面压缩包解压后是一个consul可执行文件
unzip -d /usr/local/bin consul_1.7.2_linux_amd64.zip
## 配置环境变量
vim /etc/profile //加入 export PATH=conusl的安装文件夹:$PATH
## 环境变量生效
source /etc/profile
##查看安装是否成功
consul
提示如下:
Available commands are:
agent Runs a Consul agent
configtest Validate config file
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
reload Triggers the agent to reload configuration files
rtt Estimates network round trip time between nodes
version Prints the Consul version
watch Watch for changes in Consul
其中consul agent 是启动一个agent的命令
2.启动
2.1命令参数介绍
2.1.1启动模式、配置相关
- -server:定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
- -bootstrap:用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader
- -bootstrap-expect:在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap同时使用
- -non-voting-server:本server节点不参与leader与投票选举
- -dc:该标记控制agent允许的datacenter的名称,默认是dc1
- -node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
- -disable-host-node-id:禁用主机信息生成确定的node-id,为true会随机生成,保存在数据文件夹
- -encrypt:指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
- -ui:开启自带的ui web-server,可以通过HTTP API端口外部访问
- -config-file:配置文件(.json)地址的配置文件地址
- -config-dir:配置文件目录,里面所有以.json或.hcl结尾的文件都会被加载
- -config-format:作为json和hcl配置文件格式的扩展
- -data-dir:提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
- -pid-file:提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent
2.1.2 IP相关
- -bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
- -client:consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1,需要外部访问指定0.0.0.0
- -join:加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点
- -advertise:通知展现地址用来改变我们给集群中的其他节点展现的(局域网)地址,一般情况下-bind地址就是展现地址,其他节点join的地址就是这个ip
- -advertise-wan:与-advertise类似,不过是广域网地址;
- -retry-join:和join类似,但是允许你在第一次失败后进行尝试。
- -retry-interval:两次join之间的时间间隔,默认是30s
- -retry-max:尝试重复join的次数,默认是0,也就是无限次尝试
- -rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中
2.1.3 端口相关
- -dns-port:监听的DNS端口;默认8600
- -grpc-port:gRPC API监听端口,默认-1关闭gRPC
- -http-port:http API监听端口,默认8500
- -https-port:https API监听端口,默认-1关闭;
- -server-port:server RPC监听端口;默认8300
2.1.4 日志相关
- -log-level:consul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err
- -log-file:指定日志文件,如果设置/var/log/,会在文件夹内生成consul-{timestamp}.log文件;这一参数可以结合几个日志相关的参数使用
- -log-rotate-bytes:指定日志文件轮换的字节数,文件大小超过后会生成新的日志文件;默认不限制
- -log-rotate-duration:指定日志文件轮换的时间间隔;默认24h,可以指定600s等
- -log-rotate-max-files:指定保留旧文件的数量;默认0表示无限制;-1表示不保留旧的日志文件
- -log-json:日志以json形式输出;默认关闭
- -syslog:当前日志加入系统日志
2.2搭建集群
接下来我们尝试搭建一个具有两个server的集群:
启动第一个node
consul agent -server -bind=172.26.77.7 -client 0.0.0.0 -bootstrap-expect=2 -data-dir=/mnt/gsy/my-consul -ui -node=gsy
在另一台服务器启动第二个node
consul agent -server -bind=172.21.246.248 -client 0.0.0.0 -bootstrap-expect=2 -data-dir=/mnt/gsy/my-consul -ui -node=zr
在第二个服务器重新代开一个终端,加入集群
consul join 172.26.77.7
可以看见如下日志:
bootstrap_expect = 2: A cluster with 2 servers will provide no failure tolerance. See https://www.consul.io/docs/internals/consensus.html#deployment-table
bootstrap_expect > 0: expecting 2 servers
==> Starting Consul agent...
Version: 'v1.7.2'
Node ID: '5d3bdedb-ad75-d153-22f6-ab558b07676e'
Node name: 'gsy'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [0.0.0.0] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)
Cluster Addr: 172.26.77.7 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
==> Log data will now stream in as it occurs:
2020-04-08T10:32:52.431+0800 [INFO] agent.server.raft: initial configuration: index=0 servers=[]
2020-04-08T10:32:52.432+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: gsy.dc1 172.26.77.7
2020-04-08T10:32:52.433+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: gsy 172.26.77.7
2020-04-08T10:32:52.436+0800 [INFO] agent.server.raft: entering follower state: follower="Node at 172.26.77.7:8300 [Follower]" leader=
2020-04-08T10:32:52.436+0800 [INFO] agent.server: Adding LAN server: server="gsy (Addr: tcp/172.26.77.7:8300) (DC: dc1)"
2020-04-08T10:32:52.436+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=gsy.dc1 area=wan
2020-04-08T10:32:52.437+0800 [INFO] agent: Started DNS server: address=0.0.0.0:8600 network=tcp
2020-04-08T10:32:52.437+0800 [INFO] agent: Started DNS server: address=0.0.0.0:8600 network=udp
2020-04-08T10:32:52.437+0800 [INFO] agent: Started HTTP server: address=[::]:8500 network=tcp
2020-04-08T10:32:52.437+0800 [INFO] agent: started state syncer
==> Consul agent running!
2020-04-08T10:32:59.544+0800 [ERROR] agent.anti_entropy: failed to sync remote state: error="No cluster leader"
2020-04-08T10:33:02.373+0800 [WARN] agent.server.raft: no known peers, aborting election
2020-04-08T10:33:20.216+0800 [ERROR] agent: Coordinate update error: error="No cluster leader"
2020-04-08T10:33:21.132+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: zr 172.21.246.248
2020-04-08T10:33:21.132+0800 [INFO] agent.server: Adding LAN server: server="zr (Addr: tcp/172.21.246.248:8300) (DC: dc1)"
2020-04-08T10:33:21.134+0800 [INFO] agent.server: Found expected number of peers, attempting bootstrap: peers=172.26.77.7:8300,172.21.246.248:8300
2020-04-08T10:33:21.138+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: zr.dc1 172.21.246.248
2020-04-08T10:33:21.138+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=zr.dc1 area=wan
2020-04-08T10:33:21.871+0800 [INFO] agent.server: New leader elected: payload=zr
2020-04-08T10:33:22.760+0800 [INFO] agent: Synced node info
可以看到zr节点加入成功,server数量达到要求,zr节点被选举为leader,之后server间同步了信息;
2.2 配置文件参数介绍
- -addresses:一个嵌套对象,可以设置以下key:dns、http、rpc
- -advertise_addr:等同于-advertise
- -bootstrap:等同于-bootstrap
- -bootstrap_expect:等同于-bootstrap-expect
- -bind_addr:等同于-bind
- -client_addr:等同于-client
- -datacenter:等同于-dc
- -data_dir:等同于-data-dir
- -disable_remote_exec:禁止支持远程执行,设置为true,agent会忽视所有进入的远程执行请求
- -domain:默认情况下consul在进行DNS查询时,查询的是consul域,可以通过该参数进行修改
- -enable_debug:开启debug模式
- -enable_syslog:等同于-syslog
- -encrypt:等同于-encrypt
- -key_file:提供私钥的路径
- -leave_on_terminate:默认是false,如果为true,当agent收到一个TERM信号的时候,它会发送leave信息到集群中的其他节点上。
- -log_level:等同于-log-level
- -node_name:等同于-node
- -ports:这是一个嵌套对象,可以设置以下key:dns(dns地址:8600)、http(http api地址:8500)、rpc(rpc:8400)、serf_lan(lan port:8301)、serf_wan(wan port:8302)、server(server rpc:8300)
- -rejoin_after_leave:等同于-rejoin
- -retry_join:等同于-retry-join
- -retry_interval:等同于-retry-interval
- -server:等同于-server
- -log_file:等同于 -log-file
- -log_rotate_duration:等同于-log-rotate-duration
- -log_rotate_bytes:等同于-log-rotate-bytes
- -log_rotate_max_files:等同于-log-rotate-max-files
- -log_json:等同于-log-json