热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

深入理解Consul注册中心机制

概述Consul作为注册中心,提供服务发现、配置、健康检查、安全服务通信以及多数据中心等功能,这些功能可以根据需要单独使用,也可以一起使

概述

Consul作为注册中心,提供服务发现、配置、健康检查、安全服务通信以及多数据中心等功能, 这些功能可以根据需要单独使用,也可以一起使用来构建完整的微服务系统。


Consul agent

Consul agent是Consul的核心进程。它是运行在Consul节点上,这些节点共同组成Consul集群。agent进程用于维护成员信息、注册服务、成员健康检查等功能,agent有如下两种模式运行:


  • 客户端模式(client)通过Client模式启动节点加入Consul集群中,这种模式启动的节点数量没有限制,而且它们可以轻松扩展到数千或数万。在同一个数据中心组成的集群中,所有节点参与gossip协议。通过使用gossip协议检测节点故障, 比单纯的心跳方案具有更大的可扩展性。它还为节点提供故障检测;如果agent不可达,则节点可能出现故障。Client节点缓存server节点的数据,用以提高性能和可用性。
  • 服务端模式(server)通过Server模式启动agent节点参与选举。在生产环境中3到5台服务器组成。这在故障情况下的可用性和性能之间取得了平衡,因为随着增加更多的服务器,一致性会逐渐变慢。集群中所有Server启动模式的agent节点参与Raft协议,共同选举出领导者。选举出领导者的节点负责查询数据以及数据同步到其它Server节点上

agent节点启动


  1. 从官网下载Consul压缩包。

  2. 解压启动。如下:

    [root@unite-test consul]# consul agent -data-dir=/tmp/consul -node=server184.43 -datacenter=unite-dc -server=true
    ==> Starting Consul agent...Version: 'v1.7.2'Node ID: '74124b5b-aedc-59c3-5e6c-436443f2c025'Node name: 'server184.43'Datacenter: 'unite-dc' (Segment: '')Server: true (Bootstrap: false)Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: -1, DNS: 8600)Cluster Addr: 172.27.185.43 (LAN: 8301, WAN: 8302)Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false==> Log data will now stream in as it occurs:2022-03-14T11:50:01.620+0800 [WARN] agent: Node name will not be discoverable via DNS due to invalid characters. Valid characters include all alpha-numerics and dashes.: node_name=server184.432022-03-14T11:50:01.625+0800 [INFO] agent.server.raft: initial configuration: index=0 servers=[]2022-03-14T11:50:01.625+0800 [INFO] agent.server.serf.wan: serf: EventMemberJoin: server184.43.unite-dc 172.27.185.432022-03-14T11:50:01.626+0800 [INFO] agent.server.serf.lan: serf: EventMemberJoin: server184.43 172.27.185.432022-03-14T11:50:01.627+0800 [INFO] agent: Started DNS server: address=127.0.0.1:8600 network=udp2022-03-14T11:50:01.627+0800 [INFO] agent.server.raft: entering follower state: follower="Node at 172.27.185.43:8300 [Follower]" leader=2022-03-14T11:50:01.628+0800 [INFO] agent.server.serf.wan: serf: Attempting re-join to previously known node: server29.6.dc1: 172.27.185.43:83022022-03-14T11:50:01.629+0800 [INFO] agent.server.serf.lan: serf: Attempting re-join to previously known node: server29.6: 172.27.185.43:83012022-03-14T11:50:01.629+0800 [INFO] agent.server: Adding LAN server: server="server184.43 (Addr: tcp/172.27.185.43:8300) (DC: unite-dc)"2022-03-14T11:50:01.629+0800 [INFO] agent.server: Handled event for server in area: event=member-join server=server184.43.unite-dc area=wan2022-03-14T11:50:01.630+0800 [INFO] agent: Started DNS server: address=127.0.0.1:8600 network=tcp2022-03-14T11:50:01.630+0800 [INFO] agent: Started HTTP server: address=127.0.0.1:8500 network=tcp2022-03-14T11:50:01.631+0800 [INFO] agent: started state syncer
    ==> Consul agent running!
    ....

通过consul agent命令启动成功后,通过日志输出有如下关键信息。如下:


  • Node name是节点名字,在集群中唯一的。启动时通过-node配置自定义设置节点名字
  • Datacenter是数据中心名字,通过-datacenter配置数据中心名字
  • Server是Consul agent运行(server还是client)模式,通过-server配置。

agent节点状态


alive状态

该节点状态处于正常状态。 当agent节点首次启动时,通过如下配置自动完成加入集群中。一旦节点加入集群后,该节点的信息会传递给整个集群,集群中所有的节点成员都会知道彼此的存在。如果该节点是Server模式运行的,其它Server节点会进行日志复制。

