Azure 仓库

编辑

你可以使用 Azure Blob 存储 作为 快照和恢复 的仓库。

设置

编辑

要启用 Azure 仓库,首先需要通过指定一个或多个 azure.client.CLIENT_NAME.SETTING_NAME 形式的设置来配置 Azure 仓库客户端。默认情况下,azure 仓库使用名为 default 的客户端,但在注册每个仓库时,你可以指定不同的客户端名称。

唯一强制性的 Azure 仓库客户端设置是 account,它是在 Elasticsearch 密钥库 中定义的 安全设置。 要提供此设置,请在每个节点上使用 elasticsearch-keystore 工具

bin/elasticsearch-keystore add azure.client.default.account

如果在节点启动后调整此设置,请调用 节点重新加载安全设置 API 以重新加载新值。

你可以通过设置它们的 account 值来定义多个客户端。 例如,要设置 default 客户端和另一个名为 secondary 的客户端,请在每个节点上运行以下命令

bin/elasticsearch-keystore add azure.client.default.account
bin/elasticsearch-keystore add azure.client.secondary.account

keysas_token 设置也是安全设置,可以使用如下命令进行设置

bin/elasticsearch-keystore add azure.client.default.key
bin/elasticsearch-keystore add azure.client.secondary.sas_token

其他 Azure 仓库客户端设置必须在节点启动之前在 elasticsearch.yml 中设置。 例如

azure.client.default.timeout: 10s
azure.client.default.max_retries: 7
azure.client.default.endpoint_suffix: core.chinacloudapi.cn
azure.client.secondary.timeout: 30s

在此示例中,客户端超时时间对于使用 default 客户端的仓库来说,每次尝试为 10s,失败前重试 7 次,并且端点后缀为 core.chinacloudapi.cn。使用 secondary 客户端的仓库,每次尝试的超时时间为 30s,但将使用默认端点,并且在默认重试次数后将失败。

正确配置 Azure 仓库客户端后,按如下所示注册一个 Azure 仓库,使用 client 仓库设置 提供客户端名称

resp = client.snapshot.create_repository(
    name="my_backup",
    repository={
        "type": "azure",
        "settings": {
            "client": "secondary"
        }
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_backup",
  repository: {
    type: "azure",
    settings: {
      client: "secondary",
    },
  },
});
console.log(response);
PUT _snapshot/my_backup
{
  "type": "azure",
  "settings": {
    "client": "secondary"
  }
}

如果你正在使用 default 客户端,则可以省略 client 仓库设置

resp = client.snapshot.create_repository(
    name="my_backup",
    repository={
        "type": "azure"
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_backup",
  repository: {
    type: "azure",
  },
});
console.log(response);
PUT _snapshot/my_backup
{
  "type": "azure"
}

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

客户端设置

编辑

以下列表描述了可用的客户端设置。 那些必须存储在密钥库中的设置标记为 (安全, 可重新加载);其他设置必须存储在 elasticsearch.yml 文件中。默认的 CLIENT_NAMEdefault,但你可以使用不同的名称配置一个客户端,并在注册仓库时按名称指定该客户端。

azure.client.CLIENT_NAME.account (安全, 可重新加载)
Azure 帐户名称,仓库的内部 Azure 客户端使用此名称。所有客户端都必须设置此项。
azure.client.CLIENT_NAME.endpoint_suffix
要连接到的 Azure 端点后缀。默认值为 core.windows.net
azure.client.CLIENT_NAME.key (安全, 可重新加载)
Azure 密钥,仓库的内部 Azure 客户端使用此密钥。或者,使用 sas_token
azure.client.CLIENT_NAME.max_retries
当 Azure 请求失败时使用的重试次数。此设置有助于控制指数退避策略。它指定快照失败前必须发生的重试次数。默认值为 3。初始退避时间由 Azure SDK 定义为 30s。因此,在第一次超时或失败后重试之前,有 30s 的等待时间。最大退避时间由 Azure SDK 定义为 90s
azure.client.CLIENT_NAME.proxy.host
用于连接到 Azure 的代理的主机名。默认情况下,不使用代理。
azure.client.CLIENT_NAME.proxy.port
用于连接到 Azure 的代理的端口。默认情况下,不使用代理。
azure.client.CLIENT_NAME.proxy.type
注册客户端的代理类型。支持的值为 directhttpsocks。例如:azure.client.default.proxy.type: http。当 proxy.type 设置为 httpsocks 时,还必须提供 proxy.hostproxy.port。默认值为 direct
azure.client.CLIENT_NAME.sas_token (安全, 可重新加载)
共享访问签名 (SAS) 令牌,仓库的内部 Azure 客户端使用此令牌进行身份验证。SAS 令牌必须具有仓库基本路径及其所有内容的读取 (r)、写入 (w)、列表 (l) 和删除 (d) 权限。必须为 blob 服务 (b) 授予这些权限,并且适用于资源类型服务 (s)、容器 (c) 和对象 (o)。或者,使用 key
azure.client.CLIENT_NAME.timeout
客户端对 Azure 的任何单个请求的超时时间,以 时间单位 表示。例如,值 5s 指定 5 秒的超时时间。没有默认值,这意味着 Elasticsearch 使用 Azure 客户端设置的 默认值
azure.client.CLIENT_NAME.endpoint
要连接到的 Azure 端点。它必须包含用于连接到 Azure 的协议。
azure.client.CLIENT_NAME.secondary_endpoint
要连接到的 Azure 次要端点。它必须包含用于连接到 Azure 的协议。

