多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Elasticsearch集群架构设计与高可用实践

Elasticsearch集群架构设计与高可用实践 1. 从单机到集群的必然选择第一次接触Elasticsearch时大多数开发者都是从单机模式开始的。我在2016年接手一个日志分析项目时也是用单节点ES处理每天200GB的Nginx日志。直到某个周一早晨服务器磁盘故障导致整个服务不可用——这个惨痛教训让我深刻理解了分布式系统设计的价值。生产环境中的Elasticsearch集群需要同时满足三个核心需求数据可靠性单节点故障不应导致数据丢失服务连续性个别节点下线时仍能提供服务线性扩展能通过增加节点提升整体吞吐量2. 集群架构设计要点2.1 节点角色规划典型的ES集群包含三种节点类型Master-eligible节点负责集群状态管理建议3个专用节点避免脑裂问题配置较低CPU即可如2核Data节点存储索引数据根据数据量配置SSD存储内存建议32GB起步Coordinating节点处理客户端请求不存储数据专注请求路由需要较高网络带宽关键配置示例# master节点配置 node.master: true node.data: false # data节点配置 node.master: false node.data: true2.2 分片策略设计分片数量需要提前规划每个分片建议30-50GB数据主分片数在创建索引时确定副本分片数可动态调整我们有个电商项目采用如下分片策略PUT /product { settings: { number_of_shards: 6, number_of_replicas: 2 } }3. 高可用实现方案3.1 跨机房部署实践为防范机房级故障我们采用3个AZ可用区部署每个AZ部署完整角色节点使用awareness属性控制分配cluster.routing.allocation.awareness.attributes: zone node.attr.zone: zone13.2 监控与自愈机制推荐监控组合Prometheus Grafana采集指标Cerebro进行集群管理自定义告警规则示例ALERT ClusterStatusYellow IF es_cluster_health_status 1 FOR 5m4. 性能优化实战4.1 JVM调优经验根据多年实践总结堆内存不超过物理内存50%不超过32GB避免指针压缩失效GC策略建议G1典型配置-Xms30g -Xmx30g -XX:UseG1GC -XX:MaxGCPauseMillis2004.2 查询性能提升我们优化过一个从15秒降到200ms的案例使用filter代替query条件合理设置fielddata缓存采用doc_values列式存储优化前后对比优化项查询耗时内存占用原始方案15s8GB优化后200ms2GB5. 灾备与恢复方案5.1 快照备份策略我们采用仓库快照方案创建共享文件系统仓库PUT /_snapshot/my_backup { type: fs, settings: { location: /mnt/backups } }设置每日增量备份每月全量备份5.2 集群迁移方案最近完成的跨版本迁移步骤新集群部署并测试使用reindex API同步数据POST _reindex { source: {remote: {host: http://old-cluster:9200}}, dest: {index: target_index} }流量逐步切换6. 踩坑记录与解决方案6.1 脑裂问题处理曾遇到因网络分区导致的脑裂现象部分节点显示master离线解决方案强制下线异常节点调整discovery配置discovery.zen.minimum_master_nodes: 26.2 热点分片问题某日志集群出现CPU热点原因日期字段导致数据倾斜优化改用基于哈希的路由POST /logs/_doc?routinghostname { host: web01, message: error connecting to DB }在实施ES集群的过程中我发现很多问题都是配置不当导致的。建议每次变更都先在测试环境验证特别是JVM参数和分片策略的调整。最近我们开发了一套集群配置检查工具可以自动检测常见配置问题这个工具已经帮我们避免了多次线上事故。
返回列表