微服务学习记录(一)—— Consul最小化集群搭建

2021-01-26T11:42:00

介绍

功能介绍

Consul一款服务发现和配置的工具。其使用Golang实现,天然具备可移植性,安装包仅有一个可执行文件,部署方便,可与docker等轻量级容器无缝配合。 它提供了几个关键功能:

  • 服务发现:Consul client 可以提供服务,例如api或mysql,也可以使用Consul client来发现指定服务的提供者。 使用DNS或HTTP,应用程序可以轻松找到他们所依赖的服务。
  • 健康检查:Consul client 可以提供任何数量的健康检查,或者与给定的服务(“Web服务器是否返回200 OK”),或与本地节点(“内存利用率是否低于90%”)相关联。 可以使用此信息来监控集群运行状况,服务发现组件使用此信息将流量从有问题的主机中移除出去。
  • KV Store:应用程序可以使用Consul的分层键/值存储,包括动态配置,功能标记,协调,leader选举等等。 简单的HTTP API使其易于使用。
  • 多数据中心:Consul支持多个数据中心。 这意味着Consul的用户不必担心构建额外的抽象层以扩展到多个区域。

竞品比较

功能Consulzookeeperetcdeuerka
Health Check服务状态,内存,硬盘等长连接,keepalive连接心跳可配支持
Data Center×××
KV Store×
一致性raftpaxosraft×
capcacpcpap
使用接口http,dns客户端http,grpchttp(didecar)
watch全量/支持long polling支持long polling支持long polling/大部分增量
自身监控metrics×metricsmetrics
安全acl/httpsaclhttps支持(弱)×

角色与架构

  1. Agent

    agent是一直运行在Consul集群中每个成员上的守护进程。通过运行 consul agent 来启动。agent可以运行在client或者server模式。指定节点作为client或者server是非常简单的,除非有其他agent实例。所有的agent都能运行DNS或者HTTP接口,并负责运行时检查和保持服务同步。

  2. Client
    表示consul的client模式,就是客户端模式。一个Client是一个转发所有RPC到server的代理。这个client是相对无状态的。client唯一执行的后台活动是加入LAN gossip池。这有一个最低的资源开销并且仅消耗少量的网络带宽。这种模式下,所有注册到当前节点的服务会被转发到SERVER,不持久化信息。
  3. Server

    表示consul的server模式,表明这个consul是个server。server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互WAN gossip和转发查询给leader或者远程数据中心。它会把所有的信息持久化的本地,这样遇到故障,信息是可以被保留的。

  4. SERVER-LEADER

    SERVER-LEADER是该DataCenter的Leader,它需要负责同步注册的信息给其它的SERVER,同时也要负责各个节点的健康监测。

  5. DataCenter

    虽然数据中心的定义是显而易见的,但是有一些细微的细节必须考虑。例如,在EC2中,多个可用区域被认为组成一个数据中心?我们定义数据中心为一个私有的,低延迟和高带宽的一个网络环境。这不包括访问公共网络,但是对于我们而言,同一个EC2中的多个可用区域可以被认为是一个数据中心的一部分。

  6. Raft

    Consul通过Raft来保证各节点的数据一致性。

  7. Consensus

    在我们的文档中,我们使用Consensus来表明就leader选举和事务的顺序达成一致。由于这些事务都被应用到有限状态机上,Consensus暗示复制状态机的一致性。

  8. Gossip

    Consul建立在Serf的基础之上,它提供了一个用于多播目的的完整的gossip协议。Serf提供成员关系,故障检测和事件广播。Consul使用gossip协议管理成员关系、广播消息到整个集群,他有两个gossip pool(LAN pool和WAN pool),LAN pool同一个数据中心内部通信的,WAN pool多个数据中心通信的,LAN pool有多个,WAN pool只有一个。

  9. LAN Gossip

    它包含所有位于同一个局域网或者数据中心的所有节点。

  10. WAN Gossip

    它只包含Server。这些server主要分布在不同的数据中心并且通常通过因特网或者广域网通信。
    
  11. RPC

    远程过程调用。这是一个允许client请求server的请求/响应机制。

  12. 服务注册

    Consul支持两种方式实现服务注册,一种是通过consul的服务注册http API,由服务自己调用API实现注册,另一种方式是通过json个是的配置文件实现注册,将需要注册的服务以json格式的配置文件给出。官方建议使用第二种方式。

  13. 服务发现

    consul支持两种方式实现服务发现,一种是通过http API来查询有哪些服务,另外一种是通过consul agent 自带的DNS(8600端口),域名是以NAME.service.consul的形式给出,NAME即在定义的服务配置文件中,服务的名称。DNS方式可以通过check的方式检查服务。

