hashicorp/serf

GitHub: hashicorp/serf

Serf 是一个基于 gossip 协议的轻量级去中心化服务发现与编排工具,解决分布式集群中的成员管理、故障检测和事件传播问题。

Stars: 6067 | Forks: 606

# Serf [![Build Status](https://static.pigsec.cn/wp-content/uploads/repos/cas/10/10c1084818f2e50307f497f810114bfeaa2ea3b134f514f045d90e315258b63f.svg)](https://github.com/hashicorp/serf/actions) [![Join the chat at https://gitter.im/hashicorp-serf/Lobby](https://badges.gitter.im/hashicorp-serf/Lobby.svg)](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, 分布式系统, 响应大小分析, 容错, 提示注入, 日志审计, 服务发现, 服务编排, 集群管理