Consul集群部署

前言

1、简介

Consul是HashiCorp公司推出的开源软件,通过 GO 语言编写,提供服务注册和发现、配置、多数据中心的高可用方案等能力,分布式一致方面采用 raft 算法 实现,并且很容易和 Spring Cloud 等微服务框架集成,使用起来非常的简单,具有简单、易用、可插排等特点。简而言之,Consul 提供了一种完整的服务网格解决方案

下载地址:Downloads | Consul by HashiCorp

参数说明:Configuration | Consul by HashiCorp

Consul 运行的节点连接在一起,称为数据中心,一个数据中心将有 3 到 5 台服务器和许多客户端。Consul集群架构如下:
image

2、默认端口号说明

  • 8300: 只存在于Server模式,选取Leader节点(Raft协议)。为Leader节点和Client节点的提供RPC调用
  • 8301: LAN网中集群数据同步的通信端口(Gossip协议),也是加入集群的通信端口。
  • 8302: 只存在于Server模式,WAN网中集群数据同步的通信端口(Gossip协议),也是加入集群的通信端口。主要支持数据中心与数据中心之间交互通过WLAN(8302端口)
  • 8500: 提供Http服务(或web界面)
  • 8600: 提供DNS服务端口

提示:
8301和8302接口作用类似,主要区分在于8301用于LAN网络,8302用于WAN网络。它们都可以用于加入consul集群(数据中心一致就是在一个集群),将各数据中心连接则使用8302端口。

3、consul的功能

  • @client
    CLIENT表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
  • @server
    SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
  • @server-leader
    中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
  • @raft
    server节点之间的数据一致性保证,一致性协议使用的是raft,而zookeeper用的paxos,etcd采用的也是raft。
  • @服务发现协议
    consul采用http和dns协议,etcd只支持http
  • @服务注册
    consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。consul官方建议使用第二种方式。
  • @服务发现
    consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。
  • @服务间的通信协议
    Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool是同一个数据中心内部通信的,WAN pool是多个数据中心通信的,LAN pool有多个,WAN pool只有一个。

请思考一个问题: consul中的client模式把请求转向server,那么client的作用是什么?
1)首先server端的网络连接资源有限。对于一个分布式系统,一般情况下的访问量还是很大的。如果用用户不能通过client直接访问数据中心,那么数据中心必然要为每个用户提供一个单独的连接资源,那么server端的负担会非常大。随意很有必要用大量的client端来分散连接请求,在client端先统一整合用户的服务请求,然后一次性的通过单一的链接发送大量的的请求给server端,能够大量减少server端的网络负担。
2)其次,在client端可以对用户的请求进行一些处理来提高服务的效率,比如将相同的请求合并成同一个查询,再比如将之前的查询通过cookie的形式缓存下来。但是这些功能都需要消耗不少的计算和存储资源。 如果在server端提供这些功能,必然加重server端的负担,使得server端更加不稳定。而通过client端来进行这些服务就没有这些问题了,移位client端不提供实际服务,有充足的计算资源来处理这些工作。
3)最后一点,consul规定只要介入一个client就将自己注册到一个网络服务当中。这些结构使得系统的拓展性非常强,网络的拓扑变化可以特别灵活。这也依赖于client-server结构的。如果系统中只有几个数据中心存在,那网络的扩张也无从谈起。

部署规划

此处采用的是 3Server + 1Client 的集群架构,3 台 Server 在单独的虚拟机上,1 台 Client 则直接在部署服务的宿主机运行。

节点名称 节点IP Agent类型 OS版本
consul-01 192.168.4.50 server coentos 4.19
consul-02 192.168.4.51 server coentos 4.19
consul-03 192.168.4.52 server coentos 4.19
consul-client 192.168.4.53 client coentos 4.19

部署实战

1、安装 Consul

1、解压安装

export VER="1.14.3"
wget https://releases.hashicorp.com/consul/${VER}/consul_${VER}_linux_amd64.zip
unzip consul_${VER}_linux_amd64.zip -d /usr/local/bin/
consul version

2、配置
创建consul用户和组

sudo groupadd --system consul
sudo useradd -s /sbin/nologin --system -g consul consul

创建consul安装目录

mkdir -p /data/consul/{config,data,logs}
chown -R consul:consul /data/consul
chmod -R 775 /data/consul

设置 DNS 或编辑/etc/hosts 文件以配置所有服务器的主机名,替换example.com为您的实际域名。

cat >>/etc/hosts<<EOF
192.168.4.50 consul-01.example.com consul-01
192.168.4.51 consul-02.example.com consul-02
192.168.4.52 consul-03.example.com consul-03
192.168.4.53 consul-client.example.com consul-client
EOF

2、Server 节点配置

1、生成Consul secret

[root@server50 consul]# consul keygen
4DOybtfknjIy+aVJWIvtwcu/g5Et/YO5hnxBoxk3MgI=

为server节点创建json配置文件,其他节点配置修改IP地址及节点名称即可

consul-01节点

