创建索引时,ES,分片和副本定义原则

创建索引时,ES,分片和副本定义原则

在 Elasticsearch (ES) 中创建索引时,number_of_shardsnumber_of_replicas 是非常关键的设置项,它们决定了索引的分布和冗余策略。下面是这些设置的详细定义和原则:

1. number_of_shards(分片数)

  • 作用:决定了索引的分片数量。每个分片是一个独立的 Lucene 索引,它包含数据的一部分,并且可以独立地进行查询和存储。

  • 默认值5

  • 原则

    • 数据规模:较大的数据量可以增加分片数,以便分散存储和提高查询效率。例如,数据量达到 TB 级别时,可以考虑更多的分片。
    • 硬件资源:分片数过多会消耗更多的资源(内存和 CPU)。需要根据集群的硬件配置来合理设置。
    • 性能优化:如果分片数量过多,可能会导致 Elasticsearch 负载过高,因为每个分片都会占用一定的资源。理想情况下,分片数应该与数据量和集群节点的数量成比例。
  • 建议

    • 在创建索引时,可以根据集群的规模和数据量来合理决定分片数。例如,小规模集群可能使用 35 个分片,而大规模集群可能会增加到 10 或更多。
    • 需要注意的是,number_of_shards 一旦设置并创建索引后不能更改。

2. number_of_replicas(副本数)

  • 作用:决定每个分片的副本数量。副本是原始分片的备份,通常用于增加数据的可用性和容错能力。

  • 默认值1(即每个分片有一个副本)。

  • 原则

    • 容错性:副本是为了数据冗余和提高查询性能。如果一个主分片失效,副本可以作为备用,确保数据的可用性和可靠性。
    • 查询性能:副本不仅提供容错功能,还能提高查询性能,因为副本分片和主分片一样可以处理查询请求。
    • 硬件资源:每增加一个副本,集群的存储需求就会增加。需要根据集群的硬件容量合理设置副本数。
  • 建议

    • 对于生产环境,通常建议设置至少 1 个副本,以保证高可用性。
    • 如果查询请求较高,并且需要负载均衡,则可以考虑增加副本数,例如设置 2 或更多副本,但这也意味着需要更多的存储和计算资源。

3. 示例配置:

复制代码

json