retry_join = ["172.26.4.38","172.26.4.125"]

failed状态

当出现网路故障或者agent进程关闭时,这些节点可能无法被其它节点访问,把这些节点标记为失败(failed)状态。 此时对failed状态的节点,Consul Server(领导者)节点会尝试重新连接该节点。可以看到leader节点日志输出如下:

# client29.118 has failed, no acks received
2021-11-24T16:10:06.279+0800 [INFO] agent.server.memberlist.lan: memberlist: Suspect client29.118 has failed, no acks received
2021-11-24T16:10:10.268+0800 [INFO] agent.server.serf.lan: serf: EventMemberFailed: client29.118 172.24.29.118
2021-11-24T16:10:10.269+0800 [INFO] agent.server: member failed, marking health critical: member=client29.118
2021-11-24T16:10:36.310+0800 [INFO] agent.server.serf.lan: serf: attempting reconnect to client29.118 172.24.29.118:8301
2021-11-24T16:12:06.314+0800 [INFO] agent.server.serf.lan: serf: attempting reconnect to client29.118 172.24.29.118:8301

从日志输出看出,当节点标记为故障状态,leader节点会默认每隔30s尝试重新进行连接。此时通过Consul命令查看节点状态,client29.118节点状态是failed状态。如下:

[root@unite-test consul]# consul members
Node Address Status Type Build Protocol DC Segment
server29.6 172.24.29.6:8301 alive server 1.7.2 2 test-leave-dc <all>
server29.9 172.24.29.9:8301 alive server 1.7.2 2 test-leave-dc <all>
service29.186 172.24.29.186:8301 alive server 1.7.2 2 test-leave-dc <all>
client29.118 172.24.29.118:8301 failed client 1.7.2 2 test-leave-dc <default>

注意:当网络恢复或者agent被重新启动&#xff0c;节点状态更新为正常&#xff08;alive&#xff09;状态。


left状态

对于failed状态的节点&#xff0c;默认72小时&#xff0c;Consul会完全的把它从集群中移除掉&#xff0c;此时的节点标记为离开&#xff08;left&#xff09;状态&#xff0c;和失败状态&#xff08;failed&#xff09;不同。left状态节点上注册所有服务会被删除&#xff0c;如果节点是server模式启动&#xff0c;停止对它的日志复制。该值由如下参数设置。

reconnect_timeout &#61; "1h" //可以用“s”、“m”、“h”表示秒、分钟或小时。该值必须为大于8小时。

注意建议将其值设置为节点或者网路分区的最大预期恢复中断的两倍。时间设置过低可能会导致节点故障或者网络分区期间&#xff0c;从Consul集群中删除节点&#xff0c;导致集群恢复复杂。对于failed状态的节点&#xff0c;可以在其它节点发送HTTP请求&#xff0c;强制把它从failed状态变成left状态&#xff0c;对left状态的节点&#xff0c;leader节点不会尝试重新连接。

curl http://172.24.29.186:8500/v1/agent/force-leave/client29.118

leader节点日志变化如下:

2021-11-24T16:27:13.767&#43;0800 [INFO] agent.server.serf.lan: serf: EventMemberLeave (forced): client29.118 172.24.29.118
2021-11-24T16:27:13.767&#43;0800 [INFO] agent.server: deregistering member: member&#61;client29.118 reason&#61;left

对于left状态节点&#xff0c;serf组件内有tombstone_timeout参数控制left状态的节点被收割需要时间。收割理解为节点是left状态&#xff0c;从成员中移除掉。默认24小时后&#xff0c;left状态的节点从成员中移除掉。

注意agent进程优雅的关闭&#xff0c;节点会从alive状态变为left状态。


Consul Architecture

下图表示是系统中多数据中心组成Consul集群架构图。每个数据中心都是局域网内Consul集群。如下图所示&#xff0c;有两个数据中心&#xff0c;分别是DATACENTER1DATACENTER2。不同的数据中心之间不会进行数据同步&#xff0c;但是可以通过RPC请求其它数据中心数据。 在DATACENTER1的数据中心&#xff0c;存在两种启动模式agent节点&#xff0c;分别是Server和Client。
在这里插入图片描述

从上图看出Consul需要多个不同的端口才能正常工作&#xff0c;其中一些端口使用TCP、UDP或者两种协议。主要端口详情如下&#xff1a;


  1. Server RPC&#xff08;TCP&#xff09;端口是8300。用于其它Client节点请求Server节点以及Server节点之间交互请求端口。
  2. HTTP&#xff08;TCP&#xff09;端口8500。用于客户端通过HTTP API通信端口。
  3. LAN Serf&#xff08; TCP and UDP &#xff09;端口8301。用于集群所有节点之间Gossip协议通信端口 。
  4. DNS&#xff08; TCP and UDP &#xff09;端口8600。用于解析DNS查询信息。

