1. 首页 > ElasticSearch教程 > 正文

ElasticSearch教程FG046-ElasticSearch集群主从

内容简介:本文档风哥主要介绍ElasticSearch集群主从架构的设计和实现,包括主节点选举机制、集群架构设计、节点角色分配、集群部署、监控与维护等内容。通过学习本文,您将掌握如何构建和管理ElasticSearch集群主从架构,确保集群的高可用性和稳定性。风哥教程参考ElasticSearch官方文档Clustering部分。

Part01-基础概念与理论知识

1.1 集群主从概述

ElasticSearch集群采用主从架构,由一个主节点(Master Node)和多个从节点(Data Node)组成。主节点负责集群的管理和协调,从节点负责数据的存储和查询。

  • 主节点(Master Node):负责集群的管理和协调,包括节点加入/退出、分片分配、索引创建等操作
  • 从节点(Data Node):负责数据的存储和查询,执行具体的索引和搜索操作
  • 协调节点(Coordinating Node):负责接收客户端请求,协调查询操作,将请求分发到相关节点,并汇总结果

1.2 主节点选举机制

ElasticSearch使用Zen Discovery机制进行主节点选举,选举过程如下:

  1. 节点启动:节点启动后,会向集群中的其他节点发送ping请求
  2. 发现阶段:节点通过ping请求发现集群中的其他节点
  3. 选举阶段:节点根据一定的规则选举出主节点
  4. 确认阶段:集群中的节点确认选举结果,开始正常工作

主节点选举的规则:

  • 节点资格:只有具有master资格的节点才能参与选举
  • 节点优先级:节点可以设置优先级,优先级高的节点更容易成为主节点
  • 最少主节点数:为了避免脑裂,需要设置合理的minimum_master_nodes参数

1.3 主从架构的优势

主从架构的优势包括:

  • 高可用性:当主节点出现故障时,会自动选举新的主节点,确保集群的正常运行
  • 负载均衡:从节点可以分担数据存储和查询负载,提高集群的性能
  • 可扩展性:可以通过添加从节点来扩展集群的存储容量和处理能力
  • 数据冗余:通过副本机制,确保数据的安全性和可靠性

Part02-生产环境规划与建议

2.1 集群架构设计

集群架构设计:

  • 节点数量:根据数据量和负载,推荐使用3节点或5节点集群
  • 节点角色:设置专用的主节点、数据节点和协调节点
  • 网络拓扑:确保节点间网络连接顺畅,避免网络瓶颈
  • 硬件配置:主节点和数据节点的硬件配置应根据其角色进行优化

2.2 节点角色分配

节点角色分配:

  • 主节点:建议设置2-3个专用的主节点,确保高可用性
  • 数据节点:根据数据量和负载,设置足够的数据节点
  • 协调节点:对于大型集群,可以设置专用的协调节点

2.3 主节点配置建议

主节点配置建议:

  • 硬件配置:主节点需要足够的内存和CPU资源,建议使用8核CPU、16GB内存
  • 网络配置:主节点需要稳定的网络连接,建议使用千兆或万兆网络
  • JVM配置:主节点的JVM堆大小建议设置为8GB
  • 系统配置:主节点需要关闭透明大页,配置足够的文件描述符

Part03-生产环境项目实施方案

3.1 集群部署

集群部署:

# 1. 准备环境
# 三台服务器:192.168.1.10、192.168.1.11、192.168.1.12

# 2. 安装ElasticSearch
# 在所有节点上安装ElasticSearch

# 3. 配置主节点
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 主节点1配置
cluster.name: fgedu-cluster
node.name: master-1
node.master: true
node.data: false
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: [“master-1”, “master-2”, “master-3”]

# 主节点2配置
cluster.name: fgedu-cluster
node.name: master-2
node.master: true
node.data: false
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”]
cluster.initial_master_nodes: [“master-1”, “master-2”, “master-3”]

# 主节点3配置
cluster.name: fgedu-cluster
node.name: master-3
node.master: true
node.data: false
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”]
cluster.initial_master_nodes: [“master-1”, “master-2”, “master-3”]

# 4. 配置数据节点
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 数据节点1配置
cluster.name: fgedu-cluster
node.name: data-1
node.master: false
node.data: true
network.host: 192.168.1.13
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]

