使用两台阿里云服务器尝试搭建consul集群(主机间内网互通,端口开放),这里集群都是server模式:
1.安装
1 2 3 4 5 6 7 8 9 | 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 |
提示如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 | 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
1 | 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 |
在第二个服务器重新代开一个终端,加入集群
1 | consul join 172.26.77.7 |
可以看见如下日志:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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