支持的 Geo 数据类型

Geo 数据类型是一个或多个极狐GitLab 功能所需的特定数据类以存储相关信息。

为了使用 Geo 复制这些功能生成的数据,我们使用多种策略进行访问、传输和验证。

数据类型

我们区分以下三种数据类型:

请参阅下表,了解我们复制的每个功能或组件、其相应的数据类型、复制和验证方法:

类型 功能/组件 复制方法 验证方法
数据库 PostgreSQL 中的应用数据 Native Native
数据库 Redis 不适用 (1) 不适用
数据库 Elasticsearch Native Native
数据库 SSH 公钥 PostgreSQL 复制 PostgreSQL 复制
Git 项目仓库 具有 Gitaly 的 Geo Gitaly 校验和
Git 项目 Wiki 仓库 具有 Gitaly 的 Geo Gitaly 校验和
Git 项目设计仓库 具有 Gitaly 的 Geo Gitaly 校验和
Git 项目代码片段 具有 Gitaly 的 Geo Gitaly 校验和
Git 私人代码片段 具有 Gitaly 的 Geo Gitaly 校验和
Git 群组 Wiki 仓库 具有 Gitaly 的 Geo Gitaly 校验和
Blob 用户上传 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob 用户上传 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob LFS 对象 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob LFS 对象 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob CI 作业产物 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob CI 作业产物 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 归档 CI 构建跟踪 (文件系统) 具有 API 的 Geo 未实施
Blob 归档 CI 构建跟踪 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 镜像库 (文件系统) 具有 API 的 Geo/Docker API SHA256 校验和
Blob 镜像库 (对象存储) 具有 API/Managed 的 Geo/Docker API (2) SHA256 校验和 (3)
Blob 软件包库 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob 软件包库 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob Terraform 模块库 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob Terraform 模块库 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob Versioned Terraform State (文件系统) 具有 API 的 Geo SHA256 校验和
Blob Versioned Terraform State (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 外部合并请求差异 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob 外部合并请求差异 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 流水线产物 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob 流水线产物 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob Pages (文件系统) 具有 API 的 Geo SHA256 校验和
Blob Pages (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob CI 安全文件 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob CI 安全文件 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 事件指标镜像 (文件系统) 具有 API/Managed 的 Geo SHA256 校验和
Blob 事件指标镜像 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 告警指标镜像 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob 告警指标镜像 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
Blob 依赖代理镜像 (文件系统) 具有 API 的 Geo SHA256 校验和
Blob 依赖代理镜像 (对象存储) 具有 API/Managed 的 Geo (2) SHA256 校验和 (3)
  • (1):Redis 复制可用作具有 Redis sentinel 的 HA 的一部分。不在 Geo 站点之间使用。
  • (2):对象存储复制可以由 Geo 或您的对象存储提供商/设备本机复制功能执行。
  • (3):对象存储验证的功能标志geo_object_storage_verification,引入于 16.4 并默认启用。它使用文件大小的校验和来验证文件。

Git 仓库

极狐GitLab 实例可以有一个或多个仓库分片。每个分片都有一个 Gitaly 实例,负责允许对本地存储的 Git 仓库进行访问和操作。它可以在机器上运行:

  • 使用单个磁盘
  • 将多个磁盘挂载为单个挂载点(如 RAID 阵列)
  • 使用 LVM

极狐GitLab 不需要特殊的文件系统,并且可以与挂载的存储设备一起使用。但是,使用远程文件系统时可能会存在性能限制和一致性问题。

Geo 在 Gitaly 中触发垃圾收集,以对 Geo 次要站点上的派生仓库进行去重。

Gitaly gRPC API 通过三种可能的同步方式进行通信:

  • 在两个 Geo 站点之间使用常规 Git 克隆/获取(使用特殊身份验证)
  • 使用仓库快照(当第一种方法失败或仓库损坏时)
  • 从管理中心手动触发(上述两者的组合)

每个项目最多可以有 3 个不同的仓库:

  • 项目仓库:存储源代码
  • Wiki 仓库:存储 Wiki 内容
  • 设计仓库:索引设计产物(资产实际上位于 LFS 中)

它们都位于同一个分片中,并拥有相同的基本名称,为 Wiki 和设计仓库案例添加 -wiki-design 后缀。

除此之外,还有代码片段仓库。它们可以连接到项目或某些特定用户。 两种类型都会同步到次要站点。

Blobs

极狐GitLab 将文件和 Blob(例如议题附件或 LFS 对象)存储到以下任一位置:

  • 特定位置的文件系统
  • 对象存储解决方案。对象存储解决方案可以是:
    • 基于云,例如 Amazon S3 和 Google Cloud Storage
    • 由您托管(如 MinIO)
    • 公开对象存储兼容 API 的存储设备

当使用文件系统存储而不是对象存储并且使用多个节点时,请使用网络挂载的文件系统来运行极狐GitLab。

关于复制和验证:

  • 我们使用内部 API 请求传输文件和 Blob
  • 使用对象存储,您可以:
    • 使用云提供商的复制功能
    • 让极狐GitLab 为您复制

数据库

极狐GitLab 依赖于存储在多个数据库中的数据来满足不同的用例。 PostgreSQL 是 Web 界面中用户生成内容的单一事实来源,例如议题内容、评论以及权限和凭据。

PostgreSQL 还可以保存某种级别的缓存数据,例如 HTML 渲染的 Markdown 和缓存的合并请求差异。 这也可以配置为卸载到对象存储。

我们使用 PostgreSQL 自己的复制功能将数据从主要站点复制到次要站点。

我们使用 Redis 作为缓存存储并为后台作业系统保存持久数据。由于这两个用例都具有同一 Geo 站点独有的数据,因此我们不会在站点之间进行复制。

Elasticsearch 是用于高级搜索的可选数据库。它可以改进源代码级别的搜索以及议题、合并请求和讨论中用户生成的内容。 Geo 中不支持 Elasticsearch。

复制的数据类型

复制的数据类型受功能标志控制

某些数据类型的复制需要启用相应的功能标志:

  • 其部署在功能标志后面,默认启用。
  • 其已在 JihuLab.com 上启用。
  • 无法针对每个项目进行启用或禁用。
  • 建议将其用于生产用途。
  • 对于私有化部署的极狐GitLab 实例,极狐GitLab 管理员可以选择禁用

启用或禁用复制(对于某些数据类型)

某些数据类型的复制是在默认启用的功能标志后面发布的。有权访问极狐GitLab Rails 控制台的极狐GitLab 管理员可以为您的实例禁用复制。您可以在下表的注释列中找到每种数据类型的功能标志名称。

要进行禁用,例如对于软件包文件复制:

Feature.disable(:geo_package_file_replication)

要进行启用,例如对于软件包文件复制:

Feature.enable(:geo_package_file_replication)
caution 不在此列表中的功能,或者在已复制列中标为的功能,不会复制到次要站点。如果不手动从这些功能复制数据而进行故障转移,则会导致数据丢失。 要在次要站点上使用这些功能,或者要成功执行故障转移,您必须使用其他方式复制其数据。

| 功能 | 复制(添加的极狐GitLab 版本) | 验证(添加的极狐GitLab 版本) | 极狐GitLab 管理的对象存储复制(添加的极狐GitLab 版本) | 极狐GitLab 管理的对象存储验证(添加的极狐GitLab 版本) | 备注 | |:——————————————————————————————————|:——————————————————————–|:——————————————————————–|:——————————————————————|:————————————|:———————————————————————————————————————————————————————————-| | PostgreSQL 中的应用数据 | (13.10) | (13.10) | 不适用 | 不适用 | | | 项目仓库 | (13.10) | (13.10) | 不适用 | 不适用 | 在 16.2 版本中迁移到自服务框架。

功能标志为 geo_project_repository_replication,默认启用于 16.3。

所有项目,包括归档项目,都会被复制。 | | 项目 Wiki 仓库 | (13.10)2 | (13.10)2 | 不适用 | 不适用 | 在 15.11 中,迁移到自服务框架。

功能标志为 geo_project_wiki_repository_replication,默认启用于 15.11。 | | 群组 Wiki 仓库 | (13.10) | (16.3) | 不适用 | 不适用 | 功能标志为 geo_group_wiki_repository_replication,默认启用。 | | 上传 | (13.10) | (14.6) | (15.1) | (16.4) | 复制位于功能标志 geo_upload_replication 后面,默认启用。验证位于功能标志 geo_upload_verification 后面,已在 14.8 中删除。 | | LFS 对象 | (13.10) | (14.6) | (15.1) | (16.4) | 复制位于功能标志 geo_lfs_object_replication 后面,默认启用。验证位于功能标志 geo_lfs_object_verification 后面,已在 14.7 中删除。 | | 个人代码片段 | (13.10) | (13.10) | 不适用 | 不适用 | | | 项目代码片段 | (13.10) | (13.10) | 不适用 | 不适用 | | | CI 作业产物 | (13.10) | (14.10) | (15.1) | (16.4) | 验证位于功能标志 geo_job_artifact_replication 后面,在 14.10 中默认启用。 | | CI 流水线产物 | (13.11) | (13.11) | (15.1) | (16.4) | 流水线完成后保留其他产物。 | | CI 安全文件 | (15.3) | (15.3) | (15.3) | (16.4) | 验证位于功能标志 geo_ci_secure_file_replication 后面,在 15.3 中默认启用。 | | 容器镜像库 | (13.10)1 | (15.10) | (13.10)1 | (15.10) | 请参阅说明以设置容器镜像库复制。 | | Terraform 模块库 | (14.0) | (14.0) | (15.1) | (16.4) | 在功能标志 geo_package_file_replication 后面,默认启用。 | | 项目设计仓库 | (13.10) | (16.1) | 不适用 | 不适用 | 设计还需要复制 LFS 对象和上传。 | | 软件包库 | (13.2) | (13.10) | (15.1) | (16.4) | 在功能标志 geo_package_file_replication 后面,默认启用。 | | 版本 Terraform 状态 | (13.5) | (13.12) | (15.1) | (16.4) | 复制位于功能标志 geo_terraform_state_version_replication 后面,默认启用。验证位于功能标志 geo_terraform_state_version_verification 后面,在 14.0 中删除。 | | 外部合并请求差异 | (13.5) | (14.6) | (15.1) | (16.4) | 复制位于功能标志 geo_merge_request_diff_replication 后面,默认启用。验证位于功能标志 geo_merge_request_diff_verification 后面,在 14.7 中删除。 | | 版本代码片段 | (13.7) | (14.2) | 不适用 | 不适用 | 在 13.11 中,验证由功能标志 geo_snippet_repository_verification 控制,已在 14.2 中删除。 | | 极狐GitLab Pages | (14.3) | (14.6) | (15.1) | (16.4) | 在功能标志 geo_pages_deployment_replication 后面,默认启用。验证位于功能标志 geo_pages_deployment_verification 后面,已在 14.7 中删除。 | | 项目级安全文件 | (15.3) | (15.3) | (15.3) | (16.4) | | | 事件指标镜像 | (15.5) | (15.5) | (15.5) | (16.4) | 复制/验证通过上传数据类型处理。 | | | 告警指标镜像 | (15.5) | (15.5) | (15.5) | (16.4) | 复制/验证通过上传数据类型处理。 | | 服务器端 Git Hook | 未计划 | 否 | 不适用 | 不适用 | 由于当前实施的复杂性、客户兴趣低以及 Hook 替代方案的可用性,因此未计划。 | | Elasticsearch 集成 | 未计划 | 否 | 否 | 否 | 未计划,因为需要进一步的产品发现并且可以重建 Elasticsearch (ES) 集群。次要节点使用与主要节点相同的 ES 集群。 | | 依赖代理镜像 | (15.7) | (15.7) | (15.7) | (16.4) | | | 漏洞导出 | 未计划 | 否 | 否 | 否 | 未计划,因为这些信息短暂且敏感,可以根据需要再生。 | | NPM 包元数据缓存 | 未计划 | 否 | No | 否 | 未计划是因为它将不能显著改善灾难恢复能力或次站点上的响应时间。 | 1 迁移到私有化部署架构于 15.5 版本。

2 迁移到自服务架构于 15.11 版本,功能标志为 geo_project_wiki_repository_replication,默认启用。

Footnotes:

  1. 在 15.5 中迁移到了私有化部署架构
  2. 在 15.11 中迁移到了私有化部署架构。 功能标志为 geo_project_wiki_repository_replication,默认启用。
  3. 对于存储在对象存储中文件的验证自极狐GitLab 16.4 引入,并使用名为 geo_object_storage_verification功能标志,默认启用。