极狐 GitLab

Gitaly

Tier: 基础版,专业版,旗舰版

Offering: 私有化部署

Gitaly 提供了对 Git 仓库的高级远程过程调用 (RPC) 访问。 极狐GitLab 使用它来读取和写入 Git 数据。

Gitaly 存在于每个极狐GitLab 安装中,并协调 Git 仓库的 存储和检索。Gitaly 可以是:

  • 在单实例 Linux 软件包安装中运行的后台服务(所有 极狐GitLab 在一台机器上)。
  • 根据扩展和可用性需求,分离到自己的实例并在完整的集群配置中进行配置。

Gitaly 仅管理极狐GitLab 的 Git 仓库访问。其他类型的极狐GitLab 数据不使用 Gitaly 访问。

极狐GitLab 通过配置的 仓库存储 访问仓库。每个新仓库根据其 配置的权重 存储在一个仓库存储上。每个 仓库存储要么是:

  • 使用存储路径 直接访问仓库的 Gitaly 存储,其中每个仓库存储在单个 Gitaly 节点上。所有请求都路由到此节点。
  • Gitaly 集群 (Praefect) 提供的虚拟存储,其中每个仓库可以存储在多个 Gitaly 节点上以实现容错。对于 Gitaly 集群 (Praefect):
    • 读取请求分布在多个 Gitaly 节点之间,这可以提高性能。
    • 写入请求广播到仓库副本。

以下展示了极狐GitLab 设置为直接访问 Gitaly:

极狐GitLab 应用程序与 Gitaly 存储分片交互

在此示例中:

  • 每个仓库存储在三个 Gitaly 存储之一上:storage-1storage-2storage-3
  • 每个存储由一个 Gitaly 节点提供服务。
  • 三个 Gitaly 节点在其文件系统上存储数据。

磁盘要求#

Gitaly 和 Gitaly 集群 (Praefect) 需要快速的本地存储才能有效运行,因为它们是大量 基于 I/O 的进程。因此,我们强烈建议所有 Gitaly 节点使用固态硬盘 (SSD)。这些 SSD 应具有高读写吞吐量,因为 Gitaly 同时操作许多小文件。

作为参考,以下图表显示了 JihuLab.com 上 Gitaly 生产集群在一分钟粒度下的 P99 磁盘 IOPS。 数据源自一个为期七天的代表性时期,从周一开始到周一结束。请注意,随着工作周流量 增大,IOPS 会出现规律性的峰值。原始数据显示出更大的峰值,写入峰值 达到 8000 IOPS。可用的磁盘吞吐量必须能够处理这些峰值,以避免 中断 Gitaly 请求。

  • P99 磁盘读取 IOPS:

    显示 P99 磁盘读取 IOPS 的图表。

  • P99 磁盘写入 IOPS:

    显示 P99 磁盘写入 IOPS 的图表。

我们通常看到:

  • 每秒 500 - 1000 次读取,峰值每秒 3500 次读取。
  • 每秒约 500 次写入,峰值超过每秒 3000 次写入。

在撰写本文时,Gitaly 服务器集群中的大多数实例均为 t2d-standard-32 实例, 配备 pd-ssd 磁盘。宣传的 最大写入和读取 IOPS 为 60,000。

JihuLab.com 还针对昂贵的 Git 操作采用了更严格的并发限制, 这些限制默认不会在极狐GitLab 私有化部署实例上启用。放宽并发限制、 针对特别大的单体仓库的操作,或使用 pack-objects 缓存 都可能显著增加磁盘活动。

在实践中,对于你自己的环境,你在 Gitaly 实例上观察到的磁盘活动可能与这些公布的结果 有很大差异。如果你在云环境中运行,选择更大的实例通常会提高可用的磁盘 IOPS。 你也可以选择配置 IOPS 磁盘类型,以获得有保证的吞吐量。请参阅你的云提供商的文档, 了解如何正确配置 IOPS。

对于仓库数据,出于性能和一致性的考虑,仅支持 Gitaly 和 Gitaly 集群 (Praefect) 使用本地存储。 不支持 NFS基于云的文件系统 等替代方案。

Gitaly 架构#

Gitaly 实现了客户端-服务器架构:

以下说明了 Gitaly 客户端-服务器架构:

Rendering chart...

配置 Gitaly#

Gitaly 随 Linux 软件包安装进行了预配置,这是一种 适用于多达 20 RPS / 1000 名用户 的配置。对于:

对于每天执行 Git 写入操作的活跃用户超过 2000 名的极狐GitLab 安装,最适合使用 Gitaly 集群 (Praefect)。

Gitaly CLI#

版本历史
  • gitaly git 子命令在极狐GitLab 17.4 中引入。

gitaly 命令是一个命令行界面,为 Gitaly 管理员提供了额外的子命令。例如, Gitaly CLI 用于:

有关其他子命令的更多信息,请运行 sudo -u git -- /opt/gitlab/embedded/bin/gitaly --help

备份仓库#

在使用除 GitLab 之外的工具备份或同步仓库时,必须在复制仓库数据时阻止写入

Bundle URI#

你可以将 Git bundle URI 与 Gitaly 一起使用。 有关更多信息,请参阅 Bundle URI 文档

直接访问仓库#

极狐GitLab 不建议使用 Git 客户端或任何其他工具直接访问存储在磁盘上的 Gitaly 仓库, 因为 Gitaly 在持续改进和变化。这些改进可能会使你的 假设无效,从而导致性能下降、不稳定,甚至数据丢失。例如:

  • Gitaly 具有诸如 info/refs 广告缓存 之类的优化, 这些优化依赖于 Gitaly 通过使用官方 gRPC 接口控制和监控对仓库的访问。
  • Gitaly 集群 (Praefect) 具有诸如容错和 分布式读取 的优化,这些优化依赖于 gRPC 接口和数据库 来确定仓库状态。

直接访问 Git 仓库的风险自负,且不受支持。