Service-Consul基础
一、Consul基础
1.1、Consul介绍及特性
- Consul是一个服务网格(微服务间的 TCP/IP,负责服务之间的网络调用、限流、熔断和监控)解决方案,它是一个一个分布式的,高度可用的系统,而且开发使用都很简便。它提供了一个功能齐全的控制平面,主要特点是:服务发现、健康检查、键值存储、安全服务通信、多数据中心。
- 在生产部署中,您将Consul安装在要注册服务的每个节点上,但是在本指南中,您将在本地安装Consul,以便可以使用它来探索Consul的核心功能。Consul作为二进制软件包分发。
- 特性
- 服务发现 Consul的客户端可用提供一个服务,比如 api 或者mysql ,另外一些客户端可用使用Consul去发现一个指定服务的提供者.通过DNS或者HTTP应用程序可用很容易的找到他所依赖的服务.
- 健康检查 Consul客户端可用提供任意数量的健康检查,指定一个服务(比如:webserver是否返回了200 OK 状态码)或者使用本地节点(比如:内存使用是否大于90%). 这个信息可由operator用来监视集群的健康.被服务发现组件用来避免将流量发送到不健康的主机.
- Key/Value存储 应用程序可用根据自己的需要使用Consul的层级的Key/Value存储.比如动态配置,功能标记,协调,领袖选举等等,简单的HTTP API让他更易于使用.
- 多数据中心 Consul支持开箱即用的多数据中心.这意味着用户不需要担心需要建立额外的抽象层让业务扩展到多个区域,Consul面向DevOps和应用开发者友好.是他适合现代的弹性的基础设施.
1.2、服务器和客户端代理
- 服务器或客户端模式运行每个Consul代理。每个Consul数据中心必须至少有一个服务器,该服务器负责维护Consul的状态。这包括有关其他Consul服务器和客户端,可用于发现的服务以及允许哪些服务与哪些其他服务进行通信的信息。
- 为了确保即使服务器出现故障,Consul的状态也会保留,应该始终在生产中运行三到五台服务器。奇数数量的服务器(最多不超过五台)在性能和容错能力之间取得了平衡。可以在Consul的体系结构文档中了解有关这些要求的更多信息 。
- 非服务器代理以客户端模式运行。客户端是注册服务,运行状况检查并将查询转发到服务器的轻量级进程。客户端必须在Consul数据中心中运行服务的每个节点上运行,因为客户端是有关服务运行状况的真实来源。
二、Consul基础架构及安装
2.1、基础架构介绍
- Consul是一个分布式高可用的系统.
- 每个提供服务给Consul的阶段都运行了一个Consul agent . 发现服务或者设置和获取 key/value存储的数据不是必须运行agent.这个agent是负责对节点自身和节点上的服务进行健康检查的.
- Agent与一个和多个Consul Server 进行交互,Consul Server 用于存放和复制数据.server自行选举一个领袖,虽然Consul可以运行在一台server , 但是建议使用3到5台来避免失败情况下数据的丢失.每个数据中心建议配置一个server集。
- 你基础设施中需要发现其他服务的组件可以查询任何一个Consul 的server或者 agent.Agent会自动转发请求到server。
- 每个数据中运行了一个Consul server集群.当一个跨数据中心的服务发现和配置请求创建时.本地Consul Server转发请求到远程的数据中心并返回结果。
- Consul有两种方式搭建方式:一是bootstrap模式,二是
- 补充:
- consul是支持多数据中心的,并且多数据中心是一个非常common的用户场景。公司的项目中采用consul这是比较重要的一个考虑,之前的项目一直用的是zookeeper,实现多数据中心会有比较多的问题。
- Agent - 运行在consul集群的每个node上的daemon,agent可以run在server或者是client上,每个agent都可以提供DNS或者是HTTP的接口,负责health check和service发现等。用consul agent命令可以启动,具体可run "consul agent --help"查看参数。
- Client - client把所有的RPCs转发到server端,是相对无状态的。唯一在后台运行的时client端执行了LAN gossip pool,只消耗极少的资源和网络带宽。
- Server - server 负责维护cluster state, RPC quiries, 和其他数据中心交换WAN gossip,转发queries给leader或者其他数据中心。
- Datacenter -这里文档里面指的时网络环境是私有,低延迟,高带宽的,排除和公网的通信。其实我认为和vmware的概念有些类似,vmware的一台server下面的虚拟机也可以定义为一个datacenter,不同的server可以构成不同的datacenter,这里面还包含逻辑功能的划分。对于测试人员来说,单个人的测试环境可以作为一个datacenter。
- Serf:consul是基于Serf上实现的,Serf是一个服务发现,编配(应用集群管理等)工具,它去中心化,高可用并且能故障恢复(容忍), Serf使用Gossip协议,采用Go语言编写。Serf提供成员关系,纠错检查,广播的功能。gossip包含的任意node-to-node间的通信,主要是基于UDP。
- LAN Gossip - 指 LAN gossip pool 包含哪些都在同一局域网或者是datacenter的node。which contains nodes that are all located on the same local area network or datacenter.
- WAN Gossip - 指 WAN gossip pool 包含哪些都在同一局域网或者是datacenter的node。
- RPC - Remote Procedure Call. 客户端和服务器端的请求/应答机制
2.2、Consul下载及安装
local]# wget https://releases.hashicorp.com/consul/1.6.2/consul_1.6.2_linux_amd64.zip
local]# unzip consul_1.6.2_linux_amd64.zip
local]# ll /usr/local/consul
-rwxr-xr-x. 1 root root 108053286 Nov 14 05:31 /usr/local/consul
local]# vim /etc/profile
PATH=/usr/local:$PATH
local]# consul -v
Consul v1.6.2
Protocol 2 spoken by default, understands 2 to 3 (agent will automatically use protocol >2 when speaking to compatible agents)
- 完成Consul的安装后,必须运行agent. agent可以运行为server或client模式.每个数据中心至少必须拥有一台server . 建议在一个集群中有3或者5个server.部署单一的server,在出现失败时会不可避免的造成数据丢失。
- 其他的agent运行为client模式,一个client是一个非常轻量级的进程,用于注册服务,运行健康检查和转发对server的查询,agent必须在集群中的每个主机上运行。
2.3、 引导数据中心/引导服务器
-
引导数据中心理解:
-
代理可以在客户端或服务器模式下运行。服务器节点负责运行 共识协议并存储集群状态。客户端节点大多是无状态的,并且严重依赖于服务器节点。
-
在Consul群集可以开始为请求提供服务之前,必须将服务器节点选为领导者。引导是将这些初始服务器节点加入群集的过程。阅读 架构文档以了解有关Consul内部的更多信息。
-
建议每个数据中心总共有三到五个服务器。单台服务器部署非常气馁,因为数据丢失是在出现故障的情况在所难免。请参阅 部署表以获取更多详细信息。
-
-
引导服务器
- 引导服务器的推荐方法是使用-bootstrap-expect 配置选项。此选项通知Consul服务器节点的预期数量,并在有那么多服务器可用时自动引导。为避免出现不一致和脑裂(多个服务器将其视为领导者的集群)情况,您应该为-bootstrap-expect 所有服务器指定相同的值 或完全不指定任何值。只有指定值的服务器才会尝试引导群集
- 假设我们正在启动一个三服务器集群。我们可以启动Node A,Node B以及Node C各自提供的-bootstrap-expect 3标志。节点启动后,您应该在服务输出中看到警告消息。
- [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election. (该警告表明节点期望有2个对等节点,但尚不知道。在下面,您将学习如何连接服务器,以便可以当选领导者。
三、启动 Consul Service
3.1、bootstrap模式(运行consul agent以server模式)
options
-server : 定义agent运行在server模式
-bootstrap-expect :在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap共用。
-bind:该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-node:节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-ui-dir: 提供存放web ui资源的路径,该目录必须是可读的
-rejoin:使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中。
-config-dir:配置文件目录,里面所有以.json结尾的文件都会被加载
-client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
consul agent -server -bootstrap-expect 3 -data-dir /tmp/consul -node=s1 -bind=10.201.102.198 -ui-dir ./consul_ui/ -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0
nohup consul agent -server -bootstrap-expect=3 -data-dir=/root/consul-install/consul-data -node=consul-1 -client=0.0.0.0 -bind=192.168.0.129 -datacenter=dc1 > consul-1.log & 2>&1
nohup consul agent -server -bootstrap-expect=3 -data-dir=/root/consul-install/consul-data -node=consul-3 -client=0.0.0.0 -bind=192.168.0.131 -datacenter=dc1 -join 192.168.0.129 > consul-3.log & 2>&1
node1节点-agent以server模式运行
node1-20.18 并开启WEBUI
~]# nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=node1 -bind=192.168.20.18 -datacenter=zhxy1 -ui --client=0.0.0.0 &
报错信息:
agent: Coordinate update error: No cluster leader
原因在于当前的Datacenter没有 leader server
node2~3-节点-也以server模式运行并加入集群状态运行
node2-20.98
~]# nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=node2 -bind=192.168.20.98 -datacenter=zhxy1 & #目前,三个节点均不知道其他Server节点的存在,以node0为例
~]# consul join 192.168.20.18
Successfully joined cluster by contacting 1 nodes.
node3-20.209
~]# nohup consul agent -server -bootstrap-expect=3 -data-dir=/tmp/consul -node=node3 -bind=192.168.20.209 -datacenter=zhxy1 &
~]# consul join 192.168.20.18
Successfully joined cluster by contacting 1 nodes.
node1节点查看集权信息
~]# consul members
Node Address Status Type Build Protocol DC Segment
node1 192.168.20.18:8301 alive server 1.6.2 2 zhxy1 <all>
node2 192.168.20.98:8301 alive server 1.6.2 2 zhxy1 <all>
node3 192.168.20.209:8301 alive server 1.6.2 2 zhxy1 <all>
查看consul集群信息
~]# consul info
触发选举leader(在节点node0上添加node1和node2)
此时以服务身份运行的consul集群已经构建好,想添加一个客户端节点
~]# consul agent -data-dir=/tmp/consul -node=node4 -bind=本地IP -datacenter=zhxy1 &
~]# consul join 192.168.20.18
再次查看集群
~]# consul members
Node Address Status Type Build Protocol DC Segment
node1 192.168.20.18:8301 alive server 1.6.2 2 zhxy1 <all>
node2 192.168.20.98:8301 alive server 1.6.2 2 zhxy1 <all>
node3 192.168.20.209:8301 alive server 1.6.2 2 zhxy1 <all>
node4 192.168.20.233:8301 alive client 1.6.2 2 zhxy1 <default>
四、WEB管理界面
- Consul同时提供了一个漂亮的功能齐全的WEB界面,开箱即用.界面可以用来查看所有的节点,可以查看健康检查和他们的当前状态.可以读取和设置K/V 存储的数据.UI自动支持多数据中心.点击前往下载
- 下载完后上传至服务器,建议所有server角色都使用WebUI,。
- consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=s1 -bind=10.201.102.198 -ui-dir ./consul_ui/ -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0
- options
- -ui-dir: 提供存放web ui资源的路径,指向该目录必须是可读的
- -client:consul服务侦听地址,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1所以不对外提供服务,如果你要对外提供服务改成0.0.0.0
- options
- consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=s1 -bind=10.201.102.198 -ui-dir ./consul_ui/ -rejoin -config-dir=/etc/consul.d/ -client 0.0.0.0
五、参考博客:
https://www.cnblogs.com/java-zhao/archive/2016/04/13/5387105.html #server/client模式
https://blog.csdn.net/liuzhuchen/article/details/81913562 #server_all模式
https://www.cnblogs.com/lfzm/p/10633595.html #docker容器模式
https://www.jianshu.com/p/f1e335e7a89a
https://www.jianshu.com/p/ce7c7b9dcf14
向往的地方很远,喜欢的东西很贵,这就是我努力的目标。