编辑ElasticSearch 7.3的状态文件

时间:2019-09-26 16:32:35

标签: elasticsearch lucene

我的集群中有一个ElasticNode 7.3.2,它已崩溃,此后无法重新启动,但仍包含重要数据(最后的副本在此节点上)。

  

原因:java.io.IOException:无法找到现有索引indexname-2019.06.23的元数据[位置:ORVU14kLSf6kIv8ULliijA,生成:178]

我不在乎这个特殊索引,我可以从状态文件中删除该索引吗?我已经尝试通过HexEditor删除它,但是随后他抱怨说这不是有效的哈希校验和;)

我已经尝试通过SMILE对其进行解码,但是* .st文件似乎并没有完全遵循确切的规范。

有人有想法吗?还是编辑它的好工具?

谢谢

2 个答案:

答案 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子类,但是我认为它应该非常相似。