Elasticsearch 分片策略

这篇具有很好参考价值的文章主要介绍了Elasticsearch 分片策略。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分片

和数据库中的表空间类似,不过分片是为每个索引设置,一个索引可以有多个分片,分片分为主分片和副本分片,主分片和副本分片类似于数据库中的主库和备库。

  • 主分片(shards):可以有一个或多个,但至少会有一个,默认为1。多个主分片类似于分表,可以提高大量数据情况下的性能和吞吐量压力。
  • 副本分片(replicas):是针对主分片的副本,默认为1,也可以有多个。在主分片节点掉线或故障时,会升级为主分片来提供服务。副本分片可以提供查询等服务,提高查询效率和可用性。

注:主分片并不等于主节点,主分片可能存在于 ES 集群的非主节点上。这是由分片分配功能决定的。这个我们下面会说。

索引设置分片

在创建索引的时候,通过 settings 参数设置索引的分片数量,比如:我们创建一个 索引 students

PUT /students

{
    "settings":{
        "index":{
            "number_of_shards": 2, // 设置主分片数量(数量限制为1024每个索引,建议不要太多)
            "number_of_replicas": 1 // 每个主分片对应一个副本分片
        }
    },   
    "mappings": {
        "properties": {
            "age": { 
                "type": "integer"
            },  
            "birthday":  { 
                "type": "date",
                "format":"yyyy-MM-dd HH:mm:ss" 
            }, 
            "name":   { 
                "type": "keyword"  
            },
            "height": {
                "type": "float"
            },
            "id": {
                "type": "long"
            },
            "sex":{
                "type": "byte"
            },
            "remark":{
                "type":"text"
            }
        }
    }
}

分片的数量信息,在创建索引时设置,请不要修改。修改可能造成问题。虽然 number_of_replicas 是动态索引设置,但我还是建议不要去修改它。如确实需要修改,请重建索引。更多的索引设置请查看官网 索引设置

获取索引分片信息

GET /<target>/_shard_stores

GET /_shard_stores

路径参数 target:一个或多个索引的名称,多个用英文逗号隔开即可

查询参数 status
status
(可选,字符串)以逗号分隔的分片健康状态列表,用于限制请求。
有效值包括:

  • green 分配了主分片和所有副本分片。
  • yellow 一个或多个副本分片未分配。
  • red 主分片未分配
  • all 返回所有分片,无论运行状况如何。
    默认为yellow,red ,这意味着如果我们的集群正常,不使用status参数查询不出结果

示例

比如我们目前集群只有两个节点 192.168.1.10 和 192.168.1.11

GET /students/_shard_stores?status=green
{
    "indices": {
        "students": {
            "shards": { // 分片信息对象
                "0": { // 第 0 个分片
                    "stores": [
                        {
                            "oj5FEiVMRpuWV386zdwy3w": {
                                "name": "myNode1",
                                "ephemeral_id": "Au6ZYmTZQFOlGqIelj4ceQ",
                                "transport_address": "192.168.1.10:9300",
                                "external_id": "myNode1",
                                "attributes": {
                                    "ml.allocated_processors_double": "4.0",
                                    "xpack.installed": "true",
                                    "ml.machine_memory": "6087233536",
                                    "ml.allocated_processors": "4",
                                    "ml.max_jvm_size": "3045064704"
                                },
                                "roles": [
                                    "data",
                                    "data_cold",
                                    "data_content",
                                    "data_frozen",
                                    "data_hot",
                                    "data_warm",
                                    "ingest",
                                    "master",
                                    "ml",
                                    "remote_cluster_client",
                                    "transform"
                                ]
                            },
                            "allocation_id": "fhR4UEA6SS2OnBnlQ2f-Lw",
                            "allocation": "primary" // 表示其为主分片
                        },
                        {
                            "AST-4rnFRdagsd0juerSaw": {
                                "name": "myNode2",
                                "ephemeral_id": "1VlBaXYYRAeveu6BX_BpYw",
                                "transport_address": "192.168.1.11:9300",
                                "external_id": "myNode2",
                                "attributes": {
                                    "ml.allocated_processors_double": "4.0",
                                    "xpack.installed": "true",
                                    "ml.machine_memory": "6087098368",
                                    "ml.allocated_processors": "4",
                                    "ml.max_jvm_size": "3045064704"
                                },
                                "roles": [
                                    "data",
                                    "data_cold",
                                    "data_content",
                                    "data_frozen",
                                    "data_hot",
                                    "data_warm",
                                    "ingest",
                                    "master",
                                    "ml",
                                    "remote_cluster_client",
                                    "transform"
                                ]
                            },
                            "allocation_id": "LqDP66XYQkuBh204S9HNIQ",
                            "allocation": "replica" // 表示其为副本分片
                        }
                    ]
                },
                "1": { // 第 1 个分片
                    "stores": [
                        {
                            "AST-4rnFRdagsd0juerSaw": {
                                "name": "myNode2",
                                "ephemeral_id": "1VlBaXYYRAeveu6BX_BpYw",
                                "transport_address": "192.168.1.11:9300",
                                "external_id": "myNode2",
                                "attributes": {
                                    "ml.allocated_processors_double": "4.0",
                                    "xpack.installed": "true",
                                    "ml.machine_memory": "6087098368",
                                    "ml.allocated_processors": "4",
                                    "ml.max_jvm_size": "3045064704"
                                },
                                "roles": [
                                    "data",
                                    "data_cold",
                                    "data_content",
                                    "data_frozen",
                                    "data_hot",
                                    "data_warm",
                                    "ingest",
                                    "master",
                                    "ml",
                                    "remote_cluster_client",
                                    "transform"
                                ]
                            },
                            "allocation_id": "x9N8h80WQ5aJ0aLkXicGRQ",
                            "allocation": "primary"
                        },
                        {
                            "oj5FEiVMRpuWV386zdwy3w": {
                                "name": "myNode1",
                                "ephemeral_id": "Au6ZYmTZQFOlGqIelj4ceQ",
                                "transport_address": "192.168.1.10:9300",
                                "external_id": "myNode1",
                                "attributes": {
                                    "ml.allocated_processors_double": "4.0",
                                    "xpack.installed": "true",
                                    "ml.machine_memory": "6087233536",
                                    "ml.allocated_processors": "4",
                                    "ml.max_jvm_size": "3045064704"
                                },
                                "roles": [
                                    "data",
                                    "data_cold",
                                    "data_content",
                                    "data_frozen",
                                    "data_hot",
                                    "data_warm",
                                    "ingest",
                                    "master",
                                    "ml",
                                    "remote_cluster_client",
                                    "transform"
                                ]
                            },
                            "allocation_id": "NcS8BiuYQs2qip5DIhGEKA",
                            "allocation": "replica"
                        }
                    ]
                }
            }
        }
    }
}

