原文:https://www.modb.pro/db/182864

引入此问题的原因,是因为在单节点的ES部署策略中,如果在设置某个ES索引的replica不为零,你会发现。

存在Unassigned的状态出现。一般开发者在遇到这种情况的时候,有没有考虑过为什么会有这样的情况出现呢?

分析问题

首先可以用相关命令查看哪一些索引处于unassigned状态,见下:

GET /_cat/shards?h=index,shard,prirep,state,unassigned.reason| grep UNASSIGNED


集群中的某些分片仍未分配的有用详细信息:每行都列出了索引的名称、分片编号、它是主分片 § 还是副本 ® 分片,以及未分配的原因。很容易就能看出有unassigned的分片。

查看分片分配不下去的原因

GET /_cluster/allocation/explain?pretty

结果为:

{"index": "add-000004","shard": 3,"primary": true,"current_state": "unassigned","unassigned_info": {"reason": "CLUSTER_RECOVERED","at": "2021-10-26T10:21:10.943Z","last_allocation_status": "no_valid_shard_copy"},"can_allocate": "no_valid_shard_copy","allocate_explanation": "cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster","node_allocation_decisions": [{"node_id": "0WHacVilSN2dUyyirft9Eg","node_name": "10.10.120.134","transport_address": "10.10.120.134:9333","node_attributes": {"ml.machine_memory": "16728154112","rack": "rack-1","ml.max_open_jobs": "20","xpack.installed": "true"},"node_decision": "no","store": {"found": false}},{"node_id": "jFmvlDdgT_OQ1BY0I6DXsg","node_name": "10.10.120.132","transport_address": "10.10.120.132:9333","node_attributes": {"ml.machine_memory": "33672540160","rack": "rack-1","ml.max_open_jobs": "20","xpack.installed": "true"},"node_decision": "no","store": {"found": false}},{"node_id": "xamy3maMQQqeiFLZqw_vXQ","node_name": "10.10.120.133","transport_address": "10.10.120.133:9333","node_attributes": {"ml.machine_memory": "16728154112","rack": "rack-1","ml.max_open_jobs": "20","xpack.installed": "true"},"node_decision": "no","store": {"found": false}}]}

很容易就能看出问题cannot allocate because a previous copy of the primary shard existed but can no longer be found on the nodes in the cluster

总结可能有以下几种原因导致

分片太多,节点不够

上面所述的情况就是此种原因的结果。当节点加入或者离开集群,主节点会自动重新分配分片,确保分片的多个副本不会分配给同一个节点。这个其实很好理解,如果一个主分片和它的一个副本分片在一个集群中同时分配到同一个节点中,如果此节点挂掉,整个index的数据都会loss,此时副本的意义就不存在了。

为了避免这个问题,集群中的每个索引初始化时每个主分片的副本数+1要少于或等于节点数:N >= R+1;

Shard默认延迟分配

在某个节点与master失去联系后,集群不会立刻重新allocation,而是会延迟一段时间确定此节点是否会重新加入集群。如果重新加入,则此节点会保持现有的分片数据,不会触发新的分片分配。

当然通过修改delayed_timeout,默认等待时间可以全局设置也可以在索引级别进行修改:

PUT /_all/_settings {"settings": {"index.unassigned.node_left.delayed_timeout": "10m" }}

通过_all 索引名,我们可以为所有的索引使用这个参数,默认时间修改成了10分钟
如果不想等待可以设置:delayed_timeout: 0
注意:延迟分配不会阻止副本被提拔为主分片。集群还是会进行必要的提拔来让集群回到 yellow
状态。缺失副本的重建是唯一被延迟的过程。

如果节点在超时之后再回来,且集群还没有完成分片的移动,会发生什么事情呢?在这种情形下, Elasticsearch 会检查该机器磁盘上的分片数据和当前集群中的活跃主分片的数据是不是一样 — 如果两者匹配, 说明没有进来新的文档,包括删除和修改 — 那么 master 将会取消正在进行的再平衡并恢复该机器磁盘上的数据。

之所以这样做是因为本地磁盘的恢复永远要比网络间传输要快,并且我们保证了他们的分片数据是一样的,这个过程可以说是双赢。

如果分片已经产生了分歧(比如:节点离线之后又索引了新的文档),那么恢复进程会继续按照正常流程进行。重新加入的节点会删除本地的、过时的数据,然后重新获取一份新的。

重启分片分配

