Centos7.9部署Consul
一、Consul介绍
1. 什么是Consul(服务发现)
Consul是HashiCorp公司推出的开源软件,提供了微服务系统中的服务治理、配置中心、控制总线等功能。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建全方位的服务网格,总之Consul提供了一种完整的服务网格解决方案。
微服务的框架体系中,服务发现是不能不提的一个模块。我相信了解或者熟悉微服务的童鞋应该都知道它的重要性。这里我只是简单的提一下,毕竟这不是我们的重点。我们看下面的一幅图片:
图中,客户端的一个接口,需要调用服务A-N。客户端必须要知道所有服务的网络位置的,以往的做法是配置是配置文件中,或者有些配置在数据库中。这里就带出几个问题:
- 需要配置N个服务的网络位置,加大配置的复杂性
- 服务的网络位置变化,都需要改变每个调用者的配置
- 集群的情况下,难以做负载(反向代理的方式除外)
总结起来一句话:服务多了,配置很麻烦,问题多多
既然有这些问题,那么服务发现就是解决这些问题的。话说,怎么解决呢?我们再看一张图:
与之前一张不同的是,加了个服务发现模块。图比较简单,这边文字描述下。服务A-N把当前自己的网络位置注册到服务发现模块(这里注册的意思就是告诉),服务发现就以K-V的方式记录下,K一般是服务名,V就是IP:PORT。服务发现模块定时的轮询查看这些服务能不能访问的了(这就是健康检查)。客户端在调用服务A-N的时候,就跑去服务发现模块问下它们的网络位置,然后再调用它们的服务。这样的方式是不是就可以解决上面的问题了呢?客户端完全不需要记录这些服务网络位置,客户端和服务端完全解耦!
这个过程大体是这样,当然服务发现模块没这么简单。里面包含的东西还很多。这样表述只是方便理解。
图中的服务发现模块基本上就是微服务架构中服务发现的作用了。
2.Consul 简介
做服务发现的框架常用的有
- zookeeper
- eureka
- etcd
- consul
那么consul是啥?consul就是提供服务发现的工具。然后下面是简单的介绍:
consul是分布式的、高可用、横向扩展的。consul提供的一些关键特性:
- service discovery:consul通过DNS或者HTTP接口使服务注册和服务发现变的很容易,一些外部服务,例如saas提供的也可以一样注册。
- health checking:健康检测使consul可以快速的告警在集群中的操作。和服务发现的集成,可以防止服务转发到故障的服务上面。
- key/value storage:一个用来存储动态配置的系统。提供简单的HTTP接口,可以在任何地方操作。
- multi-datacenter:无需复杂的配置,即可支持任意数量的区域。
我们这里会介绍服务发现,健康检查,还有一些基本KV存储。多数据中心有机会另一篇文章再说。
总结:只要知道它是解决我上一部分提出的问题就行,其它的东西慢慢理解
3.Consul的几个概念
上图是我从consul官方文档抠出来的。
我们只看数据中心1,可以看出consul的集群是由N个SERVER,加上M个CLIENT组成的。而不管是SERVER还是CLIENT,都是consul的一个节点,所有的服务都可以注册到这些节点上,正是通过这些节点实现服务注册信息的共享。除了这两个,还有一些小细节,一一简单介绍。
- Client
Client表示consul的client模式,就是客户端模式。是consul节点的一种模式,这种模式下,所有注册到当前节点的服务会被转发到SERVER,本身是不持久化这些信息。
- SERVER
SERVER表示consul的server模式,表明这个consul是个server,这种模式下,功能和CLIENT都一样,唯一不同的是,它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。
- SERVER-LEADER
中间那个SERVER下面有LEADER的字眼,表明这个SERVER是它们的老大,它和其它SERVER不一样的一点是,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。
- 其它信息
其它信息包括它们之间的通信方式,还有一些协议信息,算法。它们是用于保证节点之间的数据同步,实时性要求等等一系列集群问题的解决。这些有兴趣的自己看看官方文档。
4. Consul特性
- 服务发现(Service Discovery):Consul提供了通过DNS或者HTTP接口的方式来注册服务和发现服务。一些外部的服务通过Consul很容易的找到它所依赖的服务。
- 健康检查(Health Checking):Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联(“webserver是否返回200 OK”),也可以与本地节点相关联(“内存利用率是否低于90%”)。操作员可以使用这些信息来监视集群的健康状况,服务发现组件可以使用这些信息将流量从不健康的主机路由出去。
- Key/Value存储:应用程序可以根据自己的需要使用Consul提供的Key/Value存储。 Consul提供了简单易用的HTTP接口,结合其他工具可以实现动态配置、功能标记、领袖选举等等功能。
- 安全服务通信:Consul可以为服务生成和分发TLS证书,以建立相互的TLS连接。意图可用于定义允许哪些服务通信。服务分割可以很容易地进行管理,其目的是可以实时更改的,而不是使用复杂的网络拓扑和静态防火墙规则。
- 多数据中心:Consul支持开箱即用的多数据中心,这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域。
5. Consul使用场景
Consul的应用场景包括服务发现、服务隔离、服务配置:
- 服务发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。
- 服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密。
- 服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,通过工具consul-template可以更方便地实时渲染配置文件。
6.Consul架构图
- 代理(agent): 代理是Consul集群的每个成员上长时间运行的守护程序。它是通过运行consul agent 命令来启动的。代理能够以客户端或服务器模式运行。由于所有节点都必须运行代理,因此将节点称为客户端或服务器更简单,但代理还有其他实例。所有代理都可以运行DNS或HTTP接口,并负责运行检查并保持服务同步。
- 客户端模式(client agent):客户端是将所有RPC调用转发到服务器的代理。客户端是相对无状态的。客户端执行的唯一后台活动是参与LAN gossip pool(局域网 Gossip池)。这会花费非常非常小的资源并且仅消耗少量的网络带宽。
- 服务器模式(server agent):服务器是具有扩展责任的代理,包括参与Raft仲裁,维护群集状态,响应RPC查询,与其他数据中心交换WAN Gossip(广域网Gossip)以及将查询转发给领导者或远程数据中心。
- 数据中心 (datacenter):虽然数据中心的定义似乎很明显,但必须考虑细微的细节。例如,在EC2中,多个可用区域是否被视为包含单个数据中心?我们将数据中心定义为专用,低延迟和高带宽的网络环境。这排除了通过公共互联网的通信,但出于我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分。
- 共识 (consensus):在我们的文档中使用时,我们使用共识来表示对当选领导者的协议以及对交易顺序的协议。由于这些事务应用于有限状态机,因此我们对共识的定义意味着复制状态机的一致性。维基百科上更详细地描述了共识,此处描述了我们的实现。
- Gossip - Consul建立在Serf之上,它提供了一个完整的gossip 协议(八卦协议Gossip协议),用于多种用途。 Serf提供成员维护,故障检测和事件广播。我们对这些的使用在八卦文档中有更多描述。Gossip参与随机的节点到节点的通信,主要是通过UDP。
- LAN Gossip:指局域网八卦池,其中包含位于同一局域网或数据中心的节点。
- WAN Gossip:指仅包含服务器(servers)的WAN八卦池。这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。
- RPC:远程过程调用。这是一种允许客户端发出服务器请求的请求/响应机制。
架构图中有两个数据中心,标记为“1”和“2”。 在每个数据中心内,都有客户端和服务端的混合体。预计有三到五台服务端。这在失败和性能的可用性之间取得平衡,因为随着更多机器的添加,共识逐渐变慢。但是,客户端数量没有限制,可以轻松扩展到数千或数万。
数据中心中的所有节点都参与八卦协议。这意味着有一个八卦池,其中包含给定数据中心的所有节点。这有几个目的:首先,不需要为客户端配置服务器的地址;发现是自动完成的。其次,检测节点故障的工作不是放在服务器上,而是分布式的。这使得故障检测比天真的心跳方案更具可扩展性。第三,它被用作消息传递层,用于在诸如领导者选举等重要事件发生时进行通知。
每个数据中心中的服务器都是单个Raft对等集的一部分。这意味着他们共同选举一个leader,一个具有额外职责的选定服务器。领导者负责处理所有查询和交易。作为共识协议的一部分,还必须将事务复制到所有对等体。由于此要求,当非领导者服务器收到RPC请求时,它会将其转发给群集leader。
服务器节点作为WAN八卦池的一部分运行。此池与LAN池不同,因为它针对较高的Internet延迟进行了优化,并且预计仅包含其他Consul服务器节点。此池的目的是允许数据中心以低触摸方式(low-touch manner)发现彼此。在线创建新的数据中心就像加入现有的WAN八卦池一样简单。由于服务器都在此池中运行,因此它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心的随机服务器。然后该服务器可以转发给本地领导者。
这导致数据中心之间的耦合非常低,但由于故障检测,连接缓存和多路复用,跨数据中心请求相对快速且可靠。
通常,不会在不同的Consul数据中心之间复制数据。当对另一个数据中心中的资源发出请求时,本地Consul服务器会将RPC请求转发给该资源的远程Consul服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用Consul的内置ACL复制功能,或者像consul-replicate这样的外部工具。
在某些地方,客户端代理可以缓存来自服务器的数据,以使其在本地可用,以提高性能和可靠性。示例包括连接证书Connect certificates和意图intentions ,允许客户端代理在没有往返服务器的情况下做出有关入站连接请求的本地决策。某些API端点还支持可选的结果缓存。这有助于提高可靠性,因为本地代理可以继续响应某些查询,例如服务发现或从缓存连接授权,即使与服务器的连接中断或服务器暂时不可用。
7. Consul的优势
- Consul使用Raft算法来保证一致性,比复杂的Paxos算法更直接,相比较而言zookeeper采用的是Paxos,而etcd使用的则是Raft。
- Consul支持多数据中心,内外网的服务采用不同的端口进行监听,多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟、分片等情况等。zookeeper和etcd均不提供多数据中心功能的支持。
- Consul支持健康检查,etcd不提供此功能。
- Consul支持http和dns协议接口,zookeeper的集成较为复杂,etcd只支持http协议。
- Consul官方提供web管理界面,etcd无此功能。
二、consul安装及配置
系统 | 配置 | 内存 | IP | 角色 |
---|---|---|---|---|
Centos7 | 2c | 4 | 192.168.8.180 | Consul-Server |
Centos7 | 2c | 4 | 192.168.8.181 | Consul-Server-web |
Centos7 | 2c | 4 | 192.168.8.178 | Consul-client |
前提:所有节点,关闭防火墙和内核
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
1、下载consul二进制安装包
Consul官网---https://developer.hashicorp.com/consul/install
本文Consul安装包---百度网盘连接:
链接:https://pan.baidu.com/s/1pOhfpgh4lKFZdglK0E5sJw?pwd=y9ea
提取码:y9ea
wget https://releases.hashicorp.com/consul/1.18.0/consul_1.18.0_linux_amd64.zip
2、解压consul包
[root@localhost ~]# unzip consul_1.18.0_linux_amd64.zip
3、创建consul程序存放目录
[root@localhost ~]# mkdir -p /usr/local/soft/
[root@localhost ~]# cp consul /usr/local/soft
[root@localhost ~]# cd /usr/local/soft/
4、创建数据目录
[root@localhost soft]# mkdir -p /data/consul/data
5、启动consul
[root@localhost soft]# nohup /usr/local/soft/consul agent -server \
-bind=192.168.8.180 \
-client=0.0.0.0 \
-bootstrap-expect=2 \
-data-dir=/data/consul/data \
-node=server-2 >/dev/null 2>&1 &
#可以看到已经有consul进程了
[root@localhost soft]# ps -ef |grep consul
#查看端口
[root@localhost soft]# ss -lntp
可以看到consul已经在守护端口中,而且consul启用了多个端口
6、查看consul版本
[root@localhost soft]# /usr/local/soft/consul –version
7、查看consul集群成员数量
[root@localhost soft]# /usr/local/soft/consul members
只有一个机器,正常!
8、查看当前节点信息
[root@localhost soft]# /usr/local/soft/consul info
9、在第二台机器上(8.181)操作
[root@localhost ~]# mkdir -p /usr/local/soft/
[root@localhost ~]# mkdir -p /data/consul/data
# wget -P /usr/local/soft/ https://releases.hashicorp.com/consul/1.18.0/consul_1.18.0_linux_amd64.zip
[root@localhost ~]# cd /usr/local/soft/
[root@localhost soft]# nohup /usr/local/soft/consul agent -server \
-bind=192.168.8.84 \
-client=0.0.0.0 \
-bootstrap-expect=2 \
-data-dir=/data/consul/data \
-node=server-3 -ui >/dev/null 2>&1 &
-ui:允许web访问
# 如果是三台server,那就在启动第三台consul时加上-ui
[root@localhost soft]# /usr/local/soft/consul members
10、把当前节点加入到consul服务器的IP
[root@localhost soft]# /usr/local/soft/consul join 192.168.8.180
[root@localhost soft]# /usr/local/soft/consul members
11、访问
(1)、如果启动consul未添加-ui 那么该节点访问不了web页面,如下图:
若启动consul时加了-ui,即可访问web页面
12、配置client (192.168.8.178---client)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
[root@localhost ~]# wget https://releases.hashicorp.com/consul/1.18.0/consul_1.18.0_linux_amd64.zip
#解压consul包
[root@localhost ~]# unzip consul_1.18.0_linux_amd64.zip
#创建consul程序存放目录
[root@localhost ~]# mkdir -p /usr/local/soft/
[root@localhost ~]# cp consul /usr/local/soft
[root@localhost ~]# cd /usr/local/soft/
#创建数据目录
[root@localhost soft]# mkdir -p /data/consul/data
#启动Client
[root@localhost soft]# nohup /usr/local/soft/consul agent -bind=192.168.8.220 -client=0.0.0.0 -data-dir=/data/consul/data -node=client-1 >/dev/null 2>&1 &
-bind=192.168.8.178
-client=0.0.0.0
-data-dir=/data/consul/data
-node=client-1
\>/dev/null
2>&1
-bind=192.168.8.178 #本机IP
-client=0.0.0.0 #表示接受来自任何IP地址的连接
-data-dir=/data/consul/data #指定Consul代理存储数据的目录
-node=client-1 #指定Consul代理的节点名称为client-1 #可改名称
\>/dev/null #将命令的输出重定向到/dev/null,意味着命令的输出被丢弃,不会现实在终端上
2>&1 #将命令重定向到/dev/null,这样错误输出也会被丢弃
#列出集群中所有成员的信息
[root@localhost soft]# /usr/local/soft/consul members
#将当前consul节点加入到一个已经运行的consul集群中
[root@localhost soft]# /usr/local/soft/consul join 192.168.8.180
#Join 用于将节点加入到一个已经运行的 Consul 集群中
#再次列出成员信息
[root@localhost soft]# /usr/local/soft/consul members
13、访问web页面
Web页面是http://192.168.8.181:8500
可以看到client-1已经加入进来了
本文作者:谢墨尘
本文链接:https://www.cnblogs.com/xietingfeng321/p/18267728
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步