Raft协议在Consul应用

所有Consul Server节点参与Raft协议&#xff0c;共同组成Peer SetPeer set理解为参与日志复制所有成员的集合。所有Consul Client节点把请求转发给Consul Server节点。这种设计主要原因是&#xff0c;随着更多Consul节点成员的加入到Peer Set中。 quorum 的大小也会增加。quorum 理解为多数派。对于N个Consul Server节点成员&#xff0c;quorum要求至少有(N/2)&#43;1成员。例如&#xff0c;peer set有5个Server节点&#xff0c;就须要至少3个节点才能造成quorum。

注意: Raft协议理解共识&#xff08;Consensus&#xff09;协议。


启动选举

当Consul通过Server模式启动agent进程时&#xff0c;这种模式允许它们选举出领导者。通过查看Consul启动日志看出选举过程&#xff0c;如下通过三个Server节点组成Peer set参与选举。


  1. 引导模式启动&#xff0c;通过配置bootstrap_expect &#61; 3期望&#96;&#96;Peer set&#96;大小为3。

    [INFO] bootstrap_expect > 0: expecting 3 servers

  2. 在Raft协议初始化状态下&#xff0c;Server节点启动默认是跟随者&#xff08;follower&#xff09;状态。

    [INFO] agent.server.raft: initial configuration: index&#61;0 servers&#61;[]
    [INFO] agent.server.raft: entering follower state: follower&#61;"Node at 172.24.29.6:8300 [Follower]" leader&#61;

  3. 从 Consul启动完成后&#xff0c;使用配置retry_join &#61; ["172.26.4.38","172.26.4.125"]属性&#xff0c;通过self组件发现参与选举的节点数。当达到期望节点数后 最先超时的跟随者节点会增加自己的任期编号&#xff0c;并推举自己为候选人&#xff08;candidate&#xff09;&#xff0c;给自己投票&#xff0c;然后向其它节点发送请求投票 RPC 消息&#xff0c;请它们选举自己为领导者。

    [INFO] Consul agent running! Consul Agent
    [INFO] agent.server.raft: no known peers, aborting election #没有发现peer set&#xff0c;停止选举
    #发现预期Peer set数目&#xff0c;尝试引导
    [INFO] agent.server: Found expected number of peers, attempting bootstrap
    #最先超时的节点 增加自己的任期&#xff08;term&#xff09;编号&#xff0c;推举自己为候选人&#xff0c;给自己投票
    [INFO] agent.server.raft: heartbeat timeout reached, starting election: last-leader&#61;
    [INFO] agent.server.raft: entering candidate state: node&#61;"Node at 172.24.29.6:8300 [Candidate]" term&#61;2

  4. 获取票数最多的节点&#xff0c;它就会成为本届任期内新的领导者。如果节点当选领导者后&#xff0c;它将周期性地发送心跳消息&#xff0c;通知其它跟随者节点不再发起选举。

    [INFO] agent.server.raft: election won: tally&#61;2
    [INFO] agent.server.raft: entering leader state: leader&#61;"Node at 172.24.29.6:8300 [Leader]"

  5. 开始日志复制

    #已经添加Peer set中&#xff0c;开始日志复制&#xff0c;peer指向其它节点id
    [INFO] agent.server.raft: added peer, starting replication: peer&#61;e6a8a239-1c5a-3a17-20ab-176fc8c5056e
    [INFO] agent.server.raft: added peer, starting replication: peer&#61;b4b9fee5-54d9-0455-2cf0-dc647a3af745l

当一个RPC请求到达非Leader Server节点&#xff0c;请求就会被转发到Leader节点。请求分为两种类型&#xff1a;


  • 查询&#xff08;query&#xff09;类型&#xff0c;这意味着它是只读的&#xff0c;Leader会基于FSM状态机生成相应的结果&#xff1b;
  • 操作&#xff08;transaction&#xff09;类型&#xff0c;即修改状态&#xff0c;Leader节点产生一个新的日志条目&#xff0c;并基于Raft算法进行管理。一旦日志条目应用于 FSM&#xff0c;FSM可以理解为有限状态机&#xff0c;有限个状态以及在这些状态之间的转移和动做等行为的数学模型。新日志的应用&#xff0c;FSM会发生状态转换&#xff0c;相同的日志序列的应用必须致使相同的状态。

每一个数据中心选择独立的Leader和维护Peer set。数据按照数据中心进行划分&#xff0c;因此每一个Leader只负责在相应数据中心的数据。


一致性(Consistency)模式