一般情况下分配分配功能是默认开启的,不存在这种情况。但是某些时候可能禁用了分片分配(例如:滚动重启)

Disable shard allocation. This prevents Elasticsearch from rebalancing
missing shards until you tell it otherwise. If you know the
maintenance window will be short, this is a good idea. You can disable
allocation as follows:

https://www.elastic.co/guide/en/elasticsearch/guide/current/_rolling_restarts.html

需要启动分片分配

put /_cluster/settings{"transient" : {  "cluster.routing.allocation.enable" : "all" }}

低磁盘水印

如果磁盘使用率超过85%,一旦一个节点磁盘达到这个水平,意味着 Elasticsearch 不会将分片分配给磁盘使用率超过 85% 的节点。它还可以设置为绝对字节值(如500mb),以防止 Elasticsearch 在可用空间少于指定量时分配分片。此设置对新创建索引的主分片没有影响,但会阻止分配它们的副本。
如果节点够大eg 10TB ,可以安全的增加低磁盘水印到90%

put /_cluster/setttings
{"transient": {"cluster.routing.allocation.disk.watermark.low": "90%"}
}

磁盘使用率超过90%:ES会尝试将对应节点中的分片迁移到其他磁盘使用率比较低的数据节点中。

ES中cluster.routing.allocation.disk.watermark.flood_stage 洪水阶段水印控制,默认为95%。如果当磁盘使用率超过这个值后,查询settings会发现index.blocks.read_only_allow_delete = true ,强制每个索引只允许读或者删除。此设置防止节点耗尽磁盘空间的最后手段。
恢复写入命令

PUT /_cluster/settings
{"persistent" : {"cluster.blocks.read_only" : false}
}

多个ES版本

滚动升级过程中,主节点不会将主分片的副本分配给旧版本的节点。所以如果是此原因,升级旧版本的节点可以解决此问题。

分片数据不存在集群中

如果出现只有主分片未分配。它可能是在没有任何副本的节点上创建(加速初始化索引过程中,关掉副本创建和同步的方案),并且该节点在数据可以复制之前和集群断了联系。主节点在其全局集群状态中能够检测到分片,但是无法在集群中定位分片的数据。

另一种可能,当节点在与集群恢复连接时,将磁盘分片的信息同步到主节点,后将这些分片从未分配转为已分配的过程中因为某种原因失败,导致了分配保持了未分配的状态。

在这种情况下,如何继续:尝试让原始节点恢复并重新加入集群(并执行 不是强制分配主分片),或使用Cluster Reroute API强制分配分片并使用原始数据源或备份重新索引丢失的数据。

如果决定使用后者(强制分配主分片),需要注意的是将分配一个“空”分片。如果包含原始主分片数据的节点稍后重新加入集群,则其数据将被新创建的(空)主分片覆盖,因为它将被视为数据的“较新”版本。在继续执行此操作之前,可能希望重试分配,这将允许保留存储在该分片上的数据。

如果了解其中的含义并且仍想强制分配未分配的主分片,则可以使用该allocate_empty_primary标志来实现。以下命令将索引中的主分片重新路由到特定节点:

POST /_cluster/reroute?pretty
{"commands" : [{"allocate_empty_primary" : {"index" : "test-index", "shard" : 0,"node" : "<NODE_NAME>", "accept_data_loss" : "true"}}]
}

需要指定"accept_data_loss" : "true"以确认已准备好丢失分片上的数据。如果不包含此参数,将看到如下错误:

{"error" : {"root_cause" : [{"type" : "remote_transport_exception","reason" : "[NODE_NAME][127.0.0.1:9300][cluster:admin/reroute]"}],"type" : "illegal_argument_exception","reason" : "[allocate_empty_primary] allocating an empty primary for [test-index][0] can result in data loss. Please confirm by setting the accept_data_loss parameter to true"},"status" : 400}

如果需要恢复丢失的数据,需要使用Snapshot and Restore API

Snapshot module

https://www.elastic.co/guide/en/elasticsearch/reference/current/modules-snapshots.html

从备份快照中恢复。

