其他集群设置编辑

元数据编辑

可以使用以下设置将整个集群设置为只读

cluster.blocks.read_only
(动态) 使整个集群变为只读(索引不接受写操作),不允许修改元数据(创建或删除索引)。
cluster.blocks.read_only_allow_delete
(动态) 与 cluster.blocks.read_only 相同,但允许删除索引以释放资源。

不要依赖此设置来防止对集群的更改。任何有权访问 集群更新设置 API 的用户都可以使集群再次变为可读写。

集群分片限制编辑

集群中的分片数量有限制,具体取决于集群中的节点数量。这是为了防止失控进程创建过多分片,这会损害性能,在极端情况下可能会破坏集群的稳定性。

这些限制旨在作为安全网,以防止失控的分片创建,而不是规模建议。集群可以安全支持的确切分片数量取决于硬件配置和工作负载,并且可能小于默认限制。

我们不建议将这些限制增加到默认值以上。具有更多分片的集群在正常操作中可能看起来运行良好,但从临时中断(例如网络分区或意外节点重启)中恢复可能需要很长时间,并且在执行维护活动(例如滚动重启或升级)时可能会遇到问题。

如果某个操作(例如创建新索引、还原索引快照或打开已关闭的索引)会导致集群中的分片数量超过此限制,则该操作将失败,并显示指示分片限制的错误。要解决此问题,请通过添加节点来扩展集群,或 删除一些索引 以使分片数量低于限制。

如果集群已经超过限制(可能是由于节点成员资格或设置更改),则所有创建或打开索引的操作都将失败。

集群分片限制默认为每个非冻结数据节点 1000 个分片(用于正常(非冻结)索引),每个冻结数据节点 3000 个分片(用于冻结索引)。所有打开索引的主分片和副本分片(包括未分配的分片)都计入限制。例如,具有 5 个主分片和 2 个副本的打开索引计为 15 个分片。已关闭的索引不计入分片计数。

您可以使用以下设置动态调整集群分片限制

cluster.max_shards_per_node

(动态) 限制集群的主分片和副本分片的总数。Elasticsearch 按如下方式计算限制

cluster.max_shards_per_node * 非冻结数据节点数

已关闭索引的分片不计入此限制。默认为 1000。没有数据节点的集群不受限制。

Elasticsearch 会拒绝任何创建超过此限制允许的分片的请求。例如,cluster.max_shards_per_node 设置为 100 且具有三个数据节点的集群的分片限制为 300。如果集群已经包含 296 个分片,则 Elasticsearch 会拒绝任何向集群添加五个或更多分片的请求。

请注意,如果将 cluster.max_shards_per_node 设置为高于默认值的值,则 mmap 计数打开文件描述符 的限制可能也需要调整。

请注意,冻结分片有其独立的限制。

cluster.max_shards_per_node.frozen

(动态) 限制集群的主分片和副本冻结分片的总数。Elasticsearch 按如下方式计算限制

cluster.max_shards_per_node.frozen * 冻结数据节点数

已关闭索引的分片不计入此限制。默认为 3000。没有冻结数据节点的集群不受限制。

Elasticsearch 会拒绝任何创建超过此限制允许的冻结分片的请求。例如,cluster.max_shards_per_node.frozen 设置为 100 且具有三个冻结数据节点的集群的冻结分片限制为 300。如果集群已经包含 296 个分片,则 Elasticsearch 会拒绝任何向集群添加五个或更多冻结分片的请求。

这些限制仅适用于创建分片的动作,不限制分配给每个节点的分片数量。要限制分配给每个节点的分片数量,请使用 cluster.routing.allocation.total_shards_per_node 设置。

用户定义的集群元数据编辑

可以使用集群设置 API 存储和检索用户定义的元数据。这可用于存储有关集群的任意、不经常更改的数据,而无需创建索引来存储它。可以使用任何以 cluster.metadata. 为前缀的键来存储此数据。例如,要将集群管理员的电子邮件地址存储在键 cluster.metadata.administrator 下,请发出此请求

resp = client.cluster.put_settings(
    body={
        "persistent": {
            "cluster.metadata.administrator": "[email protected]"
        }
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'cluster.metadata.administrator' => '[email protected]'
    }
  }
)
puts response
PUT /_cluster/settings
{
  "persistent": {
    "cluster.metadata.administrator": "[email protected]"
  }
}

用户定义的集群元数据不用于存储敏感或机密信息。存储在用户定义的集群元数据中的任何信息都可供任何有权访问 集群获取设置 API 的人查看,并记录在 Elasticsearch 日志中。

索引墓碑编辑

集群状态维护索引墓碑以明确表示已删除的索引。集群状态中维护的墓碑数量由以下设置控制

cluster.indices.tombstones.size
(静态) 索引墓碑可防止在发生删除时不属于集群的节点加入集群并重新导入索引,就好像从未发出过删除一样。为了防止集群状态变得过大,我们只保留最后 cluster.indices.tombstones.size 个删除,默认为 500。如果您预计节点将离开集群并错过超过 500 个删除,则可以增加它。我们认为这种情况很少见,因此是默认值。墓碑不会占用太多空间,但我们也认为像 50,000 这样的数字可能太大了。

如果 Elasticsearch 遇到当前集群状态中缺少的索引数据,则这些索引被视为悬空索引。例如,如果您在一个 Elasticsearch 节点离线时删除了超过 cluster.indices.tombstones.size 个索引,则可能会发生这种情况。

您可以使用 悬空索引 API 来管理这种情况。

记录器编辑

可以使用 logger. 前缀 动态 更新控制日志记录的设置。例如,要将 indices.recovery 模块的日志记录级别增加到 DEBUG,请发出此请求

resp = client.cluster.put_settings(
    body={
        "persistent": {
            "logger.org.elasticsearch.indices.recovery": "DEBUG"
        }
    },
)
print(resp)
response = client.cluster.put_settings(
  body: {
    persistent: {
      'logger.org.elasticsearch.indices.recovery' => 'DEBUG'
    }
  }
)
puts response
PUT /_cluster/settings
{
  "persistent": {
    "logger.org.elasticsearch.indices.recovery": "DEBUG"
  }
}

持久任务分配编辑

插件可以创建一种称为持久任务的任务。这些任务通常是长期运行的任务,并存储在集群状态中,允许在完全集群重启后恢复任务。

每次创建持久任务时,主节点都会负责将任务分配给集群中的一个节点,然后分配的节点将接收任务并在本地执行。将持久任务分配给节点的过程由以下设置控制

cluster.persistent_tasks.allocation.enable

(动态) 为持久任务启用或禁用分配

  • all - (默认)允许将持久任务分配给节点
  • none - 不允许为任何类型的持久任务分配

此设置不影响已在执行的持久任务。只有新创建的持久任务或必须重新分配的任务(例如,在节点离开集群后)才会受到此设置的影响。

cluster.persistent_tasks.allocation.recheck_interval
(动态) 当集群状态发生重大变化时,主节点将自动检查是否需要分配持久任务。但是,可能还有其他因素(例如内存使用情况)会影响是否可以将持久任务分配给节点,但不会导致集群状态发生变化。此设置控制执行分配检查以对这些因素做出反应的频率。默认值为 30 秒。允许的最小值为 10 秒。