Elasticsearch

安装部署

下载安装包: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。

相关推荐
天远Date Lab23 分钟前
Python实现用户消费潜力评估:天远个人消费能力等级API对接全攻略
java·大数据·网络·python
Elastic 中国社区官方博客7 小时前
使用 Elastic Cloud Serverless 扩展批量索引
大数据·运维·数据库·elasticsearch·搜索引擎·云原生·serverless
Dxy12393102169 小时前
Elasticsearch 8.13.4 内存占用过大如何处理
大数据·elasticsearch·搜索引擎
qq_124987075311 小时前
基于深度学习的蘑菇种类识别系统的设计与实现(源码+论文+部署+安装)
java·大数据·人工智能·深度学习·cnn·cnn算法
泰迪智能科技11 小时前
新疆高校大数据人工智能实验室建设案例
大数据·人工智能
Light6011 小时前
数据战争的星辰大海:从纷争到融合,五大核心架构的终局之战与AI新纪元
大数据·人工智能·数据治理·湖仓一体·数据中台·数据架构·选型策略
qq_3482318511 小时前
市场快评 · 今日复盘20251231
大数据
小北方城市网11 小时前
Python + 前后端全栈进阶课程(共 10 节|完整版递进式|从技术深化→项目落地→就业进阶,无缝衔接基础课)
大数据·开发语言·网络·python·数据库架构
喜欢编程的小菜鸡12 小时前
2025:中国大数据行业的“价值觉醒”之年——从规模基建到效能释放的历史性转折
大数据
策知道12 小时前
从“抗旱保苗”到“修渠引水”:读懂五年财政政策的变奏曲
大数据·数据库·人工智能·搜索引擎·政务