es实战-分片分配失败解决方案
分片分配失败的原因
- 线上集群突然断电或者使用了kill -9 pid进行集群关闭
- 磁盘信道损坏
- 使用了错误的配置(小问题,排查副本/分片路由等配置即可)
排查解决方案
1. 查看未分配的原因
GET /_cluster/allocation/explain GET _cat/indices?v&health=red GET /_cat/shards?v&h=n,index,shard,prirep,state,sto,sc,unassigned.reason,unassigned.details
ALLOCATION_FAILED:由于分片分配失败而未分配。
CLUSTER_RECOVERED:由于集群恢复而未分配。
DANGLING_INDEX_IMPORTED:由于导入了悬空索引导致未分配。
EXISTING_INDEX_RESTORED:由于恢复为已关闭的索引导致未分配。
INDEX_CREATED:由于API创建索引而未分配。
INDEX_REOPENED:由于打开已关闭索引而未分配。
NEW_INDEX_RESTORED:由于恢复到新索引而未分配。
NODE_LEFT:由于托管的节点离开集群而未分配。
REALLOCATED_REPLICA:确定了更好的副本位置,并导致现有副本分配被取消。
REINITIALIZED:当分片从开始移动回初始化,导致未分配。
REPLICA_ADDED:由于显式添加副本而未分配。
REROUTE_CANCELLED:由于显式取消重新路由命令而未分配。
2. 尝试重新分配失败的分片
POST /_cluster/reroute?retry_failed=true
默认索引的尝试次数为5,可以将此参数调大尝试reroute,也许有奇效:
PUT /indexname/_settings { "index": { "allocation": { "max_retries": 20 } } }
3. 重新关开索引尝试或者重启集群
POST /index/_close(_open)
4. 将副本分片提升为主分片
如果确定了主分片已经损坏,可以尝试将副本分片提升为主(会丢部分数据):
(福利推荐:阿里云、腾讯云、华为云服务器最新限时优惠活动,云服务器1核2G仅88元/年、2核4G仅698元/3年,点击这里立即抢购>>>)
POST /_cluster/reroute?pretty { "commands": [ { "allocate_stale_primary": { "index": "indexname",//索引名 "shard": 3,//操作的分片id "node": "node1",//此分片副本位于的节点 "accept_data_loss": true//提示数据可能会丢失 } } ] }
此方案存在一个问题是需要提前知道此分片的副本位于哪个节点用以指定,可以通过如果api获取副本分片位置:
GET _shard_stores?pretty GET indexname/_shard_stores?pretty
判断当前es进程使用的数据目录:通过pid和yml配置的目录去匹配,如data
ll /proc/pid/fd |grep data
如果索引损坏导致api失效,则需要人工去数据目录进行查找副本分片位置,目录结构如下:
data/nodes/0/indices/Z60wvPOWSP6Qbk79i757Vg/0
数据目录下为节点号 -> 索引文件夹 -> 索引ID -> 分片号
5. 将此分片置为空分片
如果此分片的主副都已经损坏,则可将此分片置为空以保留索引其他分片数据:
{ "commands": [ { "allocate_empty_primary": { "index": "indexname",//索引名 "shard": 3,//操作的分片id "node": "node1",//空分片要分配的节点 "accept_data_loss": true//提示数据可能会丢失 } } ] }
如果集群存在大量索引分片无法恢复,则可以使用脚本将全部分片置空,可以基于下面的脚本修改:
#!/bin/bash master=$(curl -s 'http://localhost:9200/_cat/master?v' | grep -v ' ip ' | awk '{print $1}') for index in $(curl -s 'http://localhost:9200/_cat/shards' | grep UNASSIGNED | awk '{print $1}' | sort | uniq); do for shard in $(curl -s 'http://localhost:9200/_cat/shards' | grep UNASSIGNED | grep $index | awk '{print $2}' | sort | uniq); do echo $index $shard curl -XPOST -H 'Content-Type: application/json' 'http://localhost:9200/_cluster/reroute' -d '{ "commands" : [ { "allocate_empty_primary" : { "index" : "'$index'", "shard" : "'$shard'", "node" : "'$master'", "accept_data_loss" : true } } ] }' sleep 1 done done
你还在原价购买阿里云、腾讯云、华为云、天翼云产品?那就亏大啦!现在申请成为四大品牌云厂商VIP用户,可以3折优惠价购买云服务器等云产品,并且可享四大云服务商产品终身VIP优惠价,还等什么?赶紧点击下面对应链接免费申请VIP客户吧:
相关文章
- 学生数据库管理系统
- SpringDataJpa 用MySQL语句怎么分页,spring全家桶SpringDataJpa 用MySQL语句怎么分页
- Docker创建MySQL容器模板命令
- Elasticsearch对应MySQL的对应关系
- 使用SpringDataJpa保存(save)报错误:SQL Error: 1062, SQLState: 23000 控制台会报:Duplicate entry ‘数‘ for key ‘PRIMA
- Navicat Premium 连接sqlserver数据库时提示安装Client失败,解决方案
- Mysql查询当前用户所有数据库语句(SHOW DATABASES)
- MySQL语句-查看当前数据库有哪些表(SHOW TABLES)
- MySQL5.0版本以上新增的 information_schema 数据库是什么?
- MariaDB数据库备份之逻辑备份
- MariaDB数据库创建用户
- MariaDB数据库给用户授权
- MariaDB数据库刷新权限表命令
- MariaDB数据库删除用户命令
- PhpStudy 2016搭建-sqli-libs靶场
- MySQL手动注入步骤
- Pikachu靶场-SQL注入-数字型注入(post)过关步骤
- Pikachu靶场-SQL注入-字符型注入(get)过关步骤
- 利用SQL注入漏洞实现MySQL数据库读写文件
- Kali-工具-sqlmap常见用法