在互联网应用中,搜索引擎是不可或缺的一部分。Elasticsearch 作为一款基于 Lucene 的分布式、RESTful 风格的搜索和分析引擎,被广泛应用于日志分析、全文检索、监控等场景。本文将结合实际经验,分享 Elasticsearch 搭建 的完整过程,并提供亲测有效的避坑指南,助力你快速构建稳定可靠的搜索服务。
1. 单机 Elasticsearch 搭建
1.1 环境准备
- 操作系统: CentOS 7.x / Ubuntu 18.04+
- JDK: JDK 1.8+ (推荐 JDK 11 或 JDK 17)
- Elasticsearch 版本: 7.x 或 8.x (本文以 7.17 为例)
1.2 下载与安装
从 Elasticsearch 官网下载对应版本的安装包,例如 .tar.gz 或 .rpm 文件。
使用 .tar.gz 安装:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.17.0-linux-x86_64.tar.gz
cd elasticsearch-7.17.0
使用 .rpm 安装:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.0-x86_64.rpm
sudo rpm -i elasticsearch-7.17.0-x86_64.rpm
1.3 配置 Elasticsearch
编辑 config/elasticsearch.yml 文件,进行必要的配置。以下是一些常用的配置项:
cluster.name: my-application # 集群名称,所有节点必须一致
node.name: node-1 # 节点名称,每个节点必须唯一
network.host: 0.0.0.0 # 监听地址,允许所有 IP 访问
http.port: 9200 # HTTP 端口
discovery.seed_hosts: ["node-1"] # 发现节点,单机模式可设置为当前节点
cluster.initial_master_nodes: ["node-1"] # 初始化主节点,单机模式可设置为当前节点
1.4 启动 Elasticsearch
./bin/elasticsearch # 前台启动,方便查看日志
./bin/elasticsearch -d # 后台启动
访问 http://localhost:9200,如果看到 Elasticsearch 的相关信息,则表示安装成功。
2. Elasticsearch 集群搭建
2.1 集群规划
一个 Elasticsearch 集群至少需要 3 个节点,才能保证高可用性。通常建议采用奇数个节点,例如 3 个或 5 个。
- Master 节点: 负责集群的管理和协调,例如索引创建、节点加入等。通常选举产生,不建议承担数据存储任务。
- Data 节点: 负责存储数据和执行搜索请求。
- Client 节点: 负责接收客户端请求,并将请求转发到 Data 节点。本身不存储数据。
2.2 节点配置
修改每个节点的 elasticsearch.yml 文件,配置集群相关的参数。
Master 节点配置:
cluster.name: my-application
node.name: master-1
node.master: true
node.data: false
network.host: 192.168.1.101 # 替换为实际 IP 地址
http.port: 9200
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] # 集群所有 Master 节点的 IP 地址
cluster.initial_master_nodes: ["master-1", "master-2", "master-3"] # 集群所有 Master 节点的名称
Data 节点配置:
cluster.name: my-application
node.name: data-1
node.master: false
node.data: true
network.host: 192.168.1.104 # 替换为实际 IP 地址
http.port: 9200
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] # 集群所有 Master 节点的 IP 地址
Client 节点配置:
cluster.name: my-application
node.name: client-1
node.master: false
node.data: false
node.ingest: false #关闭ingest角色,减轻client节点压力
network.host: 192.168.1.105 # 替换为实际 IP 地址
http.port: 9200
discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"] # 集群所有 Master 节点的 IP 地址
2.3 启动集群
依次启动所有节点。可以通过 Elasticsearch Head 或 Kibana 等工具查看集群状态。
3. Elasticsearch 性能优化
3.1 JVM 堆大小设置
根据服务器内存大小,合理设置 JVM 堆大小。建议设置为服务器内存的一半,但不要超过 32GB。
修改 config/jvm.options 文件:
-Xms16g
-Xmx16g
3.2 索引优化
- 合理选择分片数量: 分片数量过多会导致资源浪费,分片数量过少会导致搜索性能下降。建议根据数据量和查询负载进行调整。
- 使用合适的分析器: 分析器决定了如何将文本转换为词项。选择合适的分析器可以提高搜索精度和召回率。常用的分析器有
standard、ik_max_word、ik_smart等。 - 优化 Mapping 设置: Mapping 定义了索引的结构和字段类型。合理设置 Mapping 可以提高存储效率和搜索性能。
3.3 查询优化
- 避免使用通配符查询: 通配符查询性能较低,尽量避免使用。
- 使用 Filter Context: Filter Context 不计算相关性得分,性能更高。
- 使用 Cache: 合理使用 Query Cache 和 Request Cache 可以提高查询速度。
3.4 硬件优化
- 使用 SSD: SSD 比传统机械硬盘具有更高的读写速度,可以显著提高 Elasticsearch 的性能。
- 增加内存: 增加内存可以提高 Elasticsearch 的缓存命中率,从而提高搜索速度。
- 使用多核 CPU: 多核 CPU 可以提高 Elasticsearch 的并发处理能力。
4. Elasticsearch 常见问题及避坑指南
- 启动失败: 检查 JDK 版本、配置文件是否正确、端口是否被占用等。
- 集群脑裂: 确保所有节点的
discovery.seed_hosts和cluster.initial_master_nodes配置正确。避免网络分区。 - OutOfMemoryError: 检查 JVM 堆大小设置是否合理,是否存在内存泄漏。
- 搜索性能慢: 检查索引和查询是否需要优化,硬件资源是否充足。
- 文件描述符限制: Linux 默认的文件描述符限制较低,在高并发场景下可能会导致问题。需要修改
/etc/security/limits.conf文件,增加文件描述符的限制。
* soft nofile 65536
* hard nofile 65536
5. 与 Nginx 集成
在生产环境中,通常会将 Elasticsearch 集群部署在 Nginx 反向代理之后,实现负载均衡和安全访问。 可以通过宝塔面板快速搭建 Nginx 环境,并配置反向代理。
Nginx 配置示例如下:
upstream elasticsearch {
server 192.168.1.104:9200;
server 192.168.1.105:9200;
server 192.168.1.106:9200;
}
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://elasticsearch;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
此外,还需要关注 Nginx 的并发连接数配置,以应对高并发场景。
通过以上步骤,相信你已经掌握了 Elasticsearch 的搭建和优化技巧。在实际应用中,还需要根据具体场景进行调整和优化。希望本文能帮助你快速构建高性能的搜索服务。
冠军资讯
代码一只喵