hashicorp/serf
GitHub: hashicorp/serf
Serf 是一个基于 gossip 协议的轻量级去中心化服务发现与编排工具,解决分布式集群中的成员管理、故障检测和事件传播问题。
Stars: 6067 | Forks: 606
# Serf [](https://github.com/hashicorp/serf/actions) [](https://gitter.im/hashicorp-serf/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
* 网站:https://github.com/hashicorp/serf
* 聊天:[Gitter](https://gitter.im/hashicorp-serf/Lobby)
* 邮件列表:[Google Groups](https://groups.google.com/group/serfdom/)
Serf 是一个去中心化的服务发现和编排解决方案,
它轻量级、高可用且容错。
Serf 可以在 Linux、Mac OS X 和 Windows 上运行。它使用高效且轻量级的 gossip
协议与其他节点进行通信。Serf 能够检测节点故障
并通知集群中的其他节点。Serf 之上构建了一个事件系统,
让你可以使用 Serf 的 gossip 协议来传播事件,例如
部署、配置变更等。Serf 是完全无中心的,
不存在单点故障。
以下是 Serf 的一些示例用例,当然还有很多其他用途:
* 发现 Web 服务器并自动将它们添加到负载均衡器
* 将许多 memcached 或 redis 节点组织成一个集群,也许可以通过
像 [twemproxy](https://github.com/twitter/twemproxy) 这样的工具,或者
也许只是为应用程序配置所有节点的地址
* 使用基于 Serf 构建的事件系统触发 Web 部署
* 将配置的更改传播到相关节点。
* 更新 DNS 记录以反映集群发生的变化。
* 以及更多、更多的用途。
## 快速开始
首先,为你的操作系统[下载预编译的 Serf 二进制文件](https://releases.hashicorp.com/serf),
或者[自己编译 Serf](#developing-serf),或者使用
`go get -u github.com/hashicorp/serf/cmd/serf` 进行安装。
接下来,让我们启动几个 Serf agent。Agent 在被通知退出之前会一直运行,
并处理 Serf 的维护任务通信。在真实的 Serf
设置中,你的系统中的每个节点都会运行一个或多个 Serf agent(如果你
运行多种集群类型,例如 Web 服务器与 memcached 服务器,则可以运行多个 agent)。
在不同的终端会话中分别启动每个 Serf agent,以便我们可以看到
每个 agent 的输出。启动第一个 agent:
```
$ serf agent -node=foo -bind=127.0.0.1:5000 -rpc-addr=127.0.0.1:7373
...
```
在另一个终端会话中(在第一个 agent 仍在运行时)启动第二个 agent:
```
$ serf agent -node=bar -bind=127.0.0.1:5001 -rpc-addr=127.0.0.1:7374
...
```
此时,两个 Serf agent 正在独立运行,但它们仍然
互不相识。现在让我们告诉第一个 agent 加入一个现有的
集群(即第二个 agent)。在启动 Serf agent 时,你必须通过指定至少一个现有成员来加入
一个现有的集群。此后,
Serf 会通过 gossip 传播,集群的其余部分就会知道此次加入。
在第三个终端会话中运行以下命令。
```
$ serf join 127.0.0.1:5001
...
```
如果你正在观察你的终端,你应该会看到两个 Serf agent
都察觉到了此次加入。你可以通过运行 `serf members`
来查看 Serf 集群的成员,以此证明这一点:
```
$ serf members
foo 127.0.0.1:5000 alive
bar 127.0.0.1:5001 alive
...
```
此时,你可以 ctrl-C 或强制杀死任何一个 Serf agent,它们会
相应地更新其成员列表。如果你对一个 Serf agent 发送 ctrl-C,
它会通知集群自己将要离开,从而优雅地退出。
如果你强制杀死了一个 agent,它最终(通常在几秒钟内)会被
集群中的另一个成员检测到,该成员随后会向集群
通报该节点的故障。
## 文档
完整、全面的文档可以在 Serf 网站上查看:
https://github.com/hashicorp/serf/tree/master/docs
## 开发 Serf
如果你想自己参与开发 Serf,你首先需要安装 [Go](https://golang.org)
(_必须_是稳定版本)。确保你已正确[安装](https://golang.org/doc/install)了 Go,
包括设置你的 [GOPATH](https://golang.org/doc/code.html#GOPATH)。
接下来,将此代码仓库克隆到 `$GOPATH/src/github.com/hashicorp/serf`,
然后只需输入 `make` 即可。稍等片刻,你就会得到一个可运行的 `serf` 可执行文件:
```
$ make
...
$ bin/serf
...
```
*注意:`make` 还会将该可执行文件的一个副本放置在 `$GOPATH/bin/` 下*
Serf 首先是一个带有命令行界面 (`serf`) 的代码库。Serf
代码库独立于命令行 agent (`serf`)。`serf`
二进制文件位于 `cmd/serf` 下,可以通过执行
`go get -u github.com/hashicorp/serf/cmd/serf` 命令进行独立安装。使用
Serf 库的应用程序应该只需要包含 `github.com/hashicorp/serf`。
可以通过输入 `make test` 来运行测试。
如果你对代码进行了任何更改,请运行 `make format` 以便根据 Go 的[标准](https://golang.org/doc/effective_go.html#formatting)自动
格式化代码。
## 指标发射与兼容性
该库可以使用 `github.com/armon/go-metrics` 或 `github.com/hashicorp/go-metrics` 来发射指标。在这两个库之间进行选择是通过 build tag 控制的。
**Build Tag**
* `armonmetrics` - 使用此 tag 将导致指标被路由到 `armon/go-metrics`
* `hashicorpmetrics` - 使用此 tag 将导致所有指标被路由到 `hashicorp/go-metrics`
如果未指定 build tag,默认行为是使用 `armon/go-metrics`。
**弃用 `armon/go-metrics`**
向 `armon/go-metrics` 发射指标已被正式弃用。`armon/go-metrics` 的使用将保持为默认行为直到 2025 年年中,而 opt-in 支持将持续到 2025 年底。
**迁移**
要将当前使用旧版 `armon/go-metrics` 的应用程序迁移为使用 `hashicorp/go-metrics`,应执行以下操作。
1. 升级使用 `armon/go-metrics` 的库,改为使用 `hashicorp/go-metrics/compat`。这应该只需要更改 import 语句。`hashicorp` 命名空间下的所有代码仓库
2. 将应用程序的库依赖项更新为已配置兼容层的版本。
3. 更新应用程序以使用 `hashicorp/go-metrics` 配置指标导出,而不是 `armon/go-metrics`
* 将应用程序中所有对 `github.com/armon/go-metrics` 的 import 替换为 `github.com/hashicorp/go-metrics`
* 改造你的构建系统,使其使用 `hashicorpmetrics` tag 进行构建。
最终,一旦默认行为在 2025 年年中更改为默认使用 `hashicorp/go-metrics`,你就可以移除 `hashicorpmetrics` build tag 了。
标签:EVTX分析, Gossip协议, Prisma Cloud, 分布式系统, 响应大小分析, 容错, 提示注入, 日志审计, 服务发现, 服务编排, 集群管理