# Geo Nodes API > 原文:[https://docs.gitlab.com/ee/api/geo_nodes.html](https://docs.gitlab.com/ee/api/geo_nodes.html) * [Create a new Geo node](#create-a-new-geo-node) * [Retrieve configuration about all Geo nodes](#retrieve-configuration-about-all-geo-nodes) * [Retrieve configuration about a specific Geo node](#retrieve-configuration-about-a-specific-geo-node) * [Edit a Geo node](#edit-a-geo-node) * [Delete a Geo node](#delete-a-geo-node) * [Repair a Geo node](#repair-a-geo-node) * [Retrieve status about all Geo nodes](#retrieve-status-about-all-geo-nodes) * [Retrieve status about a specific Geo node](#retrieve-status-about-a-specific-geo-node) * [Retrieve project sync or verification failures that occurred on the current node](#retrieve-project-sync-or-verification-failures-that-occurred-on-the-current-node) # Geo Nodes API[](#geo-nodes-api-premium-only "Permalink") 为了与地理节点端点进行交互,您需要以管理员身份进行身份验证. ## Create a new Geo node[](#create-a-new-geo-node "Permalink") 创建一个新的地理节点. ``` POST /geo_nodes ``` ``` curl --header "PRIVATE-TOKEN: " "https://primary.example.com/api/v4/geo_nodes" \ --request POST \ -d "name=himynameissomething" \ -d "url=https://another-node.example.com/" ``` | Attribute | Type | Required | Description | | --- | --- | --- | --- | | `primary` | boolean | no | 指定此节点是否为主节点. 默认为 false. | | `enabled` | boolean | no | 指示是否启用地理节点的标志. 默认为 true. | | `name` | string | yes | 地理节点的唯一标识符. 必须匹配`geo_node_name`如果在设定`gitlab.rb` ,否则必须匹配`external_url` | | `url` | string | yes | Geo 节点的面向用户的 URL. | | `internal_url` | string | no | 在主节点上定义的 URL,辅助节点应使用该 URL 与之联系. 如果未设置,则返回`url` . | | `files_max_capacity` | integer | no | 控制此辅助节点的 LFS /附件回填的最大并发性. 默认为 10 | | `repos_max_capacity` | integer | no | 控制此辅助节点的存储库回填的最大并发性. 默认为 25. | | `verification_max_capacity` | integer | no | 控制此节点的存储库验证的最大并发性. 默认为 100. | | `container_repositories_max_capacity` | integer | no | 控制此节点的容器存储库同步的最大并发性. 默认为 10 | | `sync_object_storage` | boolean | no | 指示辅助 Geo 节点是否将复制对象存储中的 Blob 的标志. 默认为 false. | | `selective_sync_type` | string | no | Limit syncing to only specific groups or shards. Valid values: `"namespaces"`, `"shards"`, or `null`. | | `selective_sync_shards` | array | no | 如果`selective_sync_type` == `shards` ,则同步项目的存储库存储. | | `selective_sync_namespace_ids` | array | no | 如果`selective_sync_type` == `namespaces` ,则应同步的组的 ID. | | `minimum_reverification_interval` | integer | no | 存储库验证有效的时间间隔(以天为单位). 一旦过期,它将被重新验证. 在辅助节点上进行设置时,这无效. | 响应示例: ``` { "id": 3, "name": "Test Node 1", "url": "https://secondary.example.com/", "internal_url": "https://secondary.example.com/", "primary": false, "enabled": true, "current": false, "files_max_capacity": 10, "repos_max_capacity": 25, "verification_max_capacity": 100, "selective_sync_type": "namespaces", "selective_sync_shards": [], "selective_sync_namespace_ids": [1, 25], "minimum_reverification_interval": 7, "container_repositories_max_capacity": 10, "sync_object_storage": false, "clone_protocol": "http", "web_edit_url": "https://primary.example.com/admin/geo/nodes/3/edit", "web_geo_projects_url": "http://secondary.example.com/admin/geo/projects", "_links": { "self": "https://primary.example.com/api/v4/geo_nodes/3", "status": "https://primary.example.com/api/v4/geo_nodes/3/status", "repair": "https://primary.example.com/api/v4/geo_nodes/3/repair" } } ``` ## Retrieve configuration about all Geo nodes[](#retrieve-configuration-about-all-geo-nodes "Permalink") ``` GET /geo_nodes ``` ``` curl --header "PRIVATE-TOKEN: " "https://primary.example.com/api/v4/geo_nodes" ``` 响应示例: ``` [ { "id": 1, "name": "us-node", "url": "https://primary.example.com/", "internal_url": "https://internal.example.com/", "primary": true, "enabled": true, "current": true, "files_max_capacity": 10, "repos_max_capacity": 25, "container_repositories_max_capacity": 10, "verification_max_capacity": 100, "selective_sync_type": "namespaces", "selective_sync_shards": [], "selective_sync_namespace_ids": [1, 25], "minimum_reverification_interval": 7, "clone_protocol": "http", "web_edit_url": "https://primary.example.com/admin/geo/nodes/1/edit", "_links": { "self": "https://primary.example.com/api/v4/geo_nodes/1", "status":"https://primary.example.com/api/v4/geo_nodes/1/status", "repair":"https://primary.example.com/api/v4/geo_nodes/1/repair" } }, { "id": 2, "name": "cn-node", "url": "https://secondary.example.com/", "internal_url": "https://secondary.example.com/", "primary": false, "enabled": true, "current": false, "files_max_capacity": 10, "repos_max_capacity": 25, "container_repositories_max_capacity": 10, "verification_max_capacity": 100, "selective_sync_type": "namespaces", "selective_sync_shards": [], "selective_sync_namespace_ids": [1, 25], "minimum_reverification_interval": 7, "sync_object_storage": true, "clone_protocol": "http", "web_edit_url": "https://primary.example.com/admin/geo/nodes/2/edit", "web_geo_projects_url": "https://secondary.example.com/admin/geo/projects", "_links": { "self":"https://primary.example.com/api/v4/geo_nodes/2", "status":"https://primary.example.com/api/v4/geo_nodes/2/status", "repair":"https://primary.example.com/api/v4/geo_nodes/2/repair" } } ] ``` ## Retrieve configuration about a specific Geo node[](#retrieve-configuration-about-a-specific-geo-node "Permalink") ``` GET /geo_nodes/:id ``` ``` curl --header "PRIVATE-TOKEN: " "https://primary.example.com/api/v4/geo_nodes/1" ``` 响应示例: ``` { "id": 1, "name": "us-node", "url": "https://primary.example.com/", "internal_url": "https://primary.example.com/", "primary": true, "enabled": true, "current": true, "files_max_capacity": 10, "repos_max_capacity": 25, "container_repositories_max_capacity": 10, "verification_max_capacity": 100, "selective_sync_type": "namespaces", "selective_sync_shards": [], "selective_sync_namespace_ids": [1, 25], "minimum_reverification_interval": 7, "clone_protocol": "http", "web_edit_url": "https://primary.example.com/admin/geo/nodes/1/edit", "_links": { "self": "https://primary.example.com/api/v4/geo_nodes/1", "status":"https://primary.example.com/api/v4/geo_nodes/1/status", "repair":"https://primary.example.com/api/v4/geo_nodes/1/repair" } } ``` ## Edit a Geo node[](#edit-a-geo-node "Permalink") 更新现有地理节点的设置. *这只能在主要的地理节点上运行.* ``` PUT /geo_nodes/:id ``` | Attribute | Type | Required | Description | | --- | --- | --- | --- | | `id` | integer | yes | 地理位置节点的 ID. | | `enabled` | boolean | no | 指示是否启用地理节点的标志. | | `name` | string | yes | 地理节点的唯一标识符. 必须匹配`geo_node_name`如果在设定`gitlab.rb` ,否则必须匹配`external_url` . | | `url` | string | yes | Geo 节点的面向用户的 URL. | | `internal_url` | string | no | 在主节点上定义的 URL,辅助节点应使用该 URL 与之联系. 如果未设置,则返回`url` . | | `files_max_capacity` | integer | no | 控制此辅助节点的 LFS /附件回填的最大并发性. | | `repos_max_capacity` | integer | no | 控制此辅助节点的存储库回填的最大并发性. | | `verification_max_capacity` | integer | no | 控制此节点的最大并发验证. | | `container_repositories_max_capacity` | integer | no | 控制此节点的容器存储库同步的最大并发性. | | `sync_object_storage` | boolean | no | 指示辅助 Geo 节点是否将复制对象存储中的 Blob 的标志. | | `selective_sync_type` | string | no | 将同步限制为仅特定的组或碎片. 有效值: `"namespaces"` , `"shards"`或`null` . | | `selective_sync_shards` | array | no | 如果`selective_sync_type` == `shards` ,则同步项目的存储库存储. | | `selective_sync_namespace_ids` | array | no | 如果`selective_sync_type` == `namespaces` ,则应同步的组的 ID. | | `minimum_reverification_interval` | integer | no | 存储库验证有效的时间间隔(以天为单位). 一旦过期,它将被重新验证. 在辅助节点上进行设置时,这无效. | 响应示例: ``` { "id": 1, "name": "cn-node", "url": "https://secondary.example.com/", "internal_url": "https://secondary.example.com/", "primary": false, "enabled": true, "current": true, "files_max_capacity": 10, "repos_max_capacity": 25, "container_repositories_max_capacity": 10, "verification_max_capacity": 100, "selective_sync_type": "namespaces", "selective_sync_shards": [], "selective_sync_namespace_ids": [1, 25], "minimum_reverification_interval": 7, "sync_object_storage": true, "clone_protocol": "http", "web_edit_url": "https://primary.example.com/admin/geo/nodes/2/edit", "web_geo_projects_url": "https://secondary.example.com/admin/geo/projects", "_links": { "self":"https://primary.example.com/api/v4/geo_nodes/2", "status":"https://primary.example.com/api/v4/geo_nodes/2/status", "repair":"https://primary.example.com/api/v4/geo_nodes/2/repair" } } ``` ## Delete a Geo node[](#delete-a-geo-node "Permalink") 删除地理节点. **注意:**只有 Geo 主节点将接受此请求. ``` DELETE /geo_nodes/:id ``` | Attribute | Type | Required | Description | | --- | --- | --- | --- | | `id` | integer | yes | 地理位置节点的 ID. | ## Repair a Geo node[](#repair-a-geo-node "Permalink") 修复地理节点的 OAuth 身份验证. *这只能在主要的地理节点上运行.* ``` POST /geo_nodes/:id/repair ``` 响应示例: ``` { "id": 1, "name": "us-node", "url": "https://primary.example.com/", "internal_url": "https://primary.example.com/", "primary": true, "enabled": true, "current": true, "files_max_capacity": 10, "repos_max_capacity": 25, "container_repositories_max_capacity": 10, "verification_max_capacity": 100, "clone_protocol": "http", "web_edit_url": "https://primary.example.com/admin/geo/nodes/1/edit", "_links": { "self": "https://primary.example.com/api/v4/geo_nodes/1", "status":"https://primary.example.com/api/v4/geo_nodes/1/status", "repair":"https://primary.example.com/api/v4/geo_nodes/1/repair" } } ``` ## Retrieve status about all Geo nodes[](#retrieve-status-about-all-geo-nodes "Permalink") ``` GET /geo_nodes/status ``` ``` curl --header "PRIVATE-TOKEN: " "https://primary.example.com/api/v4/geo_nodes/status" ``` 响应示例: ``` [ { "geo_node_id": 1, "healthy": true, "health": "Healthy", "health_status": "Healthy", "missing_oauth_application": false, "attachments_count": 1, "attachments_synced_count": nil, "attachments_failed_count": nil, "attachments_synced_missing_on_primary_count": 0, "attachments_synced_in_percentage": "0.00%", "db_replication_lag_seconds": nil, "lfs_objects_count": 0, "lfs_objects_synced_count": nil, "lfs_objects_failed_count": nil, "lfs_objects_synced_missing_on_primary_count": 0, "lfs_objects_synced_in_percentage": "0.00%", "job_artifacts_count": 2, "job_artifacts_synced_count": nil, "job_artifacts_failed_count": nil, "job_artifacts_synced_missing_on_primary_count": 0, "job_artifacts_synced_in_percentage": "0.00%", "container_repositories_count": 3, "container_repositories_synced_count": nil, "container_repositories_failed_count": nil, "container_repositories_synced_in_percentage": "0.00%", "design_repositories_count": 3, "design_repositories_synced_count": nil, "design_repositories_failed_count": nil, "design_repositories_synced_in_percentage": "0.00%", "projects_count": 41, "repositories_failed_count": nil, "repositories_synced_count": nil, "repositories_synced_in_percentage": "0.00%", "wikis_failed_count": nil, "wikis_synced_count": nil, "wikis_synced_in_percentage": "0.00%", "replication_slots_count": 1, "replication_slots_used_count": 1, "replication_slots_used_in_percentage": "100.00%", "replication_slots_max_retained_wal_bytes": 0, "repositories_checked_count": 20, "repositories_checked_failed_count": 20, "repositories_checked_in_percentage": "100.00%", "repositories_checksummed_count": 20, "repositories_checksum_failed_count": 5, "repositories_checksummed_in_percentage": "48.78%", "wikis_checksummed_count": 10, "wikis_checksum_failed_count": 3, "wikis_checksummed_in_percentage": "24.39%", "repositories_verified_count": 20, "repositories_verification_failed_count": 5, "repositories_verified_in_percentage": "48.78%", "repositories_checksum_mismatch_count": 3, "wikis_verified_count": 10, "wikis_verification_failed_count": 3, "wikis_verified_in_percentage": "24.39%", "wikis_checksum_mismatch_count": 1, "repositories_retrying_verification_count": 1, "wikis_retrying_verification_count": 3, "repositories_checked_count": 7, "repositories_checked_failed_count": 2, "repositories_checked_in_percentage": "17.07%", "last_event_id": 23, "last_event_timestamp": 1509681166, "cursor_last_event_id": nil, "cursor_last_event_timestamp": 0, "last_successful_status_check_timestamp": 1510125024, "version": "10.3.0", "revision": "33d33a096a", "package_files_count": 10, "package_files_checksummed_count": 10, "package_files_checksum_failed_count": 0, "package_files_registry_count": 10, "package_files_synced_count": 6, "package_files_failed_count": 3 }, { "geo_node_id": 2, "healthy": true, "health": "Healthy", "health_status": "Healthy", "missing_oauth_application": false, "attachments_count": 1, "attachments_synced_count": 1, "attachments_failed_count": 0, "attachments_synced_missing_on_primary_count": 0, "attachments_synced_in_percentage": "100.00%", "db_replication_lag_seconds": 0, "lfs_objects_count": 0, "lfs_objects_synced_count": 0, "lfs_objects_failed_count": 0, "lfs_objects_synced_missing_on_primary_count": 0, "lfs_objects_synced_in_percentage": "0.00%", "job_artifacts_count": 2, "job_artifacts_synced_count": 1, "job_artifacts_failed_count": 1, "job_artifacts_synced_missing_on_primary_count": 0, "job_artifacts_synced_in_percentage": "50.00%", "container_repositories_count": 3, "container_repositories_synced_count": nil, "container_repositories_failed_count": nil, "container_repositories_synced_in_percentage": "0.00%", "design_repositories_count": 3, "design_repositories_synced_count": nil, "design_repositories_failed_count": nil, "design_repositories_synced_in_percentage": "0.00%", "projects_count": 41, "repositories_failed_count": 1, "repositories_synced_count": 40, "repositories_synced_in_percentage": "97.56%", "wikis_failed_count": 0, "wikis_synced_count": 41, "wikis_synced_in_percentage": "100.00%", "replication_slots_count": nil, "replication_slots_used_count": nil, "replication_slots_used_in_percentage": "0.00%", "replication_slots_max_retained_wal_bytes": nil, "repositories_checksummed_count": 20, "repositories_checksum_failed_count": 5, "repositories_checksummed_in_percentage": "48.78%", "wikis_checksummed_count": 10, "wikis_checksum_failed_count": 3, "wikis_checksummed_in_percentage": "24.39%", "repositories_verified_count": 20, "repositories_verification_failed_count": 5, "repositories_verified_in_percentage": "48.78%", "repositories_checksum_mismatch_count": 3, "wikis_verified_count": 10, "wikis_verification_failed_count": 3, "wikis_verified_in_percentage": "24.39%", "wikis_checksum_mismatch_count": 1, "repositories_retrying_verification_count": 4, "wikis_retrying_verification_count": 2, "repositories_checked_count": 5, "repositories_checked_failed_count": 1, "repositories_checked_in_percentage": "12.20%", "last_event_id": 23, "last_event_timestamp": 1509681166, "cursor_last_event_id": 23, "cursor_last_event_timestamp": 1509681166, "last_successful_status_check_timestamp": 1510125024, "version": "10.3.0", "revision": "33d33a096a", "package_files_count": 10, "package_files_checksummed_count": 10, "package_files_checksum_failed_count": 0, "package_files_registry_count": 10, "package_files_synced_count": 6, "package_files_failed_count": 3 } ] ``` **注意:**在 GitLab 12.0 中,已弃用的字段`wikis_count`和`repositories_count`被删除. 请改用`projects_count` . ## Retrieve status about a specific Geo node[](#retrieve-status-about-a-specific-geo-node "Permalink") ``` GET /geo_nodes/:id/status ``` ``` curl --header "PRIVATE-TOKEN: " "https://primary.example.com/api/v4/geo_nodes/2/status" ``` 响应示例: ``` { "geo_node_id": 2, "healthy": true, "health": "Healthy", "health_status": "Healthy", "missing_oauth_application": false, "attachments_count": 1, "attachments_synced_count": 1, "attachments_failed_count": 0, "attachments_synced_missing_on_primary_count": 0, "attachments_synced_in_percentage": "100.00%", "db_replication_lag_seconds": 0, "lfs_objects_count": 0, "lfs_objects_synced_count": 0, "lfs_objects_failed_count": 0, "lfs_objects_synced_missing_on_primary_count": 0, "lfs_objects_synced_in_percentage": "0.00%", "job_artifacts_count": 2, "job_artifacts_synced_count": 1, "job_artifacts_failed_count": 1, "job_artifacts_synced_missing_on_primary_count": 0, "job_artifacts_synced_in_percentage": "50.00%", "container_repositories_count": 3, "container_repositories_synced_count": nil, "container_repositories_failed_count": nil, "container_repositories_synced_in_percentage": "0.00%", "design_repositories_count": 3, "design_repositories_synced_count": nil, "design_repositories_failed_count": nil, "design_repositories_synced_in_percentage": "0.00%", "projects_count": 41, "repositories_failed_count": 1, "repositories_synced_count": 40, "repositories_synced_in_percentage": "97.56%", "wikis_failed_count": 0, "wikis_synced_count": 41, "wikis_synced_in_percentage": "100.00%", "replication_slots_count": nil, "replication_slots_used_count": nil, "replication_slots_used_in_percentage": "0.00%", "replication_slots_max_retained_wal_bytes": nil, "last_event_id": 23, "last_event_timestamp": 1509681166, "cursor_last_event_id": 23, "cursor_last_event_timestamp": 1509681166, "last_successful_status_check_timestamp": 1510125268, "version": "10.3.0", "revision": "33d33a096a" } ``` 注意: `health_status`参数只能处于"健康"或"不健康"状态,而`health`参数可以为空,"健康"或包含实际错误消息. **注意:**在 GitLab 12.0 中,已弃用的字段`wikis_count`和`repositories_count`被删除. 请改用`projects_count` . ## Retrieve project sync or verification failures that occurred on the current node[](#retrieve-project-sync-or-verification-failures-that-occurred-on-the-current-node "Permalink") 这仅适用于辅助节点. ``` GET /geo_nodes/current/failures ``` | Attribute | Type | Required | Description | | --- | --- | --- | --- | | `type` | string | no | 失败对象的类型( `repository` / `wiki` ) | | `failure_type` | string | no | 故障类型( `sync` / `checksum_mismatch` / `verification` ) | 该端点使用[分页](README.html#pagination) . ``` curl --header "PRIVATE-TOKEN: " "https://primary.example.com/api/v4/geo_nodes/current/failures" ``` 响应示例: ``` [ { "project_id": 3, "last_repository_synced_at": "2017-10-31 14:25:55 UTC", "last_repository_successful_sync_at": "2017-10-31 14:26:04 UTC", "last_wiki_synced_at": "2017-10-31 14:26:04 UTC", "last_wiki_successful_sync_at": "2017-10-31 14:26:11 UTC", "repository_retry_count": null, "wiki_retry_count": 1, "last_repository_sync_failure": null, "last_wiki_sync_failure": "Error syncing Wiki repository", "last_repository_verification_failure": "", "last_wiki_verification_failure": "", "repository_verification_checksum_sha": "da39a3ee5e6b4b0d32e5bfef9a601890afd80709", "wiki_verification_checksum_sha": "da39a3ee5e6b4b0d3255bfef9ef0189aafd80709", "repository_checksum_mismatch": false, "wiki_checksum_mismatch": false } ] ```