注意

  1. 每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。如果增加越多的机器,则Consensus会越来越慢。对client没有限制,可以很容易地扩展到成千上万或数万。
  2. 同一个数据中心的所有节点都要加入Gossip协议。这意味着gossip pool包含给定数据中心的所有节点。有以下目的:首先,没有必要为client配置服务器地址参数;发现是自动完成的。第二,节点故障检测的工作不是放置在服务器上,而是分布式的。这使故障检测比心跳机制更可扩展性。第三,可用来作为消息层通知重要的事件,如leader选举。
  3. 每个数据中心的服务器都是属于一个Raft peer。这意味着,他们一起工作,选出一个的Leader,Leader server是有额外的职责。负责处理所有的查询和事务。事务也必须通过Consensus协议复制到所有的伙伴。由于这一要求,当非Leader Server接收到一个RPC请求,会转发到集群的leader。
  4. Server节点也是作为WAN gossip pool的一部分。这个pool是与LAN gossip pool是不同的,它为具有更高延迟的网络响应做了优化,并且可能包括其他consul集群的server节点。设计WANpool的目的是让数据中心能够以low-touch的方式发现彼此。将一个新的数据中心加入现有的WAN Gossip是很容易的。因为池中的所有Server都是可控制的,这也使跨数据中心的要求。当一个Serfer接收到不同的数据中心的要求时,它把这个请求转发给相应数据中心的任一Server。然后,接收到请求的Server可能会转发给Leader。
  5. 多个数据中心之间是低耦合,但由于故障检测、连接缓存复用、跨数据中心要求快速和可靠的响应。

搭建

使用VirtualBox虚拟机

首先应该下载好你所使用的的系统镜像,我比较熟悉CentOS,因此我下载了CentOS 7。

新建虚拟机

在新建虚拟机这里,我需要偷个懒,因为各个节点的环境都是一致的,而VirtualBox有个复制功能,因此我新建了个模板虚拟机,配置好基础环境,以后需要的时候就可以直接复制一台出来了。

修改网卡模式

如上图所示,我选择了桥接模式,之所以是网卡3,是因为我之前分别用网卡1、网卡2尝试了NATHost-Only Adapter模式。

然后启动虚拟机,安装系统,配置好基础环境即可,如更换软件源系统更新安装必须软件等。

安装必须软件

yum install -y  wget  
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 
yum clean all 
yum makecache 
yum upgrade -y 
yum update -y 
yum install -y curl vim zip unzip yum-utils bash-completion screen net-tools

关闭防火墙

systemctl stop firewalld && systemctl disable firewalld

复制节点

我需要5个节点,因此复制出了5台虚拟机。

需要注意的是,复制时MAC地址设定请选择为所有网卡重新生成MAC地址

VirtualBox可使用无界面启动,启动后点击显示,打开虚拟机界面。

修改主机名

vim /ect/hostname // 修改主机名
reboot //修改成功后,重启生效

获取机器的Ip地址

// 需要安装 net-tools,需要使用ipconfig命令,如有,请略过
yum install -y net-tools

// 运行ipconfig,获取IP地址
ipconfig

安装screen

// 用于后台运行Consul,如有,请略过
yum install -y screen

安装Consul

// 在screen中使用Consul
screen

// 安装 Consul
wget https://releases.hashicorp.com/consul/1.3.0/consul_1.3.0_linux_amd64.zip && unzip consul_1.3.0_linux_amd64.zip

以上为每台机器都需要执行的共同操作。

分别运行Consul

./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-1 -client=0.0.0.0 -bind=192.168.3.189 -datacenter=dc1

./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-2 -client=0.0.0.0 -bind=192.168.3.190 -datacenter=dc1 -join 192.168.3.189

./consul agent -server -ui -bootstrap-expect=2 -data-dir=/tmp/consul -node=consul-3 -client=0.0.0.0 -bind=192.168.3.191 -datacenter=dc1 -join 192.168.3.189

./consul agent -bind 192.168.3.192 -client 192.168.3.194 -data-dir=/tmp/consul -node=Test.Client.DEV -join 192.168.3.189

./consul agent -bind 192.168.3.193 -client 192.168.3.196 -data-dir=/tmp/consul -node=Test.Client.PRD -join 192.168.3.189

