创建索引时,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 会重新平衡分片,以保证数据均匀分布。

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

相关推荐
YONG823_API4 小时前
API技术深度解析:构建高效、安全与可扩展的接口服务
大数据·爬虫·安全·网络爬虫
AustinCien4 小时前
1.4常规es报错问题
运维·elk·elasticsearch
米糕.4 小时前
【R语言】ggplot2绘图常用操作
大数据·开发语言·数据分析·r语言
m0_748257185 小时前
Java进阶(ElasticSearch的安装与使用)
java·elasticsearch·jenkins
INFINI Labs5 小时前
谈谈 ES 6.8 到 7.10 的功能变迁(4)- 聚合功能篇
java·大数据·elasticsearch
zhang98800006 小时前
K8S能部署大数据集群吗?为什么?K8S的HPA功能可以作为大数据处理消息积压的问题(Kafka的分区)
大数据·kafka·kubernetes
程序员瓜叔7 小时前
大数据风控系统——变量指标平台设计
java·大数据·风控
szxinmai主板定制专家7 小时前
基于全志T527+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案
大数据·运维·人工智能·fpga开发·边缘计算