{ "settings": { "index": { "number_of_shards": 5, // 分片数设置为5 "number_of_replicas": 1 // 副本数设置为1 } } }

4. 选择分片和副本数量时的注意事项:

  • 分片的数量与集群节点数量:通常推荐分片数不应过多,以避免每个节点负担过重。理想的情况是分片的数量应该大致匹配集群中节点的数量。比如,如果有 5 个节点,且总共有 10 个分片,建议每个节点分担 2 个分片。

  • 副本的数量与数据安全性:副本数决定了数据的冗余程度。在高可用环境中,副本数设置为 1 至少可以保证在一个节点宕机时数据不会丢失。根据实际需求可以增加副本数来增强数据安全性,但这会带来更多的存储和计算负担。

  • 动态调整 :虽然 number_of_shards 一旦设置无法更改,但副本数是可以在运行时调整的。例如,你可以随时增加或减少副本数,来适应集群负载和容错需求。

5. 总结

  • number_of_shards 影响数据分布,合理配置可以帮助提高数据分布效率和查询性能。
  • number_of_replicas 影响数据的冗余性、容错性和查询性能。合理配置副本数可以提升数据的可靠性,但需要更多存储资源。

在实际使用时,应根据数据量、查询需求、硬件资源以及容错要求来调整分片数和副本数,做到平衡性能和资源消耗。

es分词器

Elasticsearch(ES)中的分词器是用于将文本数据分割成更小的单位(如词条、标记或词汇单元),并用于索引和搜索。在 Elasticsearch 中,分词器有多个种类,根据不同的需求,分词器能够影响索引和查询的效果。下面是一些常见的分词器类型和相关概念:

1. 分词器的工作原理

分词器通常由两个部分组成:

  • Tokenizer(分词器):将输入的文本切分成词项。
  • Token Filters(词项过滤器):对分词结果进行进一步的处理,例如删除停用词、转换大小写等。

2. 常见的分词器类型

1. Standard Analyzer(标准分析器)
  • 功能 :这是 Elasticsearch 默认的分析器。它首先会使用 standard tokenizer 将文本切分成词项,然后应用一组常见的 token filters,如小写化、去除停用词等。
  • 适用场景:适用于大多数英文文本的分词。
复制代码

json

"settings": { "analysis": { "tokenizer": { "standard": { "type": "standard" } } } }

2. Whitespace Analyzer(空格分析器)
  • 功能:这个分析器基于空格将文本切分成词项,没有任何更复杂的操作,所有字符之间有空格的部分会被认为是一个词项。
  • 适用场景:适合处理没有标点符号、且词项由空格分开的情况。
复制代码

json

"settings": { "analysis": { "tokenizer": { "whitespace": { "type": "whitespace" } } } }

3. Keyword Analyzer(关键词分析器)
  • 功能:此分析器将整个输入文本作为一个词项,不进行任何切分操作。也就是说,输入的文本将被视为一个完整的关键字。
  • 适用场景:适用于不需要分词的字段(如 ID、邮箱等)。
复制代码

json

"settings": { "analysis": { "tokenizer": { "keyword": { "type": "keyword" } } } }

4. IK Analyzer(IK 分词器)
  • 功能:IK 是一个开源的中文分词器,支持精确模式和智能模式。精确模式将文本分割为精确的词项,智能模式则会尽量将文本分割为语义相关的部分。
  • 适用场景:适合中文文本分析。Elasticsearch 默认不包含 IK 分词器,需要额外安装插件。
复制代码

json

"settings": { "analysis": { "tokenizer": { "ik_max_word": { "type": "ik_max_word" } } } }

5. Pinyin Analyzer(拼音分析器)
  • 功能:这是一个用于中文拼音搜索的分析器。它会将中文字符转换成拼音,并进行分词。
  • 适用场景:适用于中文拼音检索。
复制代码

json

"settings": { "analysis": { "tokenizer": { "pinyin": { "type": "pinyin" } } } }

6. Edge NGram Analyzer(前缀分词器)
  • 功能:将文本切分为以不同长度的前缀为基础的词项。适用于实现自动补全(Autocomplete)功能。
  • 适用场景:适用于需要实现前缀匹配的查询,例如自动补全搜索框。
复制代码

json

"settings": { "analysis": { "tokenizer": { "edge_ngram": { "type": "edge_ngram", "min_gram": 1, "max_gram": 25, "token_chars": ["letter", "digit"] } } } }

3. 分词器和分析器的配置

在 Elasticsearch 中,可以通过自定义分析器来组合分词器和词项过滤器。以下是一个自定义分析器的示例:

复制代码

json

{ "settings": { "analysis": { "tokenizer": { "my_custom_tokenizer": { "type": "edge_ngram", "min_gram": 2, "max_gram": 5, "token_chars": ["letter", "digit"] } }, "filter": { "lowercase": { "type": "lowercase" } }, "analyzer": { "custom_analyzer": { "type": "custom", "tokenizer": "my_custom_tokenizer", "filter": ["lowercase"] } } } } }

4. 分词器的选择和优化

  • 选择分词器时需要考虑以下因素
    • 文本语言:中文、英文、阿拉伯文等语言的分词规则不同,需要选择适合的分词器。
    • 应用场景:例如,中文分词可以选择 IK 分词器,而英文可以选择 Standard 分词器。
    • 性能:有些分词器可能性能较差,特别是在处理大量数据时,需要根据应用需求做优化。
    • 查询需求:如果是为了支持前缀搜索,可以选择 NGram 分词器。

5. 总结

Elasticsearch 提供了多种分词器,适应不同的文本数据和查询需求。在实际使用中,可以根据需求选择合适的分词器,也可以通过自定义分析器来组合不同的分词器和过滤器,从而实现更灵活和精细的搜索功能。

type:keyword

在 Elasticsearch 中,"type": "keyword" 是一种字段类型,它表示该字段的内容应该被索引为 关键词,即精确值而不是分词后的文本。

具体到你提供的这段代码:

复制代码

json

"properties": { "apply_date": { "type": "keyword" }, "type": "keyword" }

  • "apply_date": { "type": "keyword" } 表示字段 apply_date 会被当作精确的关键词进行存储和索引。这通常用于存储如日期、标签、ID等,不需要进行分词和分析的字段。比如如果你查询 apply_date: "2025-02-24",它会精确匹配这个日期,而不会做分词处理。

  • "type": "keyword" 出现两次,可能是代码中的一处错误或不完整的示例。在这里,"type": "keyword" 需要配合具体的字段来使用,它不应直接作为顶层属性。如果你在索引的字段定义中出现了 "type": "keyword" 这样的情况,通常意味着该字段是一个 字符串类型 的精确匹配字段。

如果你想定义多个字段,你应该使用类似以下的结构:

复制代码

json

"properties": { "apply_date": { "type": "keyword" }, "status": { "type": "keyword" } }

这表示 apply_datestatus 都是精确匹配的字段,不会进行分词处理。

2025-02-24 09:04:58

es一般定义几个节点,几个分片,几个副本,创建索引时,分片怎么设置

2025-02-24 09:05:01

在 Elasticsearch (ES) 中,创建索引时需要配置节点、分片和副本的数量。以下是一些常见的设置和最佳实践:

1. 节点数量 (Nodes)

  • 生产环境 :通常会有多个节点以确保高可用性和负载均衡。典型的生产环境中,至少有 3 个节点。
    • 单节点:适用于开发或测试环境,但不推荐用于生产。
    • 3 个节点:在生产环境中,通常配置 3 个节点来确保高可用性,这样即使一个节点故障,集群仍能正常运行。
    • 更多节点:如果数据量非常大或需要更高的计算能力,可以增加节点的数量。

2. 分片数量 (Shards)

  • 分片是 Elasticsearch 将数据分散到不同节点上的单位,决定了索引如何被分割和分配。

  • 默认值:每个索引默认有 5 个主分片(primary shards)。

  • 如何选择分片数量

    • 根据数据量来选择。如果数据量不大,5 个分片通常是足够的。如果预计数据量会很大或有很高的查询吞吐量,可能需要更多分片。
    • 分片的数量要适中,因为太多的分片会导致管理的复杂性,太少的分片则可能无法有效分布数据。

    一般推荐:

    • 对于小型数据集,可能选择 1-3 个分片。
    • 对于大规模的数据集,可能选择 10 个分片甚至更多。

3. 副本数量 (Replicas)

  • 副本是每个主分片的复制品,用于提高查询性能和容错性。
  • 默认值:每个主分片默认有 1 个副本(即 2 个副本副本+主分片)。
  • 如何选择副本数量
    • 如果集群有足够的节点,可以增加副本数量以提高读取性能。
    • 每个副本增加查询吞吐量,但会消耗更多的磁盘空间。
    • 在生产环境中,通常至少配置 1 个副本(即每个主分片有一个副本),确保数据冗余和高可用。

4. 创建索引时的分片设置

创建索引时,通常需要指定分片和副本的数量。以下是一个创建索引时的设置示例:

复制代码

json

PUT /my_index { "settings": { "number_of_shards": 3, // 设置分片数为 3 "number_of_replicas": 1 // 设置副本数为 1 } }

在这个例子中:

  • number_of_shards: 3 个主分片。
  • number_of_replicas: 每个主分片有 1 个副本。

总结

  • 节点数量:在生产环境中,至少有 3 个节点。
  • 分片数量:默认 5 个分片,根据数据量和查询吞吐量来调整,一般设置为 1-10 个分片。
  • 副本数量:默认每个主分片有 1 个副本,增加副本提高容错性和查询性能。

这些设置需要根据具体的应用场景、数据量和查询需求来调整。

3个节点,5分片怎么分配的

在 Elasticsearch 中,当你创建一个索引并指定了 3 个节点和 5 个主分片时,Elasticsearch 会根据分片的数量和节点的数量来自动分配这些分片。通常情况下,分片会尽量均匀地分配到各个节点上。

假设你有 3 个节点(Node1, Node2, Node3)和 5 个主分片(shard_0, shard_1, shard_2, shard_3, shard_4),并且假设副本数为 1(每个主分片有 1 个副本)。分配的过程可能会如下所示:

分配示例(3 节点,5 分片,1 副本):

主分片/副本 节点 1 节点 2 节点 3
shard_0 主分片 副本
shard_1 主分片 副本
shard_2 主分片 副本
shard_3 副本 主分片
shard_4 主分片

说明:

  1. 主分片 (Primary Shards):每个主分片会被分配到集群中的不同节点,以实现数据的分布。

    • shard_0 在节点 1 上,shard_1 在节点 1 上,shard_2 在节点 2 上,shard_3 在节点 2 上,shard_4 在节点 3 上。
  2. 副本分片 (Replica Shards):副本分片是主分片的冗余拷贝,副本会被分配到其他节点上。副本会尽量与主分片分配到不同的节点上。

    • shard_0 的副本会分配到节点 2。
    • shard_1 的副本会分配到节点 3。
    • shard_2 的副本会分配到节点 3。
    • shard_3 的副本会分配到节点 1。
    • shard_4 的副本会分配到节点 1。

如何分配:

  • 在 Elasticsearch 中,分片的分配是由集群的 分片分配算法 动态计算的,旨在确保数据均匀分布在所有节点上并最大限度地提高可用性。
  • 在节点数大于分片数的情况下,某些节点可能没有主分片,但会有副本分片。例如,在 3 个节点和 5 个主分片的情况下,会出现 2 个节点负责更多的主分片,而第三个节点则可能负责更多的副本分片。

注意事项:

  • 如果你增加副本数量(例如设置为 2 个副本),那么每个主分片就会有两个副本,分片的分配会更加复杂,并且会增加磁盘存储和内存使用。
  • 分片的分配是动态的,当节点加入或离开集群时,Elasticsearch 会重新平衡分片,以保证数据均匀分布。

这个分配策略是根据集群的负载和资源动态调整的,所以不同的情况下,具体的分片分配可能会有所不同。

相关推荐
Wnq100721 小时前
具身机器人中AI(DEEPSEEK)与PLC、驱动器协同发展研究:突破数据困境与指令精确控制(3)
大数据·人工智能·程序员·机器人·aigc·ai编程·智能电视
weixin_457885822 小时前
DeepSeek:AI如何重构搜索引擎时代的原创内容生态
人工智能·搜索引擎·ai·重构·deepseek
一个天蝎座 白勺 程序猿4 小时前
大数据(7.3)Kafka量子安全加密实践指南:构建抗量子计算攻击的消息系统
大数据·安全·kafka·量子计算
结冰架构4 小时前
【AI提示词】Emoji风格排版艺术与设计哲学
大数据·人工智能·ai·提示词
@ V:ZwaitY094 小时前
TikTok 云控矩阵详解:从养号到引流的全链路自动化管理
大数据·矩阵·自动化
zandy10114 小时前
飞书集成衡石ChatBot实战:如何10分钟搭建一个业务数据问答机器人?
大数据·人工智能·机器人·飞书·chatbot·衡石科技
wending-Y5 小时前
flink 增量快照同步文件引用关系和恢复分析
大数据·flink
goTsHgo5 小时前
Flink的数据流图中的数据通道 StreamEdge 详解
大数据·flink
SelectDB6 小时前
Apache Doris & SelectDB 技术能力全面解析
大数据·数据库·程序员
笑傲码湖7 小时前
SkipList跳表:高效查找的利器
大数据