# 数据节点2配置
cluster.name: fgedu-cluster
node.name: data-2
node.master: false
node.data: true
network.host: 192.168.1.14
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]

# 5. 启动集群
# 启动主节点
systemctl start elasticsearch

# 启动数据节点
systemctl start elasticsearch

# 6. 验证集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”

3.2 主节点配置

主节点配置:

# 1. 配置主节点参数
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 主节点配置
node.master: true
node.data: false
node.ingest: false
node.ml: false

# 2. 配置minimum_master_nodes
curl -X PUT “http://192.168.1.10:9200/_cluster/settings” -H “Content-Type: application/json” -d ‘{
“persistent”: {
“discovery.zen.minimum_master_nodes”: 2
}
}’

# 3. 配置主节点优先级
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 主节点1优先级
node.attr.rack: rack1
cluster.routing.allocation.awareness.attributes: rack

# 4. 配置主节点监控
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 监控配置
xpack.monitoring.enabled: true
xpack.monitoring.collection.enabled: true

3.3 从节点配置

从节点配置:

# 1. 配置数据节点参数
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 数据节点配置
node.master: false
node.data: true
node.ingest: true
node.ml: true

# 2. 配置数据节点存储
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 数据路径配置
path.data: /es/fgdata
path.logs: /es/app/elasticsearch-8.10.0/logs

# 3. 配置数据节点内存
# 编辑jvm.options
vi /es/app/elasticsearch-8.10.0/config/jvm.options

# JVM堆大小
-Xms16g
-Xmx16g

# 4. 配置数据节点分片
# 编辑elasticsearch.yml
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

# 分片配置
cluster.routing.allocation.node_concurrent_recoveries: 2
cluster.routing.allocation.cluster_concurrent_rebalance: 2

3.4 集群监控与维护

集群监控与维护:

# 1. 监控集群状态
# 检查集群健康状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”

# 检查集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/state?pretty”

# 检查节点状态
curl -X GET “http://192.168.1.10:9200/_cat/nodes?v”

# 2. 监控主节点状态
# 检查主节点信息
curl -X GET “http://192.168.1.10:9200/_cat/master?v”

# 3. 监控数据节点状态
# 检查数据节点信息
curl -X GET “http://192.168.1.10:9200/_cat/nodes?v&h=name,ip,port,node.role”

# 4. 集群维护
# 手动触发分片分配
curl -X POST “http://192.168.1.10:9200/_cluster/reroute”

# 检查未分配的分片
curl -X GET “http://192.168.1.10:9200/_cat/shards?v” | grep -E “UNASSIGNED”

# 分析分片分配失败的原因
curl -X GET “http://192.168.1.10:9200/_cluster/allocation/explain?pretty”

Part04-生产案例与实战讲解

4.1 集群部署实战

集群部署实战:

# 1. 环境准备
# 服务器信息:
# 192.168.1.10:主节点1
# 192.168.1.11:主节点2
# 192.168.1.12:主节点3
# 192.168.1.13:数据节点1
# 192.168.1.14:数据节点2

# 2. 安装ElasticSearch
# 在所有节点上安装ElasticSearch

# 3. 配置主节点
# 主节点1配置
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

cluster.name: fgedu-cluster
node.name: master-1
node.master: true
node.data: false
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: [“master-1”, “master-2”, “master-3”]

# 主节点2配置
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

cluster.name: fgedu-cluster
node.name: master-2
node.master: true
node.data: false
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”]
cluster.initial_master_nodes: [“master-1”, “master-2”, “master-3”]

# 主节点3配置
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

cluster.name: fgedu-cluster
node.name: master-3
node.master: true
node.data: false
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”]
cluster.initial_master_nodes: [“master-1”, “master-2”, “master-3”]

# 4. 配置数据节点
# 数据节点1配置
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

cluster.name: fgedu-cluster
node.name: data-1
node.master: false
node.data: true
network.host: 192.168.1.13
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]

# 数据节点2配置
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

cluster.name: fgedu-cluster
node.name: data-2
node.master: false
node.data: true
network.host: 192.168.1.14
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]

# 5. 启动集群
# 启动主节点
systemctl start elasticsearch

# 启动数据节点
systemctl start elasticsearch

