Elasticsearch:分片和集群设计

分片

分片数量

  • 7.0开始,新建索引时,默认只有一个主分片。优点在于:单个分片,查询算分和聚合不准的问题都可以得到避免;缺点在于:即便增加新的节点,也无法实现水平扩展。
  • 如果有两个主分片,当集群增加节点后,es会自动进行分片移动(Shard Rebalancing),将本分布在一个节点的两个分片平衡为两个节点,每个节点一个分片。
  • 分片数>节点数时:一旦集群中有新的数据节点加入,分片就可以自动分配;分片在重新分配时,系统也可以正常工作。
  • 多分片的好处:一个索引如果分布在多个节点,查询可以并行,写入可以分散到多个机器。
  • 例1:每天1GB,一个索引,一个主分片,一个副本分片。保留半年,共18012 = 360G数据 = 360个分片。
  • 例2:五个不同日志,每天一个日志索引,每个日志索引有10个主分片,保留半年,共180510 = 9000个分片。
  • 分片是es实现集群水平扩展的最小单位。
  • 当分片过多时,会导致额外的性能开销:
    • 每次搜索,需要从每个分片获取数据。
    • 分片的Meta信息会变多,增加主节点的负担。

分片建议

  • 日志类应用,单分片不超50GB。
  • 搜索类应用,单分片不超20GB。
  • 为什么要控制:
    • 提高更新时的性能。
    • 分片合并时,减少所需资源。
    • 节点丢失后,具备更快恢复速度(分片小便于在集群内移动)

副本建议

  • 副本是主分片的拷贝,目的是提高系统可用性:可以执行查询,并且避免数据丢失;副本分片需要占用和主分片一样的资源。
  • 副本分片会降低数据的索引(写入)速度:有几份副本就会有几倍的CPU资源消耗。
  • 可以减缓对主分片的查询压力,但是会消耗同样的内存资源;如果机器资源充分,提高副本数可以提高整体的查询QPS。

相关设置

  • Es分片策略会尽量保证节点上的分片数大致相同。可能会产生问题: 扩容时,原有节点磁盘基本写满了,新索引会集中在新加的节点上,导致数据分布不均匀。
  • index.routing.allocation.total_shards_per_node设置为1,可以限制一个索引在单个节点上只能有一个分片(主分片或者副本)

集群

容量规划

  • 需要保证一定的余量,当负载出现波动或者节点丢失时,还可以正常运行。
  • 容量规划需要考虑:机器的软硬件配置、数据量大小(包括单条文档的数据大小,文档的总数据量,索引的总数据量,副本分片数)、批量写入的大小、查询的复杂度等。

评估业务的性能需求

  • 数据吞吐及性能需求:数据写入的吞吐量,查询的吞吐量,单条查询可接受的最大返回时间。
  • 了解数据格式和数据的Mapping。了解实际查询和聚合张什么样。

硬件配置

  • 数据节点尽可能用SSD。
  • 搜索等性能要求高的场景,建议1:10的比例配置内存和硬盘。硬盘使用SSD。
  • 日志类和查询并发低的场景,可以考虑使用机械硬盘,按照1:50的比例配置内存和硬盘。
  • 单节点数据控制在2TB以内,最大不超过5个T。
  • JVM配置机器内存的一半,不建议超过32G。

部署方式

  • 如果考虑高可用性,建议部署3台备用主节点。
  • 如果有复杂查询和聚合,建议设置Coordinating节点。

案例1:对固定大小数据集搜索

  • 如:产品信息库。特点:被搜索的数据集很大,但是增长相对缓慢。更关心搜索和聚合的读取性能;数据的重要性与时间无关,主要关注的是搜索的相关度。
  • 估算索引数据量,然后确定分片大小。单个分片数据不要超过20GB,可以通过增加副本分片,提高查询的吞吐。
  • 如果业务上有大量查询是基于一个字段进行Filter,该字段又是一个枚举值,如果单索引数据量较大,可以考虑根据这个字段进行索引拆分,这样可以提高查询性能;拆分后,若有其他业务场景需要查询多个索引,可以在查询中指定或使用通配符。
  • 如果业务上有大量查询是基于一个字段进行Filter,该字段不固定,可以启用Routing功能,按照filter字段的值分布到集群中不同的shard,降低查询时相关的分片数,提高CPU利用率。

案例2:日志/指标等事件

  • 特性:每条数据都有时间戳;文档基本不会更新;用户更多会查询近期数据,对旧数据查询较少;对数据的写入性能要求较高。
  • 创建基于时间的索引:time-xxx,在索引名字中增加时间信息,按照每天/每周/每月的方式进行划分。
  • 带来的好处:更加合理的组织索引,例如随着时间推移,便于做老化处理。
  • 基于Date Math方式,POST /<logs-{now/d}>/_search 需要进行转义:POST /%3Clogs-%7now%2Fd%7D%3E/_search
格式例子
<logs-{now/d}>logs-2021.04.29
<logs-{now{YYYY.MM}}>logs-2021.04
  • 基于Index Alias方式,创建索引,每天/每周/每月,在索引的名字中增加时间信息。

集群扩容

  • 增加Coordinating Node或Ingest Node,解决CPU和内存开销问题。
  • 增加数据节点,解决存储的容量问题;为避免分片不均。要提前监控磁盘空间,提前清理数据或增加节点(70%)。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值