ElasticSearch教程FG001-ElasticSearch架构原理与官方核心特性生产实战解析
本文档风哥主要介绍ElasticSearch数据库的架构原理与核心特性,包括ElasticSearch数据库的基础概念、架构原理、核心特性、生产环境规划与建议、集群部署方案、高可用架构设计等内容,风哥教程参考ElasticSearch官方文档Basic Concepts、Architecture、Scalability and resilience等内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。
Part01-基础概念与理论知识
1.1 ElasticSearch数据库基础概念
ElasticSearch是一个基于Lucene的分布式搜索引擎,提供了实时的、分布式的全文搜索和分析能力。它是一个开源项目,由Elastic公司维护,广泛应用于日志分析、全文搜索、安全分析等场景。更多视频教程www.fgedu.net.cn
- 文档(Document):ElasticSearch中的基本数据单元,以JSON格式存储
- 索引(Index):文档的集合,类似于关系数据库中的数据库
- 类型(Type):索引中的逻辑分类,类似于关系数据库中的表(在7.0+版本中已被移除)
- 分片(Shard):索引的水平分割,提高性能和可用性
- 副本(Replica):分片的副本,提高可用性和读取性能
- 节点(Node):ElasticSearch集群中的单个服务器
- 集群(Cluster):多个节点的集合,共同存储数据并提供服务
1.2 ElasticSearch数据库架构原理
ElasticSearch采用分布式架构,主要由以下组件组成:
– 节点(Node):单个ElasticSearch实例
– 集群(Cluster):多个节点组成的集合
– 索引(Index):文档的集合
– 分片(Shard):索引的水平分割
– 副本(Replica):分片的副本
– 倒排索引:用于快速全文搜索的数据结构
– 网关(Gateway):持久化存储
– 发现模块(Discovery):节点发现和集群形成
– 脚本模块(Scripting):支持自定义脚本
– 插件(Plugins):扩展功能
1.3 ElasticSearch数据库核心特性
ElasticSearch的核心特性包括:
- 分布式架构:自动分片和复制,提高可用性和扩展性
- 实时搜索:近实时索引和搜索能力
- 全文搜索:强大的全文搜索功能,支持复杂查询
- 分析能力:丰富的聚合功能,支持数据统计和分析
- RESTful API:通过HTTP接口进行操作
- 水平扩展:可以轻松添加节点,扩展集群容量
- 高可用性:自动故障转移,确保服务持续可用
- 多语言支持:支持多种编程语言的客户端
Part02-生产环境规划与建议
2.1 系统硬件要求
ElasticSearch在生产环境中的硬件要求:
## 内存
– 最低:8GB RAM
– 推荐:16GB-64GB RAM(根据数据量和查询复杂度)
– 注意:不要超过32GB,因为JVM在32GB以上内存的处理效率会下降
## CPU
– 最低:4核
– 推荐:8核-16核
– 注意:多核CPU对并行处理查询和索引操作很重要
## 存储
– 类型:SSD(推荐)或HDD
– 容量:根据数据量计算,预留50%的空间
– IOPS:SSD至少5000 IOPS
## 网络
– 最低:1Gbps
– 推荐:10Gbps(对于大型集群)
– 注意:低延迟网络对集群性能至关重要
2.2 操作系统环境
推荐的操作系统:
- 主要系统:Oracle Linux 9.3 / RHEL 9.3 / 8.x / 7.x
- 可选系统:国产麒麟操作系统 Kylin v10 SP3、欧拉
- 注意事项:关闭透明大页、配置足够的文件描述符、调整内核参数
2.3 网络环境要求
网络环境配置建议:
## 网络拓扑
– 使用专用网络段
– 确保节点间网络延迟低(< 1ms)
- 避免跨数据中心部署(除非使用跨集群复制)
## 防火墙设置
- 开放9200端口(API访问)
- 开放9300端口(节点间通信)
- 限制外部访问,只允许受信任的IP
## 网络参数
- 调整TCP参数,优化网络性能
- 启用TCP keepalive
- 调整网络缓冲区大小
Part03-生产环境项目实施方案
3.1 节点部署方案
ElasticSearch节点部署方案:
## 1. 准备服务器
# 检查系统信息
$ uname -a
Linux fgedu.net.cn 5.14.0-362.8.1.el9_3.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Oct 13 17:40:42 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
# 检查内存
$ free -h
total used free shared buff/cache available
Mem: 32G 2.1G 28G 128M 1.8G 29G
Swap: 4G 0B 4G
# 检查磁盘
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 10G 38G 21% /
/dev/sdb1 200G 10G 180G 6% /es
## 2. 系统配置
# 关闭透明大页
$ echo “never” > /sys/kernel/mm/transparent_hugepage/enabled
$ echo “never” > /sys/kernel/mm/transparent_hugepage/defrag
# 配置文件描述符
$ echo “* soft nofile 65536” >> /etc/security/limits.conf
$ echo “* hard nofile 65536” >> /etc/security/limits.conf
# 配置内存锁定
$ echo “* soft memlock unlimited” >> /etc/security/limits.conf
$ echo “* hard memlock unlimited” >> /etc/security/limits.conf
3.2 集群形成与配置
ElasticSearch集群配置:
# 集群名称
cluster.name: fgedu-cluster
# 节点名称
node.name: node-1
# 节点角色
node.roles: [master, data, ingest]
# 网络配置
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”, “node-2”, “node-3”]
# 数据路径
path.data: /es/fgdata
# 日志路径
path.logs: /es/app/elasticsearch/logs
# JVM堆大小
# 在jvm.options文件中设置
# -Xms16g
# -Xmx16g
3.3 高可用架构设计
ElasticSearch高可用架构设计:
## 1. 节点角色分离
– 主节点(Master):负责集群管理,建议3个
– 数据节点(Data):负责存储和搜索,根据数据量设置
– 协调节点(Coordinating):负责请求路由,建议2个
– ingest节点:负责数据预处理,根据需要设置
## 2. 副本配置
# 设置索引副本数为2
PUT /fgedu-index
{
“settings”: {
“number_of_shards”: 5,
“number_of_replicas”: 2
}
}
## 3. 快照备份
# 创建快照仓库
PUT /_snapshot/fgedu_backup
{
“type”: “fs”,
“settings”: {
“location”: “/es/backup”
}
}
# 执行快照
PUT /_snapshot/fgedu_backup/snapshot_1
Part04-生产案例与实战讲解
4.1 集群状态检查实战
ElasticSearch集群状态检查:
$ 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” : 5,
“active_shards” : 15,
“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
}
# 检查节点信息
$ curl -X GET “http://192.168.1.10:9200/_cat/nodes?v”
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.10 25 75 2 0.10 0.15 0.12 mdi * node-1
192.168.1.11 22 70 1 0.05 0.10 0.08 mdi – node-2
192.168.1.12 20 68 1 0.08 0.12 0.10 mdi – node-3
# 检查索引状态
$ curl -X GET “http://192.168.1.10:9200/_cat/indices?v”
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open fgedu-index 5c9f8f8f-8f8f-4f4f-8f8f-8f8f8f8f8f8f 5 2 0 0 1.2kb 400b
4.2 节点角色配置实战
ElasticSearch节点角色配置:
node.name: master-1
node.roles: [master]
# 数据节点配置
node.name: data-1
node.roles: [data]
# 协调节点配置
node.name: coord-1
node.roles: []
# 检查节点角色
$ curl -X GET “http://192.168.1.10:9200/_cat/nodes?h=name,role”
master-1 m
master-2 m
master-3 m
数据-1 d
数据-2 d
数据-3 d
coord-1
coord-2
4.3 扩展性测试实战
ElasticSearch扩展性测试:
$ curl -X POST “http://192.168.1.10:9200/fgedu-test/_bulk” -H “Content-Type: application/json”
{
“index”: {“_id”: 1}
}
{
“name”: “测试文档1”,
“content”: “这是一个测试文档,用于测试ElasticSearch的扩展性”
}
{
“index”: {“_id”: 2}
}
{
“name”: “测试文档2”,
“content”: “这是另一个测试文档,用于测试ElasticSearch的性能”
}
# 2. 执行搜索测试
$ curl -X GET “http://192.168.1.10:9200/fgedu-test/_search?pretty”
{
“took” : 1,
“timed_out” : false,
“_shards” : {
“total” : 5,
“successful” : 5,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 2,
“relation” : “eq”
},
“max_score” : 1.0,
“hits” : [
{
“_index” : “fgedu-test”,
“_type” : “_doc”,
“_id” : “1”,
“_score” : 1.0,
“_source” : {
“name” : “测试文档1”,
“content” : “这是一个测试文档,用于测试ElasticSearch的扩展性”
}
},
{
“_index” : “fgedu-test”,
“_type” : “_doc”,
“_id” : “2”,
“_score” : 1.0,
“_source” : {
“name” : “测试文档2”,
“content” : “这是另一个测试文档,用于测试ElasticSearch的性能”
}
}
]
}
}
# 3. 添加新节点测试扩展性
# 在新服务器上部署ElasticSearch并加入集群
# 检查集群状态
$ curl -X GET “http://192.168.1.10:9200/_cluster/health?pretty”
{
“cluster_name” : “fgedu-cluster”,
“status” : “green”,
“timed_out” : false,
“number_of_nodes” : 4,
“number_of_data_nodes” : 4,
“active_primary_shards” : 5,
“active_shards” : 20,
“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
}
Part05-风哥经验总结与分享
5.1 ElasticSearch数据库最佳实践
ElasticSearch数据库最佳实践:
- 合理规划索引:根据数据特点和查询模式设计索引结构
- 适当设置分片:根据数据量和节点数设置合理的分片数
- 配置副本:至少设置1个副本,提高可用性
- 监控集群状态:定期检查集群健康状态,及时发现问题
- 备份数据:定期执行快照备份,确保数据安全
- 优化查询:避免复杂查询,使用合适的查询类型
- 资源管理:合理分配内存和CPU资源,避免资源争用
- 版本管理:定期升级到稳定版本,享受新特性和bug修复
5.2 常见问题与解决方案
ElasticSearch常见问题与解决方案:
## 1. 集群状态为yellow或red
– 原因:副本未分配或分片丢失
– 解决方案:检查节点状态,确保有足够的节点,修复故障节点
## 2. 内存不足
– 原因:JVM堆设置过大或数据量增长
– 解决方案:调整JVM堆大小,增加节点内存,优化数据结构
## 3. 索引性能下降
– 原因:分片过多,查询复杂,硬件资源不足
– 解决方案:合并分片,优化查询,升级硬件
## 4. 节点通信问题
– 原因:网络故障,防火墙设置
– 解决方案:检查网络连接,配置正确的防火墙规则
## 5. 磁盘空间不足
– 原因:数据增长过快,未及时清理
– 解决方案:增加磁盘空间,配置索引生命周期管理,删除不需要的数据
5.3 学习路径与前景
ElasticSearch学习路径与前景:
- 学习路径:
- 基础概念与架构理解
- 安装与配置
- 索引与查询操作
- 集群管理与监控
- 性能优化与调优
- 高级特性应用(如机器学习、向量搜索)
- 应用前景:
- 日志分析与监控
- 全文搜索
- 安全分析
- 业务分析
- 推荐系统
- IoT数据处理
- 职业发展:
- ElasticSearch工程师
- 数据工程师
- DevOps工程师
- 搜索工程师
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