ES集群中出现UNASSIGNED分片时的解决思路相关推荐

  1. es集群节点数和分片数关系_ES数据插入和查询流程是怎么样的?

    ES集群的状态有哪些,为什么主分片数目是固定的,副本分片却能动态调节,快看看这些关于ES的问题你都知道吗? 1. ES集群的状态 green 最健康的状态,说明所有的分片包括备份都可用 yellow ...

  2. 在不停业务的情况下重启ES集群中的节点

    之前写了一篇文章如何安全重启ES集群的节点,这又一个前提,就是需要停止写入业务.但是,有些时候业务是不能停的,又需要重启某一个节点(例如补丁修复,服务器更换等),这就需要用到本篇文章提到的不停业务重启 ...

  3. K8S集群中Pod资源处于CrashLoopBackOff状态排查思路

    K8S集群中Pod资源处于CrashLoopBackOff状态排查思路 文章目录 K8S集群中Pod资源处于CrashLoopBackOff状态排查思路 1.Pod资源处于CrashLoopBackO ...

  4. K8S集群中Pod资源数据丢包排查思路

    K8S集群中Pod资源数据丢包排查思路 Pod资源可能会由于网络原因产生丢包的现象. 当Pod资源存在丢包的现象时,会出现下面的报错: Connect to 100.111.156.74 port 5 ...

  5. K8S集群中Pod资源处于Pending状态排查思路

    K8S集群中Pod资源处于Pending状态排查思路 文章目录 K8S集群中Pod资源处于Pending状态排查思路 1.Pod资源处于Pending状态的原因 2.Pod资源处于Pending状态的 ...

  6. es集群节点数和分片数关系_ElasticSeaerch(弹性搜索数据库)中集群、节点、副本和分片的区别...

    简单总结下: 1.集群cluster: 集群顾名思义就是多个相同集群名称的es节点组合在一起.相当于一个集群就是一个班级,班级下面的学生就是节点. 如果只有一个节点在运行就称为单节点. 2.节点nod ...

  7. ES命令行查询es集群的状态、分片、索引

    查看es集群状态 curl -XGET -uelastic -p http://172.18.35.144:9200/_cat/health?v cluster ,集群名称 status,集群状态 g ...

  8. ElasticSearch高可用集群环境搭建和分片原理

    1.ES是如何实现分布式高并发全文检索 2.简单介绍ES分片Shards分片技术 3.为什么ES主分片对应的备分片不在同一台节点存放 4.索引的主分片定义好后为什么不能做修改 5.ES如何实现高可用容 ...

  9. ES 7.6.2集群迁移(从一套ES集群迁移数据到另一套集群)

    有时有需要从ES集群中去除多个节点的需求,比如迁移一套ES集群到另外一套ES集群,这时可以先将新的ES节点加入到现有集群里,再将老ES节点下线. 一 实验环境  ​​​​​二 实验步骤 2.1 集群扩 ...

最新文章

  1. 这家研究院太年轻,竟跟世界级选手“叫板”
  2. win2003服务器记录文件夹,在Windows Server 2003里快速查找文件
  3. 四十五、爬取QQ音乐Lemon 日语歌的评论
  4. celery定时任务简单使用
  5. 图像处理理论(一)——直方图、二值化、滤波基础
  6. ibatis mysql sqlmapconfig_iBATIS sqlMapConfig配置详解
  7. mysql Subqueries
  8. Mysql 学习总结(86)—— Mysql 的 JSON 数据类型正确使用姿势
  9. Google云也想为中国企业服务,正与腾讯浪潮谈合作
  10. ASP与數据庫,文本文件鏈接精髓
  11. 关于oracle数据恢复
  12. SREng 日志分析方法
  13. 计算机,通信,自动化等方向期刊排名
  14. Riemann问题精确解及程序实现
  15. MYSQL中linux的前戏
  16. python客户端_python客户端编程
  17. 社保到底是多交好,还是少交好?
  18. 微信支付API v3签名与验签-APP支付问题
  19. NFT Insider #92:NBA球星拉梅洛·鲍尔入驻The Sandbox元宇宙,蓝精灵协会宣布与著名艺术家展开一系列合作
  20. 解决服务器网卡乱序的问题(HP居多)

热门文章

  1. java重新加载类_java重新加载类的探寻
  2. javascript this指向总结
  3. pandas --移动窗口rolling的概念
  4. BannerStudio---旗帜软件工作室2021年交接会会议总结
  5. [mini LCTF 2023] 西电的部分
  6. 9. Zigbee应用程序框架开发指南 - 属性管理
  7. 瑕疵检测(深度学习)
  8. MySQL简单拷贝并重命名_MYSQL 复制,重命名表等
  9. OpenGL ES像素着色器教程
  10. Python的pickle模块详解(包括优缺点及和JSON的区别)