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