【es】通过分片感知将节点划分为不同的区域

1.es的分片感知,将节点划分为不同的区域

分片感知 
可以使用分片分配的感知,对副本分片分配的位置进行人为干预。分片分片的感知
允许把ES的节点划分为属于不同的区域,当分配一个副本分片时,不允许将它分配
到它的主分片所在的区域,这样可以避免同一区域宕机,导致集群不可用的风险。


(1)启动集群时,设置集群所在的区域属性 。
vim elasticsearch.yml  
node.attr.zone=zone1 

第二个节点:
node.attr.zone=zone2 

设置分配感知的区域。
curl -X PUT localhost:9200/_cluster/settings -u elastic:elastic  -H "Content-Type: application/json" -d '
{
"transient":{
"cluster.routing.allocation.awareness.attributes":"zone",
"cluster.routing.allocation.awareness.force.zone.values":"zone1,zone2"
}
}'

{
    "acknowledged":true,
    "persistent":{

    },
    "transient":{
        "cluster":{
            "routing":{
                "allocation":{
                    "awareness":{
                        "attributes":"zone",
                        "force":{
                            "zone":{
                                "values":"zone1,zone2"
                            }
                        }
                    }
                }
            }
        }
    }
}

curl -XGET localhost:9200/_cat/shards/iot_005?v -u elastic:elastic  -H "Content-Type: application/json" -d 

curl -X PUT localhost:9200/iot_005 -u elastic:elastic  -H "Content-Type: application/json" -d '
{
"settings":{
"number_of_shards":"3",
"number_of_replicas":"1"
}
}'

6.分片分配的过滤 
当想从集群中删除一个节点,在关闭该节点前,想把它拥有的分片全部迁移到其他节点上。
这时候可以使用分片分配的过滤来完成。分片分配的过滤允许配置分片只能
或不能分配到某些节点上,这些配置对整个集群有效。

vim elasticsearch.yml 
node.attr.state: abandon 

配置一个自定义属性state,内容为 abandon; 为了不让任何分片分配到该节点上,需要设置:
PUT _cluster/settings 
{
"transient":{"cluster.routing.allocation.exclude.state":"abandon"}
}

这样,携带属性:node.attr.state: abandon 的节点将不会分配任何分片。

常用的节点自带的属性有:
_name: 节点的名称。
_ip: 节点的IP; 
_host: 节点主机名  
_id: 节点的ID;

exclude 可以用于分配分片时过滤掉某些节点,include 和 require 可以用于配置分配 
分片时需要包含的节点。

PUT _cluster/settings 
{
"transient":{
"cluster.routing.allocation.exclude.state":"abandon",
"cluster.routing.allocation.include._name":"node-1,node-2",
"cluster.routing.allocation.require.state":"good,fine"
}
}

在集群中分配分片时,要过滤掉state属性为 abandon的节点,允许将分片分配到节点 
名为 node-1,或 node-2 的节点,而且节点的state 属性必须同时包含good 和 fine 

Elasticsearch 中的分片分布机制旨在实现数据的高效存储和查询负载的均衡。分片的分配过程由集群的主节点(Master Node)负责协调,并通过分片分配器(Shard Allocator)在集群的各个数据节点(Data Node)之间进行分片的平衡分布。 ### 分片分配的基本原则 分片分配的核心目标是确保主分片(Primary Shard)和副本分片(Replica Shard)均匀分布在集群的不同节点上,以提高系统的容错能力和性能。Elasticsearch 使用一种基于节点属性的分配策略,确保每个索引的主分片和副本分片不会被分配到同一个节点上。这种机制避免了单点故障导致数据丢失或服务中断的情况[^3]。 ### 分片分配的节点选择 在节点选择方面,Elasticsearch 会考虑多个因素,包括节点的可用性、负载情况、分片数量限制以及节点属性配置。例如,在节点上保留的分片数量应与可用的堆内存成正比,一个经验法则是确保每个节点分片数量低于每GB堆内存配置20到25个分片。因此,具有30GB堆内存的节点应保持最多600-750个分片,以确保集群的健康运行[^1]。 此外,Elasticsearch 还支持根据节点属性(如节点名称、机房位置等)进行分片分配。例如,可以通过设置 `cluster.routing.allocation.attribute` 参数来控制分片分配到特定的节点组或区域,从而实现更精细的控制[^5]。 ### 分片分配的动态调整 Elasticsearch 支持动态调整分片的分配策略。例如,当某个节点发生故障或需要进行维护时,可以通过 `_cluster/reroute` API 手动触发分片的重新分配。以下是一个分片迁移的示例: ```json POST /_cluster/reroute?metric=none { "commands": [ { "cancel": { "index": "log-service-prod-2025.02.20", "shard": 4, "node": "node-2", "allow_primary": true } } ] } ``` 该操作将取消节点 `node-2` 上索引 `log-service-prod-2025.02.20` 的第4个分片,并触发分片的重新分配。需要注意的是,对于主分片的取消操作,必须设置 `allow_primary` 为 `true`[^3]。 ### 分片分配的故障恢复 当集群中的某个节点意外重启或宕机时,Elasticsearch 会自动检测到该节点的状态变化,并将原本分配在该节点上的主分片标记为不可用。随后,Elasticsearch 会从其他节点上的副本分片中选举一个新的主分片,并重新分配副本分片以确保数据的冗余性和可用性。例如,在一个3节点集群中,如果其中一个数据节点意外重启,导致所有主分片集中到另一个数据节点上,Elasticsearch 会自动将部分主分片重新分配回重启后的节点,以恢复负载均衡[^4]。 ### 示例代码:查看分片分配状态 可以通过以下命令查看集群中分片的分配状态: ```json GET /_cat/shards?v ``` 该命令将返回每个索引的分片信息,包括分片编号、状态(主分片或副本分片)、所在节点等信息。 ### 示例代码:动态调整分片分配策略 可以通过以下命令动态调整分片分配策略,例如禁用或启用分片的自动分配: ```json PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.enable": "all" } } ``` 该操作将启用所有分片的自动分配策略。如果希望禁用分片分配,可以将 `cluster.routing.allocation.enable` 设置为 `none`。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值