作者:海木木 | 来源:互联网 | 2024-10-22 18:13
serf是出自Hashicorp的开源项目,实现了去中心化的gossip(八卦)协议,其中gossip协议定义了一种类似病毒感染的消息传播过程。一些著名的开源项目,如Docker和
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.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进行信息返回。
结果如下图所示:
greet.png