Consul是一个复杂的系统,有许多不同的运动部件。为了帮助Consul的用户和开发人员形成其工作原理的心理模型,该页面记录了系统架构。 ###Consul概述### 在描述架构之前,我们提供术语表以帮助澄清正在讨论的内容: • 代理 - 代理是Consul集群的每个成员上长时间运行的守护程序。它是通过运行开始的consul agent。代理能够以客户端 或服务器模式运行。由于所有节点都必须运行代理,因此将节点称为客户端或服务器更简单,但代理还有其他实例。所有代理都可以运行DNS或HTTP接口,并负责运行检查并保持服务同步。 • 客户端 - 客户端是将所有RPC转发到服务器的代理。客户是相对无国籍的。客户端执行的唯一后台活动是参与LAN八卦池。这具有最小的资源开销并且仅消耗少量的网络带宽。 • 服务器 - 服务器是一套扩展的职责包括参与筏仲裁,维护群集状态,响应RPC查询,与其他数据中心WAN交换八卦,并转发查询领导人或远程数据中心的代理人。 • 数据中心 - 虽然数据中心的定义似乎很明显,但必须考虑细微的细节。例如,在EC2中,多个可用区域是否被视为包含单个数据中心?我们将数据中心定义为专用,低延迟和高带宽的网络环境。这排除了通过公共互联网的通信,但出于我们的目的,单个EC2区域内的多个可用区域将被视为单个数据中心的一部分。 • 共识 - 在我们的文档中使用时,我们使用共识来表示对当选领导者的协议以及对交易顺序的协议。由于这些事务应用于 有限状态机,因此我们对共识的定义意味着复制状态机的一致性。维基百科上更详细地描述了共识,此处描述了我们的实现。 • Gossip - Consul建立在Serf之上,它提供了一个完整的 八卦协议,用于多种用途。Serf提供会员资格,故障检测和事件广播。我们对这些的使用在八卦文档中有更多描述。足以知道八卦涉及随机节点到节点的通信,主要是通过UDP。 • LAN Gossip - 指局域网八卦池,其中包含位于同一局域网或数据中心的节点。 • WAN Gossip - 指仅包含服务器的WAN八卦池。这些服务器主要位于不同的数据中心,通常通过互联网或广域网进行通信。 • RPC - 远程过程调用。这是一种允许客户端发出服务器请求的请求/响应机制。 ![输入图片说明](http://imgs.itopers.com/consul-arch-420ce04a.png "在这里输入图片标题") 让我们分解这个图像并描述每一块。 首先,我们可以看到有两个数据中心,标记为“一个”和“两个”。Consul为多个数据中心提供一流的支持,并期望这是常见的情况。 在每个数据中心内,我们都有客户端和服务器的混合体。预计有三到五台服务器。这在失败和性能的可用性之间取得平衡,因为随着更多机器的添加,共识逐渐变慢。但是,客户端数量没有限制,可以轻松扩展到数千或数万。 数据中心中的所有节点都参与八卦协议。这意味着有一个八卦池,其中包含给定数据中心的所有节点。这有几个目的: 首先,不需要为客户端配置服务器的地址; 发现是自动完成的。 其次,检测节点故障的工作不是放在服务器上,而是分布式的。这使得故障检测比天真的心跳方案更具可扩展性。 第三,它被用作消息传递层,用于在诸如领导者选举等重要事件发生时进行通知。 每个数据中心中的服务器都是单个Raft对等集的一部分。这意味着他们共同选举一个领导者,一个具有额外职责的选定服务器。领导者负责处理所有查询和交易。作为[共识协议](https://www.consul.io/docs/internals/consensus.html)的一部分,还必须将事务复制到所有对等体。由于此要求,当非领导者服务器收到RPC请求时,它会将其转发给群集负责人。 服务器节点也作为WAN八卦池的一部分运行。此池与LAN池不同,因为它针对较高的Internet延迟进行了优化,并且预计仅包含其他Consul服务器节点。此池的目的是允许数据中心以低触摸方式发现彼此。在线创建新的数据中心就像加入现有的WAN八卦池一样简单。由于服务器都在此池中运行,因此它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心的随机服务器。然后该服务器可以转发给本地领导者。 这导致数据中心之间的耦合非常低,但由于故障检测,连接缓存和多路复用,跨数据中心请求相对快速且可靠。 通常,不会在不同的Consul数据中心之间复制数据。当对另一个数据中心中的资源发出请求时,本地Consul服务器会将RPC请求转发给该资源的远程Consul服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用Consul的内置 ACL复制功能,或者像consul-replicate这样的外部工具。 在某些地方,客户端代理可以缓存来自服务器的数据,以使其在本地可用,以提高性能和可靠性。示例包括连接证书和意图,允许客户端代理在没有往返服务器的情况下做出有关入站连接请求的本地决策。某些API端点还支持可选的结果缓存。这有助于提高可靠性,因为本地代理可以继续响应某些查询,例如服务发现或从缓存连接授权,即使与服务器的连接中断或服务器暂时不可用也是如此。 让我们分解这个图像并描述每一块。首先,我们可以看到有两个数据中心,标记为“一个”和“两个”。Consul为多个数据中心提供一流的支持,并期望这是常见的情况。 在每个数据中心内,我们都有客户端和服务器的混合体。预计有三到五台服务器。这在失败和性能的可用性之间取得平衡,因为随着更多机器的添加,共识逐渐变慢。但是,客户端数量没有限制,可以轻松扩展到数千或数万。 数据中心中的所有节点都参与八卦协议。这意味着有一个八卦池,其中包含给定数据中心的所有节点。这有几个目的:首先,不需要为客户端配置服务器的地址; 发现是自动完成的。其次,检测节点故障的工作不是放在服务器上,而是分布式的。这使得故障检测比天真的心跳方案更具可扩展性。第三,它被用作消息传递层,用于在诸如领导者选举等重要事件发生时进行通知。 每个数据中心中的服务器都是单个Raft对等集的一部分。这意味着他们共同选举一个领导者,一个具有额外职责的选定服务器。领导者负责处理所有查询和交易。作为共识协议的一部分,还必须将事务复制到所有对等体。由于此要求,当非领导者服务器收到RPC请求时,它会将其转发给群集负责人。 服务器节点也作为WAN八卦池的一部分运行。此池与LAN池不同,因为它针对较高的Internet延迟进行了优化,并且预计仅包含其他Consul服务器节点。此池的目的是允许数据中心以低触摸方式发现彼此。在线创建新的数据中心就像加入现有的WAN八卦池一样简单。由于服务器都在此池中运行,因此它还支持跨数据中心请求。当服务器收到对不同数据中心的请求时,它会将其转发到正确数据中心的随机服务器。然后该服务器可以转发给本地领导者。 这导致数据中心之间的耦合非常低,但由于故障检测,连接缓存和多路复用,跨数据中心请求相对快速且可靠。 通常,不会在不同的Consul数据中心之间复制数据。当对另一个数据中心中的资源发出请求时,本地Consul服务器会将RPC请求转发给该资源的远程Consul服务器并返回结果。如果远程数据中心不可用,那么这些资源也将不可用,但这不会影响本地数据中心。在某些特殊情况下,可以复制有限的数据子集,例如使用Consul的内置[ACL复制](https://www.consul.io/docs/guides/acl.html#outages-and-acl-replication)功能,或者像[consul-replicate](https://github.com/hashicorp/consul-replicate)这样的外部工具。 在某些地方,客户端代理可以缓存来自服务器的数据,以使其在本地可用,以提高性能和可靠性。示例包括连接证书和意图,允许客户端代理在没有往返服务器的情况下做出有关入站连接请求的本地决策。某些API端点还支持可选的结果缓存。这有助于提高可靠性,因为本地代理可以继续响应某些查询,例如服务发现或从缓存连接授权,即使与服务器的连接中断或服务器暂时不可用也是如此。 ###»深入了解### 此时我们已经介绍了Consul的高级架构,但每个子系统还有更多细节。[一致性协议](https://www.consul.io/docs/internals/consensus.html)进行详细记录为是[gossip](https://www.consul.io/docs/internals/gossip.html)。 还提供了所使用的安全模型和协议的[文档](https://www.consul.io/docs/internals/security.html)。 有关其他详细信息,请查阅代码,在IRC中询问或联系邮件列表。 ###Consul部署### 一、下载 wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip 二、解压 Unzip consul_1.4.4_linux_amd64.zip && mv consul /usr/local/bin Cd /data && mkdir bin etc log data Server 1: consul agent -server -datacenter "cslg" -data-dir "/data/consul/data/" -config-dir "/data/consul/etc/" -dns-port "8600" -domain "test.com" -log-file "/data/consul/log/consul.log" -log-rotate-bytes "50000" -client=0.0.0.0 -node "consulserver01" -ui-dir "/data/consul/web/" 第一次请求加上-bootstrap引导集群启动 Server2: consul agent -server -datacenter "cslg" -data-dir "/data/consul/data/" -config-dir "/data/consul/etc/" -dns-port "8600" -domain "test.com" -log-file "/data/consul/log/consul.log" -log-rotate-bytes "50000" -client=0.0.0.0 -node "consulserver02" -retry-join "10.200.131.3" Server3: consul agent -server -datacenter "cslg" -data-dir "/data/consul/data/" -config-dir "/data/consul/etc/" -dns-port "8600" -domain "test.com" -log-file "/data/consul/log/consul.log" -log-rotate-bytes "50000" -client=0.0.0.0 -node "consulserver03" -retry-join "10.200.131.3" Agent: consul agent -datacenter "cslg" -data-dir "/data/consul/data/" -config-dir "/data/consul/etc/" -domain "test.com" -log-file "/data/consul/log/consul.log" -log-rotate-bytes "50000" -node "consulagent" -retry-join "10.200.131.3" ###简单使用### 显示所有成员 [root@cslg-10-200-131-6 ~]# consul members Node Address Status Type Build Protocol DC Segment consulserver01 10.200.131.3:8301 alive server 1.4.4 2 cslg <all> consulserver02 10.200.131.4:8301 alive server 1.4.4 2 cslg <all> consulserver03 10.200.131.5:8301 alive server 1.4.4 2 cslg <all> consulagent 10.200.131.6:8301 alive client 1.4.4 2 cslg <default> [root@cslg-10-200-131-6 ~]# dig consulagent.node.test.com ; <<>> DiG 9.9.4-RedHat-9.9.4-73.el7_6 <<>> consulagent.node.test.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14767 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 2 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;consulagent.node.test.com. IN A ;; ANSWER SECTION: consulagent.node.test.com. 0 IN A 10.200.131.6 ;; ADDITIONAL SECTION: consulagent.node.test.com. 0 IN TXT "consul-network-segment=" ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed May 22 11:32:56 CST 2019 ;; MSG SIZE rcvd: 106
文章最后更新时间: 2019年05月22日 09:08:17
分类文章统计
Python基础(10)
Django(5)
Flask(1)
Python常见错误(3)
Linux基础(6)
shell(11)
linux排障(4)
虚拟化(1)
Consul(3)
SequoiaDB(2)
TiDB(4)
Redis(2)
oracle(10)
MySQL(64)
ProxySQL(7)
常用软件(2)
硬件排障(2)
JavaScript(1)
HTML(1)
我们的作品(18)
windows(1)
总结(1)
按年文章统计
2013(43)
2014(19)
2015(25)
2016(6)
2017(30)
2018(7)
2019(17)
2020(4)
2021(4)
2023(1)
2024(3)
老版入口
亲,扫我吧!
友情链接
飞哥的:imbusy.me/
冰川的:www.mindg.cn
海洋的:hiaero.net
宏斌的:techindeep.com
若水的:nosa.me
段郎的:sixther.me
肥客联邦:fk68.net