杨谕黔,FreeWheel基础架构部高级软件工程师。 目前主要从事服务化框架、容器化平台相关的研发与推广。关注和感兴趣的技术主要有Golang, Docker, Kubernetes等。
serf是出自Hashicorp的开源项目, 实现了去中心化的gossip(八卦)协议,其中gossip协议定义了一种类似病毒感染的消息传播过程。 一些著名的开源项目,如Docker和Consul,网络管理和服务发现的核心组件是基于serf实现的,然而它们背后的serf似乎还鲜为人知,一方面其复杂的理论以及不完善的文档让人望而却步;另一方面,gossip协议天然的数据弱一致性也制约了serf的使用场景。
本文希望从serf背后的分布式系统理论和部分源码实现出发,为项目中serf的使用带来一些启发,分为四个部分:
· serf初体验
· serf背后的分布式系统理论
· serf部分源码分析
· serf集群参数与调优
SERF初体验
serf提供了一种轻量级的方式来管理去中心化集群,并基于这个集群提供了UserEvent和Query等接口,处理一些用户层的事件,如服务发现、自动化部署等。本节通过具体的例子,介绍serf中的一些基本特性。
集群管理
基于serf搭建去中心化集群非常简单:在每个节点上启动serf agent,然后通过每个agent上的rpc接口(或使用serf命令行工具),就可以让agent快速建立连接并形成集群。
图1.1.1 启动独立的serf agent
图1.1.1 中启动了三个独立的serf agent,配置分别为:
Node |
Bind Address |
RPC Address |
node1 |
127.0.0.1:5001 |
127.0.0.1:7473 |
node2 |
127.0.0.1:5002 |
127.0.0.1:7474 |
node3 |
127.0.0.1:5003 |
127.0.0.1:7475 |
顺便提一下,agent启动时需要指定两个address,bind address和rpc address,分别提供集群间的通信接口和客户端操作集群的接口,serf默认采用UDP来广播gossip