安装部署
下载安装包:https://www.elastic.co/
解压:tar -zxvf elasticsearch-6.1.1.tar.gz -C /export/servers
mv elasticsearch-6.1.1 elasticsearch
修改配置:
vi elasticsearch.yml
修改的主要内容:
#配置es的集群名称,默认是elasticsearch,es会自动发现在同一网段下的es,如果在同一网段下有多个集群,就可以用这个属性来区分不同的集群。
cluster.name: my-es
#节点名称
node.name: node1
#设置索引数据的存储路径
path.data: /export/servers/esdata
#设置日志的存储路径
path.logs: /export/servers/es/logs
#设置当前的ip地址,通过指定相同网段的其他节点会加入该集群中
network.host: 192.168.52.140
#设置对外服务的http端口
http.port: 9200
#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["node-1"]
性能调优
- 索引优化
Elasticsearch 本身索引速度其实还是蛮快的,索引优化主要是在 Elasticsearch 插入层面优化,如果瓶颈不在这块,而是在产生数据部分,比如 DB 或者 Hadoop 上,那么优化方向就需要改变下。
**硬件优化:**尽量使用固态硬盘 SSD
**批量提交:**如果在提交过程中,遇到 EsRejectedExecutionException 异常的话,则说明集群的索引性能已经达到极限了。。这种情况,要么提高服务器集群的资源,要么根据业务规则,减少数据收集速度,比如只收集 Warn、Error 级别以上的日志。
**refresh时间间隔:**通过延长 refresh 时间间隔,可以有效的减少 segment 合并压力,提供索引速度。将 index.refresh_interval 设置为 30s,减少 refresh 次数。在进行全量索引时,可以将 refresh 次数临时关闭,即 index.refresh_interval 设置为 -1,数据导入成功后再打开到正常模式,比如 30s。
**减少副本数量:**Elasticsearch 默认副本数量为 3 个,虽然这样会提高集群的可用性,增加搜索的并发数,但是同时也会影响写入索引的效率。使用 Elasticsearch 做业务搜索的时候,建议副本数目还是设置为 3 个,但是像内部 ELK 日志系统、分布式跟踪系统中,完全可以将副本数目设置为 1 个。
- 查询优化
**路由:**routing 默认值是文档的 id,也可以采用自定义值,比如用户 id。Elasticsearch 如何知道一个文档应该存放到哪个分片中呢?它其实是通过下面这个公式来计算出来,shard = hash(routing) % number_of_primary_shards。
带routing的查询 VS 不带routing的查询:
不带routing的查询,因为不知道要查询的数据具体在哪个分片上,所以整个过程分为 2 个步骤:
- 分发:请求到达协调节点后,协调节点将查询请求分发到每个分片上。
- 聚合: 协调节点搜集到每个分片上查询结果,在将查询的结果进行排序,之后给用户返回结果。
带routing的查询可以直接根据 routing 信息定位到某个分片查询,不需要查询所有的分片,经过协调节点排序。如上面自定义用户查询,如果 routing 设置为 userid 的话,就可以直接查询出数据来,效率提升很多。
Filter vs Query
尽可能使用过滤器上下文(Filter)替代查询上下文(Query),因为Elasticsearch 针对 Filter 查询只需要回答「是」或者「否」,不需要像 Query 查询一下计算相关性分数,同时 Filter 结果可以缓存。
大翻页
在使用 Elasticsearch 过程中,应尽量避免大翻页的出现。
如果 From 或者 Size 很大的话,导致参加排序的数量会同步扩大很多,最终会导致 CPU 资源消耗增大。
可以通过使用 Elasticsearch scroll 和 scroll-scan 高效滚动的方式来解决这样的问题。具体写法,可以参考 Elasticsearch: 权威指南 - scroll 查询
- 配置优化
Elasticsearch 底层使用 Lucene,建议把 50% 的可用内存作为 Elasticsearch 的堆内存,保留剩下的 50%留给Lucene。假设你有个机器有 128 GB 的内存,你可以创建两个节点,每个节点内存分配不超过 32 GB。 也就是说不超过 64 GB 内存给 ES 的堆内存,剩下的超过 64 GB 的内存给 Lucene。