Consul集群部署
前言
1、简介
Consul是HashiCorp公司推出的开源软件,通过 GO 语言编写,提供服务注册和发现、配置、多数据中心的高可用方案等能力,分布式一致方面采用 raft 算法 实现,并且很容易和 Spring Cloud 等微服务框架集成,使用起来非常的简单,具有简单、易用、可插排等特点。简而言之,Consul 提供了一种完整的服务网格解决方案
下载地址:Downloads | Consul by HashiCorp
参数说明:Configuration | Consul by HashiCorp
Consul 运行的节点连接在一起,称为数据中心,一个数据中心将有 3 到 5 台服务器和许多客户端。Consul集群架构如下:
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
6、停止Agent
在退出中,Consul提醒其他集群成员,这个节点离开了。如果强行杀掉进程,集群的其他成员应该能检测到这个节点失效了。 当一个成员离开,他的服务和检测也会从目录中移除。当一个成员失效了,他的健康状况被简单的标记为危险。但是不会从目录中移除,Consul会自动对失效的节点进行重连。允许他从某些网络条件下恢复过来,离开的节点则不再继续联系。
此外,如果一个agent作为一个服务器,一个优雅的离开是很重要的,可以避免潜在的可用性故障,影响达成一致性协议。
consul leave # consul优雅退出命令