consul 服务注册中心

consul registry service

Posted by alovn on March 10, 2019

服务发现

服务发现组件记录了分布式系统中所有的服务信息。可以通过服务发现找到这些服务。复杂系统的服务发现提供了更多的功能,例如:服务元数据存储、监控监控等。 服务发现是支撑大规模分布式系统的核心服务,它包含了以下一些关键特性:

  • 服务注册
  • 服务查找
  • 服务目录
  • 高可用

consul

consul 客户端不保存数据,客户端将接受到的请求转发给server端。每个server或 client都是一个 consul agent. consul 集群间使用了GOSSIP协议通信和 raft一致性算法。 consul 中涉及的一些术语:

  • Agent agent是一直运行在Consul集群中每个成员上的守护进程。通过运行 consul agent 来启动。agent可以运行在client或者server模式。指定节点作为client或者server是非常简单的,除非有其他agent实例。所有的agent都能运行DNS或者HTTP接口,并负责运行时检查和保持服务同步。
  • Client 一个Client是一个转发所有RPC到server的代理。这个client是相对无状态的。client唯一执行的后台活动是加入LAN gossip池。这有一个最低的资源开销并且仅消耗少量的网络带宽。
  • Server 一个server是一个有一组扩展功能的代理,这些功能包括参与Raft选举,维护集群状态,响应RPC查询,与其他数据中心交互WAN gossip和转发查询给leader或者远程数据中心。
  • DataCenter 数据中心

在每个数据中心,client和server是混合的。一般建议有3-5台server。这是基于有故障情况下的可用性和性能之间的权衡结果,因为越多的机器加入达成共识越慢。然而,并不限制client的数量,它们可以很容易的扩展到数千或者数万台。

常用命令

  • agent
    • 运行一个 consul agent
  • join
    • 将 agent 加入到 consul cluster
  • members
    • 列出consul cluster 集群中的 members

常用选项

  • -dev
    • 创建一个开发环境下的server节点。
    • 该参数下不会有任何可持久化操作。
    • 不能用于生产环境。
  • -data-dir
    • 指定数据存储目录。
  • -config-dir
    • 指定配置文件所在位置。
  • -config-file
    • 指定一个要装载的配置文件。
  • -bootstrap-expect
    • 该命令通知consul server我们现在准备加入的 server节点个数,该参数是为了延迟日志复制的启动直到我们指定数量的 server节点成功的加入后启动。
  • -node
    • 指定节点在集群中的名称
    • 该名称在集群中必须是唯一的。
  • -bind
    • 该地址用来在集群内部的通讯,集群内的所有节点到地址都必须是可达的,默认是0.0.0.0。consul将使用第一个有效的私有IPv4地址。如果指定“[::]”,consul将使用第一个有效的公共IPv6地址。
  • -server
    • 指定节点为 server。
    • 每个数据中心的 server 数推荐为3或5个
    • 所有 server 都采用raft一致性算法来确保事务的一致性和线性化,事务修改了集群的状态,且集群的状态保存在每一台server上保证可用性。
  • -client
    • consul绑定在哪个client地址上,这个地址提供HTTP、DNS、RPC等服务,默认是127.0.0.1,只允许回路连接。
  • -join
    • 将节点加入到集群。
  • -datacenter
    • 数据中心名称,默认是 dc1。
  • -ui
    • 启用 UI管理。默认访问地址为:http://localhost:8500/ui

开发环境

为了简单起见,我们现在将以开发模式启动Consul代理

1
consul agent -dev -ui -client 0.0.0.0

加入集群

1
2
3
4
consul join 192.168.1.100

//查看集群中的节点
consul members

DNS服务

除了DNS API之外,HTTP API还可以用来查询服务: http://localhost:8500/v1/catalog/service/consul

实验

一、 准备三台机器,可用虚拟机或 docker

1
2
3
server1: 172.16.10.11
server2: 172.16.10.12
server3: 172.16.10.13

二、 启动 consul agent

1
2
3
4
5
6
7
server1># ./consul agent -server -bootstrap-expect 3 -data-dir=./data -node=n1 -bind=172.16.10.11 -datacenter=dc1 -client=0.0.0.0 -ui

server2># ./consul agent -server -bootstrap-expect 3 -data-dir=./data -node=n2 -bind=172.16.10.12 -datacenter=dc1 -client=0.0.0.0 -ui
server2># ./consul join 172.16.10.11

server3># ./consul agent -server -bootstrap-expect 3 -data-dir=./data -node=n3 -bind=172.16.10.13 -datacenter=dc1 -client=0.0.0.0 -ui
server3># ./consul join 172.16.10.11

三、 查看是否主节点

现在整个consul server 集群就算完成了,可以利用consul members查看集群中包含的node信息。使用consul info命令可以查看当前节点状态,包括是否在集群中,是否为leader(主)。

1
2
3
./consul info | grep state
state = Leader //主
state = Follower //从

四、client 节点

如果要扩展节点可以增加 client 节点。假如现在增加了一台 172.16.10.14:

1
2
3
4
5
6
7
8
server4># ./consul agent -node=n4-client -data-dir=./data -datacenter=dc1 -client 0.0.0.0 -ui -join 172.16.10.11

server4># ./consul members
Node       Address            Status  Type    Build  Protocol  DC   Segment
n1         172.16.10.11:8301  alive   server  1.4.3  2         dc1  <all>
n2         172.16.10.12:8301  alive   server  1.4.3  2         dc1  <all>
n3         172.16.10.13:8301  alive   server  1.4.3  2         dc1  <all>
n4-client  172.16.10.14:8301  alive   client  1.4.3  2         dc1  <default>

现在可以看出新增的这个节点是 Type=client。

参考

官方入门指南

https://www.consul.io/docs/commands/index.html

https://www.consul.io/docs/agent/options.html