serf是出自Hashicorp的開源項目买雾, 實現(xiàn)了去中心化的gossip(八卦)協(xié)議掷酗,其中g(shù)ossip協(xié)議定義了一種類似病毒感染的消息傳播過程虽界。 一些著名的開源項目,如Docker和Consul鸿捧,網(wǎng)絡(luò)管理和服務(wù)發(fā)現(xiàn)的核心組件是基于serf實現(xiàn)的屹篓。
serf提供了一種輕量級的方式來管理去中心化集群,并基于這個集群提供了UserEvent和Query等接口匙奴,處理一些用戶層的事件堆巧,如服務(wù)發(fā)現(xiàn)、自動化部署等。
開始serf初體驗旅程:
一恳邀、在不同的terminal上啟動serf agent節(jié)點
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消息,因此在實際網(wǎng)絡(luò)中部署時笋颤,需要為Bind Address配置相應(yīng)的防火墻規(guī)則乳附。
重點:
- bind address: 集群間通信的接口;
- rpc address: 客戶端控制agent的接口伴澄。
二赋除、節(jié)點之間建立連接,形成去中性化集群非凌。
- 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)的消息。向集群發(fā)送消息可以針對任意節(jié)點進行喉悴,然后節(jié)點間可以互相傳播這些消息棱貌。
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,并建立節(jié)點之間的連接形成集群(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為例苦囱,結(jié)果如下圖:
發(fā)送一個log Event,所有節(jié)點都會處理該Event,向?qū)?yīng)的日志文件中寫入一段文本
serf event (-rpc-addr=*) (UserEvent-name) payload
serf event -rpc-addr=127.0.0.1:7473 log payload
向role=ui的節(jié)點發(fā)送一個Query昨寞,agent處理完消息之后將結(jié)果傳回客戶端
serf event (-rpc-addr=*) (----) (Query-name) payload
serf query -rpc-addr=127.0.0.1:7473 -tag role=ui greet payload
為了保證一般性,這里選擇向集群中的node1發(fā)送該Query公黑,但通過-tag設(shè)置Query實際的處理節(jié)點是node2拣凹,最終可見返回的結(jié)果和日志中只有node2處理了該信息。說明節(jié)點之間是可以相互通信的督函。若不帶tag參數(shù)嘀粱,這里所有的節(jié)點都將執(zhí)行g(shù)reet,并對query進行信息返回辰狡。
結(jié)果如下圖所示: