elasticsearch的使用越来越广泛,但是小打小闹的使用没有太大的问题,但是在生产环境,随着时间的日积月累,数据会越来越多,那么elasticsearch的调优等也是越来越刻不容缓的事情,今天我们就从官方的文档里面梳理下有哪些调优的地方。主要从三个方面来讲,分别是设计层面,运维层面,代码层面。
设计层面
1、如果业务中不适用exists query,则可以禁用_field_names 字段,能大大提高索引速度。
{ "mappings": { "_doc": { "_field_names": { "enabled": false } } }
2、document字段类型使用合适的类型,减少不合适的索引类型带来的查询开销
3、document设计尽量在一个表做关联,查询的时间避免出现join操作。减少使用nested和parent-child查询,普通查询效率>nested查询效率>parent-child查询效率
4、mappings里面的字段能用keyword最好,如果是数字类型,没有排序的需求,也使用keyword,有排序则使用integer。
5、避免出现过大的document,每个document越小越好,默认每个document为100M,可以调试,但是不能超过2G。
6、尽可能使用fieldcache。
运维层面
1、在条件允许的情况下,调大refresh interval可以增大索引请求量。默认为1s,根据时间情况进行调整。
2、在条件允许的情况下,禁用refresh和replicats可以增大索引请求量。禁用的话这样设置:
index.refresh_interval:-1 index.number_of_replicas:0
3、设置操作系统,禁止swap
swapoff -a
4、xms和xmx设置为一样的值,减少gc频率
5、elasticsearch一般暂用服务器一半内存或稍小一点,例如64G内存的服务器,给elasticsearch分配 26-32G的内存都可以
6、尽量使用ssd硬盘+千兆万兆带宽(一般都是放在服务器内网的)
7、尽量使用local storage,不要使用nfs,smb等远程存储
8、如果是搜索密集型的业务,建议买cpu密集型的服务器。
9、加大indexing busffer size,index.memory.index_buffer_size的值一般是 分片数*512M。
代码层面
1、使用批量请求索引比单文档请求索引能获得更好的性能。
2、生产这段建议使用多线程向es发送批量请求,尽可能利用集群资源
3、代码层多关注TOO_MANY_REQUESTS,出现这种情况的时候,java代码会报错:EsRejectedExecutionException,此时应该减缓代码层的索引请求数,并且做好数据不丢失的准备。
4、不要一次性返回非常大的结果集,一般我们只需要返回top-n即可
5、查询结果能不打分就不打分
还没有评论,来说两句吧...