Skip to content

==当集群中只有一个节点的时候,将导致整个集群不可用。==

集群职责划分 elasticsearch中集群节点有不同的职责划分:

在这里插入图片描述

默认情况下,集群中的任何一个节点都同时具备上述四种角色。

但是真实的集群一定要将集群职责分离:

  • master节点:对CPU要求高,但是内存要求第

  • data节点:对CPU和内存要求都高

  • coordinating节点:对网络带宽、CPU要求高 职责分离可以让我们根据不同节点的需求分配不同的硬件去部署。而且避免业务之间的互相干扰。

一个典型的es集群职责划分如图:

在这里插入图片描述

ES写入流程

在这里插入图片描述

集群路由

文档路由 document路由到shard分片上,就叫做文档路由 ,如何路由? 路由算法 算法公式:shard = hash(routing)%number_of_primary_shards 例子: 一个索引index ,有3个primary shard : p0,p1,p2 增删改查 一个document文档时候,都会传递一个参数 routing number, 默认就是document文档 _id,(也可以手动指定) Routing = _id,假设: _id = 1 算法: Hash(1) = 21 % 3 = 0 表示 请求被 路由到 p0分片上面。 自定义路由 请求: PUT /index/item/id?routing = _id (默认) PUT /index/item/id?routing = user_id(自定义路由)---- 指定把某些值固定路由到某个分片上面。 primary shard不可变原因 即使加服务器也不能改变主分片的数量

根据业务场景确定分片和副本

根据节点数配置

  • 在2个节点的情况下

    默认即可,即1个主分片,1个副本分片

  • 在3个节点的情况下

    重要数据:1个主分片,2个副本分片

    不重要的数据:1个主分片,1个副本分片

根据场景设置

  • 日志收集:1个副本3个分片
  • 搜索功能:2副本3分片

日志收集需要的是写,所以分片数越多越好

搜索功能提供的是读,所以副本数越多效果越好

json
# 创建test索引
PUT /test/
{
  "settings":{
    "number_of_shards": 2,
    "number_of_replicas": 1
  }
}
# 更改索引test分片副本数量,主分片数number_of_shards创建索引的时候确定好后不能再修改
PUT /test/_settings
{
  "settings":{
    "number_of_replicas": 1
  }
}

更改分片副本数量

bash
curl -X PUT "localhost:9200/my_index/_settings" -H 'Content-Type: application/json' -d'
{
  "index": {
    "number_of_replicas": 1
  }
}'

节点数、分片数、副本数关系公式:

Max number of nodes = Number of shards * (number of replicas +1)

换句话说,如果你计划用10个分片和2个分片副本,那么最大的节点数是30。

集群规格和容量规划

当您准备创建 Elasticsearch 实例时,建议提前评估集群所需的资源。一般情况下需要评估所需磁盘容量、集群规格、存储的文件类型、大小和数量等。基于这些资源评估,预先规划合适的 Elasticsearch 集群配置,可以减少后续使用过程中的问题和风险。

重要知识: ES 集群的物理磁盘容量 不等于 ES 集群可使用数据空间大小

要进行 Elasticsearch 的容量规划,需要考虑以下因素:

  • 使用场景:主要使用的业务场景,不同场景下产生的数据量不同
  • 文档数量:确定要存储的文档数量,以及每个文档的大小
  • 存储需求:确定所需的存储空间,以便存储所有文档以及任何相关数据
  • 索引需求:选择适当的索引策略和设置以确保性能和可扩展性
  • 查询需求:确定查询负载的复杂性和大小,以便为其分配足够的资源
  • 集群规模:确定集群的大小和数量,以便支持预期的负载并提供高可用性和容错性

基础要求规划

在存储容量规划的开始时,需要预先确认两个 使用场景数据要求 规划:

  • 使用场景
    • 日志场景
    • 搜索场景
    • 数据分析场景
    • 数据库加速场景
    • 通用场景
  • 数据要求
    • 源数据大小或者预估文档条数和单个文档的大小
    • 每日数据增量情况
    • 数据保留时长
    • 需要的副本数

ES磁盘容量预估

Elasticsearch 中除了数据之外,还有其他的开销,这些也是影响 Elasticsearch 服务存储容量的主要原因,如:

  • 索引开销:可以使用 cat/indices?v API 和 _pri.store.size 值计算确切的开销计算,通常比源数据大 10%( _all 参数等未计算)
  • 操作系统预留空间:默认操作系统会保留5%的文件系统供您处理关键流程、系统恢复以及防止磁盘碎片化问题等
  • Elasticsearch 内部开销:段合并、日志等内部操作,一般预留 20%
  • 副本数量: 副本有利于增加数据的可靠性,但同时会增加存储成本
  • 安全阈值: 为了预防突发的数据增长,请大致保留 15% 的容量空间作为安全阈值

所以,为了数据的安全和稳定,我们建议您的磁盘使用率不要超过 85% ;或者在即将达到 85%,应该尽快扩充升级。

