serf初体验

serf是出自Hashicorp的开源项目, 实现了去中心化的gossip(八卦)协议,其中gossip协议定义了一种类似病毒感染的消息传播过程。 一些著名的开源项目,如Docker和Consul,网络管理和服务发现的核心组件是基于serf实现的。

serf提供了一种轻量级的方式来管理去中心化集群,并基于这个集群提供了UserEvent和Query等接口,处理一些用户层的事件,如服务发现、自动化部署等。

开始serf初体验旅程:

一、在不同的terminal上启动serf agent节点
serf agent -node=node1 -bind=127.0.0.1:5001 -rpc-addr=127.0.0.1:7473
serf agent -node=node2 -bind=127.0.0.1:5002 -rpc-addr=127.0.0.1:7474
serf agent -node=node3 -bind=127.0.0.1:5003 -rpc-addr=127.0.0.1:7475

agent启动时需要指定两个address,bind address和rpc address,分别提供集群间的通信接口和客户端操作集群的接口,serf默认采用UDP来广播gossip消息,因此在实际网络中部署时,需要为Bind Address配置相应的防火墙规则。

重点:

  • bind address: 集群间通信的接口;
  • rpc address: 客户端控制agent的接口。
二、节点之间建立连接,形成去中性化集群。
  • node2 join node1
  • node1 join node3
  • serf join node2-rpc-addr node1-bind-addr
  • serf join node1-rpc-addr node3-bind-addr
serf join -rpc-addr=127.0.0.1:7474 127.0.0.1:5001
serf join -rpc-addr=127.0.0.1:7473 127.0.0.1:5003
三、UserEvent和Query

UserEvent和Query是serf基于去中心化集群提供的高效消息封装。UserEvent是一些单向的不需要集群反馈的消息,而Query是双向的,需要集群给出反馈(QueryResponse)的消息。向集群发送消息可以针对任意节点进行,然后节点间可以互相传播这些消息。

Node Tag Event Handler Query Handler
node1 role=apiserver echo node1 >> node1.log echo hello,node1
node2 role=ui echo node2 >> node2.log echo hello,node2
node3 role=apiserver echo node3 >> node3.log echo hello,node3
为node1,2,3指定不同的Event Handler,并建立节点之间的连接形成集群(node连接参考上述命令)

其中user是UserEvent的name;greet是Query的name。

serf agent -node=node1 -bind=127.0.0.1:5001 -rpc-addr=127.0.0.1:7473 -event-handler=user:log='echo node1 >> node1.log' -event-handler=query:greet='echo hello,node1' -tag role=apiserver

serf agent -node=node2 -bind=127.0.0.1:5002 -rpc-addr=127.0.0.1:7474 -event-handler=user:log='echo node2 >> node2.log' -event-handler=query:greet='echo hello,node2' -tag role=ui

serf agent -node=node3 -bind=127.0.0.1:5003 -rpc-addr=127.0.0.1:7475 -event-handler=user:log='echo node3 >> node3.log' -event-handler=query:greet='echo hello,node3' -tag role=apiserver

以node3为例,结果如下图:


serf初体验_第1张图片
serf.png
发送一个log Event,所有节点都会处理该Event,向对应的日志文件中写入一段文本

serf event (-rpc-addr=*) (UserEvent-name) payload

serf event -rpc-addr=127.0.0.1:7473 log payload
向role=ui的节点发送一个Query,agent处理完消息之后将结果传回客户端

serf event (-rpc-addr=*) (----) (Query-name) payload

serf query -rpc-addr=127.0.0.1:7473 -tag role=ui greet payload

为了保证一般性,这里选择向集群中的node1发送该Query,但通过-tag设置Query实际的处理节点是node2,最终可见返回的结果和日志中只有node2处理了该信息。说明节点之间是可以相互通信的。若不带tag参数,这里所有的节点都将执行greet,并对query进行信息返回。

结果如下图所示:


serf初体验_第2张图片
greet.png

你可能感兴趣的:(serf初体验)