0%

ES设置

简介

前文只是简单的介绍了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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
"news" : {
"mappings" : {
"properties" : {
"content" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
},
"title" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword",
"ignore_above" : 256
}
}
}
}
}
}
}

如果

写操作优化

对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没有太大区别,就是优化缓存数据和日志刷新到硬盘的策略。