快速计算公式

完整公式简化版本
源数据 * (1 + 副本数量) * ( 1 + 索引开销) / (1 - Linux 预留空间) / (1 - 内部开销) = 最小存储要求源数据 * (1 + 副本数量)* 1.45 = 最小存储要求
ES建议存储容量 = 源数据 * (1 + 副本数量) * 1.45 * (1 + 预留空间) ≈ 源数据 * (1 + 副本数量) * 2.2

==如果有 500G 数据存储并且需要一个副本,则最低存储要求更接近 500 * 2 * 1.1 / 0.95 / 0.8 = 1.5T==

关于节点磁盘的配置

使用场景不同,单节点最大承载数据量也会不同,具体如下:

  • 数据加速、查询聚合等场景:单节点磁盘最大容量 = 单节点内存大小(GB)* 10
  • 日志写入、离线分析等场景:单节点磁盘最大容量 = 单节点内存大小(GB)* 50
  • 通用场景:单节点磁盘最大容量 = 单节点内存大小(GB)* 30

ES 集群实例配置推荐

在生产环境部署推荐配置:尽量一个节点只承担一个角色。不同节点所需要的计算资源不一样。不同角色分离后,可以按需扩展互不影响。

  • 集群最大节点数 = 单节点 CPU * 5
  • 单节点磁盘最大容量
    • 搜索类场景:单节点磁盘最大容量 = 单节点内存大小(GB)* 10。
    • 日志类等场景:单节点磁盘最大容量 = 单节点内存大小(GB)* 50。
配置最大节点数单节点磁盘最大容量 (查询)单节点磁盘最大容量 (日志)
4 核 16G20160 GB800 GB
8 核 32G40320 GB1.5 TB
16 核 64G80640 GB2 TB

分片数量规划

适用场景:

  • 日志类,写入频繁,查询较少,单个分片 30G 左右
  • 搜索类,写入少,查询频繁,单个分片不超过 20G

每个 Elasticsearch 索引被分为多个分片,数据按哈希算法打散到不同的分片中。由于索引分片的数量影响读写性能和故障恢复速度,建议提前规划。

分片使用概要

  • Elasticsearch 在 7.x 版本中,每个索引默认为 1 个主分片1 个副本分片
  • 在单节点上,7.x 版本最大分片数量为 1000
  • 单个分片大小尽量保持在 10-50G 之间为最佳体验,一般推荐在 30G 左右
    • 分片过大可能使 Elasticsearch 的故障恢复速度变慢
    • 分片过小可能导致非常多的分片,因为每个分片会使用占用一些 CPU 和内存,从而导致读写性能和内存不足的问题。
  • 当分片数量超过数据节点数量时,建议分片数量接近数据节点的整数倍,便于将分片均匀的分布到数据节点中。
  • 对日志场景,建议启用 ILM 功能。在发现分片大小不合理时,通过该功能及时调整分片数量。

分片计算公式

(元数据 + 增长空间) * (1 + 索引开销) / 所需的分片大小 = 主分片的大约数量

假设有 80GiB 的数据。希望将每个分片保持在 30GiB 左右。因此,您的分片数量应大约为 80 * 1.1 / 30 = 3

分片设置的可参考原则:

ElasticSearch推荐的最大JVM堆空间是30~32G, 所以把你的分片最大容量限制为30GB, 然后再对分片数量做合理估算. 例如, 你认为你的数据能达到200GB, 推荐你最多分配7到8个分片。 在开始阶段, 一个好的方案是根据你的节点数量==按照1.5~3倍的原则==来创建分片. 例如,如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个。当性能下降时,增加节点,ES会平衡分片的放置。 对于基于日期的索引需求, 并且对索引数据的搜索场景非常少. 也许这些索引量将达到成百上千, 但每个索引的数据量只有1GB甚至更小. 对于这种类似场景, 建议只需要为索引分配1个分片。如日志管理就是一个日期的索引需求,日期索引会很多,但每个索引存放的日志数据量就很少。

副本设置基本原则:

为保证高可用,副本数设置为2即可。要求集群至少要有3个节点,来分开存放主分片、副本。 如发现并发量大时,查询性能会下降,可增加副本数,来提升并发查询能力。

注意:新增副本时主节点会自动协调,然后拷贝数据到新增的副本节点

如何避免脑裂问题?

3.1 脑裂问题

一个集群中只有一个A主节点,A主节点因为需要处理的东西太多或者网络过于繁忙,从而导致其他从节点ping不通A主节点,这样其他从节点就会认为A主节点不可用了,就会重新选出一个新的主节点B。过了一会A主节点恢复正常了,这样就出现了两个主节点,导致一部分数据来源于A主节点,另外一部分数据来源于B主节点,出现数据不一致问题,这就是脑裂

3.2 尽量避免脑裂,需要添加最小数量的主节点配置:

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

这个参数控制的是,选举主节点时需要看到最少多少个具有master资格的活节点,才能进行选举。官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量。