我的集群中有一个ElasticNode 7.3.2,它已崩溃,此后无法重新启动,但仍包含重要数据(最后的副本在此节点上)。
原因:java.io.IOException:无法找到现有索引indexname-2019.06.23的元数据[位置:ORVU14kLSf6kIv8ULliijA,生成:178]
我不在乎这个特殊索引,我可以从状态文件中删除该索引吗?我已经尝试通过HexEditor删除它,但是随后他抱怨说这不是有效的哈希校验和;)
我已经尝试通过SMILE对其进行解码,但是* .st文件似乎并没有完全遵循确切的规范。
有人有想法吗?还是编辑它的好工具?
谢谢
答案 0 :(得分:0)
否,无法手动编辑数据目录中的任何文件。如果您遇到failed to find metadata for existing index
之类的异常,则说明您的存储空间有问题,或者Elasticsearch修改了其内容。无论哪种情况,都损坏了该节点。最好的前进方法是擦除数据路径并重新启动节点,以便Elasticsearch可以从群集中的其他位置重建丢失的碎片,或者从最近的快照中还原它们。
答案 1 :(得分:0)
我有一个相似的案例,其中我使用无效的相似性设置破坏了索引设置。不幸的是,设置是在没有有效性检查的情况下由ES写入文件的,此后我无法再次打开索引。因此,我从data/nodes/0/indices/<index UID>/_state/state-xx.st
获取了索引元数据,并弄清楚了如何加载,更改和重新存储它。我使用的是ES 5.4,因此我在此处提供的代码在ES 7.x中会稍有不同。它是这样的:
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.xcontent.NamedXContentRegistry;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Paths;
public class RepairIndexSettings {
public static void main(String args[]) throws IOException {
// Load the existing, possibly corrupt index file
IndexMetaData d = IndexMetaData.FORMAT.read(NamedXContentRegistry.EMPTY, Paths.get( "indexstaterepair","_state", "state-11.st"));
// Create new IndexMetaData by copying all the valid meta data from the original and removing or fixing
// the corrupt settings.
Settings.Builder sb = Settings.builder();
for (String key : d.getSettings().keySet()) {
if (!key.contains("similarity"))
sb.put(key, d.getSettings().get(key));
}
IndexMetaData newd = IndexMetaData.builder(d).settings(sb).build();
// Write the new index state to file
IndexMetaData.FORMAT.write(newd, Paths.get("indexstaterepair"));
}
}
我用新的状态文件替换了原始状态文件,然后可以正常打开并使用索引。
您将不得不使用另一个MetaData
子类,但是我认为它应该非常相似。