ElasticSearch教程FG025-ElasticSearch集群高可用设计实战
内容简介:本文档风哥主要介绍ElasticSearch集群高可用设计的完整流程,包括集群拓扑设计、节点角色分配、网络规划、高可用配置、监控与告警以及故障转移演练等内容。通过学习本文,您将掌握如何构建一个高可用的ElasticSearch集群。风哥教程参考ElasticSearch官方文档High Availability部分。
Part01-基础概念与理论知识
1.1 高可用概述
高可用(High Availability,HA)是指系统在面对各种故障时,能够保持持续运行的能力。对于ElasticSearch集群来说,高可用意味着:
- 集群能够承受节点故障而不影响服务
- 数据能够在节点故障时保持完整
- 服务能够在节点故障时自动恢复
- 系统能够持续提供服务,不出现长时间中断
1.2 ElasticSearch集群架构
ElasticSearch集群架构主要由以下组件组成:
- 节点(Node):ElasticSearch的实例,可以是主节点、数据节点、协调节点等
- 分片(Shard):数据的分片,分为主分片和副本分片
- 索引(Index):数据的逻辑集合,由多个分片组成
- 集群(Cluster):由多个节点组成的集合
1.3 高可用相关概念
ElasticSearch高可用相关的概念包括:
- 主节点(Master Node):负责集群管理,如分片分配、节点加入/离开等
- 数据节点(Data Node):存储数据和执行数据相关操作
- 协调节点(Coordinating Node):处理客户端请求,协调查询执行
- 主分片(Primary Shard):数据的主要分片
- 副本分片(Replica Shard):主分片的副本,用于容错和负载均衡
- 脑裂(Split Brain):集群中出现多个主节点的情况
Part02-生产环境规划与建议
2.1 集群拓扑设计
生产环境中,ElasticSearch集群拓扑设计建议:
- 节点数量:至少3个节点,推荐奇数节点,以避免脑裂
- 分片策略:根据数据量和节点数,合理设置分片数
- 副本策略:至少1个副本,推荐2个副本以提高可用性
- 硬件配置:根据节点角色配置不同的硬件资源
2.2 节点角色分配
节点角色分配建议:
- 主节点:配置较高的CPU和内存,专注于集群管理
- 数据节点:配置较大的内存和磁盘,用于存储数据
- 协调节点:配置较高的CPU和内存,用于处理客户端请求
- 专用主节点:建议使用专用主节点,避免数据节点同时作为主节点
2.3 网络规划
网络规划建议:
- 网络隔离:将ElasticSearch集群部署在专用网络中
- 带宽要求:确保节点间有足够的带宽
- 延迟要求:节点间网络延迟应尽可能低
- 安全配置:配置防火墙,限制访问
Part03-生产环境项目实施方案
3.1 集群部署
集群部署步骤:
# 服务器配置:
# 节点1:192.168.1.10(主节点)
# 节点2:192.168.1.11(数据节点)
# 节点3:192.168.1.12(数据节点)
# 2. 安装ElasticSearch
# 在每个节点上执行:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.0-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.10.0-linux-x86_64.tar.gz
mv elasticsearch-8.10.0 /es/app/
# 3. 配置ElasticSearch
# 节点1配置(主节点):
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-1
node.roles: [master, data]
network.host: 192.168.1.10
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
cluster.initial_master_nodes: [“node-1”]
# 节点2配置(数据节点):
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-2
node.roles: [data]
network.host: 192.168.1.11
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
# 节点3配置(数据节点):
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-3
node.roles: [data]
network.host: 192.168.1.12
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
# 4. 启动ElasticSearch
# 在每个节点上执行:
/es/app/elasticsearch-8.10.0/bin/elasticsearch -d
3.2 高可用配置
高可用配置步骤:
curl -X PUT “http://192.168.1.10:9200/_template/fgedu-template” -H “Content-Type: application/json” -d ‘{
“index_patterns”: [“fgedu-*”],
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 2
}
}’
# 2. 配置集群参数
curl -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“discovery.zen.minimum_master_nodes”: 2,
“cluster.routing.allocation.enable”: “all”
}
}’
# 3. 配置监控
# 安装监控插件
/es/app/elasticsearch-8.10.0/bin/elasticsearch-plugin install x-pack
3.3 监控与告警
监控与告警配置步骤:
- 使用ElasticSearch自带的监控功能
- 集成Kibana监控
- 配置Prometheus和Grafana监控
- 设置告警规则
curl -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“xpack.monitoring.collection.enabled”: true
}
}’
# 2. 配置Kibana监控
# 在kibana.yml中添加:
# xpack.monitoring.ui.container.elasticsearch.enabled: true
# 3. 配置Prometheus监控
# 安装Prometheus插件
/es/app/elasticsearch-8.10.0/bin/elasticsearch-plugin install prometheus-exporter
3.4 故障转移演练
故障转移演练步骤:
- 模拟主节点故障
- 观察集群状态变化
- 验证数据完整性
- 验证服务可用性
- 恢复故障节点
Part04-生产案例与实战讲解
4.1 三节点集群部署实战
部署三节点ElasticSearch集群:
# 服务器配置:
# 节点1:192.168.1.10(主节点)
# 节点2:192.168.1.11(数据节点)
# 节点3:192.168.1.12(数据节点)
# 2. 安装ElasticSearch
# 在每个节点上执行:
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.10.0-linux-x86_64.tar.gz
tar -xzf elasticsearch-8.10.0-linux-x86_64.tar.gz
mv elasticsearch-8.10.0 /es/app/
# 3. 配置ElasticSearch
# 节点1配置:
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-1
node.roles: [master, data]
network.host: 192.168.1.10
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
cluster.initial_master_nodes: [“node-1”]
# 节点2配置:
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-2
node.roles: [data]
network.host: 192.168.1.11
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
# 节点3配置:
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml
cluster.name: fgedu-cluster
node.name: node-3
node.roles: [data]
network.host: 192.168.1.12
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]
# 4. 启动ElasticSearch
# 在每个节点上执行:
/es/app/elasticsearch-8.10.0/bin/elasticsearch -d
# 5. 验证集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
执行后输出:
“cluster_name” : “fgedu-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
}
4.2 高可用配置实战
配置高可用集群:
curl -X PUT “http://192.168.1.10:9200/fgedu-test” -H “Content-Type: application/json” -d ‘{
“settings”: {
“number_of_shards”: 3,
“number_of_replicas”: 2
},
“mappings”: {
“properties”: {
“name”: {
“type”: “text”
},
“value”: {
“type”: “integer”
}
}
}
}’
# 2. 插入测试数据
curl -X POST “http://192.168.1.10:9200/fgedu-test/_bulk” -H “Content-Type: application/json” -d ‘{
“index”: {“_id”: “1”}
{“name”: “test1”, “value”: 1}
{“index”: {“_id”: “2”}
{“name”: “test2”, “value”: 2}
{“index”: {“_id”: “3”}
{“name”: “test3”, “value”: 3}
}’
# 3. 查看分片分配
curl -X GET “http://192.168.1.10:9200/_cat/shards/fgedu-test?v”
执行后输出:
fgedu-test 0 p STARTED 1 4.6kb 192.168.1.10 node-1
fgedu-test 0 r STARTED 1 4.6kb 192.168.1.11 node-2
fgedu-test 0 r STARTED 1 4.6kb 192.168.1.12 node-3
fgedu-test 1 p STARTED 1 4.6kb 192.168.1.11 node-2
fgedu-test 1 r STARTED 1 4.6kb 192.168.1.10 node-1
fgedu-test 1 r STARTED 1 4.6kb 192.168.1.12 node-3
fgedu-test 2 p STARTED 1 4.6kb 192.168.1.12 node-3
fgedu-test 2 r STARTED 1 4.6kb 192.168.1.10 node-1
fgedu-test 2 r STARTED 1 4.6kb 192.168.1.11 node-2
4.3 故障转移测试实战
测试故障转移:
# 在节点1上停止ElasticSearch
pkill -f elasticsearch
# 2. 查看集群状态
curl -X GET “http://192.168.1.11:9200/_cluster/health?pretty”
# 3. 验证数据完整性
curl -X GET “http://192.168.1.11:9200/fgedu-test/_search”
# 4. 恢复主节点
/es/app/elasticsearch-8.10.0/bin/elasticsearch -d
# 5. 查看集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
4.4 监控与告警配置实战
配置监控与告警:
curl -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“xpack.monitoring.collection.enabled”: true
}
}’
# 2. 配置Kibana监控
# 在kibana.yml中添加:
# xpack.monitoring.ui.container.elasticsearch.enabled: true
# xpack.monitoring.ui.container.logstash.enabled: true
# xpack.monitoring.ui.container.beats.enabled: true
# 3. 配置Prometheus监控
# 安装Prometheus插件
/es/app/elasticsearch-8.10.0/bin/elasticsearch-plugin install prometheus-exporter
# 4. 配置Grafana仪表盘
# 导入ElasticSearch官方Grafana仪表盘
Part05-风哥经验总结与分享
5.1 高可用最佳实践
- 合理规划集群规模:根据业务需求和数据量,规划合适的集群规模
- 使用奇数节点:避免脑裂,提高集群稳定性
- 配置足够的副本:至少1个副本,推荐2个副本
- 使用专用主节点:避免数据节点同时作为主节点
- 定期备份数据:确保数据安全
- 监控集群状态:及时发现和解决问题
- 定期进行故障演练:提高应对故障的能力
5.2 常见问题与解决方案
- 脑裂:配置合适的minimum_master_nodes参数,确保集群中只有一个主节点
- 分片分配失败:检查磁盘空间和网络连接,确保节点正常
- 集群状态为yellow:检查未分配的分片,可能是由于节点故障或资源不足
- 集群状态为red:检查主分片是否丢失,可能需要从备份恢复
- 节点加入失败:检查网络连接和集群配置
5.3 性能优化建议
- 硬件优化:使用高性能的服务器和存储,特别是SSD存储
- 内存配置:为ElasticSearch分配足够的内存,但不要超过物理内存的50%
- JVM调优:合理配置JVM堆内存大小,优化GC策略
- 索引优化:合理设置分片数和副本数,优化索引参数
- 查询优化:优化查询语句,减少不必要的计算
- 网络优化:确保集群内节点之间的网络连接稳定
- 缓存优化:充分利用ElasticSearch的缓存机制
更多视频教程www.fgedu.net.cn
学习交流加群风哥微信: itpux-com
学习交流加群风哥QQ113257174
风哥提示:构建高可用ElasticSearch集群需要综合考虑节点配置、网络规划和监控告警等多个方面
更多学习教程公众号风哥教程itpux_com
from ElasticSearch视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
