一、重新启用分片分配
在新加入节点或者新创建一个索引时,会出现如下图所示情况,节点未自动分配到任何节点,一般原因是关闭了自动平衡分配原则。
- 重新启用分片自动分配到节点
curl -XPUT 'localhost:9200/_cluster/settings' -d '{ "transient": { "cluster.routing.allocation.enable" : "all" } }'
- 关闭分片自动分配
curl -XPUT 'localhost:9200/_cluster/settings' -d '{ "transient": { "cluster.routing.allocation.enable" : "none" } }'
二、分片数据不再存在于集群中
有时索引的主分片0是未分配的。它可能在没有任何副本的节点上创建(一种用于加速初始索引过程的技术),并且节点在可以复制数据之前离开集群。Master在全局集群状态文件中检测到shard,但是无法在集群中找到分配的数据。
另一种可能性是节点在重新启动时可能遇到问题。通常,当一个节点恢复到集群的连接时,它会将有关其磁盘分片的信息转发给主节点,然后主节点将这些分片从“未分配”转换为“已分配/已启动”。当由于某种原因(例如,节点的存储已被损坏)导致此进程失败时,分片可能保持未分配状态。
在这种情况下,你必须决定如何处理:尝试获得原始节点恢复并重新加入集群(并没有强制分配主分片),或者力分配使用的碎片重新路由API使用和重新索引丢失数据原始数据源或备份。
在这种情况下,你必须决定如何处理:
尝试让原始节点恢复并重新加入集群(并没有强制分配主分片)
使用分片重新路由API强制分配分片
从备份数据中使用原始数据源重建索引丢失的数据
- 使用Reroute API强制重分配分片请求如下
curl -XPOST 'localhost:9200/_cluster/reroute' -d '{ "commands" : [ { "allocate" : { "index" : "constant-updates", "shard" : 0, "node": "<NODE_NAME>", "allow_primary": "true" } }] }'
三、磁盘低水平位
如果没有足够的磁盘空间的节点(它不会将分片分配给磁盘使用率超过85%的节点),主节点可能无法分配分片。一旦一个节点达到了这个磁盘使用级别,或者Elasticsearch称之为“低磁盘水位”,它就不会被分配更多的分片。
- 您可以通过查询cat API来检查集群中每个节点上的磁盘空间(并查看每个节点上存储了哪些分片):
如果您的节点具有较大的磁盘容量,则85%的低水位置可能太低。您可以使用群集更新设置API进行更改,curl -s 'localhost:9200/_cat/allocation?v'
cluster.routing.allocation.disk.watermark.low
或
cluster.routing.allocation.disk.watermark.high。
- 例如,这个堆栈溢出线程指出,如果您的节点具有5TB的磁盘容量,则可以安全地将低磁盘水位增加到90%
如果希望配置更改在群集重新启动时保持不变,请将"transient"替换为"persistent",或更新配置文件中的这些值。您可以选择使用字节或百分比值来更新这些设置,但请务必记住Elasticsearch文档中的这一重要提示:百分比值是指已用磁盘空间,而字节值是指可用磁盘空间。curl -XPUT 'localhost:9200/_cluster/settings' -d '{ "transient": { "cluster.routing.allocation.disk.watermark.low": "90%" } }'