Google Cloud Storage 存储库

编辑

您可以使用 Google Cloud Storage 服务作为 快照/恢复 的存储库。

入门

编辑

此存储库类型使用 Google Cloud Java 存储客户端 连接到存储服务。如果您是第一次使用 Google Cloud Storage,则必须连接到 Google Cloud Platform 控制台 并创建一个新项目。创建项目后,必须为您的项目启用 Cloud Storage 服务。

创建存储桶

编辑

Google Cloud Storage 服务使用 存储桶 的概念作为所有数据的容器。存储桶通常使用 Google Cloud Platform 控制台 创建。此存储库类型不会自动创建存储桶。

要创建新的存储桶

  1. 连接到 Google Cloud Platform 控制台
  2. 选择您的项目。
  3. 转到 存储浏览器
  4. 单击 创建存储桶 按钮。
  5. 输入新存储桶的名称。
  6. 选择存储类别。
  7. 选择一个位置。
  8. 单击 创建 按钮。

有关更详细的说明,请参阅 Google Cloud 文档

服务认证

编辑

存储库必须对它向 Google Cloud Storage 服务发出的请求进行身份验证。Google 客户端库通常采用名为 应用程序默认凭据 的策略。但是,Elasticsearch 仅 部分支持 该策略。存储库在启用了安全管理器的 Elasticsearch 进程下运行。安全管理器在使用环境变量 GOOGLE_APPLICATION_CREDENTIALS 指向磁盘上的本地文件时,会阻止“自动”凭据发现。但是,它可以检索附加到运行 Elasticsearch 的资源的服务帐户,或回退到 Compute Engine、Kubernetes Engine 或 App Engine 提供的默认服务帐户。或者,如果您使用的环境不支持自动凭据发现,则必须配置 服务帐户 凭据。

使用服务帐户

编辑

您必须手动获取并提供 服务帐户凭据

有关生成 JSON 服务帐户文件的详细信息,请参阅 Google Cloud 文档。请注意,此存储库类型不支持 PKCS12 格式。

以下是步骤摘要

  1. 连接到 Google Cloud Platform 控制台
  2. 选择您的项目。
  3. 选择 服务帐户 选项卡。
  4. 单击 创建服务帐户
  5. 创建帐户后,选择它并转到 密钥
  6. 选择 添加密钥,然后选择 创建新密钥
  7. 选择密钥类型 JSON,因为不支持 P12。

JSON 服务帐户文件如下所示

{
  "type": "service_account",
  "project_id": "your-project-id",
  "private_key_id": "...",
  "private_key": "-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n",
  "client_email": "service-account-for-your-repository@your-project-id.iam.gserviceaccount.com",
  "client_id": "...",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://accounts.google.com/o/oauth2/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/[email protected]"
}

要将此文件提供给存储库,它必须存储在 Elasticsearch 密钥存储 中。您必须使用 add-file 子命令添加名为 gcs.client.NAME.credentials_filefile 设置。 NAME 是存储库的客户端配置的名称。隐式客户端名称为 default,但在存储库设置中可以使用 client 密钥指定不同的客户端名称。

通过 GOOGLE_APPLICATION_CREDENTIALS 环境变量传递文件路径 不支持

例如,如果您在密钥存储中添加了 gcs.client.my_alternate_client.credentials_file 设置,则可以像这样配置存储库以使用这些凭据

resp = client.snapshot.create_repository(
    name="my_gcs_repository",
    repository={
        "type": "gcs",
        "settings": {
            "bucket": "my_bucket",
            "client": "my_alternate_client"
        }
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_gcs_repository",
  repository: {
    type: "gcs",
    settings: {
      bucket: "my_bucket",
      client: "my_alternate_client",
    },
  },
});
console.log(response);
PUT _snapshot/my_gcs_repository
{
  "type": "gcs",
  "settings": {
    "bucket": "my_bucket",
    "client": "my_alternate_client"
  }
}

credentials_file 设置是 可重新加载的。您可以在节点启动之前定义这些设置,或者在定义设置后调用 节点重新加载安全设置 API 以将其应用于正在运行的节点。

重新加载设置后,用于传输快照内容的内部 gcs 客户端将利用密钥存储中的最新设置。

正在进行的快照或恢复作业不会因客户端 credentials_file 设置的 重新加载 而被抢占。它们使用在操作开始时构建的客户端完成。

客户端设置

编辑

用于连接到 Google Cloud Storage 的客户端有许多可用的设置。客户端设置名称采用 gcs.client.CLIENT_NAME.SETTING_NAME 的形式,并在 elasticsearch.yml 中指定。 gcs 存储库查找的默认客户端名称称为 default,但可以使用存储库设置 client 进行自定义。

例如

resp = client.snapshot.create_repository(
    name="my_gcs_repository",
    repository={
        "type": "gcs",
        "settings": {
            "bucket": "my_bucket",
            "client": "my_alternate_client"
        }
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_gcs_repository",
  repository: {
    type: "gcs",
    settings: {
      bucket: "my_bucket",
      client: "my_alternate_client",
    },
  },
});
console.log(response);
PUT _snapshot/my_gcs_repository
{
  "type": "gcs",
  "settings": {
    "bucket": "my_bucket",
    "client": "my_alternate_client"
  }
}

