高可用概述
高可用(High Availability, HA)是生产环境的关键要求。ELK技术栈的高可用部署需要确保各个组件在单点故障时能够继续提供服务,保证系统的稳定性和可靠性。
高可用目标
# 高可用目标
ha_goals = {
"可用性": "99.9%或更高的可用性",
"故障恢复": "自动故障检测和恢复",
"数据安全": "数据不丢失,可恢复",
"服务连续性": "故障时服务不中断"
}
Elasticsearch高可用
1. 集群架构
# Elasticsearch高可用集群架构
集群配置:
节点数量: "至少3个节点"
主节点: "3个专用主节点(防止脑裂)"
数据节点: "至少3个数据节点"
副本数量: "至少1个副本(推荐2个)"
节点分布:
- 跨机架部署
- 跨可用区部署(云环境)
- 避免单点故障
2. 主节点配置
# config/elasticsearch.yml
# 主节点配置
cluster.name: my-elasticsearch-cluster
node.name: master-1
node.roles: [master]
# 发现配置
discovery.seed_hosts: ["master-1:9300", "master-2:9300", "master-3:9300"]
cluster.initial_master_nodes: ["master-1", "master-2", "master-3"]
# 主节点选举
discovery.zen.minimum_master_nodes: 2 # (节点数/2) + 1
3. 数据节点配置
# 数据节点配置
node.name: data-1
node.roles: [data, ingest]
# 分片分配
cluster.routing.allocation.awareness.attributes: rack
node.attr.rack: rack1
4. 副本策略
// 索引副本配置
PUT /my_index
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 2, // 至少2个副本保证高可用
"index.routing.allocation.awareness.attributes": "rack"
}
}
5. 跨可用区部署
# 跨可用区部署配置
节点分布:
可用区A:
- master-1
- data-1
- data-2
可用区B:
- master-2
- data-3
- data-4
可用区C:
- master-3
- data-5
- data-6
配置:
node.attr.zone: zone-a
cluster.routing.allocation.awareness.attributes: zone
Logstash高可用
1. Logstash集群
# Logstash集群配置
集群架构:
节点数量: "至少2个Logstash节点"
负载均衡: "使用负载均衡器分发请求"
配置同步: "所有节点使用相同配置"
配置管理:
- 使用配置管理工具(Ansible、Chef等)
- 使用共享存储(NFS、Git等)
- 使用配置中心(Consul、Etcd等)
2. 负载均衡配置
# Nginx负载均衡配置
upstream logstash_backend {
least_conn;
server logstash1:5044;
server logstash2:5044;
server logstash3:5044;
}
server {
listen 5044;
proxy_pass logstash_backend;
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
3. 队列持久化
# Logstash持久化队列配置
# config/logstash.yml
queue.type: persisted
queue.max_bytes: 10gb
queue.max_events: 0
# 队列路径
path.queue: /var/lib/logstash/queue
4. 故障转移
# Logstash多输出配置(故障转移)
output {
elasticsearch {
hosts => ["es1:9200", "es2:9200", "es3:9200"]
index => "logs-%{+YYYY.MM.dd}"
retry_on_conflict => 3
# 自动故障转移
}
# 备用输出
if "_es_failure" in [tags] {
file {
path => "/var/log/logstash/backup.log"
}
}
}
Kibana高可用
1. Kibana集群
# Kibana集群配置
集群架构:
节点数量: "至少2个Kibana节点"
负载均衡: "使用负载均衡器"
会话共享: "使用Redis或Memcached共享会话"
配置:
server.name: "kibana-1"
elasticsearch.hosts: ["http://es1:9200", "http://es2:9200", "http://es3:9200"]
2. 负载均衡配置
# Nginx负载均衡配置
upstream kibana_backend {
ip_hash; # 会话保持
server kibana1:5601;
server kibana2:5601;
server kibana3:5601;
}
server {
listen 80;
server_name kibana.example.com;
location / {
proxy_pass http://kibana_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3. 会话共享
# Kibana会话共享配置(使用Redis)
# 需要安装kibana-session-storage-redis插件
server.sessionStorage: redis
server.sessionStorage.redis.host: redis.example.com
server.sessionStorage.redis.port: 6379
故障转移
1. 自动故障检测
# 故障检测机制
检测方式:
Elasticsearch:
- 集群健康检查
- 节点心跳检测
- 分片状态监控
Logstash:
- 进程监控
- 端口检测
- 日志监控
Kibana:
- HTTP健康检查
- 进程监控
2. 健康检查
# Elasticsearch健康检查
curl -X GET "http://localhost:9200/_cluster/health?pretty"
# Logstash健康检查
curl -X GET "http://localhost:9600/_node/stats?pretty"
# Kibana健康检查
curl -X GET "http://localhost:5601/api/status"
3. 自动恢复
# 自动恢复机制
恢复策略:
Elasticsearch:
- 自动重新分配分片
- 自动恢复副本
- 自动重新平衡
Logstash:
- 自动重启(systemd)
- 队列恢复
- 连接重试
Kibana:
- 自动重启
- 连接重试
负载均衡
1. Elasticsearch负载均衡
# Elasticsearch负载均衡
负载均衡方式:
协调节点: "使用协调节点分发请求"
客户端负载均衡: "客户端连接多个节点"
外部负载均衡: "使用Nginx、HAProxy等"
2. 客户端负载均衡
# Python客户端负载均衡
from elasticsearch import Elasticsearch
es = Elasticsearch(
[
{'host': 'es1', 'port': 9200},
{'host': 'es2', 'port': 9200},
{'host': 'es3', 'port': 9200}
],
# 负载均衡策略
sniff_on_start=True,
sniff_on_connection_fail=True,
sniffer_timeout=60
)
监控和告警
1. 集群监控
# 集群监控指标
监控指标:
Elasticsearch:
- 集群健康状态
- 节点状态
- 分片状态
- JVM使用情况
- 磁盘使用情况
Logstash:
- 处理速率
- 队列大小
- 错误率
- CPU和内存使用
Kibana:
- 响应时间
- 错误率
- 连接状态
2. 告警配置
# 告警规则
告警规则:
集群状态:
- 集群状态为red
- 节点离线
- 分片未分配
性能指标:
- JVM使用率超过80%
- 磁盘使用率超过85%
- 响应时间超过阈值
错误率:
- 错误率超过5%
- 队列积压超过阈值
实际部署案例
1. 生产环境架构
# 生产环境高可用架构
架构设计:
Elasticsearch:
- 3个主节点(专用)
- 6个数据节点(跨3个可用区)
- 每个索引2个副本
Logstash:
- 3个Logstash节点
- Nginx负载均衡
- 持久化队列
Kibana:
- 2个Kibana节点
- Nginx负载均衡
- Redis会话共享
2. 部署检查清单
# 高可用部署检查清单
检查项:
Elasticsearch:
- [ ] 至少3个主节点
- [ ] 至少3个数据节点
- [ ] 至少1个副本
- [ ] 跨可用区部署
- [ ] 监控配置
Logstash:
- [ ] 至少2个节点
- [ ] 负载均衡配置
- [ ] 持久化队列
- [ ] 故障转移配置
Kibana:
- [ ] 至少2个节点
- [ ] 负载均衡配置
- [ ] 会话共享
- [ ] 健康检查
总结
ELK集群高可用部署的关键要点:
- 高可用概述:高可用目标、架构设计
- Elasticsearch高可用:集群架构、主节点配置、数据节点配置、副本策略、跨可用区部署
- Logstash高可用:集群配置、负载均衡、队列持久化、故障转移
- Kibana高可用:集群配置、负载均衡、会话共享
- 故障转移:自动故障检测、健康检查、自动恢复
- 负载均衡:Elasticsearch负载均衡、客户端负载均衡
- 监控和告警:集群监控、告警配置
- 实际部署:生产环境架构、部署检查清单
掌握高可用部署,可以构建稳定可靠的ELK集群,满足生产环境的高可用要求。
转载请注明:周志洋的博客 » ELK集群高可用部署