Consul启动参数说明

启动参数说明
-advertise通知展现地址用来改变我们给集群中的其他节点展现的地址,一般情况下-bind地址就是展现地址
-bootstrap用来控制一个server是否在bootstrap模式,在一个datacenter中只能有一个server处于bootstrap模式,当一个server处于bootstrap模式时,可以自己选举为raft leader
-bootstrap-expect在一个datacenter中期望提供的server节点数目,当该值提供的时候,consul一直等到达到指定sever数目的时候才会引导整个集群,该标记不能和bootstrap公用
-bind该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0
-clientconsul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1
-config-file明确的指定要加载哪个配置文件
-config-dir配置文件目录,里面所有以.json结尾的文件都会被加载
-data-dir提供一个目录用来存放agent的状态,所有的agent允许都需要该目录,该目录必须是稳定的,系统重启后都继续存在
-dc该标记控制agent允许的datacenter的名称,默认是dc1
-encrypt指定secret key,使consul在通讯时进行加密,key可以通过consul keygen生成,同一个集群中的节点必须使用相同的key
-join加入一个已经启动的agent的ip地址,可以多次指定多个agent的地址。如果consul不能加入任何指定的地址中,则agent会启动失败,默认agent启动时不会加入任何节点。
-retry-join和join类似,但是允许你在第一次失败后进行尝试
-retry-interval两次join之间的时间间隔,默认是30s
-retry-max尝试重复join的次数,默认是0,也就是无限次尝试
-log-levelconsul agent启动后显示的日志信息级别。默认是info,可选:trace、debug、info、warn、err
-node节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名
-protocolconsul使用的协议版本
-rejoin使consul忽略先前的离开,在再次启动后仍旧尝试加入集群中
-server定义agent运行在server模式,每个集群至少有一个server,建议每个集群的server不要超过5个
-syslog开启系统日志功能,只在linux/osx上生效
-ui使用自带的ui
-ui-dir提供存放web ui资源的路径,该目录必须是可读的
-pid-file提供一个路径来存放pid文件,可以使用该文件进行SIGINT/SIGHUP(关闭/更新)agent

命令使用

查看所有Consul成员

./consul members
Node               Address             Status  Type    Build  Protocol  DC   Segment
consul-1           192.168.3.189:8301  alive   server  1.3.0  2         dc1  <all>
consul-2           192.168.3.190:8301  alive   server  1.3.0  2         dc1  <all>
consul-3           192.168.3.191:8301  alive   server  1.3.0  2         dc1  <all>
Test.Client.DEV    192.168.3.194:8301  alive   client  1.3.0  2         dc1  <default>
Test.Client.PRD    192.168.3.196:8301  alive   client  1.3.0  2         dc1  <default>

查看Consul成员类型

./consul operator raft list-peers
Node      ID                                    Address             State     Voter  RaftProtocol
consul-1  b686d2b3-70eb-e4a4-fe4e-71059e0b4eb7  192.168.3.189:8300  leader    true   3
consul-2  39a45ff0-b8c8-5b4c-ac54-8eb35f046a59  192.168.3.190:8300  follower  true   3
consul-3  8450e6b7-30f0-92c2-d273-ccb9589272b7  192.168.3.191:8300  follower  true   3

由上可知192.168.3.189是现有集群的leader,那当现有的leader宕机后,会有什么措施呢?那我们就把189重启下试试:

Node      ID                                    Address             State     Voter  RaftProtocol
consul-1  b686d2b3-70eb-e4a4-fe4e-71059e0b4eb7  192.168.3.189:8300  follower  true   3
consul-2  39a45ff0-b8c8-5b4c-ac54-8eb35f046a59  192.168.3.190:8300  follower  true   3
consul-3  8450e6b7-30f0-92c2-d273-ccb9589272b7  192.168.3.191:8300  leader    true   3

可以看到,leader已经变成了192.168.3.191

通过Web UI查看服务状态

访问任意一台 http://[server ip]:8500都可以查看。如 http://192.168.3.189:8500

退出Consul

// 假设client地址是 192.168.3.189
// 使用 leave 优雅的通知集群
./consul leave -http-addr=192.168.3.189:8500

如果使用screen,则可以Ctrl+C直接退出

参考

.NET Core微服务之路:基于Consul最少集群实现服务的注册与发现(一)

微服务之:从零搭建ocelot网关和consul集群

搭建consul 集群

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »