Elasticsearch 分片策略

文章介绍了Elasticsearch中分片的概念,包括主分片和副本分片的作用,以及如何在创建索引时设置分片数量。此外,还讨论了如何获取索引的分片信息,分片的分配策略,如集群级和索引级分配,以及节点掉线时的延迟分配策略。强调了合理设置和管理分片对集群性能和可用性的重要性。
摘要由CSDN通过智能技术生成

分片

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

  • 主分片(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分钟),可以在索引(或所有索引)上更新此设置:

PUT _all/_settings
{
  "settings": {
    "index.unassigned.node_left.delayed_timeout": "5m"
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值