Consul 集群搭建
consul 集群搭建和遇到的问题解决
前言
最近公司项目需要用到consul 集群,根据网上信息踩了很多坑,将自己的操作进行分享。
一、consul
consul介绍
Consul是Go语言写的开源 的服务器发现软件,用于实现 分布式系统的服务发现与配置,包含 多个组件,作为一个整体,它为基础设施提供服务发现和服务配置的工具,提供以下关键特性:
- 服务发现:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册,consul采用Raft一致性协议算法来保证服务的高可用,使用GOSSIP协议管理成员和广播消息
- 健康检查:健康检测使consul可以快速的告警在集群中的操作,和服务发现的集成,可以防止服务转发到故障的服务上面(心跳机制)
- 键/值存储:一个用来存储动态配置的系统,提供简单的HTTP接口,可以在任何地方操作
- 多数据中心方案支持:无需复杂的配置,即可支持任意数量的区域
- 简易安装:安装包仅包含一个二进制文件,支持跨平台,可与Docker等轻量级容器实现无缝对接
- 提供Web管理界面:官方提供web管理界面
官方建议:最好是三台或者三台以上的consul在运行,同名服务最好是三台或三台以上,默认可以搭建集群
consul安装
下载地址: Install | Consul | HashiCorp Developer
以linux 服务器操作
将consul 压缩包解压到/usr/local/consul目录下,在该目录下新建data、config 文件夹和consul.log 日志文件
查询安装结果
[root@localhost ~]# cd /usr/local/consul/
[root@localhost ~]# ./consul -v
二、consul集群搭建
consul的角色
完成consul的安装后,必须运行 agent, agent可以运行为 server模式、 client模式或者 dev模式, 每个数据中心至少必须拥 有一台serve,建议在一个集群中有 3或者5个server,因为部署单一server,在出现失败时,也许会不可避免的出现数据丢失
-
client客户端角色: 将 HTTP 和 DNS 接口请求转发给局域网内的Server服务端集群
-
server服务端角色 :保存配置信息、实现高可用集群、在局域网内与本地客户端通讯、通过广域网与其他数据中心通讯等, 每个数据中心(集群)的 server 数量推荐为3个或是5个
-
开发模式:主要用于开发阶段(dev模式也是server模式)
consul安装好之后,在使用之前,先了解一下consul都有哪些命令,使用命令 consul -h可以查看consul支持的所有参数,而且每个参数里面还支持其他参数
consul的服务端和客户端
Consul 是 HashiCorp 公司推出的开源工具,用于实现 分布式系统的服务发现与配置,Consul 是 分布式的、 高可用的、 可横向扩展的,完成consul的安装后,必须运行 agent代理, agent可以运行为 server模式、 client模式
- 服务模式(server模式): 主要参与维护集群状态,响应RPC查询,与其他数据中心交换WAN gossip ,以及向上级或远程数据中心转发查询,并且会将数据持久化,推荐使用3到5台机器
- 客户模式(client模式):客户模式下ConsulAgent是一个非常轻量级的进程,它消耗最小的资源开销和少量的网络带宽,提供注册服务,运行健康检查,并将查询转发给服务器,客户端是相对无状态的,客户端执行的唯一后台活动是LANgossip池,不负责数据的持久化,客户模式不能单独存在,必须要有一个服务模式的Consul
- 数据中心:一个数据中心由多个Server和Client模式Consul组成,多个数据中心通过WAN通信,每个数据中心(数据中心是一个大型的计算机系统集群,通常由成千上万台计算机、存储设备、网络设备、电源设备、冷却设备等组成,以提供高效、可靠的计算和存储能力,主要功能是提供云计算、虚拟化、存储和数据处理等服务,以满足企业、政府机构和个人的计算和数据存储需求,是现代企业和政府机构不可或缺的基础设施之一)至少必须拥有一台server,建议在一个集群中有3或者5个server,部署单一server,在出现失败时,会不可避免的出现数据丢失
图片上 datacenter 分成上下两个部分, 但是这两个部分又不是完全隔离的,他们之间通过 WAN GOSSIP 进行报文交互,单个 datacenter 中,节点被划分成两种颜色, 红色的 server, 紫色的 client, 他们之间通过 GRPC 进行通信(业务数据), 除此之外, Client 和 Server 之间通过还有一条 LAN Gosssip 进行通信,比如,当 Server 节点增加,或者 down 机后,Client 可以获取对应的 Server列表,去除或者增加 Server 列表,同一个 Consul agent 程序,启动的时候,通过制定不同的参数来运行 Server 和 Client 模式,也就是说 client 和 server 本质上都是 Client Agent
一个client是一个非常 轻量级的进程,用于 注册服务,运行 健康检查和 转发对server的查询,每个数据中心 至少必须拥有一个server,agent必须在集群中的每个主机上运行,
注意:
server也可以用于注册服务,比如前面运行的 consul agent -dev ,但是正式上线后一般 通过client注册服务,使用保存配置信息、实现高可用集群、通过广域网与其他数据中心通讯等
Server功能
-
参与共识仲裁(raft)
- 存储机器状态(日志存储)
- 处理查询
- 维护周边(LAN/WAN) 节点之间的关系
Client功能
-
负责通过该节点注册到 Consul 微服务的健康检查
- 将客户端的注册请求和查询转换为 server 的 RPC 请求
- 维护周边各节点(LAN/WAN) 的关系
Client-Server 架构模式搭建
Server端:172.16.11.219、172.16.11.220、172.16.11.221
Client端:172.16.11.214、172.16.11.215
启动服务端
172.16.11.219执行
nohup ./consul agent -server -data-dir=/usr/local/consul/data -node=server1 -bind=172.16.11.219 -client=172.16.11.219 -advertise=172.16.11.219 -bootstrap-expect 3 -datacenter=datacenter1 -ui -enable-script-checks=true -config-dir=/usr/local/consul/config -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 > /usr/local/consul/consul.log 2>&1 &
172.16.11.220执行
修改data -node=server2、新增 -join=172.16.11.219:8301
nohup ./consul agent -server -data-dir=/usr/local/consul/data -node=server2 -bind=172.16.11.220 -client=172.16.11.220 -advertise=172.16.11.220 -join=172.16.11.219:8301 -bootstrap-expect 3 -datacenter=datacenter1 -ui -enable-script-checks=true -config-dir=/usr/local/consul/config -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 > /usr/local/consul/consul.log 2>&1 &
172.16.11.221执行
修改data -node=server3、新增 -join=172.16.11.219:8301
nohup ./consul agent -server -data-dir=/usr/local/consul/data -node=server3 -bind=172.16.11.221 -client=172.16.11.221 -advertise=172.16.11.221 -join=172.16.11.219:8301 -bootstrap-expect 3 -datacenter=datacenter1 -ui -enable-script-checks=true -config-dir=/usr/local/consul/config -server-port=8300 -serf-lan-port=8301 -serf-wan-port=8302 -http-port=8500 -dns-port=8600 > /usr/local/consul/consul.log 2>&1 &
可以在对应服务器/usr/local/consul 目录下 新增consul.sh 启动脚本 将以上命令写入 通过 ./consul.sh 启动consul
上面参数说明:
-server : 定义agent运行在 server模式,表示以Server模式启动,没有设置-server表示Client方式启动
-bootstrap-expect :在一个 datacenter(数据中心)中期望提供的server节点数目,当该值提供的时候, consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap,通俗来讲,就是 构成集群的最小数量共用(注意:bootstrap-expect值必须是server的数量)
-bind :集群通信的ip,该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0 ,表示所有ip
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui : 启动web界面 :8500,启动后台管理,默认 http://ip:8500访问
-rejoin :使consul启动的时候加入集群中。
-config-dir :配置文件目录,里面所有以.json结尾的文件都会被加载
-client :consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果要对外提供服务改成0.0.0.0, ,表示所有ip
data-dir :提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在,通俗来讲就是 数据存放目录额外参数
enable-script-checks=true: 允许使用脚本进行监控检查
advertise=IP: 告诉集群其他节点你通过这个ip来和我通信,默认使用bind绑定的ip
datacenter=dataCenterName: 数据中心名称
server-port=8300:选取Leader节点(raft协议通信)和提供RPC调用的
serf-lan-port=8301: 集群通信端口,用在LAN网
serf-wan-port=8302: 数据中心通信端口,用在WAN网
http-port=8500: 提供Http服务的端口
dns-port=8600: 提供Dns服务的端口
启动客户端
172.16.11.214执行
nohup ./consul agent -data-dir=/usr/local/consul/data -node=client-01 -bind=172.16.11.214 -client 0.0.0.0 -join=172.16.11.219:8301 -datacenter=datacenter1 -ui -config-dir=/usr/local/consul/config > /usr/local/consul/consul.log 2>&1 &
172.16.11.215执行
nohup ./consul agent -data-dir=/usr/local/consul/data -node=client-02 -bind=172.16.11.215 -client 0.0.0.0 -join=172.16.11.219:8301 -datacenter=datacenter1 -ui -config-dir=/usr/local/consul/config > /usr/local/consul/consul.log 2>&1 &
219 server1挂掉 server2为 leader
访问请求可以正常轮询
将219 server1启动,server1不会恢复为leader
注意:应用下线后 应用并不会立刻从consul上删除 consul在轮询过程中还是会找到下线的服务,导致操作失败。接到服务下线报警后,应该将应用从服务上删除。在服务器上执行该脚本
curl -s -XPUT http://ip:port/v1/agent/service/deregister/“applicationName”
或者用postman 发put请求
http://ip:port/v1/agent/service/deregister/“applicationName”
或者修改consul在应用上配置 如java的spring.cloud.consul 将critical-timeout 设置小一点 如30s
注意:client 端下线后 server端不会剔除client端
curl -X PUT http://127.0.0.1:8500/v1/agent/force-leave/client-02
或
http://127.0.0.1:8500/v1/agent/force-leave/client-02
总结
这是我在项目中搭建consul集群遇到的问题。还有很多问题没有得到很好的解决,列如:consul的某一client端下线后。该client端上所有的应用就会报“all nodes checks failing” 的问题并且应用都不可用 。server端不会不会将有问题的client 剔除。 希望大神不吝赐教!
这是我的发的第一篇文档 。遇到很多编写上的问题。还有很多不足的地方,希望自己能够坚持下去。加油!!!
感谢引用文档:[golang 微服务] 5. 微服务服务发现介绍,安装以及consul的使用,Consul集群_golang微服务-CSDN博客
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)