cat >/data/consul/config/consul.json<<EOF
{
    "advertise_addr": "192.168.4.50",
    "bind_addr": "192.168.4.50",
    "bootstrap_expect": 3,
    "client_addr": "0.0.0.0",
    "datacenter": "DC1",
    "node_name": "consul-01", 
    "data_dir": "/data/consul/data",
    "domain": "consul",
    "enable_script_checks": true,
    "dns_config": {
        "enable_truncate": true,
        "only_passing": true
    },
    "enable_syslog": true,
    "encrypt": "4DOybtfknjIy+aVJWIvtwcu/g5Et/YO5hnxBoxk3MgI=",
    "leave_on_terminate": true,
    "log_level": "INFO",
    "rejoin_after_leave": true,
    "retry_join": [
     "consul-01",
     "consul-02",
     "consul-03"
    ],
    "server": true,
    "start_join": [
        "consul-01",
        "consul-02",
        "consul-03"
    ],
    "ui": true
}
EOF

配置参数说明:

  • datacenter:此标志控制运行代理的数据中心。如果未提供,则默认为dc1。Consul 对多个数据中心有一流的支持,但它依赖于正确的配置。同一数据中心中的节点应位于单个 LAN 上。

  • data_dir:该标志为代理提供了一个数据目录来存储状态。

  • node_name:节点名字,一般为主机名。

  • server:指定是否为server节点。

  • bootstrap_expect:在一个datacenter中期望提供的server节点数目,当提供该值的时候,consul一直等到达到指定sever数目才会引导整个集群,该标记不能和bootstrap公用。

  • bind_addr:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。

  • client_addr:Consul 将绑定客户端接口的地址,包括 HTTP 和 DNS 服务器。默认情况下,这是127.0.0.1,仅允许环回连接。在 Consul 1.0 及更高版本中,这可以设置为要绑定到的以空格分隔的地址列表。

  • log_json:此标志使代理能够以 JSON 格式输出日志。默认为false。

  • log_level:在 Consul 代理启动后显示的日志级别。默认为 info 。可用的日志级别是trace、debug、info、warn和err。

  • retry_join:指定将要置入集群的IP列表,如果失败,会自动重试,知道直到成功加入。

  • start_join:启动时加入集群的地址

  • ui_config:此对象允许设置多个子键,用于控制 UI 中可用的显示或功能。

  • rejoin_after_leave :允许重新加入集群

consul-02节点

cat >/data/consul/config/consul.json<<EOF
{
    "advertise_addr": "192.168.4.51",
    "bind_addr": "192.168.4.51",
    "bootstrap_expect": 3,
    "client_addr": "0.0.0.0",
    "datacenter": "DC1",
    "node_name": "consul-02", 
    "data_dir": "/data/consul/data",
    "domain": "consul",
    "enable_script_checks": true,
    "dns_config": {
        "enable_truncate": true,
        "only_passing": true
    },
    "enable_syslog": true,
    "encrypt": "4DOybtfknjIy+aVJWIvtwcu/g5Et/YO5hnxBoxk3MgI=",
    "leave_on_terminate": true,
    "log_level": "INFO",
    "rejoin_after_leave": true,
    "retry_join": [
     "consul-01",
     "consul-02",
     "consul-03"
    ],
    "server": true,
    "start_join": [
        "consul-01",
        "consul-02",
        "consul-03"
    ],
    "ui": true
}
EOF

consul-02节点

cat >/data/consul/config/consul.json<<EOF
{
    "advertise_addr": "192.168.4.52",
    "bind_addr": "192.168.4.52",
    "bootstrap_expect": 3,
    "client_addr": "0.0.0.0",
    "datacenter": "DC1",
    "node_name": "consul-03", 
    "data_dir": "/data/consul/data",
    "domain": "consul",
    "enable_script_checks": true,
    "dns_config": {
        "enable_truncate": true,
        "only_passing": true
    },
    "enable_syslog": true,
    "encrypt": "4DOybtfknjIy+aVJWIvtwcu/g5Et/YO5hnxBoxk3MgI=",
    "leave_on_terminate": true,
    "log_level": "INFO",
    "rejoin_after_leave": true,
    "retry_join": [
     "consul-01",
     "consul-02",
     "consul-03"
    ],
    "server": true,
    "start_join": [
        "consul-01",
        "consul-02",
        "consul-03"
    ],
    "ui": true
}
EOF

3、Client 节点配置

client是consul客户端,客户端不保存数据,客户端将接收到的请求转发给Server端。Server之间通过局域网或广域网通信实现数据一致性。每个Server或Client都是一个consul agent。
创建consul-client节点配置文件