可以看到结果我们有两个两两对应的主副分片,分别在集群的两个节点上,且均匀分布的。

查询结果中可能会出现 “store_exception”: … 信息,其表示打开分片索引或早期引擎故障时遇到的任何异常信息

分片分配

我们上面提到,分片是均匀分布在 ES 集群的,但这个不是绝对的。比如受节点所在服务器的内存、磁盘等各种情况的限制,各个节点之间可能存在性能差异等, ES 集群会通过一些策略对分片进行合理的分配。这些策略默认是理想情况下的均匀分配策略,在实际情况中,我们可以进行相应的策略配置使 ES 尽可能的按照我们提供的策略进行分片分配。

分片分配是将分片分配给节点的过程。在初始恢复、副本分配、重新平衡或添加或删除节点时发生。主节点的主要角色之一就是决定将哪些分片分配给哪个节点,以及何时在节点之间移动分片以重新平衡集群。

集群级分片分配

确定分片被分配到哪个节点,以及分片在集群之间的移动策略等的配置。我们这里不做扩展讲解,可以在官网 集群级分片分配 中进行详细查看。

索引级分片分配

索引级分片筛选

通过索引级分片筛选可以将索引按你设置的策略进行分片的分配(如 _name 按节点名称进分配、_host_ip 按主机 IP 分配节点)。

该配置通过 index.routing.allocation 来配置

属性 说明
_name 按节点名称匹配节点
_host_ip 按主机IP地址匹配节点(与主机名关联的IP)
_publish_ip 按发布IP地址匹配节点
_ip 匹配其中之一_host_ip或_publish_ip
_host 按主机名匹配节点
_id 按节点id匹配节点
_tier 按节点匹配节点数据层角色。data_content、data_hot、data_warm、data_cold、data_frozen

例如:

PUT person/_settings
{
  "index.routing.allocation.include._ip": "192.168.2.*"
}

将 tset 索引分片分配到 包含 192.168.2.* ip的地址。

  • require:表示必须满足所有条件
  • exclude:条件之外
  • include:必须至少满足其中一个条件

每个节点的分片总数

集群级分片分配器尝试将单个索引的分片分散到尽可能多的节点上。

  • index.routing.allocation.total_shards_per_node
    将分配给单个索引的最大分片数(副本和主分片)。默认为无边界。

  • cluster.routing.allocation.total_shards_per_node
    (动态)分配给每个节点的最大主分片和副本分片数。默认为-1(无限制)

例如:
当前有三个节点,设置的最大分片数都为 100
节点A:当前100个分片
节点B:当前59个分片
节点C:当前20个分片
当节点 C 故障时, ES 集群会将分片分配给节点 B,因为节点 A 已经达到了分片数量的限制。

索引恢复优先级

ES 会尽可能的按优先级顺序恢复未分配到分片,默认情况下,ES 按如下优先级顺序:

  • index.priority设置(值大优先)
  • 索引创建日期(日期越大越优先)
  • 索引名称(先高后低)

我们可以,动态的通过 index.priority 设置优先级,UPDATE 修改索引设置

PUT person/_settings
{
  "index.priority": 1
}

节点掉线时延时分配

当某个节点丢失(离开集群)时,主节点

  • 将副本分片替换该节点的主分片
  • 重新分配丢失的副本分片
  • 在其余的节点上重新平衡分片

