简介
前文只是简单的介绍了ES的使用,但是实际使用中会涉及到一些设计和服务器上参数的调整,这里对其做个简介
JVM
- 内存:Xms和Xmx设置一样,避免堆Resize引发的停顿,Xmx设置不要超过物理内存的百分50,最大不超过32G,JVM在内存小于32G时会对内存进行指针压缩,如果大于32G可能会导致性能下降
- JVM使用Service模式
- 关闭JVM Swapping
硬件
内存
内存的大小需要根据Node所需要的数据来估算
搜索类的比例1:16
日志类的比例 1:48 -1:96之间
Mapping
ES的Mapping分为动态的Mapping和手动设置的Mapping,所谓动态就是在创建索引时不指定字段的类型,由ES在插入数据时,自动生成对应的类型,比如一下是一个ES自动生成的Mapping,其为content和title自动创建了文本类型,并且为其创建了keyword类型的子字段为了精确匹配,这样导致了资源的浪费,或者在索引效率等问题,所以一般情况下我们会选择手动创建Mapping和关闭自动创建索引功能
1 | { |
如果
写操作优化
对ES的写优化前先大致了解一下ES的写策略,总体ES的写入策略和KAFKA类似(WAL),分为Refresh和Flush。ES的数据分片的最小单元成员Segment,ES中只有文档变成了生成了Segment才能被检索到,那么文档生成Segment的实效决定了写入了数据多长时间能被检索到,而ES写入的策略是先将数据写在内存的缓冲区,当达到一定条件后将数据生成Segment,这个过程就叫Refresh。我们知道文件系统中存在缓存区,Linux系统中需要调用fsync才能将数据由文件缓存区写入到磁盘,在Refresh时,ES并没有调用fsync,只有当ES在Flush阶段在调用fsync,数据才真正写入磁盘,为了避免数据在Refresh和Flush的阶段中丢失,ES也引入了WAL,在数据写入时写入磁盘日志,来避免数据丢失,那么这里优化的方法其实和kafka没有太大区别,就是优化缓存数据和日志刷新到硬盘的策略。