1,ES的优化:
优化以下几个方面进行入手:
- 硬件层面:
- 因为ES的所有的索引和数据都是存储在磁盘上面的;因此,当你的服务器磁盘性能越好,那么IO流的速度越快也就意味着查询性能更好,因此使用高性能的SSD能在根本上提升ES的性能;
- ES的储存结构是:内存加硬盘,在内存中是存放热数据,因此在第一次上线的时候呢,可以将项目的一些热点数据先行加载到内存里面,实现热数据预加载;
- 使用多块磁盘,并运行ES通过path.data的目录配置设置数据条带化分配到磁盘上面;
- 不要使用远程的挂载存储,否则可能会因为带宽的影响导致延迟,降低了不必要的性能;
- 分片策略:
- 在集群中的分片尽可能地合理,但是具体要分多少片,还是得通过测试得出;总的来说,每个分片的磁盘占用量不应该超过ES的最大JVM堆内存空间的设置(一般不要设置超过32g,java语言的特性);
- 合理分配节点node的数量,一般分片数不应该超过节点数的3倍,比如说:3个节点node,那么最大的分片数就是9个;因为当分片数量过多的时候,一旦节点故障,会存在过多的节点,可能会导致数据的丢失;
- 写入速度的优化:
- 在ES中有提供Bulk API来对批量数据的导入优化,要导入大量的数据的时候,尽可能使用bulk来进行批量写入;
- 减少Refresh的次数:因为ES采用了延迟写入的策略,ES会将要写入的数据先写入到内存中,超过1秒后再通过refresh将内存中的数据写入到磁盘,所以,可以将refresh的周期延长,减少refresh的周期,让每次写入磁盘的数据量尽可能地大一点,减少写入连接的次数;但是这种方案,对内存的大小有较高的要求;
- 内存的设置:
- 在初始化ES的时候,默认的安装内容是1GB,这个内存对应任何高并发的业务来说都太小了,因此,在jvm.option文件中可以设置ES的堆内存大小,Xms表示内存大小,Xmx表示最大内存大小;
- 在分配内存大小的时候尽量不要超过32GB,因为在java语言中所有的对象都分配在堆中,如果说内存大于32gb的时候,会导致对象内存大小的改变;
- 且应该确保Xmx和Xms的大小是相同的,目的就是为了能在java垃圾回收机制清理完成后,堆内存不需要重新计算堆内存的大小导致资源的浪费;
- 查询语句的设置:
- 在执行大批量数据查询(全表查询)的时候,如果不需要用到sorce来算分查询,那么尽量使用过滤器执行一般的查询即可,否则算分函数查询会消耗大量的算力导致查询缓慢;
- 建立索引库:
- 在建立索引库的时候,如果在分类查询的业务使用到ES,那么可以分成多个索引库,不要将多个分类全集中在一个索引库进行查询,可以一个分类对应一个或者多个索引库,再通过前端的传来的分类信息数据查询对应的索引库即可;简单来说就是尽可能地去减少一个索引库的数据量大小,能更快地实现全库查询;
这些只是其中一些的优化策略;这里只是简单描述一下而已;
