一、什么是consul

1、Consul 是 HashiCorp 公司推出的开源软件,用于实现分布式系统的服务发现与配置。

Consul 是分布式的、高可用的、 可横向扩展的

2、官方网站:

https://www.consul.io/

3、Consul 集群间使用了 Gossip 协议通信和 raft 一致性算法

二、下载consul软件

1,下载地址:

https://www.consul.io/downloads

选择64位linux版本下载

2,把consul的安装文件解压:

[root@localhost consul]# cd /usr/local/source/consul
[root@localhost consul]# ls
consul_1.8.4_linux_amd64.zip
[root@localhost consul]# unzip consul_1.8.4_linux_amd64.zip
Archive:  consul_1.8.4_linux_amd64.zip
  inflating: consul
[root@localhost consul]# ls
consul  consul_1.8.4_linux_amd64.zip

3,复制到到各服务器的/usr/local/soft目录下

三、在第一台consul服务器上运行:

1,生成数据目录:

[root@consul1 /]# mkdir /data/
[root@consul1 /]# mkdir /data/consul/
[root@consul1 /]# mkdir /data/consul/data
[root@consul1 /]# chmod 777 /data/consul/data

2,运行consul

-server:以server身份启动

-bootstrap-expect=2:集群要求的最少server数量

-bind:监听的ip

-client:客户端ip,0.0.0.0表示不限制客户端ip

-data-dir:指定存放数据的目录

-node:指定节点id,注意:同一集群内节点id不允许重复

[root@consul1 /]# nohup /usr/local/soft/consul agent -server -bind=172.17.0.2 -client=0.0.0.0 -bootstrap-expect=2 -data-dir=/data/consul/da -node=server-2 >/dev/null 2>&1 &
[1] 549
[root@consul1 /]#

查看是否在运行中,这里我们选择查看端口:

[root@consul1 /]# ss -lntp
State       Recv-Q       Send-Q              Local Address:Port              Peer Address:Port
LISTEN      0            4096                   172.17.0.2:8300                   0.0.0.0:*           users:(("consul",pid=549,fd=6))
LISTEN      0            4096                   172.17.0.2:8301                   0.0.0.0:*           users:(("consul",pid=549,fd=12))
LISTEN      0            4096                   172.17.0.2:8302                   0.0.0.0:*           users:(("consul",pid=549,fd=8))
LISTEN      0            4096                            *:8500                         *:*           users:(("consul",pid=549,fd=16))
LISTEN      0            4096                            *:8600                         *:*           users:(("consul",pid=549,fd=15))  

可以看到consul已经在守护端口中,而且consul启用了多个端口

3,查看consul的版本:

[root@consul1 /]# /usr/local/soft/consul --version
Consul v1.8.4
Revision 12b16df32
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)

4,查看consul的集群成员数量

[root@consul1 /]# /usr/local/soft/consul members
Node      Address          Status  Type    Build  Protocol  DC   Segment
server-2  172.17.0.2:8301  alive   server  1.8.4  2         dc1  <all>

只有一台机器,正常

5,查看当前节点的信息:

[root@consul1 /]# /usr/local/soft/consul info
agent:
        check_monitors = 0
        check_ttls = 0
        checks = 0
        services = 0
build:
        prerelease =
        revision = 12b16df3
        version = 1.8.4
consul:
        acl = disabled
        bootstrap = false
        known_datacenters = 1
        leader = false
        leader_addr =
        server = true
raft:
        applied_index = 0
        commit_index = 0
        fsm_pending = 0
        last_contact = never
        last_log_index = 0
        last_log_term = 0
        last_snapshot_index = 0
        last_snapshot_term = 0
        latest_configuration = []
        latest_configuration_index = 0
        num_peers = 0
        protocol_version = 3
        protocol_version_max = 3
        protocol_version_min = 0
        snapshot_version_max = 1
        snapshot_version_min = 0
        state = Follower
        term = 0
runtime:
        arch = amd64
        cpu_count = 2
        goroutines = 79
        max_procs = 2
        os = linux
        version = go1.14.6
serf_lan:
        coordinate_resets = 0
        encrypted = false
        event_queue = 0
        event_time = 1
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 1
        members = 1
        query_queue = 0
        query_time = 1
serf_wan:
        coordinate_resets = 0
        encrypted = false
        event_queue = 0
        event_time = 1
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 1
        members = 1
        query_queue = 0
        query_time = 1

四、在第二台consul服务器上运行相同的操作,

