11.4 生产环境部署最佳实践 Elasticsearch 生产环境部署最佳实践 11.4.1 硬件规划与资源配置 1. 节点类型划分: 根据负载类型,将节点划分为以下几种类型: Master 节点: 负责集群管理,不参与数据存储和搜索。通常需要 3 个或以上的 Master 节点,以确保高可用性。 Data 节点: 负责数据存储和搜索。根据数据量和查询负载,配置足够的 Data 节点。 Ingest 节点: 负责数据预处理和转换。如果数据需要复杂的处理,可以配置专门的 Ingest 节点。 Coordinating 节点: 负责接收客户端请求,并将请求分发到 Data 节点。如果客户端请求量很大,可以配置 Coordinating 节点来分担压力。 2.
1. 节点类型划分:
根据负载类型,将节点划分为以下几种类型:
Master 节点: 负责集群管理,不参与数据存储和搜索。通常需要 3 个或以上的 Master 节点,以确保高可用性。
Data 节点: 负责数据存储和搜索。根据数据量和查询负载,配置足够的 Data 节点。
Ingest 节点: 负责数据预处理和转换。如果数据需要复杂的处理,可以配置专门的 Ingest 节点。
Coordinating 节点: 负责接收客户端请求,并将请求分发到 Data 节点。如果客户端请求量很大,可以配置 Coordinating 节点来分担压力。
2. 硬件规格建议:
CPU:
Master 节点:4-8 核
Data 节点:8-32 核
Ingest 节点:8-16 核
Coordinating 节点:4-8 核
内存:
Master 节点:8-16 GB
Data 节点:32-128 GB (分配一半给 JVM Heap)
Ingest 节点:16-32 GB
Coordinating 节点:8-16 GB
存储:
SSD:提供更快的读写速度,建议用于 Data 节点。
足够的磁盘空间:根据数据量和备份策略,预留足够的磁盘空间。
网络:
3. JVM Heap Size 配置:
JVM Heap Size 应该设置为物理内存的一半,但不要超过 32GB。
避免频繁的 GC,可以使用 G1GC 垃圾回收器。
在 jvm.options 文件中配置 JVM 参数:
-Xms16g -Xmx16g -XX:+UseG1GC -XX:G1HeapRegionSize=4g -XX:MaxGCPauseMillis=200 -XX:InitiatingHeapOccupancyPercent=45
4. 操作系统配置:
禁用 Swap:避免 Elasticsearch 使用 Swap 空间,影响性能。
增加文件描述符限制:Elasticsearch 需要打开大量文件,增加文件描述符限制可以避免 "Too many open files" 错误。
/etc/security/limits.conf 文件:* soft nofile 65535 * hard nofile 65535
/etc/sysctl.conf 文件:vm.max_map_count=262144
sysctl -p 命令使配置生效。1. 集群名称:
确保所有节点配置相同的集群名称。
在 elasticsearch.yml 文件中配置集群名称:
cluster.name: my-production-cluster
2. 节点角色:
明确指定节点的角色,避免节点承担不必要的负载。
在 elasticsearch.yml 文件中配置节点角色:
# Master 节点 node.roles: [ master ] # Data 节点 node.roles: [ data ] # Ingest 节点 node.roles: [ ingest ] # Coordinating 节点 node.roles: [ coordinating_only ]
3. 发现机制:
使用 discovery.seed_hosts 和 cluster.initial_master_nodes 配置静态节点发现。
避免使用 multicast 发现,因为它在生产环境中不可靠。
在 elasticsearch.yml 文件中配置发现机制:
discovery.seed_hosts: ["node1", "node2", "node3"] cluster.initial_master_nodes: ["node1", "node2", "node3"]
4. 分片与副本:
合理设置分片数量:每个分片的大小应该在 10-50GB 之间。
设置足够的副本:通常建议设置 1-2 个副本,以提高数据可用性和查询性能。
在创建索引时配置分片和副本:
PUT /my-index { "settings": { "number_of_shards": 3, "number_of_replicas": 1 } }
5. 索引模板:
使用索引模板可以自动应用相同的设置和映射到多个索引。
创建索引模板:
PUT /_template/my-template { "index_patterns": ["logstash-*"], "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "@timestamp": { "type": "date", "format": "strict_date_optional_time||epoch_millis" } } } }
6. 延迟分配:
配置 index.unassigned.node_left.delayed_timeout 选项,延迟分配未分配的分片,避免不必要的重新分配。
在 elasticsearch.yml 文件中配置延迟分配:
index.unassigned.node_left.delayed_timeout: 5m
7. 自动扩展:
考虑使用 Elasticsearch 的自动扩展功能,根据负载动态调整集群规模。
可以使用 Elasticsearch 的 Auto-Scaling API 或第三方工具来实现自动扩展。
1. 启用安全认证:
使用 Elasticsearch 的 Security 功能启用安全认证,保护集群免受未经授权的访问。
可以使用内置的用户名/密码认证,也可以集成 LDAP 或 Active Directory。
配置 elasticsearch.yml 文件:
xpack.security.enabled: true xpack.security.transport.ssl.enabled: true xpack.security.transport.ssl.verification_mode: certificate xpack.security.transport.ssl.keystore.path: elastic-certificates.p12 xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
2. 角色权限控制:
创建角色,并为角色分配相应的权限。
将用户分配到不同的角色,实现细粒度的权限控制。
可以使用 Kibana 的 Security UI 或 Elasticsearch 的 Security API 来管理角色和权限。
3. 网络隔离:
将 Elasticsearch 集群部署在隔离的网络环境中,限制外部访问。
使用防火墙或网络策略,只允许必要的端口和 IP 地址访问 Elasticsearch 集群。
4. 审计日志:
启用审计日志,记录集群中的所有操作,以便进行安全审计和故障排查。
配置 elasticsearch.yml 文件:
xpack.security.audit.enabled: true xpack.security.audit.logfile.path: /var/log/elasticsearch/audit.log
1. 监控指标:
监控 Elasticsearch 集群的各项指标,包括 CPU 使用率、内存使用率、磁盘使用率、JVM Heap 使用率、GC 时间、搜索延迟、索引延迟等。
可以使用 Elasticsearch 的 Monitoring API、Kibana 的 Monitoring UI 或第三方监控工具(如 Prometheus、Grafana)来监控集群。
2. 告警策略:
设置合理的告警策略,当集群指标超过阈值时,及时发出告警。
可以使用 Elasticsearch 的 Watcher 功能或第三方告警工具(如 Alertmanager)来设置告警策略。
3. 日志管理:
集中管理 Elasticsearch 集群的日志,方便进行故障排查和性能分析。
可以使用 Elasticsearch 的 Filebeat 或 Logstash 将日志发送到 Elasticsearch 集群。
4. 常用监控指标及阈值建议:
| 指标 | 描述 | 阈值建议 |
|---|---|---|
| CPU 使用率 | 集群中所有节点的 CPU 使用率之和 | 超过 80% 需要关注,超过 90% 需要立即处理 |
| 内存使用率 | 集群中所有节点的内存使用率之和 | 超过 80% 需要关注,超过 90% 需要立即处理 |
| 磁盘使用率 | 集群中所有节点的磁盘使用率之和 | 超过 80% 需要关注,超过 90% 需要立即处理 |
| JVM Heap 使用率 | 集群中所有节点的 JVM Heap 使用率之和 | 超过 75% 需要关注,超过 85% 需要立即处理 |
| GC 时间 | 集群中所有节点的 GC 时间之和 | 频繁 GC 需要关注,长时间 GC 需要立即处理 |
| 搜索延迟 | 搜索请求的平均延迟时间 | 根据业务需求设置,超过阈值需要关注 |
| 索引延迟 | 索引请求的平均延迟时间 | 根据业务需求设置,超过阈值需要关注 |
| 分片未分配数量 | 集群中未分配的分片数量 | 任何未分配的分片都需要关注 |
| 节点宕机数量 | 集群中宕机的节点数量 | 任何节点宕机都需要关注 |
1. 备份策略:
制定合理的备份策略,定期备份 Elasticsearch 集群的数据。
可以使用 Elasticsearch 的 Snapshot API 或第三方备份工具(如 Curator)来备份数据。
建议使用增量备份,减少备份时间和存储空间。
2. 备份存储:
将备份数据存储在安全可靠的地方,例如云存储或异地存储。
确保备份数据的可用性和完整性。
3. 恢复测试:
定期进行恢复测试,验证备份数据的可用性和恢复流程的正确性。
确保在发生故障时,可以快速恢复 Elasticsearch 集群的数据。
4. Snapshot API 示例:
PUT /_snapshot/my_backup_repo { "type": "fs", "settings": { "location": "/path/to/backup/location", "compress": true } }
PUT /_snapshot/my_backup_repo/my_backup { "indices": "my-index-*" }
POST /_snapshot/my_backup_repo/my_backup/_restore { "indices": "my-index-*" }
1. 滚动升级:
使用滚动升级的方式升级 Elasticsearch 集群,避免停机。
一次升级一个节点,确保集群的可用性。
2. 升级前准备:
备份数据:在升级前备份 Elasticsearch 集群的数据,以防万一。
测试升级:在测试环境中测试升级流程,确保升级过程顺利。
阅读升级文档:仔细阅读 Elasticsearch 的升级文档,了解升级过程中的注意事项。
3. 升级流程:
PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "none" } }
停止节点:停止要升级的 Elasticsearch 节点。
升级 Elasticsearch:升级 Elasticsearch 到新版本。
启动节点:启动升级后的 Elasticsearch 节点。
启用分片分配:在升级节点后,启用分片分配。
PUT /_cluster/settings { "transient": { "cluster.routing.allocation.enable": "all" } }
以上是 Elasticsearch 生产环境部署的最佳实践,涵盖了硬件规划、集群配置、安全配置、监控告警、备份恢复和升级策略等方面。通过遵循这些最佳实践,可以构建一个健壮、高效且安全的 Elasticsearch 集群,满足生产环境的需求。 请根据实际业务场景和需求,灵活调整配置和策略。 持续监控和优化 Elasticsearch 集群,确保其稳定运行。