ElasticSearch 1.4版本集群重启后数据丢失,如何恢复?
首先咱们先拆解下你给出的集群状态信息,先把状态贴出来:
{ "cluster_name": "mycluster", "status": "yellow", "timed_out": false, "number_of_nodes": 1, "number_of_data_nodes": 1, "active_primary_shards": 113, "active_shards": 113, "relocating_shards": 0, "initializing_shards": 0, "unassigned_shards": 110 }
从这个状态能看出:你的集群现在是yellow状态,只有1个数据节点在运行,113个主分片是活跃的,但有110个分片未分配。结合你说的重启后丢数据,大概率是之前集群是多节点架构,现在只剩单节点,或者部分分片的存储路径出了问题,咱们一步步来排查恢复:
第一步:先确认未分配分片的类型
首先要搞清楚未分配的是主分片(p)还是副本分片(r),这直接决定了数据是否真的丢失:
执行这个命令查看分片详情:
curl -XGET 'http://localhost:9200/_cat/shards?v'
输出里会有一列prirep,p代表主分片,r代表副本分片。
如果未分配的是副本分片
这种情况其实数据没丢!因为主分片都正常活跃着,副本分片未分配只是因为当前只有1个节点(Elasticsearch默认副本分片不能和主分片在同一个节点)。解决方法很简单:
- 临时把所有索引的副本数改成0,让集群状态变回绿色:
curl -XPUT 'http://localhost:9200/_all/_settings' -d '{"number_of_replicas": 0}'
之后如果你恢复了多节点集群,再把副本数改回原来的值就行。
如果未分配的是主分片(这才是真正的数据丢失风险)
如果是主分片未分配,那说明Elasticsearch没找到这些分片的存储文件,咱们尝试以下方法:
检查数据目录是否存在分片文件
Elasticsearch 1.4默认的数据目录是data/,每个索引的分片存储在nodes/0/indices/{索引名}/{分片ID}路径下。先去服务器上看看对应的分片文件夹是否还在,如果文件夹完整存在,那大概率能恢复。手动强制分配主分片
如果分片文件存在,咱们可以手动告诉Elasticsearch把这个主分片分配到当前节点上:
curl -XPOST 'http://localhost:9200/_cluster/reroute' -d '{ "commands": [ { "allocate": { "index": "你的索引名", "shard": 分片ID, "node": "当前节点名", "allow_primary": true } } ] }'
- 节点名可以通过
curl -XGET 'http://localhost:9200/_cat/nodes?v'获取,看name列的值。 - 把命令里的占位符换成实际的索引名和分片ID。
- 调整集群分配设置,让Elasticsearch自动尝试恢复
如果手动分配不行,试试打开自动分配开关:
curl -XPUT 'http://localhost:9200/_cluster/settings' -d '{ "transient": { "cluster.routing.allocation.disable_allocation": false, "cluster.routing.allocation.enable": "all" } }'
设置完后等个几分钟,看看未分配的分片会不会自动初始化。
最后:如果以上方法都失效,只能依赖快照恢复
如果你之前给集群做过快照备份,那可以从快照里恢复数据:
- 先确认你的快照仓库存在:
curl -XGET 'http://localhost:9200/_snapshot/_all'
- 恢复指定索引:
curl -XPOST 'http://localhost:9200/_snapshot/仓库名/快照名/_restore' -d '{ "indices": "要恢复的索引名" }'
另外提醒下:Elasticsearch 1.4是非常老旧的版本了,早就停止官方维护了,安全漏洞和稳定性问题都很多,建议尽快升级到新版本(比如7.x或者8.x系列),避免后续再出现类似问题。
内容的提问来源于stack exchange,提问作者iGh0st

