Supported Geo data types

  • Tier: Premium, Ultimate
  • Offering: GitLab Self-Managed

A Geo data type is a specific class of data that is required by one or more GitLab features to store relevant information.

To replicate data produced by these features with Geo, we use several strategies to access, transfer, and verify them.

Data types

We distinguish between the following different data types:

See the list below of each feature or component we replicate, its corresponding data type, replication, and verification methods:

Type Feature / component Replication method Verification method
Database Application data in PostgreSQL Native Native
Database Redis Not applicable1 Not applicable
Database SSH public keys PostgreSQL Replication PostgreSQL Replication
Git Project repository Geo with Gitaly Gitaly Checksum
Git Project wiki repository Geo with Gitaly Gitaly Checksum
Git Project designs repository Geo with Gitaly Gitaly Checksum
Git Snippets Geo with Gitaly Gitaly Checksum
Git Group wiki repository Geo with Gitaly Gitaly Checksum
Blob User uploads (file system) Geo with API SHA256 checksum
Blob User uploads (object storage) Geo with API/Managed2 SHA256 checksum3
Blob LFS objects (file system) Geo with API SHA256 checksum
Blob LFS objects (object storage) Geo with API/Managed2 SHA256 checksum3
Blob CI job artifacts (file system) Geo with API SHA256 checksum
Blob CI job artifacts (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Archived CI build traces (file system) Geo with API Not implemented
Blob Archived CI build traces (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Package registry (file system) Geo with API SHA256 checksum
Blob Package registry (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Packages Helm Metadata Cache (file system) Geo with API SHA256 checksum
Blob Packages Helm Metadata Cache (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Terraform Module Registry (file system) Geo with API SHA256 checksum
Blob Terraform Module Registry (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Versioned Terraform State (file system) Geo with API SHA256 checksum
Blob Versioned Terraform State (object storage) Geo with API/Managed2 SHA256 checksum3
Blob External merge request diffs (file system) Geo with API SHA256 checksum
Blob External merge request diffs (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Pipeline artifacts (file system) Geo with API SHA256 checksum
Blob Pipeline artifacts (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Pages (file system) Geo with API SHA256 checksum
Blob Pages (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Project-level CI Secure Files (file system) Geo with API SHA256 checksum
Blob Project-level CI Secure Files (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Incident Metric Images (file system) Geo with API/Managed SHA256 checksum
Blob Incident Metric Images (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Alert Metric Images (file system) Geo with API SHA256 checksum
Blob Alert Metric Images (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Dependency Proxy Images (file system) Geo with API SHA256 checksum
Blob Dependency Proxy Images (object storage) Geo with API/Managed2 SHA256 checksum3
Blob Packages NuGet Symbol (file system) Geo with API SHA256 checksum
Blob Packages NuGet Symbol (object storage) Geo with API/Managed2 SHA256 checksum3
Container Repository Container registry (file system) Geo with API/Docker API SHA256 checksum
Container Repository Container registry (object storage) Geo with API/Managed/Docker API2 SHA256 checksum3

Git repositories

A GitLab instance can have one or more repository shards. Each shard has a Gitaly instance that is responsible for allowing access and operations on the locally stored Git repositories. It can run on a machine:

  • With a single disk.
  • With multiple disks mounted as a single mount-point (like with a RAID array).
  • Using LVM.

GitLab does not require a special file system and can work with a mounted Storage Appliance. However, there can be performance limitations and consistency issues when using a remote file system.

Geo triggers garbage collection in Gitaly to deduplicate forked repositories on Geo secondary sites.

The Gitaly gRPC API does the communication, with three possible ways of synchronization:

  • Using regular Git clone/fetch from one Geo site to another (with special authentication).
  • Using repository snapshots (for when the first method fails or the repository is corrupt).
  • Manual trigger from the Admin area (combines the other listed possible ways).

Each project can have at most 3 different repositories:

  • A project repository, where the source code is stored.
  • A wiki repository, where the wiki content is stored.
  • A design repository, where design artifacts are indexed (assets are actually in LFS).

They all live in the same shard and share the same base name with a -wiki and -design suffix for Wiki and Design Repository cases.

Besides that, there are snippet repositories. They can be connected to a project or to some specific user. Both types are synced to a secondary site.

Container repositories

Container repositories are stored in the container registry. They are a GitLab-specific concept built on top of a container registry as the datastore.

Blobs

GitLab stores files and blobs such as Issue attachments or LFS objects into either:

  • The file system in a specific location.
  • An Object Storage solution. Object Storage solutions can be:
    • Cloud based like Amazon S3 and Google Cloud Storage.
    • Self-hosted S3-compatible object storage.
    • A Storage Appliance that exposes an Object Storage-compatible API.

When using the file system store instead of Object Storage, use network mounted file systems to run GitLab when using more than one node.

With respect to replication and verification:

  • We transfer files and blobs using an internal API request.
  • With Object Storage, you can either:
    • Use a cloud provider replication functionality.
    • Have GitLab replicate it for you.

Databases

GitLab relies on data stored in multiple databases, for different use-cases. PostgreSQL is the single point of truth for user-generated content in the Web interface, like issues content, comments as well as permissions and credentials.

PostgreSQL can also hold some level of cached data like HTML-rendered Markdown and cached merge request diffs. This can also be configured to be offloaded to object storage.

We use PostgreSQL’s own replication functionality to replicate data from the primary to secondary sites.

We use Redis both as a cache store and to hold persistent data for our background jobs system. Because both use-cases have data that are exclusive to the same Geo site, we don’t replicate it between sites.

Elasticsearch is an optional database for advanced search. It can improve search in both source-code level, and user generated content in issues, merge requests, and discussions. Elasticsearch is not supported in Geo. After a failover, recover data for advanced search.

Replicated data types

Replication for some data types is released behind feature flags that are enabled by default. These feature flags can’t be enabled or disabled per-project, and they’re recommended for production use. GitLab administrators with access to the GitLab Rails console can opt to disable them for your instance. You can find feature flag names of each of those data types in the notes column of the table below.

Features not on this list, or documented as not replicated, are not replicated to a secondary site. Failing over without manually replicating data from those features causes the data to be lost. To use those features on a secondary site, or to execute a failover successfully, you must replicate their data using some other means.

Feature Replicated Verified GitLab-managed object storage replication GitLab-managed object storage verification Notes
Application data in PostgreSQL check-sm check-sm Not applicable Not applicable None
Project repository check-sm check-sm Not applicable Not applicable Replication is behind feature flag geo_project_repository_replication, enabled by default.

All projects, including archived projects, are replicated.
Project wiki repository check-sm check-sm Not applicable Not applicable Replication is behind feature flag geo_project_wiki_repository_replication, enabled by default.
Group wiki repository check-sm check-sm Not applicable Not applicable Replication is behind feature flag geo_group_wiki_repository_replication, enabled by default.
User uploads check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_upload_replication, enabled by default.
LFS objects check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_lfs_object_replication, enabled by default.
Snippets check-sm check-sm Not applicable Not applicable Replication is behind feature flag geo_snippet_repository_replication, enabled by default. Includes both personal and project snippets.
CI job artifacts check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_job_artifact_replication, enabled by default. On the primary site, checksumming continues unless geo_job_artifact_force_primary_checksumming is also disabled. See Enable or disable replication.
Pipeline artifacts check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_pipeline_artifact_replication, enabled by default. Persists additional artifacts after a pipeline completes.
Project-level CI Secure Files check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_ci_secure_file_replication, enabled by default.
Container registry check-sm check-sm check-sm check-sm Replication is behind feature flag geo_container_repository_replication, enabled by default. See instructions to set up the container registry replication.
Terraform Module Registry check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_package_file_replication, enabled by default.
Project designs repository check-sm check-sm Not applicable Not applicable Replication is behind feature flag geo_design_management_repository_replication, enabled by default. Designs also require replication of LFS objects and Uploads.
Package registry check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_package_file_replication, enabled by default.
Packages Helm Metadata Cache check-sm check-sm check-sm check-sm Replication is behind feature flag geo_packages_helm_metadata_cache_replication, enabled by default. Introduced in GitLab 18.10.
Versioned Terraform State check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_terraform_state_version_replication, enabled by default.
External merge request diffs check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_merge_request_diff_replication, enabled by default.
Pages check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_pages_deployment_replication, enabled by default.
Incident Metric Images check-sm check-sm check-sm check-sm 4 Replication and verification are handled through the Uploads data type.
Alert Metric Images check-sm check-sm check-sm check-sm 4 Replication and verification are handled through the Uploads data type.
Dependency Proxy Images check-sm check-sm check-sm check-sm 4 Replication is behind feature flags geo_dependency_proxy_blob_replication and geo_dependency_proxy_manifest_replication, enabled by default.
Packages NuGet Symbol check-sm check-sm check-sm check-sm 4 Replication is behind feature flag geo_packages_nuget_symbol_replication, enabled by default. Introduced in GitLab 18.10.
Packages Debian ProjectComponentFile check-sm check-sm check-sm check-sm Behind feature flag geo_packages_debian_project_component_file_replication, disabled by default. Introduced in GitLab 19.1.

Enable or disable replication (for some data types)

To disable, such as for package file replication:

ruby
Feature.disable(:geo_package_file_replication)

To enable, such as for package file replication:

ruby
Feature.enable(:geo_package_file_replication)

Disabling a geo_<replicable>_replication flag stops replication and verification on secondary sites. On the primary site, checksumming continues while the corresponding geo_<replicable>_force_primary_checksumming flag is enabled (the default). To stop checksumming on the primary site as well, disable both flags:

ruby
Feature.disable(:geo_package_file_replication)
Feature.disable(:geo_package_file_force_primary_checksumming)

Data types not replicated

Geo doesn’t replicate data for the following features:

Feature Reason Tracking issue
Server-side Git hooks Current implementation complexity, low customer interest, and availability of alternatives to hooks. Epic 1867
Elasticsearch Further product discovery is required and Elasticsearch (ES) clusters can be rebuilt. Secondaries use the same ES cluster as the primary. Issue 1186
Exact code search (Zoekt) None Issue 509597
Vulnerability Export Exports are ephemeral and contain sensitive information. They can be regenerated on demand. Epic 3111
Packages NPM metadata cache Would not notably improve disaster recovery capabilities nor response times at secondary sites. Issue 408278
Packages Debian GroupComponentFile None Issue 556945
Packages Debian GroupDistribution None Issue 556947
Packages Debian ProjectDistribution None Issue 556946
Packages RPM RepositoryFile None Issue 379055
VirtualRegistries Maven Cache Entry None Issue 473033
SBOM Vulnerability Scan Data Data is temporary and has a short lifespan with limited impact on disaster recovery capabilities at secondary sites. Issue 398199

  1. Redis replication can be used as part of HA with Redis sentinel. It’s not used between Geo sites. ↩︎

  2. Object storage replication can be performed by Geo or by your object storage provider/appliance native replication feature. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  3. See Object storage verification for information about the feature flag geo_object_storage_verification, which is enabled by default. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎

  4. See Object storage verification for information about the feature flag geo_object_storage_verification, which is enabled by default. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