硬盘策略
- Elasticsearch 重度使用磁盘磁盘能处理的吞吐量越大,节点就越稳定;
硬盘建议使用SSD,建议使用条带化 RAID 会提高磁盘 I/O,不建议使用镜像;
配置多磁盘存储,即配置索引数据、日志不同存储目录,elasticsearch-7.13.0/config/ elasticsearch.yml
分片策略
- 每个分片占用的硬盘容量不超过 ES 的最大 JVM 的堆空间设置,一般设置不超过 32G,且分片数不超过节点数的 3 倍。主分片,副本、节点数之间满足:节点数 <=主分片数(副本数+1)*
如果节点数过少,远远小于分片数,很可能会导致一个节点上存在多个分片,一旦该节点故障,集群无法恢复
如果节点数过多,分片数也过多,每一个分片都只有很少的数据会导致很低的相关度
5m(时间可改)内瞬时中断节点重接接入集群,节点会保持现有的分片数据,不会触发新的分片分配。
PUT /_all/_settings
{
"settings": {
"index.unassigned.node_left.delayed_timeout": "5m"
} }
路由策略
shard = hash(routing) % number_of_primary_shards
routing 默认值是文档的 id,也可以采用自定义值
带 routing 查询,查询的时候,可以直接根据 routing 信息定位到某个分片或副本,不需要查询所有节点的分片和副本
不带 routing 查询,协调节点将查询请求分发到每个分片上,协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,之后给用户返回结果
写入流程优化
-
加大 Translog Flush时间 ,目的是降低 IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)、Writeblock(写入磁盘)。
index.translog.flush_threshold_size
参数的默认值是 512MB, 我们可以进行修改,
同时也意味着文件缓存系统中可能需要存储更多的数据 -
增加 Refresh 间隔,目的是减少 Segment Merge 的次数。
对搜索的实效性要求不高,可以将 Refresh 周期延长,同时也意味着消耗更多的Heap内存。 因为段合并的计算量大,消耗大量的 I/O
-
当写索引时,需要把写入的数据都同步到副本节点,副本节点越多,写索引的效率就越慢。
我 们 需 要 大 批 量 写 入操 作 , 可 以 先 禁 止 Replica 复 制 , 设 置index.number_of_replicas: 0 关闭副本。在写入完成后,Replica 修改回正常的状态
内存设置
ES 默认安装后设置的内存是 1GB,可以对Heap内存 和 操作系统文件缓存重分配。建议最大分配内存不要超过50%,即Heap内存、操作系统文件缓存,各自容量不要超过物理内存50%
若一台电脑有64G物理内存,则每个节点的内存分配不要超过32G,jvm.option 文件配置如下:
-Xms 31g
-Xmx 31g
Xms 表示堆的初始大小,Xmx 表示可分配的最大内存
确保 Xmx 和 Xms 的大小是相同的,其目的是为了能够在 Java 垃圾回收机制清理完
堆区后不需要重新分隔计算堆区的大小而浪费资源,可以减轻伸缩堆大小带来的压力