这个过程会给集群增加负载,当节点丢失的时间很短,几分钟内就恢复了,那么此过程其实是可以避免的,我们可以通过 index.unassigned.node_left.delayed_timeout 来设置分配延迟时间,该配置默认为 1m (1分钟),可以在索引(或所有索引)上更新此设置:文章来源地址https://www.toymoban.com/news/detail-745606.html

PUT _all/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "5m"
  }
}

到了这里,关于Elasticsearch 分片策略的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Elasticsearch基础篇(七):分片大小修改和路由分配规则

    在Elasticsearch中,分片是对索引数据的水平划分和分布。索引被分成多个分片,每个分片可以在集群的不同节点上存储。这种分片的设计提供了一种水平扩展的能力,允许将大量数据分布到多个节点上,从而提高性能和可伸缩性。每个分片就是一个Lucene的实例,具有完整的功能

    2024年01月21日
    浏览(60)
  • Elasticsearch 分片策略

    和数据库中的表空间类似,不过分片是为每个索引设置,一个索引可以有多个分片,分片分为主分片和副本分片,主分片和副本分片类似于数据库中的主库和备库。 主分片(shards):可以有一个或多个,但至少会有一个,默认为1。多个主分片类似于分表,可以提高大量数据

    2024年02月05日
    浏览(39)
  • Elasticsearch:如何使用集群级别的分片分配过滤(不包括节点)安全地停用节点

    当你想停用 Elasticsearch 中的节点时,通常的过程不是直接销毁节点。 如果你这样做,那么你就有数据丢失的风险,这不是你想要对应该是可靠的数据库做的事情。 这样做的问题是,节点很可能会通过 Elasticsearch 处理的恰当命名的分片分配分配给它们的分片。 Elasticsearch 中的

    2024年02月07日
    浏览(46)
  • ElasticSearch---查询es集群状态、分片、索引

    查看es集群状态: 如果?后面加上pretty,能让返回的json格式化。 加上?v的返回结果,如下: 解释如下: 查看es分片信息: 查看es分片信息,模糊匹配,比如匹配test: 返回信息如下: 解析如下: 查看状态为unassigned的es分片信息: 查看es索引 查看es所有索引: indices表示索引,是

    2024年02月02日
    浏览(41)
  • elasticsearch——ES集群分片不平衡处理

    在使用云上的一个ES集群的时候,发现搜索性能很差,查看分片情况,发现ES有12个节点,索引创建了10个分片,1个副本,最后20个分片全在其中3个节点上,分布不均衡,实际只消耗了3个节点的资源,所以性能很差,再次创建新的索引,发现仍然是这种情况,最后通过下面的命

    2024年02月13日
    浏览(39)
  • elasticSearch核心概念的介绍(十四):ES集群索引分片管理

    上一章节我们对ES的集群进行了搭建,有兴趣的朋友可以参考一下elasticSearch核心概念的介绍(十三):docker搭建ES集群 这里我们来介绍了ES集群索引的分片管理 ES集群索引分片管理 介绍 分片(shard):因为ES是个分布式的搜索引擎,所以索引通常都会分解成不同部分,而这些

    2023年04月27日
    浏览(56)
  • 【elasticsearch】 es状态查看节点分片信息:/_cat/shards

    在kibana查询: 查询结果: index:索引名称 shard:分片数 prirep:分片类型,p=pri=primary为主分片,r=rep=replicas为复制分片 state:分片状态,STARTED为正常分片,INITIALIZING为异常分片 docs:记录数 store:存储大小 ip:es节点ip node:es节点名称

    2024年02月11日
    浏览(48)
  • ElasticSearch学习笔记-第四章 ES分片原理以及读写流程详解

    在学习ES分片原理以及读写流程之前,需要先学习一些ES的核心概念以及ES集群环境的相关知识 4.1 ES核心概念 4.1.1 索引 索引(Index)相当于MySQL中的数据库,一个索引就是一个拥有几分相似特征的文档的集合。 4.1.2 类型 类型(Type)相当于MySQL中的表,一个类型就是索引的一个逻辑上

    2024年02月06日
    浏览(62)
  • 【ElasticSearch系列-07】ES的开发场景和索引分片的设置及优化

    ElasticSearch系列整体栏目 内容 链接地址 【一】ElasticSearch下载和安装 https://zhenghuisheng.blog.csdn.net/article/details/129260827 【二】ElasticSearch概念和基本操作 https://blog.csdn.net/zhenghuishengq/article/details/134121631 【三】ElasticSearch的高级查询Query DSL https://blog.csdn.net/zhenghuishengq/article/details/1

    2024年02月03日
    浏览(54)
  • 【ElasticSearch】更新es索引生命周期策略,策略何时对索引生效

    大家好,我是好学的小师弟,今天和大家讨论下更新es索引生命周期策略后,策略何时对索引生效 结论: 若当前索引已应用策略A(旧),更新完策略A后,新的策略A会立即对原来的已经应用该策略的索引生效;若当前索引符合新策略A的生命周期变化条件,则会自动进入下一阶段

    2024年02月07日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包