某些设置很敏感,必须存储在 Elasticsearch 密钥存储 中。服务帐户文件就是这种情况

bin/elasticsearch-keystore add-file gcs.client.default.credentials_file /path/service-account.json

以下是可用的客户端设置。必须存储在密钥存储中的设置标记为 Secure

credentials_file (Secure可重新加载的)
用于对 Google Cloud Storage 服务进行身份验证的服务帐户文件。
endpoint
要连接到的 Google Cloud Storage 服务端点。这将由 Google Cloud Storage 客户端自动确定,但可以显式指定。
connect_timeout
建立与 Google Cloud Storage 服务的连接的超时时间。该值应指定单位。例如,值 5s 指定 5 秒的超时时间。值 -1 对应于无限超时。默认值为 20 秒。
read_timeout
从已建立的连接读取数据的超时时间。该值应指定单位。例如,值 5s 指定 5 秒的超时时间。值 -1 对应于无限超时。默认值为 20 秒。
application_name
客户端在使用 Google Cloud Storage 服务时使用的名称。设置自定义名称对于在 Google Cloud Platform 中记录请求统计信息时对您的集群进行身份验证很有用。默认为 repository-gcs
project_id
Google Cloud 项目 ID。这将从凭据文件自动推断,但可以显式指定。例如,它可以用于在同一凭据可用于生产和开发项目时在项目之间切换。
proxy.host
要通过其连接到 Google Cloud Storage 的代理的主机名。
proxy.port
要通过其连接到 Google Cloud Storage 的代理的端口。
proxy.type
客户端的代理类型。支持的值为 direct(无代理)、httpsocks。默认为 direct

存储库设置

编辑

gcs 存储库类型支持许多设置来自定义如何在 Google Cloud Storage 中存储数据。

这些可以在创建存储库时指定。例如

resp = client.snapshot.create_repository(
    name="my_gcs_repository",
    repository={
        "type": "gcs",
        "settings": {
            "bucket": "my_other_bucket",
            "base_path": "dev"
        }
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_gcs_repository",
  repository: {
    type: "gcs",
    settings: {
      bucket: "my_other_bucket",
      base_path: "dev",
    },
  },
});
console.log(response);
PUT _snapshot/my_gcs_repository
{
  "type": "gcs",
  "settings": {
    "bucket": "my_other_bucket",
    "base_path": "dev"
  }
}

支持以下设置

bucket
要用于快照的存储桶的名称。(必填)
client
要用于连接到 Google Cloud Storage 的客户端的名称。默认为 default
base_path

指定存储桶中存储库数据的路径。默认为存储桶的根目录。

配置 Elastic Cloud Enterprise 的快照存储库时,不要设置 base_path。Elastic Cloud Enterprise 会自动为每个部署生成 base_path,以便多个部署可以共享同一个存储桶。

chunk_size
在快照过程中,大型文件可以分解成 blob 存储中的多个较小的 blob。除非有明确的理由限制存储库中 blob 的大小,否则不建议更改此值的默认值。与使用默认值相比,设置低于默认值的值会导致在创建快照和恢复操作期间向 Google Cloud Storage 服务发出更多 API 调用,从而使这两个操作都更慢且成本更高。将块大小指定为值和单位,例如:10MB5KB500B。默认为 Google Cloud Storage 服务中 blob 的最大大小,即 5TB
compress
设置为 true 时,元数据文件将以压缩格式存储。此设置不影响默认情况下已压缩的索引文件。默认为 true
max_restore_bytes_per_sec
(可选,字节值)每个节点的最大快照恢复速率。默认为无限制。请注意,恢复也通过 恢复设置 进行限制。
max_snapshot_bytes_per_sec

(可选,字节值) 每个节点的最大快照创建速率。默认为每秒 40mb。请注意,如果设置了托管服务的恢复设置,则默认为无限,并且速率还会通过恢复设置进行限制。
只读

(可选,布尔值) 如果 true,则存储库为只读。集群可以从存储库检索和恢复快照,但不能写入存储库或在其中创建快照。

只有具有写入权限的集群才能在存储库中创建快照。连接到存储库的所有其他集群都应将 readonly 参数设置为 true

如果 false,则集群可以写入存储库并在其中创建快照。默认为 false

如果将同一个快照存储库注册到多个集群,则只有一个集群应该具有对存储库的写入权限。多个集群同时写入存储库存在损坏存储库内容的风险。

application_name
[6.3.0] 已在 6.3.0 中弃用。此设置现在在客户端设置中定义。 客户端使用 Google Cloud Storage 服务时使用的名称。

推荐的存储桶权限

编辑

用于访问存储桶的服务帐户必须对存储桶具有“写入者”权限。

  1. 连接到 Google Cloud Platform 控制台
  2. 选择您的项目。
  3. 转到 存储浏览器
  4. 选择存储桶并“编辑存储桶权限”。
  5. 服务帐户必须配置为具有“写入者”权限的“用户”。

线性化寄存器实现

编辑

GCS 存储库的线性化寄存器实现基于 GCS 对 put-blob 操作的强一致性前提条件的支持。要对寄存器执行比较并交换操作,Elasticsearch 会检索寄存器 blob 及其当前生成,然后使用观察到的生成作为其前提条件上传更新后的 blob。前提条件确保在此期间生成没有更改。