1

“删除索引”命令在 ES 中是如何工作的?

在正在运行的 ES 集群上使用“删除索引”命令有什么风险吗?这个命令会花费太多的 CPU 或内存吗?

4

1 回答 1

2

删除索引通常非常快,并且 Elasticsearch 在发送删除索引请求的成功响应时实际上并没有删除所有文档。

Elasticsearch 主要更新集群状态(维护在集群的所有节点上)以将索引标记为已删除,并且在更新它以及路由表、元数据等其他一些事情时完成了主要的繁重工作。

是 Elaticsearch 源代码中的主要方法,它可以帮助您理解我上面提到的内容以及删除索引的内部结构。

上面链接中的一些重要代码片段

RoutingTable.Builder routingTableBuilder = RoutingTable.builder(currentState.routingTable());
        Metadata.Builder metadataBuilder = Metadata.builder(meta);
        ClusterBlocks.Builder clusterBlocksBuilder = ClusterBlocks.builder().blocks(currentState.blocks());

        final IndexGraveyard.Builder graveyardBuilder = IndexGraveyard.builder(metadataBuilder.indexGraveyard());
        final int previousGraveyardSize = graveyardBuilder.tombstones().size();
        for (final Index index : indices) {
            String indexName = index.getName();
            logger.info("{} deleting index", index);
            routingTableBuilder.remove(indexName);
            clusterBlocksBuilder.removeIndexBlocks(indexName);
            metadataBuilder.remove(indexName);
        }
        // add tombstones to the cluster state for each deleted index
        final IndexGraveyard currentGraveyard = graveyardBuilder.addTombstones(indices).build(settings);
        metadataBuilder.indexGraveyard(currentGraveyard); // the new graveyard set on the metadata
        logger.trace("{} tombstones purged from the cluster state. Previous tombstone size: {}. Current tombstone size: {}.",
            graveyardBuilder.getNumPurged(), previousGraveyardSize, currentGraveyard.getTombstones().size());

提出您的问题,在正在运行的 ES 集群上使用“删除索引”命令是否有任何风险?这个命令会花费太多的 CPU 或内存吗?

不,在运行的 Elasticsearch 集群上使用请求是没有风险的,delete index除非你有一个巨大的集群状态,并且如上所述,实际上删除索引是异步发生的,这只是更新各种状态和标志,它不会占用太多的 CPU。

您还可以启用跟踪登录,org.elasticsearch.cluster.metadata.MetadataDeleteIndexService并查看上面代码片段中记录的集群大小。

于 2020-04-18T15:38:41.990 回答