cat >/data/consul/config/consul.json<<EOF
{
    "advertise_addr": "192.168.4.53",
    "bind_addr": "192.168.4.53",
    "client_addr": "0.0.0.0",
    "datacenter": "DC1",
    "node_name": "consul-client", 
    "data_dir": "/data/consul/data",
    "domain": "consul",
    "enable_script_checks": true,
    "dns_config": {
        "enable_truncate": true,
        "only_passing": true
    },
    "enable_syslog": true,
    "encrypt": "4DOybtfknjIy+aVJWIvtwcu/g5Et/YO5hnxBoxk3MgI=",
	"ports": {
            "http": 8500,
            "dns": 8600,
            "serf_lan": 8301,
            "serf_wan": 8302,
            "server": 8300

    },
    "leave_on_terminate": true,
    "log_level": "INFO",
    "rejoin_after_leave": true,
    "retry_join": [
     "consul-01",
     "consul-02",
     "consul-03"
    ],
    "server": false,
    "start_join": [
        "consul-01",
        "consul-02",
        "consul-03"
    ],
    "ui": true
}
EOF

4、systemd 启动文件

所有节点创建systemd 服务文件/etc/systemd/system/consul.service,所有节点具有相同内容,配置如下

cat >/etc/systemd/system/consul.service<<EOF
[Unit]
Description=Consul Service Discovery Agent
Documentation=https://www.consul.io/
After=network-online.target
Wants=network-online.target


[Service]
Type=simple
User=consul
Group=consul
ExecStart=/usr/local/bin/consul agent -config-dir=/data/consul/config/consul.json


ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
TimeoutStopSec=5
Restart=on-failure
SyslogIdentifier=consul


[Install]
WantedBy=multi-user.target
EOF

所有节点启动consul服务

systemctl enable --now consul.service

查看consul服务运行状态

[root@server50 consul]# systemctl status consul
● consul.service - Consul Service Discovery Agent
   Loaded: loaded (/etc/systemd/system/consul.service; enabled; vendor preset: disabled)
   Active: active (running) since Fri 2022-12-23 14:46:02 CST; 59s ago
     Docs: https://www.consul.io/
 Main PID: 6744 (consul)
   CGroup: /system.slice/consul.service
           └─6744 /usr/local/bin/consul agent -config-dir=/data/consul/config/consul.json

Dec 23 14:46:59 server50 consul[6744]: 2022-12-23T14:46:59.242+0800 [INFO]  agent.leader: stopped routine: rout...heck"
Dec 23 14:46:59 server50 consul[6744]: 2022-12-23T14:46:59.242+0800 [INFO]  agent.server: member joined, markin...fault
Dec 23 14:46:59 server50 consul[6744]: agent.leader: stopped routine: routine="virtual IP version check"
Dec 23 14:46:59 server50 consul[6744]: agent.server: member joined, marking health alive: member=consul-02 part...fault
Dec 23 14:46:59 server50 consul[6744]: agent.server: member joined, marking health alive: member=consul-03 part...fault
Dec 23 14:46:59 server50 consul[6744]: 2022-12-23T14:46:59.244+0800 [INFO]  agent.server: member joined, markin...fault
Dec 23 14:46:59 server50 consul[6744]: 2022-12-23T14:46:59.378+0800 [INFO]  agent: Synced node info
Dec 23 14:46:59 server50 consul[6744]: agent: Synced node info
Dec 23 14:46:59 server50 consul[6744]: 2022-12-23T14:46:59.585+0800 [INFO]  agent.server: federation state anti...ynced
Dec 23 14:46:59 server50 consul[6744]: agent.server: federation state anti-entropy synced
Hint: Some lines were ellipsized, use -l to show in full.

5、查看 Consul 集群状态

[root@server50 consul]# consul members
Node           Address            Status  Type    Build   Protocol  DC   Partition  Segment
consul-01      192.168.4.50:8301  alive   server  1.14.3  2         dc1  default    <all>
consul-02      192.168.4.51:8301  alive   server  1.14.3  2         dc1  default    <all>
consul-03      192.168.4.52:8301  alive   server  1.14.3  2         dc1  default    <all>
consul-client  192.168.4.53:8301  alive   client  1.14.3  2         dc1  default    <default>

查看server节点成员状态信息:

[root@server50 consul]# consul operator raft list-peers
Node       ID                                    Address            State     Voter  RaftProtocol
consul-02  a6f2e11f-4ddf-77e0-279e-15b59d182a9b  192.168.4.51:8300  leader    true   3
consul-03  b6806673-d7bd-12df-9ce2-4345a2cea931  192.168.4.52:8300  follower  true   3
consul-01  e30db7de-a4d2-737e-d832-6af6c43f18a4  192.168.4.50:8300  follower  true   3

访问Consul UI:http://192.168.4.50:8500/ui
image

6、停止Agent

在退出中,Consul提醒其他集群成员,这个节点离开了。如果强行杀掉进程,集群的其他成员应该能检测到这个节点失效了。 当一个成员离开,他的服务和检测也会从目录中移除。当一个成员失效了,他的健康状况被简单的标记为危险。但是不会从目录中移除,Consul会自动对失效的节点进行重连。允许他从某些网络条件下恢复过来,离开的节点则不再继续联系。
此外,如果一个agent作为一个服务器,一个优雅的离开是很重要的,可以避免潜在的可用性故障,影响达成一致性协议。

consul leave # consul优雅退出命令

FAQ

posted @ 2022-12-23 11:44  jluo123  阅读(713)  评论(0编辑  收藏  举报