ElasticSearch优化
硬件选择
- 使用ssd
- 使用RAID0
- 使用多个硬盘,并允许ES通过多个path.data目录配置把数据条带化分配到他们上面
不要使用远程挂载的存储,比如NFS或者SMB/CIFS。这个引入的延迟对性能来说是背道而驰
分片策略
合理设置分片数
- 控制每个分片占用的硬盘容量不超过ES的最大JVM的堆空间(一般设置不超过32G),因此,如果索引的总量在500G左右,那分片大小在16个左右即可,最好同时考虑原则2
- 考虑一下node数量,一般一个节点有时候就是一台物理机,如果分片数量过多,大大超过了节点数,很可能会导致一个节点上存在多个分片,一旦该节点故障,即使保持了一个以上的副本,同样有可能会导致数据丢失,集群无法恢复。所以, 一般都设置分片数不超过节点数的3倍。
- 主分片,副本和节点最大数之间数量,分配参考关系
节点数 <= 主分片数 * (副本数+1)
推迟分片分配
写入速度优化
- 加大TranslogFlush,目的是降低Iops,Writeblock.
- 增加Index Refresh间隔,目的是减少segment Merge的次数
- 调整Bulk线程池和队列
- 优化节点间的任务分布
- 优化Lucene层的索引建立,目的是降低cpu及io
批量数据提交
- ES提供了BulkAPI支持批量操作,当我们有大量的写任务时,可以使用Bulk来进行批量写入
通用的策略:如果Bulk默认设置批量提交的数据量不能超过100M.数据条数一般时 根据文档的大小和服务器性能而定的,但是单词批处理的数据大小应从5MB~15MB 逐渐增加,当性能没有提升时,把这个数据量作为最大值
减少Refresh的次数
- Lucene在新增数据时,采用了延迟写入的策略,默认情况下索引的refresh_interval为1秒
Lucene将待写入的数据优先写到内存中,超过1秒(默认)时就会触发一次Refresh,然后Refresh 会把内存中的数据刷新到操作系统的文件缓存系统中,如果我们对搜索的时效性要求不高,可以将Refresh周期延长,例如30秒
加大Flush设置
- Flush的主要目的是把文件缓存系统中的段持久化到硬盘,当Translog的数据量达到512MB
或者30分钟时,会触发一次Flush - index.translog.flush_threshold_size参数的默认值为512MB,我们进行修改。
增加参数值以为值文件缓存系统中可能需要 存储更多的数据,所以我们需要为操作系统的文件 缓存系统留下足够的空间
减少副本的数量
- S为了保证集群的可用性,提供了Replicas(副本)支持,然后每个副本也会执行分析、索引及可能的
合并过程,索引Replicas的数量会严重有影响索引的效率
内存设置
- 不要超过物理内存的50% Lucene的设计母的是把底层os里的数据缓存到内存中
Lucene的段是分别存储到单个文件中的,这些文件都是不会变化的,所以很利于缓存,同时操作系统也会把这些文件缓存起来,以便更快的的访问 如果我们设置的堆内存过大,Lucene可用的内存将会减少,就会严重影响降低Lucene的全文本查询性能 - 堆内存的大小最好不要超过32GB 在java中,所有对象都分配在堆上,然后有一个Klass Pointer指针指向它的类元数据。
这个指针在64位的操作系统上为64位,64位的操作系统可以使用更多的内存2的64次方。在32位的系统上位32位, 32位的操作系统的最大寻址空间位4GB 2的32次方 但是64位的指针意味着更大的浪费,以为你的指针本身大了,浪费内存不算,更糟糕的是,更大的指针在主内存和缓存器(例如LLC,L1等) 之间移动数据的时候,会占用更多的带宽。 最终采用31G -Xms31g -Xmx31g
重要参数设置
|