ElasticSearch集群配置的最佳实践
一、ElasticSearch 集群概述
ElasticSearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,被广泛应用于全文搜索、结构化搜索、分析以及这三个功能的组合。在实际生产环境中,为了提高数据的可用性、性能和处理能力,通常会搭建 ElasticSearch 集群。
一个 ElasticSearch 集群由一个或多个节点组成,这些节点共同持有整个集群的数据,并协同工作以提供索引和搜索功能。每个节点都有自己的角色,如主节点负责集群的管理工作,数据节点负责存储和处理数据,协调节点负责接收客户端请求并将其分发到合适的数据节点。
二、环境准备
在配置 ElasticSearch 集群之前,需要确保服务器满足一定的条件:
- 操作系统:ElasticSearch 支持多种操作系统,如 Linux、Windows、MacOS 等。在生产环境中,通常推荐使用 Linux 系统,如 CentOS 或 Ubuntu。
- Java 环境:ElasticSearch 基于 Java 开发,需要安装 Java 8 或更高版本。可以通过以下命令检查 Java 版本:
java -version
- 服务器资源:根据数据量和业务需求合理分配服务器资源。一般来说,每个节点至少需要 2GB 的内存,同时确保有足够的磁盘空间用于存储数据。
三、集群配置文件详解
ElasticSearch 的配置主要通过 elasticsearch.yml
文件进行。下面详细介绍一些关键配置项:
- 集群名称:
cluster.name: my - elastic - cluster
cluster.name
定义了集群的名称。同一集群中的所有节点必须使用相同的集群名称,这样它们才能自动发现并加入到同一个集群中。建议使用一个有意义的名称,方便在多集群环境中进行区分。
2. 节点名称:
node.name: node - 1
node.name
定义了节点的名称。每个节点在集群中必须有唯一的名称。如果不指定,ElasticSearch 会自动生成一个随机名称。为了便于管理和识别,建议为每个节点指定一个有意义的名称。
3. 节点角色:
node.master: true
node.data: true
node.ingest: true
node.master
:设置该节点是否有资格成为主节点。主节点负责管理集群状态、索引创建和删除等重要操作。一般建议将node.master
设置为true
的节点数量为奇数个,以防止脑裂问题。node.data
:设置该节点是否存储数据。数据节点负责存储和处理数据,是集群中最消耗资源的节点类型。node.ingest
:设置该节点是否作为摄入节点。摄入节点可以在文档索引之前对其进行预处理,如添加字段、修改字段值等。
- 网络配置:
network.host: 0.0.0.0
http.port: 9200
network.host
:指定节点绑定的 IP 地址。0.0.0.0
表示绑定到所有可用的网络接口。在生产环境中,建议指定具体的 IP 地址,以提高安全性。http.port
:指定 HTTP 协议监听的端口号。默认端口为 9200,用于与客户端进行通信。
- 发现机制:
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101"]
cluster.initial_master_nodes: ["node - 1", "node - 2"]
discovery.seed_hosts
:指定初始种子节点的地址列表。新节点启动时,会通过这些种子节点来发现集群中的其他节点。cluster.initial_master_nodes
:在首次启动集群时,指定有资格成为主节点的节点列表。这有助于避免脑裂问题,确保集群的稳定性。
四、单节点集群配置实践
- 下载安装 ElasticSearch:从 ElasticSearch 官方网站下载适合你操作系统的安装包,并解压到指定目录。
- 配置
elasticsearch.yml
:在解压后的config
目录下找到elasticsearch.yml
文件,进行如下配置:
cluster.name: my - single - node - cluster
node.name: single - node
node.master: true
node.data: true
network.host: 0.0.0.0
http.port: 9200
- 启动 ElasticSearch:在解压后的
bin
目录下执行以下命令启动 ElasticSearch:
./elasticsearch
- 验证集群状态:打开浏览器,访问
http://localhost:9200
,如果看到类似以下的 JSON 响应,表示单节点集群启动成功:
{
"name" : "single - node",
"cluster_name" : "my - single - node - cluster",
"cluster_uuid" : "Yf33fGJqR66Jg6 - u4z - 13g",
"version" : {
"number" : "7.14.0",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "6f1e7a11098c99f036b86c17f096e786f1f8c8e3",
"build_date" : "2021 - 09 - 28T21:40:44.035404Z",
"build_snapshot" : false,
"lucene_version" : "8.9.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0 - beta1"
},
"tagline" : "You Know, for Search"
}
五、多节点集群配置实践
- 准备服务器:假设有三台服务器,IP 地址分别为
192.168.1.100
、192.168.1.101
和192.168.1.102
。 - 下载安装 ElasticSearch:在每台服务器上下载并解压 ElasticSearch 安装包。
- 配置
elasticsearch.yml
:- 在
192.168.1.100
服务器上的elasticsearch.yml
配置如下:
- 在
cluster.name: my - multi - node - cluster
node.name: node - 1
node.master: true
node.data: true
network.host: 192.168.1.100
http.port: 9200
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
cluster.initial_master_nodes: ["node - 1", "node - 2"]
- 在 `192.168.1.101` 服务器上的 `elasticsearch.yml` 配置如下:
cluster.name: my - multi - node - cluster
node.name: node - 2
node.master: true
node.data: true
network.host: 192.168.1.101
http.port: 9200
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
cluster.initial_master_nodes: ["node - 1", "node - 2"]
- 在 `192.168.1.102` 服务器上的 `elasticsearch.yml` 配置如下:
cluster.name: my - multi - node - cluster
node.name: node - 3
node.master: false
node.data: true
network.host: 192.168.1.102
http.port: 9200
discovery.seed_hosts: ["192.168.1.100", "192.168.1.101", "192.168.1.102"]
- 启动 ElasticSearch:在每台服务器的
bin
目录下分别执行以下命令启动 ElasticSearch:
./elasticsearch
- 验证集群状态:可以使用
_cluster/health
API 来查看集群状态。在任意一台服务器上执行以下命令:
curl -X GET "http://192.168.1.100:9200/_cluster/health?pretty"
如果集群状态正常,会看到类似以下的 JSON 响应:
{
"cluster_name" : "my - multi - node - cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
其中,status
为 green
表示集群状态良好,所有分片都已分配。yellow
表示所有主分片都已分配,但有一些副本分片未分配。red
表示有主分片未分配,集群不可用。
六、高可用性配置
- 副本设置:在创建索引时,可以通过
settings
参数设置副本数量。例如,使用以下命令创建一个具有 1 个副本的索引:
curl -X PUT "http://192.168.1.100:9200/my_index?pretty" -H 'Content - Type: application/json' -d'
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
}
}'
这样,每个主分片都会有一个副本分片,分布在不同的节点上。当某个节点故障时,副本分片可以自动提升为主分片,保证数据的可用性。 2. 自动恢复:ElasticSearch 具有自动恢复机制。当节点故障恢复后,它会自动重新加入集群,并从其他节点同步缺失的数据,恢复到故障前的状态。 3. 监控与报警:可以使用 Elasticsearch Head、Kibana 等工具对集群进行监控。通过设置监控指标的阈值,如磁盘使用率、CPU 使用率、集群状态等,当指标超出阈值时,及时发送报警通知,以便管理员及时处理。
七、性能优化配置
- 索引设置:
- 分片数量:根据数据量和查询负载合理设置分片数量。一般来说,每个分片的大小控制在 10GB - 50GB 之间比较合适。如果数据量较小,可以适当减少分片数量,以降低管理成本。例如:
curl -X PUT "http://192.168.1.100:9200/my_index?pretty" -H 'Content - Type: application/json' -d'
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}'
- **刷新间隔**:`index.refresh_interval` 参数控制索引的刷新频率。默认情况下,ElasticSearch 每秒自动刷新一次索引,这会影响写入性能。如果写入操作较多,可以适当增大刷新间隔,如设置为 30 秒:
curl -X PUT "http://192.168.1.100:9200/my_index/_settings?pretty" -H 'Content - Type: application/json' -d'
{
"index": {
"refresh_interval": "30s"
}
}'
- 节点资源优化:
- 内存设置:ElasticSearch 使用堆内存来存储索引数据和缓存查询结果。可以通过
ES_HEAP_SIZE
环境变量来设置堆内存大小。一般建议将堆内存设置为物理内存的一半,且不超过 32GB。例如,在启动脚本中添加以下行:
- 内存设置:ElasticSearch 使用堆内存来存储索引数据和缓存查询结果。可以通过
export ES_HEAP_SIZE=4g
- **磁盘 I/O 优化**:使用高性能的磁盘,如 SSD,以提高数据读写速度。同时,确保磁盘 I/O 队列长度不会过高,可以通过调整 `vm.dirty_ratio` 和 `vm.dirty_background_ratio` 等内核参数来优化磁盘 I/O。
3. 查询优化: - 使用过滤器:在查询时,尽量使用过滤器而不是查询语句来缩小结果集。过滤器不会计算文档的相关性得分,因此执行速度更快。例如:
{
"query": {
"bool": {
"filter": [
{
"term": {
"category": "electronics"
}
}
]
}
}
}
- **批量操作**:对于写入操作,尽量使用批量 API(如 `_bulk`),减少网络开销,提高写入性能。例如:
curl -X POST "http://192.168.1.100:9200/_bulk?pretty" -H 'Content - Type: application/json' -d'
{"index":{"_index":"my_index","_id":"1"}}
{"title":"Product 1","description":"This is a product description."}
{"index":{"_index":"my_index","_id":"2"}}
{"title":"Product 2","description":"Another product description."}
'
八、安全配置
- 身份验证:
- 内置用户:ElasticSearch 提供了内置的用户管理功能。可以使用
elasticsearch - useradd
命令创建新用户,并设置密码。例如:
- 内置用户:ElasticSearch 提供了内置的用户管理功能。可以使用
./bin/elasticsearch - useradd myuser
- **LDAP 集成**:对于企业环境,可以将 ElasticSearch 与 LDAP 进行集成,使用 LDAP 服务器进行用户身份验证。需要在 `elasticsearch.yml` 中配置 LDAP 相关参数,如:
xpack.security.authc:
realms:
ldap1:
type: ldap
order: 0
url: ldap://ldap.example.com:389
bind_dn: CN=admin,DC=example,DC=com
bind_password: password
user_search:
base_dn: DC=example,DC=com
filter: "(sAMAccountName={0})"
- 加密通信:
- HTTPS:可以为 ElasticSearch 配置 HTTPS 协议,加密客户端与服务器之间的通信。需要生成 SSL 证书,并在
elasticsearch.yml
中配置相关参数,如:
- HTTPS:可以为 ElasticSearch 配置 HTTPS 协议,加密客户端与服务器之间的通信。需要生成 SSL 证书,并在
xpack.security.http.ssl:
enabled: true
key: /path/to/your/key.pem
certificate: /path/to/your/cert.pem
certificate_authorities: ["/path/to/your/ca.pem"]
- **传输层加密**:ElasticSearch 节点之间的通信也可以进行加密。同样需要配置 SSL 证书,如:
xpack.security.transport.ssl:
enabled: true
key: /path/to/your/key.pem
certificate: /path/to/your/cert.pem
certificate_authorities: ["/path/to/your/ca.pem"]
九、故障排查与维护
- 日志分析:ElasticSearch 的日志文件位于
logs
目录下。通过分析日志文件,可以了解集群的运行状态、节点故障原因等信息。常见的日志文件有elasticsearch.log
、gc.log
等。 - 集群状态检查:使用
_cluster/health
、_cluster/stats
等 API 可以获取集群的状态信息。例如,通过_cluster/health
API 可以查看集群状态、节点数量、分片分配情况等。 - 节点故障处理:当节点发生故障时,首先检查节点的日志文件,确定故障原因。如果是硬件故障,需要及时更换硬件设备。如果是软件问题,可以尝试重启节点或调整配置参数。
- 数据备份与恢复:可以使用 Elasticsearch Snapshot 和 Restore API 对数据进行备份和恢复。例如,创建一个快照仓库:
curl -X PUT "http://192.168.1.100:9200/_snapshot/my_backup_repo?pretty" -H 'Content - Type: application/json' -d'
{
"type": "fs",
"settings": {
"location": "/path/to/backup/directory"
}
}'
然后创建一个快照:
curl -X PUT "http://192.168.1.100:9200/_snapshot/my_backup_repo/my_snapshot?pretty"
在需要恢复数据时,可以使用以下命令:
curl -X POST "http://192.168.1.100:9200/_snapshot/my_backup_repo/my_snapshot/_restore?pretty"
通过以上配置和实践,可以搭建一个高效、稳定、安全的 ElasticSearch 集群,满足不同业务场景的需求。在实际应用中,还需要根据具体的业务需求和数据特点,不断优化集群配置,以提高集群的性能和可用性。