# 6. 验证集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
curl -X GET “http://192.168.1.10:9200/_cat/nodes?v”

4.2 主节点选举实战

主节点选举实战:

# 1. 查看当前主节点
curl -X GET “http://192.168.1.10:9200/_cat/master?v”

# 2. 模拟主节点故障
# 停止当前主节点
systemctl stop elasticsearch

# 3. 查看新的主节点
curl -X GET “http://192.168.1.11:9200/_cat/master?v”

# 4. 查看集群状态
curl -X GET “http://192.168.1.11:9200/_cluster/health?pretty”

# 5. 重启故障主节点
systemctl start elasticsearch

# 6. 查看集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
curl -X GET “http://192.168.1.10:9200/_cat/nodes?v”

4.3 集群故障转移实战

集群故障转移实战:

# 1. 查看集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”

# 2. 模拟数据节点故障
# 停止数据节点
systemctl stop elasticsearch

# 3. 查看集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”

# 4. 查看分片分配情况
curl -X GET “http://192.168.1.10:9200/_cat/shards?v”

# 5. 重启故障数据节点
systemctl start elasticsearch

# 6. 查看集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”

# 7. 查看分片分配情况
curl -X GET “http://192.168.1.10:9200/_cat/shards?v”

4.4 集群扩容实战

集群扩容实战:

# 1. 查看当前集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
curl -X GET “http://192.168.1.10:9200/_cat/nodes?v”

# 2. 准备新数据节点
# 服务器信息:192.168.1.15

# 3. 安装ElasticSearch
# 在新节点上安装ElasticSearch

# 4. 配置新数据节点
vi /es/app/elasticsearch-8.10.0/config/elasticsearch.yml

cluster.name: fgedu-cluster
node.name: data-3
node.master: false
node.data: true
network.host: 192.168.1.15
http.port: 9200
transport.port: 9300
discovery.seed_hosts: [“192.168.1.10”, “192.168.1.11”, “192.168.1.12”]

# 5. 启动新数据节点
systemctl start elasticsearch

# 6. 查看集群状态
curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
curl -X GET “http://192.168.1.10:9200/_cat/nodes?v”

# 7. 手动触发分片重平衡
curl -X POST “http://192.168.1.10:9200/_cluster/reroute”

# 8. 查看分片分配情况
curl -X GET “http://192.168.1.10:9200/_cat/shards?v”

Part05-风哥经验总结与分享

5.1 集群主从最佳实践

  • 合理设置主节点数量:建议设置2-3个专用的主节点,确保高可用性
  • 配置minimum_master_nodes:为了避免脑裂,设置合理的minimum_master_nodes参数
  • 优化主节点配置:主节点需要足够的内存和CPU资源,建议使用8核CPU、16GB内存
  • 合理分配节点角色:根据节点的硬件配置和角色需求,合理分配节点角色
  • 监控主节点状态:定期监控主节点状态,及时发现和解决问题
  • 备份主节点配置:定期备份主节点配置,确保在故障时能够快速恢复

5.2 常见问题与解决方案

  • 脑裂:配置合理的minimum_master_nodes参数,优化网络连接
  • 主节点选举失败:检查网络连接,确保节点间通信顺畅
  • 集群状态变为red:检查未分配的分片,分析原因,修复故障节点
  • 主节点负载过高:减少主节点的工作负载,设置专用的主节点
  • 集群扩容失败:检查新节点的配置,确保网络连接顺畅

5.3 集群稳定性优化

  • 硬件优化:使用高性能的硬件,确保主节点和数据节点有足够的资源
  • 网络优化:使用千兆或万兆网络,确保节点间通信顺畅
  • 配置优化:合理配置ElasticSearch参数,优化集群性能
  • 监控优化:建立完善的监控体系,及时发现和解决问题
  • 备份优化:定期创建快照,确保数据安全
  • 升级优化:及时更新ElasticSearch版本,修复已知问题

更多视频教程www.fgedu.net.cn

学习交流加群风哥微信: itpux-com

学习交流加群风哥QQ113257174

风哥提示:集群主从架构是ElasticSearch高可用性的关键,需要合理设计和配置

更多学习教程公众号风哥教程itpux_com

from ElasticSearch视频:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息