Azure 存储库编辑

您可以使用 Azure Blob 存储 作为 快照/恢复 的存储库。

设置编辑

要启用 Azure 存储库,您必须先将 Azure 存储设置定义为 安全设置

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

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

请注意,您还可以定义多个帐户

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

有关这些设置的更多信息,请参阅 客户端设置

支持的 Azure 存储帐户类型

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

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

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

客户端设置编辑

您用来连接到 Azure 的客户端有许多可用的设置。这些设置的格式为 azure.client.CLIENT_NAME.SETTING_NAME。默认情况下,azure 存储库使用名为 default 的客户端,但这可以使用 存储库设置 client 进行修改。例如

PUT _snapshot/my_backup
{
  "type": "azure",
  "settings": {
    "client": "secondary"
  }
}

大多数客户端设置都可以添加到 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 帐户的客户端超时为每次尝试 10 秒,在失败之前重试 7 次。端点后缀为 core.chinacloudapi.cnsecondary 帐户的客户端超时为每次尝试 30 秒,在失败之前重试 3 次。

accountkeysas_token 存储设置是可重新加载的安全设置,您可以将它们添加到 Elasticsearch 密钥库中。有关创建和更新 Elasticsearch 密钥库的更多信息,请参阅 安全设置。重新加载设置后,用于传输快照的内部 Azure 客户端将使用密钥库中的最新设置。

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

以下列表包含可用的客户端设置。必须存储在密钥库中的设置标记为“安全”;其他设置属于 elasticsearch.yml 文件。

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

存储库设置编辑

Azure 存储库支持以下设置

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。

一些使用脚本的示例

# The simplest one
PUT _snapshot/my_backup1
{
  "type": "azure"
}

# With some settings
PUT _snapshot/my_backup2
{
  "type": "azure",
  "settings": {
    "container": "backup-container",
    "base_path": "backups",
    "chunk_size": "32MB",
    "compress": true
  }
}


# With two accounts defined in elasticsearch.yml (my_account1 and my_account2)
PUT _snapshot/my_backup3
{
  "type": "azure",
  "settings": {
    "client": "secondary"
  }
}
PUT _snapshot/my_backup4
{
  "type": "azure",
  "settings": {
    "client": "secondary",
    "location_mode": "primary_only"
  }
}

使用 Java 的示例

client.admin().cluster().preparePutRepository("my_backup_java1")
    .setType("azure").setSettings(Settings.builder()
        .put(Storage.CONTAINER, "backup-container")
        .put(Storage.CHUNK_SIZE, new ByteSizeValue(32, ByteSizeUnit.MB))
    ).get();

存储库验证规则编辑

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

  • 容器名称必须以字母或数字开头,并且只能包含字母、数字和短划线 (-) 字符。
  • 每个短划线 (-) 字符前后必须紧跟一个字母或数字;容器名称中不允许出现连续的短划线。
  • 容器名称中的所有字母必须为小写。
  • 容器名称的长度必须为 3 到 63 个字符。

线性化寄存器实现编辑

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