启动的命令需要修改ip和节点名:

[root@consul2 /]# nohup /usr/local/soft/consul agent -server -bind=172.17.0.3 -client=0.0.0.0 -bootstrap-expect=2 -data-dir=/data/consul/da -node=server-3 >/dev/null 2>&1 &
[1] 371

查看集群成员:

[root@consul2 /]# /usr/local/soft/consul members
Node      Address          Status  Type    Build  Protocol  DC   Segment
server-3  172.17.0.3:8301  alive   server  1.8.4  2         dc1  <all>

把当前节点加入到第一台consul服务器的ip:

[root@consul2 /]# /usr/local/soft/consul join 172.17.0.2
Successfully joined cluster by contacting 1 nodes.

加入成功后再次查看节点:

[root@consul2 /]# /usr/local/soft/consul members
Node      Address          Status  Type    Build  Protocol  DC   Segment
server-2  172.17.0.2:8301  alive   server  1.8.4  2         dc1  <all>
server-3  172.17.0.3:8301  alive   server  1.8.4  2         dc1  <all>

五、在第三台consul服务器上运行相同的操作:

命令修改ip和节点名:并允许访问ui

-ui:允许访问web ui

[root@consul3 /]# nohup /usr/local/soft/consul agent -server -bind=172.17.0.4 -client=0.0.0.0 -bootstrap-expect=2 -data-dir=/data/consul/da -node=server-4 -ui >/dev/null 2>&1 &
[1] 229
[root@consul3 /]#

查看成员

[root@consul3 /]# /usr/local/soft/consul members
Node      Address          Status  Type    Build  Protocol  DC   Segment
server-4  172.17.0.4:8301  alive   server  1.8.4  2         dc1  <all>

加入集群

[root@consul3 /]# /usr/local/soft/consul join 172.17.0.2
Successfully joined cluster by contacting 1 nodes.

成功后再次查看成员

[root@consul3 /]# /usr/local/soft/consul members
Node      Address          Status  Type    Build  Protocol  DC   Segment
server-2  172.17.0.2:8301  alive   server  1.8.4  2         dc1  <all>
server-3  172.17.0.3:8301  alive   server  1.8.4  2         dc1  <all>
server-4  172.17.0.4:8301  alive   server  1.8.4  2         dc1  <all>

六,访问在第三台consul服务器上启用的web ui:

访问:

 http://172.17.0.4:8500/

返回:

点击后可以查看集群内3个实例:

如图:

点击每台机器可查看其状态:

七,consul的退出:

leave指令触发一个优雅的离开动作并关闭agent,节点离开后不会尝试重新加入集群中

在第二台consul服务器上执行:

[root@consul2 /]# /usr/local/soft/consul leave
Graceful leave complete

查看端口:

[root@consul2 /]# ss -lntp
State            Recv-Q             Send-Q                          Local Address:Port                         Peer Address:Port

可以看到守护进程已退出

在其他节点查看成员:

[root@consul3 /]# /usr/local/soft/consul members
Node      Address          Status  Type    Build  Protocol  DC   Segment
server-2  172.17.0.2:8301  alive   server  1.8.4  2         dc1  <all>
server-3  172.17.0.3:8301  left    server  1.8.4  2         dc1  <all>
server-4  172.17.0.4:8301  alive   server  1.8.4  2         dc1  <all>

可以看到server-3的状态已变更为left

从web ui查看:

已看不到 server-3

八、docker安装consul

docker run -d -p 8500:8500 –restart=always –name consul-8500 consul:1.8.8 agent -server -bootstrap -ui -node=consul_node_01 -client=‘0.0.0.0’

-d: 后台运行容器,并返回容器ID;
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
--name consul-8500 : 指定容器名称,自定义
consul:1.8.8 : 指定镜像, 镜像名:标签名
agent: 表示启动 Agent 进程。
server:表示启动 Consul Server 模式
client:表示启动 Consul Cilent 模式。
bootstrap:表示这个节点是 Server-Leader ,每个数据中心只能运行一台服务器。技术角度上讲 Leader 是通过 Raft 算法选举的,但是集群第一次启动时需要一个引导Leader,在引导群集后,建议不要使用此标志。
ui:表示启动 Web UI 管理器 。
-node=consul_node_01:节点的名称,自定义;集群中必须是唯一的,默认是该节点的主机名。
-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,
         默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0。
join:表示加入到某一个集群中去。 如:-join=192.168.1.169。