虽然全部日志副本的写入都是基于Raft&#xff0c;读取更灵活。但为了支持开发人员可能须要的各类权衡&#xff0c;Consul支持3种不一样的一致性模式。

​ 三种读模式是&#xff1a;


  • default&#xff1a;客户端访问领导者节点执行读操作&#xff0c;领导者确认自己处于稳定状态时&#xff08;在 leader leasing 时间内&#xff09;&#xff0c;返回本地数据给客户端&#xff0c;否则返回错误给客户端。在这种情况下&#xff0c;客户端是可能读到旧数据的&#xff0c;比如此时发生了网络分区错误&#xff0c;新领导者已经更新过数据&#xff0c;但因为网络故障&#xff0c;旧领导者未更新数据也未退位&#xff0c;仍处于稳定状态。
  • consistent&#xff1a;客户端访问领导者节点执行读操作&#xff0c;领导者在和大多数节点确认自己仍是领导者之后返回本地数据给客户端&#xff0c;否则返回错误给客户端。在这种情况下&#xff0c;客户端读到的都是最新数据。
  • stale&#xff1a;从任意节点读数据&#xff0c;不局限于领导者节点&#xff0c;客户端可能会读到旧数据

Gossip协议在Consul应用

Consul使用Gossip协议管理成员并向集群广播消息&#xff0c;Gossip协议是通过使用Serf库提供的。Serf是一个用于集群节点成员&#xff08;membership&#xff09;发现、故障检测&#xff08;failure detection&#xff09;和编排的工具组件。它是分散的、容错的和高可用性的。非常轻量级运行在内存中脚本中&#xff0c;使用UDP消息进行通信&#xff0c;它使用gossip协议。Consu屏蔽Serf的抽象提供这些特性。Consul使用两个不同的Gossip Pool&#xff0c;如下&#xff1a;


  1. LAN Gossip Pool
  2. WAN Gossip Pool

在Consul中&#xff0c;每个数据中心都有一个LAN Gossip Pool&#xff0c;这里面包含这个数据中心的所有成员节点。主要作用如下:


  1. 成员信息允许客户端自动发现服务器&#xff0c;减少所需的配置。
  2. 分布式故障检测工作由整个集群节点共同分担&#xff0c;而不是集中在Consul Server节点上。
  3. Gossip Pool具有可靠和快速的事件广播。

在多数据中心组成服务中&#xff0c;WAN Gossip Pool是唯一的。不同数据中心下的所有节点都参与 WAN Pool, 该池允许服务器执行跨数据中心请求。


推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 云原生应用最佳开发实践之十二原则(12factor)
    目录简介一、基准代码二、依赖三、配置四、后端配置五、构建、发布、运行六、进程七、端口绑定八、并发九、易处理十、开发与线上环境等价十一、日志十二、进程管理当 ... [详细]
  • k8s+springboot+Eureka如何平滑上下线服务
    k8s+springboot+Eureka如何平滑上下线服务目录服务平滑上下线-k8s版本目录“上篇介绍了springboot+Euraka服务平滑上下线的方式,有部分小伙伴反馈k ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 本文介绍了Redis中RDB文件和AOF文件的保存和还原机制。RDB文件用于保存和还原Redis服务器所有数据库中的键值对数据,SAVE命令和BGSAVE命令分别用于阻塞服务器和由子进程执行保存操作。同时执行SAVE命令和BGSAVE命令,以及同时执行两个BGSAVE命令都会产生竞争条件。服务器会保存所有用save选项设置的保存条件,当满足任意一个保存条件时,服务器会自动执行BGSAVE命令。此外,还介绍了RDB文件和AOF文件在操作方面的冲突以及同时执行大量磁盘写入操作的不良影响。 ... [详细]
  • 网卡工作原理及网络知识分享
    本文介绍了网卡的工作原理,包括CSMA/CD、ARP欺骗等网络知识。网卡是负责整台计算机的网络通信,没有它,计算机将成为信息孤岛。文章通过一个对话的形式,生动形象地讲述了网卡的工作原理,并介绍了集线器Hub时代的网络构成。对于想学习网络知识的读者来说,本文是一篇不错的参考资料。 ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Composer依赖管理的重要性及使用方法。对于现代语言而言,包管理器是标配,而Composer作为PHP的包管理器,解决了PEAR的问题,并且使用简单,方便提交自己的包。文章还提到了使用Composer能够避免各种include的问题,避免命名空间冲突,并且能够方便地安装升级扩展包。 ... [详细]
  • zuul 路由不生效_Zuul网关到底有何牛逼之处?竟然这么多人在用~
    作者:kosamino来源:cnblogs.comjing99p11696192.html哈喽,各位新来的小伙伴们,大家好& ... [详细]
author-avatar
破晓晨曦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有