ES集群知识

本文介绍了Elasticsearch的核心概念,包括集群、节点角色(Master、DataNode和CoordinatingNode)、分片与副本的作用。重点讲解了如何避免和解决脑裂问题,以及如何合理配置分片数量和副本数,确保高可用性和性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ES集群知识

核心概念

Cluster:集群,包含一个或多个 Elasticsearch 节点组成。

Node:节点,组成 Elasticsearch 集群的服务单元,同一个集群内节点的名字不能重复。通常在一个节点上分配一个或者多个分片。

Shards:分片,会将一个索引上的数据进行水平拆分,已提供水平扩展能力和分片维度的副本,拆分出来的每个数据库叫作一个分片。在创建索引时需要指定分片的数量,并且分片的数量一旦确定就不能更改。

分片后的索引带来了规模上(数据水平切分)和性能上(并行执行)的提升。每个分片都是 Luence 中的一个索引文件,每个分片必须有一个主分片和零到多个副本分片。

Replicas:备份或称为副本,是指对主分片的备份。主分片和备份分片都可以对外提供查询服务,写操作时先在主分片上完成,然后分发到备份上。

Recovery:数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

集群节点

Cluster:集群中包含多个节点,节点角色为:

Master: 主节点, node.master:true 配置的节点可以成为主节点。主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。

DataNode: 数据节点, node.data:true 默认是数据节点。数据节点负责数据的存储和相关具体操作,比如索引数据的创建、修改、删除、搜索、聚合。

Coordinate node: 协调节点,前面两个设置为false则节点仅仅担任协调节点。协调节点只负责接收请求、转发请求到其他节点、汇总各个节点返回数据等功能。

一个节点可以充当一个或多个角色, 默认是充当三个角色。

集群节点的配置:

A. 小规模集群,不需严格区分。

B. 中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。

集群规模

ES JVM heap 最大可以设置32G。30G heap 大概能处理的数据量 10 T。如果内存很大如128G,可在一台机器上运行多个ES节点实例。

A、用于构建业务搜索功能模块,且多是垂直领域的搜索。数据量级几千万到数十亿级别。一般2-4台机器的规模。

B、用于大规模数据的实时OLAP(联机处理分析),经典的如ELK Stack,数据规模可能达到千亿或更多。几十到上百节点的规模。

脑裂问题

原本一个集群,被分成了两个集群,同时出现了两个“大脑”,这就是所谓的“脑裂”现象。 由于原本的一个集群变成了两个,都对外提供服务。 一段时间之后,两个集群之间的数据可能会变得不一致了。 当网络恢复时,就面临着谁当Leader,数据怎么合并,数据冲突怎么解决等问题。脑裂问题产生是由于集群中由于网络问题形成多个割据的网络产生多个主节点造成的。

解决ES脑裂需要设置最小的主节点数量:

discovery.zen.minimum_master_nodes: (有master资格节点数/2) + 1

常用解决方法:

  1. 设置专门的,奇数个的master
  2. 单播发现机制:discovery.zen.ping.multicast.enabled: false —— 关闭多播发现机制,默认是关闭的。

discovery.zen.ping.unicast.hosts: ["master1", "master2", "master3"] —— 配置单播发现的主节点ip地址,其他从节点要加入进来,就得去询问单播发现机制里面配置的主节点我要加入到集群里面了,主节点同意以后才能加入,然后主节点再通知集群中的其他节点有新节点加入。

  1. 配置选举发现数,及延长ping master的等待时长。

discovery.zen.ping_timeout: 30(默认值是3秒)——其他节点ping主节点多久时间没有响应就认为主节点不可用了。

discovery.zen.minimum_master_nodes: 2 —— 选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。

分片数量的配置

索引的分片数指定后不可更高, 除非进行重做索引。

ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。

在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 例如,如果你有3个节点,则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。

对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片。如日志管理就是一个日期的索引需求,日期索引会很多,但每个索引存放的日志数据量就很少。

分片副本数是可以随时调整的, 一般一个分片有1-2个副本即可保证高可用。

分片路由:路由算法:shard = hash(routing) % number_of_primary_shards

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值