其他集群设置
集群名称设置
只有当节点与其他所有节点共享相同的 cluster.name 时,节点才能加入集群。默认名称为 elasticsearch,但你应该将其更改为能够描述集群用途的适当名称:
cluster.name: logging-prod
不要在不同的环境中重复使用相同的集群名称。否则,节点可能会加入错误的集群。
更改集群名称需要全集群重启。
元数据
可以使用以下设置将整个集群设为只读:
cluster.blocks.read_only(动态)— 将整个集群设为只读(索引不接受写操作),不允许修改元数据(创建或删除索引)。默认为false。cluster.blocks.read_only_allow_delete(动态)— 与cluster.blocks.read_only相同,但允许删除索引以释放资源。默认为false。
不要依赖此设置来阻止对集群的更改。任何有权访问集群更新设置 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 下存储集群管理员的电子邮件地址:
PUT /_cluster/settings
{
"persistent": {
"cluster.metadata.administrator": "sysadmin@example.com"
}
}
用户定义的集群元数据不用于存储敏感或机密信息。存储在用户定义集群元数据中的任何信息,任何有权访问集群获取设置 API 的人都可以查看,并且会记录在 Elasticsearch 日志中。
索引墓碑
集群状态维护索引墓碑(tombstones)以显式标记已删除的索引。集群状态中维护的墓碑数量由以下设置控制:
cluster.indices.tombstones.size(静态)— 索引墓碑可以防止在删除发生时不属于集群的节点加入集群并将该索引重新导入,就好像删除从未发出过一样。为了防止集群状态过大,我们只保留最近的cluster.indices.tombstones.size次删除,默认为 500。如果你预期节点会离开集群并错过超过 500 次删除,可以增加此值。我们认为这种情况很少见,因此采用了此默认值。墓碑不会占用太多空间,但我们认为像 50,000 这样的数字可能太大了。
如果 Elasticsearch 遇到当前集群状态中不存在的索引数据,则这些索引被视为悬空(dangling)。例如,如果在一个 Elasticsearch 节点离线期间删除了超过 cluster.indices.tombstones.size 个索引,就可能发生这种情况。
你可以使用悬空索引 API 来管理这种情况。
日志记录器
控制日志记录的设置可以使用 logger. 前缀动态更新。例如,将 indices.recovery 模块的日志级别提高到 DEBUG:
PUT /_cluster/settings
{
"persistent": {
"logger.org.elasticsearch.indices.recovery": "DEBUG"
}
}
持久任务分配
插件可以创建一种称为持久任务(persistent tasks)的任务。这些任务通常是长期存续的任务,并存储在集群状态中,允许任务在全集群重启后恢复。
每次创建持久任务时,主节点负责将任务分配给集群中的一个节点,被分配的节点随后将获取该任务并在本地执行。将持久任务分配到节点的过程由以下设置控制:
cluster.persistent_tasks.allocation.enable
(动态)启用或禁用持久任务的分配:
all—(默认)允许将持久任务分配给节点none— 不允许为任何类型的持久任务进行分配
此设置不影响已在执行的持久任务。只有新创建的持久任务或必须重新分配的任务(例如,在节点离开集群之后)才会受此设置影响。
cluster.persistent_tasks.allocation.recheck_interval
(动态)当集群状态发生显著变化时,主节点会自动检查是否需要分配持久任务。但是,可能存在其他因素(例如内存使用情况)影响持久任务能否分配到节点,但不会导致集群状态发生变化。此设置控制执行分配检查的频率,以响应这些因素。默认为 30 秒。允许的最小值为 10 秒。