支持的 Geo 数据类型
- Tier: Premium, Ultimate
- Offering: GitLab Self-Managed
Geo 数据类型是 GitLab 某个或多个功能所需的一类特定数据,用于存储相关信息。
要使用 Geo 复制这些功能产生的数据,我们采用多种策略来访问、传输和验证它们。
数据类型
我们区分以下不同的数据类型:
请参阅下表,了解我们复制的每个功能或组件、其对应的数据类型、复制和验证方法:
| 类型 | 功能/组件 | 复制方法 | 验证方法 |
|---|---|---|---|
| Database | PostgreSQL 中的应用数据 | Native | Native |
| Database | Redis | Not applicable 1 | Not applicable |
| Database | 高级搜索 (Elasticsearch 或 OpenSearch) | Native | Native |
| Database | 精确代码搜索 (Zoekt) | Native | Native |
| Database | SSH 公钥 | PostgreSQL Replication | PostgreSQL Replication |
| Git | 项目仓库 | Geo with Gitaly | Gitaly Checksum |
| Git | 项目 Wiki 仓库 | Geo with Gitaly | Gitaly Checksum |
| Git | 项目设计仓库 | Geo with Gitaly | Gitaly Checksum |
| Git | 项目代码片段 | Geo with Gitaly | Gitaly Checksum |
| Git | 个人代码片段 | Geo with Gitaly | Gitaly Checksum |
| Git | 组 Wiki 仓库 | Geo with Gitaly | Gitaly Checksum |
| Blob | 用户上传 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 用户上传 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | LFS 对象 (文件系统) | Geo with API | SHA256 checksum |
| Blob | LFS 对象 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | CI 作业构件 (文件系统) | Geo with API | SHA256 checksum |
| Blob | CI 作业构件 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 归档的 CI 构建跟踪 (文件系统) | Geo with API | Not implemented |
| Blob | 归档的 CI 构建跟踪 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 容器注册表 (文件系统) | Geo with API/Docker API | SHA256 checksum |
| Blob | 容器注册表 (对象存储) | Geo with API/Managed/Docker API 2 | SHA256 checksum 3 |
| Blob | 包注册表 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 包注册表 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | Terraform 模块注册表 (文件系统) | Geo with API | SHA256 checksum |
| Blob | Terraform 模块注册表 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 版本化 Terraform 状态 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 版本化 Terraform 状态 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 外部合并请求差异 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 外部合并请求差异 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 流水线构件 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 流水线构件 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | Pages (文件系统) | Geo with API | SHA256 checksum |
| Blob | Pages (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | CI 安全文件 (文件系统) | Geo with API | SHA256 checksum |
| Blob | CI 安全文件 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 事件指标图片 (文件系统) | Geo with API/Managed | SHA256 checksum |
| Blob | 事件指标图片 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 告警指标图片 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 告警指标图片 (对象存储) | Geo with API/Managed 2 | SHA256 checksum 3 |
| Blob | 依赖代理镜像 (文件系统) | Geo with API | SHA256 checksum |
| Blob | 依赖代理镜像 (对象存储) | Geo with API/managed 2 | SHA256 checksum 3 |
| Container Repository | 容器注册表 (文件系统) | Geo with API/Docker API | SHA256 checksum |
| Container Repository | 容器注册表 (对象存储) | Geo with API/Managed/Docker API 2 | SHA256 checksum 3 |
脚注:
- Redis 复制可用作 Redis sentinel 的一部分实现高可用。它不用于 Geo 站点之间。
- 对象存储复制可由 Geo 或您的对象存储提供商/设备原生复制功能执行。
- 对象存储验证位于 功能标志
geo_object_storage_verification后面,在 16.4 版本中引入并默认启用。它使用文件大小的校验和来验证文件。
Git 仓库
GitLab 实例可以有一个或多个仓库分片。每个分片都有一个 Gitaly 实例,负责允许访问和操作本地存储的 Git 仓库。它可以在一台机器上运行:
- 使用单个磁盘。
- 使用多个磁盘挂载为单个挂载点(如 RAID 数组)。
- 使用 LVM。
GitLab 不需要特殊的文件系统,可以与挂载的存储设备一起工作。但是,使用远程文件系统时可能会存在性能限制和一致性问题。
Geo 在 Gitaly 中触发垃圾回收,以在 Geo 从站点上去重分叉的仓库。
Gitaly gRPC API 进行通信,有三种可能的同步方式:
- 使用常规 Git 克隆/获取从一个 Geo 站点到另一个站点(使用特殊身份验证)。
- 使用仓库快照(当第一种方法失败或仓库损坏时)。
- 从 Admin 区域手动触发(结合其他列出的可能方式)。
每个项目最多可以有 3 个不同的仓库:
- 项目仓库,存储源代码。
- Wiki 仓库,存储 Wiki 内容。
- 设计仓库,索引设计工件(资产实际存储在 LFS 中)。
它们都位于同一个分片中,并共享相同的基本名称,Wiki 和设计仓库分别带有 -wiki 和 -design 后缀。
除此之外,还有代码片段仓库。它们可以连接到项目或特定用户。这两种类型都会同步到从站点。
容器仓库
容器仓库存储在容器注册表中。它们是基于容器注册表作为数据存储构建的 GitLab 特定概念。
Blob 对象
GitLab 将文件和 Blob 对象(如 Issue 附件或 LFS 对象)存储在:
- 特定位置的文件系统中。
- 对象存储解决方案。对象存储解决方案可以是:
- 基于 Cloud 的,如 Amazon S3 和 Google Cloud Storage。
- 由您托管的(如 MinIO)。
- 暴露对象存储兼容 API 的存储设备。
当使用文件系统存储而非对象存储时,在使用多个节点时应使用网络挂载的文件系统来运行 GitLab。
关于复制和验证:
- 我们使用内部 API 请求来传输文件和 Blob 对象。
- 对于对象存储,您可以选择:
- 使用云提供商的复制功能。
- 让 GitLab 为您进行复制。
数据库
GitLab 依赖于存储在多个数据库中的数据,用于不同的用例。 PostgreSQL 是 Web 界面中用户生成内容的唯一真实来源,如 Issue 内容、评论以及权限和凭证。
PostgreSQL 还可以存储一定级别的缓存数据,如 HTML 渲染的 Markdown 和缓存的合并请求差异。这也可以配置为卸载到对象存储。
我们使用 PostgreSQL 自身的复制功能将数据从主站点复制到从站点。
我们使用 Redis 作为缓存存储,并保存后台作业系统的持久数据。由于这两种用例的数据都仅限于同一个 Geo 站点,因此我们不在站点之间复制它们。
Elasticsearch 是用于高级搜索的可选数据库。它可以改进源代码级别以及 Issue、合并请求和讨论中的用户生成内容的搜索。Geo 不支持 Elasticsearch。
已复制的数据类型
功能标志后已复制的数据类型
此功能的可用性由功能标志控制。 有关更多信息,请参阅历史记录。
启用或禁用复制(针对某些数据类型)
某些数据类型的复制发布在默认启用的功能标志后面。可以访问 GitLab Rails 控制台的 GitLab 管理员可以选择为您的实例禁用它。您可以在下表的备注列中找到每个数据类型的功能标志名称。
要禁用,例如对于包文件复制:
Feature.disable(:geo_package_file_replication)要启用,例如对于包文件复制:
Feature.enable(:geo_package_file_replication)不在此列表中或在已复制列中显示否的功能不会复制到从站点。在不手动复制这些功能的数据的情况下进行故障转移会导致数据丢失。要在从站点上使用这些功能,或成功执行故障转移,您必须使用其他方式复制其数据。
| 功能 | 已复制(在 GitLab 版本中添加) | 已验证(在 GitLab 版本中添加) | GitLab 管理的对象存储复制(在 GitLab 版本中添加) | GitLab 管理的对象存储验证(在 GitLab 版本中添加) | 备注 |
|---|---|---|---|---|---|
| PostgreSQL 中的应用数据 | 是 (10.2) | 是 (10.2) | Not applicable | Not applicable | |
| 项目仓库 | 是 (10.2) | 是 (10.7) | Not applicable | Not applicable | 于 16.2 版本迁移到自助服务框架。有关更多详细信息,请参阅 GitLab 问题 #367925。 位于功能标志 geo_project_repository_replication 后面,默认启用于 (16.3)。所有项目,包括已归档的项目,都会被复制。 |
| 项目 Wiki 仓库 | 是 (10.2)2 | 是 (10.7)2 | Not applicable | Not applicable | 于 15.11 版本迁移到自助服务框架。有关更多详细信息,请参阅 GitLab 问题 #367925。 位于功能标志 geo_project_wiki_repository_replication 后面,默认启用于 (15.11)。 |
| 组 Wiki 仓库 | 是 (13.10) | 是 (16.3) | Not applicable | Not applicable | 位于功能标志 geo_group_wiki_repository_replication 后面,默认启用。 |
| 用户上传 | 是 (10.2) | 是 (14.6) | 是 (15.1) | 是 (16.4)3 | 复制位于功能标志 geo_upload_replication 后面,默认启用。验证位于功能标志 geo_upload_verification 后面,于 14.8 版本移除。 |
| LFS 对象 | 是 (10.2) | 是 (14.6) | 是 (15.1) | 是 (16.4)3 | GitLab 版本 11.11.x 和 12.0.x 受一个阻止任何新 LFS 对象复制的 bug影响。 复制位于功能标志 geo_lfs_object_replication 后面,默认启用。验证位于功能标志 geo_lfs_object_verification 后面,于 14.7 版本移除。 |
| 个人代码片段 | 是 (10.2) | 是 (10.2) | Not applicable | Not applicable | |
| 项目代码片段 | 是 (10.2) | 是 (10.2) | Not applicable | Not applicable | |
| CI 作业构件 | 是 (10.4) | 是 (14.10) | 是 (15.1) | 是 (16.4)3 | 验证位于功能标志 geo_job_artifact_replication 后面,默认启用于 14.10。 |
| 流水线构件 | 是 (13.11) | 是 (13.11) | 是 (15.1) | 是 (16.4)3 | 在流水线完成后保留额外的构件。 |
| CI 安全文件 | 是 (15.3) | 是 (15.3) | 是 (15.3) | 是 (16.4)3 | 验证位于功能标志 geo_ci_secure_file_replication 后面,默认启用于 15.3。 |
| 容器注册表 | 是 (12.3)1 | 是 (15.10) | 是 (12.3)1 | 是 (15.10) | 请参阅说明设置容器注册表复制。 |
| Terraform 模块注册表 | 是 (14.0) | 是 (14.0) | 是 (15.1) | 是 (16.4)3 | 位于功能标志 geo_package_file_replication 后面,默认启用。 |
| 项目设计仓库 | 是 (12.7) | 是 (16.1) | 是 (16.4)3 | 是 (16.4)3 | 设计还需要复制 LFS 对象和上传文件。 |
| 包注册表 | 是 (13.2) | 是 (13.10) | 是 (15.1) | 是 (16.4)3 | 位于功能标志 geo_package_file_replication 后面,默认启用。 |
| 版本化 Terraform 状态 | 是 (13.5) | 是 (13.12) | 是 (15.1) | 是 (16.4)3 | 复制位于功能标志 geo_terraform_state_version_replication 后面,默认启用。验证位于功能标志 geo_terraform_state_version_verification 后面,于 14.0 版本移除。 |
| 外部合并请求差异 | 是 (13.5) | 是 (14.6) | 是 (15.1) | 是 (16.4)3 | 复制位于功能标志 geo_merge_request_diff_replication 后面,默认启用。验证位于功能标志 geo_merge_request_diff_verification 后面,于 14.7 版本移除。 |
| 版本化代码片段 | 是 (13.7) | 是 (14.2) | 是 (16.4)3 | 是 (16.4)3 | 验证是在 13.11 版本中通过功能标志 geo_snippet_repository_verification 实现的,该功能标志于 14.2 版本移除。 |
| Pages | 是 (14.3) | 是 (14.6) | 是 (15.1) | 是 (16.4)3 | 位于功能标志 geo_pages_deployment_replication 后面,默认启用。验证位于功能标志 geo_pages_deployment_verification 后面,于 14.7 版本移除。 |
| 项目级 CI 安全文件 | 是 (15.3) | 是 (15.3) | 是 (15.3) | 是 (16.4)3 | |
| 事件指标图片 | 是 (15.5) | 是 (15.5) | 是 (15.5) | 是 (16.4)3 | 复制/验证通过上传数据类型处理。 |
| 告警指标图片 | 是 (15.5) | 是 (15.5) | 是 (15.5) | 是 (16.4)3 | 复制/验证通过上传数据类型处理。 |
| 服务器端 Git hooks | 暂无计划 | No | Not applicable | Not applicable | 暂无计划,因为当前实现复杂、客户兴趣低以及 hooks 有替代方案。 |
| Elasticsearch | 暂无计划 | No | No | No | 暂无计划,因为需要进一步的产品发现,并且 Elasticsearch (ES) 集群可以重建。从站点使用与主站点相同的 ES 集群。 |
| 依赖代理镜像 | 是 (15.7) | 是 (15.7) | 是 (15.7) | 是 (16.4)3 | |
| 漏洞导出 | 暂无计划 | No | No | No | 暂无计划,因为它们是临时的且包含敏感信息。可以按需重新生成。 |
| 包 NPM 元数据缓存 | 暂无计划 | No | No | No | 暂无计划,因为它不会显著提高从站点的灾难恢复能力或响应时间。 |
| SBOM 漏洞扫描数据 | 暂无计划 | No | No | No | 暂无计划,因为数据是临时的,寿命短,对从站点的灾难恢复能力影响有限。 |
脚注: