GitHub Freno:协作式高可用节流器服务

Hacker News Top 工具

摘要

Freno 是 GitHub 的一个开源协作式节流器服务,根据复制延迟限制对 MySQL 集群的写入,并使用 Raft 实现高可用性。

暂无内容
查看原文
查看缓存全文

缓存时间: 2026/07/07 17:13

github/freno

来源:https://github.com/github/freno

freno

构建状态 (https://github.com/github/freno/actions/workflows/main.yml) 下载 (https://github.com/github/freno/releases) 发布版本 (https://github.com/github/freno/releases)

协作式、高可用的节流服务:客户端使用 freno 来限制对资源的写入操作。

当前实现可基于 MySQL 集群的复制状态对其(多个)集群的写入进行节流。当复制延迟超过预设阈值时,freno 会限制协作客户端的写入。

freno 能动态适应服务器清单的变化;用户还可进一步控制它,强制对某些应用进行节流。

freno 具有高可用性,通过 raft 共识协议来确定领导权并在成员节点间传递用户事件。

协作式

freno 从后端存储(目前仅限 MySQL)收集数据,并具备判断“我能否向该后端存储写入?”的逻辑。

客户端(应用程序、脚本、任务)应咨询 frenofreno 并非客户端与后端存储之间的代理。它仅观察存储状态并声明“你可以写入”或“你应停止写入”。客户端需咨询 freno 并遵循其建议。

存储和应用

freno 按数据存储独立收集数据。例如,探测 MySQL 集群时,它会独立收集每个集群的复制延迟。后端存储指标自动采集,代表绝对事实。

freno 为标识为 app(应用)的客户端提供服务。由于是协作式,freno 信任应用自行标识身份。应用可被管理:freno 可被指示强制节流某个特定应用。这旨在让其他高优先级应用得以完成。freno 仅接收节流指令,本身不具备调度/优先级逻辑。

MySQL

freno 最初设计用于为 MySQL 节流提供统一、自适应的解决方案:在保持低复制延迟的同时控制写入。

freno 通过预定义的 MySQL 集群列表进行配置。该列表可包含凭据、延迟(或其他)检查查询以及预期阈值。对于每个集群,freno 需知道要探测和收集数据的服务器。每个集群可提供以下列表:

  • 静态的硬编码 hostname[:port] 列表。
  • 动态列表。主机可动态增减,节流也相应调整。支持的动态选项:
    • 通过 haproxy:向 freno 提供 haproxy URL 和后端/池名称,freno 将定期解析该池中已启用的服务器列表并动态适应探测。

阅读更多关于 freno 和 MySQL 节流

使用场景

freno 适用于批量操作:大规模加载/归档任务、schema 迁移、批量更新。此类操作通常遍历数千到数百万行,可能导致 MySQL 复制延迟等不良影响。通过将这些任务分解为小任务(例如每次 100 行),并在执行每个子任务前咨询 freno,我们能在不影响数据库及其应用的前提下达到相同结果。

freno 还可用于确定实际延迟以推断副本的有效性,这有助于缓解主库读取的“写入后读取”问题。参见 此处

HTTP

freno 通过 HTTP 提供服务。最重要的请求是 check 请求:“该应用可以向此存储写入吗?” freno 接受 HEAD 请求(GET 也可,但开销更大),并返回状态码:

  • 200(OK):应用可写入数据存储。
  • 404(Not Found):未知的指标名称。
  • 417(Expectation Failed):请求的应用被明确禁止写入。
  • 429(Too Many Requests):不要写入。这是正常状态,表示存储状态未达到预期阈值。
  • 500(Internal Server Error):内部错误。不要写入。

阅读更多关于 HTTP 请求与响应

客户端

客户端通常通过 HEAD 方法发送 /check/... 请求。

客户端可预期每秒发送大量请求。freno 资源消耗轻量,每秒处理数百次请求通常没有问题。当然,这取决于您的硬件和资源。

建议按所需粒度频率访问 freno。如果您的客户端以 1000ms 复制延迟为阈值进行节流,每秒检查 freno 200 次可能过度。但若您希望客户端保持简单无缓存,这也无妨。

阅读更多关于 客户端

Raft

freno 使用 raft 提供高可用性。freno 节点将竞争 领导权,只有领导者才会收集指标并服务客户端。

阅读更多关于 raft高可用性

配置

参见 示例配置文件。另见:

部署

参见 部署文档 了解推荐的 freno 部署方案。

资源

您可在 resources/ 中找到用于在环境中设置 freno 的各种资源。

freno-client (https://github.com/github/freno-client) 是我们开源的 Ruby 客户端,以 Ruby Gem 形式提供。

名称由来

“Freno” 在西班牙语中意为“刹车”,就像汽车刹车一样。我们本想叫它 “throttler” 或 “throttled”,但这两个名称已被多个仓库使用,于是另寻他名。查阅词典时,我们看到了如下句子:

踩下刹车,马格达莱诺!

这让我们想起了 80 年代,于是就这么定了。

项目状态

本项目正在积极开发中。

贡献

本仓库欢迎 贡献。另请参阅 行为准则

许可

本项目基于 MIT 许可 发布。请注意,它包含第三方依赖项,这些依赖项按各自许可发布;相关内容可在 vendor 目录下找到 (https://github.com/github/freno/tree/master/vendor)。

作者

由 GitHub Engineering 创作。

相似文章

Fluree DB(GitHub 仓库)

TLDR AI

Fluree DB 是一个开源的时间图数据库,具有类似 Git 的分支、集成的向量/文本/地理搜索、细粒度的访问控制,并支持 SPARQL、JSON-LD 和 Open Cypher。它针对 AI 代理记忆进行了优化,在十亿级图上实现了高性能。

诊断 MariaDB 随机冻结问题

Lobsters Hottest

Frappe Cloud 对影响数千个托管站点的反复数据库冻结问题展开调查,通过 eBPF 追踪在内核层面监控磁盘 I/O,最终发现了触发该故障的可疑查询模式。

Frood:一个基于Alpine Initramfs的NAS

Hacker News Top

描述了一种完全从Alpine Linux initramfs运行NAS的方法,支持干净启动、A/B部署、声明式git跟踪配置,并相比Alpine的无盘模式降低了复杂性。

从本地存储引擎中移除 fsync

Hacker News Top

FractalBits 推出了一种专为单节点设计的 KV 存储引擎,通过在硬件层级直接管理数据持久性来消除 fsync 调用,从而在 NVMe SSD 上实现显著提升的写入吞吐量。