从环境中获取凭据

如果你没有为客户端指定 keysas_token 设置,那么 Elasticsearch 将尝试使用 Azure SDK 中内置的机制,自动从其运行的环境中获取凭据。这非常适合在 Azure 平台上运行 Elasticsearch 时使用。

Azure 虚拟机 上运行 Elasticsearch 时,应使用 Azure 托管标识 向 Elasticsearch 提供凭据。要使用 Azure 托管标识,请将适当授权的标识分配给运行 Elasticsearch 的 Azure 虚拟机。

例如,当在 Azure Kubernetes Service 中运行 Elasticsearch 时(例如使用 Elastic Cloud on Kubernetes),应使用 Azure 工作负载标识 向 Elasticsearch 提供凭据。要使用 Azure 工作负载标识,请将 azure-identity-token 卷作为 Elasticsearch 配置目录 的子目录挂载,并将 AZURE_FEDERATED_TOKEN_FILE 环境变量设置为指向挂载卷内的名为 azure-identity-token 的文件。

Azure SDK 还有其他几种机制可以自动从其环境中获取凭据,但上面描述的两种方法是唯一经过测试并支持在 Elasticsearch 中使用的方法。

仓库设置

编辑

Azure 仓库支持以下设置,可以在注册 Azure 仓库时指定这些设置,如下所示

resp = client.snapshot.create_repository(
    name="my_backup",
    repository={
        "type": "azure",
        "settings": {
            "client": "secondary",
            "container": "my_container",
            "base_path": "snapshots_prefix"
        }
    },
)
print(resp)
const response = await client.snapshot.createRepository({
  name: "my_backup",
  repository: {
    type: "azure",
    settings: {
      client: "secondary",
      container: "my_container",
      base_path: "snapshots_prefix",
    },
  },
});
console.log(response);
PUT _snapshot/my_backup
{
  "type": "azure",
  "settings": {
    "client": "secondary",
    "container": "my_container",
    "base_path": "snapshots_prefix"
  }
}
client
要使用的 Azure 仓库客户端的名称。默认为 default
container
容器名称。在创建仓库之前,必须先创建 azure 容器。默认为 elasticsearch-snapshots
base_path

指定容器中仓库数据的路径。默认为空(根目录)。

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

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

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

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

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

如果使用多个集群注册同一个快照存储库,则只能有一个集群具有该存储库的写入权限。多个集群同时写入存储库可能会损坏存储库的内容。

location_mode
primary_onlysecondary_only。默认为 primary_only。请注意,如果将其设置为 secondary_only,则会强制 readonly 为 true。

存储库验证规则

编辑

根据容器命名指南,容器名称必须是有效的 DNS 名称,符合以下命名规则

  • 容器名称必须以字母或数字开头,并且只能包含字母、数字和破折号 (-) 字符。
  • 每个破折号 (-) 字符的前后必须紧跟字母或数字;容器名称中不允许使用连续的破折号。
  • 容器名称中的所有字母必须为小写。
  • 容器名称的长度必须在 3 到 63 个字符之间。

支持的 Azure 存储帐户类型

Azure 存储库类型适用于所有标准存储帐户

  • 标准本地冗余存储 - Standard_LRS
  • 标准区域冗余存储 - Standard_ZRS
  • 标准异地冗余存储 - Standard_GRS
  • 标准读取访问异地冗余存储 - Standard_RAGRS

高级本地冗余存储 (Premium_LRS) 不支持,因为它只能用作虚拟机磁盘存储,而不是通用存储。

线性化寄存器实现

编辑

Azure 存储库的线性化寄存器实现基于 Azure 对强一致性租约的支持。每个租约在任何时候只能由单个节点持有。该节点在对受保护的 Blob 执行读取或写入操作时会出示其租约。如果租约无效或过期,受租约保护的操作将失败。为了对寄存器执行比较和交换操作,Elasticsearch 首先获取 Blob 的租约,然后在租约下读取 Blob 内容,最后在同一租约下上传更新后的 Blob。此过程确保读取和写入操作以原子方式发生。