Elasticsearch架构与原理
大约 4 分钟ELK日志收集技术Elasticsearch架构原理
Elasticsearch架构与原理
Elasticsearch概述
Elasticsearch是一个基于Apache Lucene构建的开源、分布式、RESTful搜索引擎。它能够快速地存储、搜索和分析大量数据,被广泛应用于日志分析、全文搜索、商业智能等场景。
Elasticsearch架构
1. 节点类型
Elasticsearch集群由多个节点组成,每个节点可以承担不同的角色:
Master-eligible节点
- 负责集群管理任务
- 维护集群状态
- 管理索引的创建和删除
- 节点的加入和移除
Data节点
- 存储数据
- 执行数据相关的操作(CRUD、搜索、聚合)
- 处理大量的磁盘I/O和CPU资源
Ingest节点
- 负责数据预处理
- 执行Ingest Pipeline
- 转换和丰富数据
Coordinating节点
- 负责路由请求到正确的节点
- 聚合来自不同节点的响应
- 每个节点都隐式地具有协调功能
Machine Learning节点
- 运行机器学习任务
- 需要专门的许可证
2. 集群架构
[Client] --> [Coordinating Node] --> [Master Node]
|--> [Data Node 1]
|--> [Data Node 2]
|--> [Data Node N]
3. 分片与副本机制
分片(Shard)
- 索引的水平分割单元
- 每个分片都是一个独立的Lucene索引
- 支持水平扩展
副本(Replica)
- 分片的备份
- 提供高可用性和数据冗余
- 提升查询性能
Elasticsearch核心概念
1. 索引(Index)
索引是具有相似特征的文档集合,类似于关系数据库中的数据库概念。
索引操作:
# 创建索引
PUT /my_index
# 删除索引
DELETE /my_index
# 查看索引信息
GET /my_index
2. 文档(Document)
文档是Elasticsearch中的基本单位,采用JSON格式存储。
文档操作:
# 创建文档
POST /my_index/_doc/1
{
"title": "Elasticsearch入门",
"content": "这是一篇关于Elasticsearch的文章"
}
# 查询文档
GET /my_index/_doc/1
# 更新文档
PUT /my_index/_doc/1
{
"title": "Elasticsearch入门指南",
"content": "这是一篇关于Elasticsearch的详细指南"
}
# 删除文档
DELETE /my_index/_doc/1
3. 映射(Mapping)
映射定义了文档及其字段的存储和索引方式。
映射示例:
{
"mappings": {
"properties": {
"title": {
"type": "text"
},
"publish_date": {
"type": "date"
},
"tags": {
"type": "keyword"
}
}
}
}
4. 分析器(Analyzer)
分析器负责将文本转换为倒排索引中的词条。
内置分析器:
- Standard Analyzer:默认分析器,按词切分并转为小写
- Simple Analyzer:按非字母切分并转为小写
- Whitespace Analyzer:按空格切分
- Stop Analyzer:按非字母切分,转为小写并移除停用词
Elasticsearch工作原理
1. 数据写入流程
1. 客户端发送写入请求
2. Coordinating节点接收请求
3. 路由到主分片所在节点
4. 主分片执行写入操作
5. 主分片将变更同步到副本分片
6. 所有分片确认后返回成功响应
2. 数据查询流程
1. 客户端发送查询请求
2. Coordinating节点接收请求
3. 将查询请求广播到相关分片
4. 每个分片独立执行查询
5. 各分片返回局部结果
6. Coordinating节点聚合结果
7. 返回最终结果给客户端
3. 倒排索引
Elasticsearch使用倒排索引实现快速搜索:
正排索引:
Doc1: "Elasticsearch is powerful"
Doc2: "Logstash is useful"
倒排索引:
Elasticsearch: [Doc1]
is: [Doc1, Doc2]
powerful: [Doc1]
Logstash: [Doc2]
useful: [Doc2]
Elasticsearch配置优化
1. 内存配置
# elasticsearch.yml
# 堆内存设置(建议不超过物理内存的50%)
-Xms4g
-Xmx4g
# 禁用swap
bootstrap.memory_lock: true
2. 网络配置
# 绑定地址
network.host: 0.0.0.0
# HTTP端口
http.port: 9200
# 集群通信端口
transport.tcp.port: 9300
3. 分片配置
# 索引分片数
index.number_of_shards: 5
# 索引副本数
index.number_of_replicas: 1
Elasticsearch性能优化
1. 索引优化
批量写入:
# 使用_bulk API批量写入
POST /_bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "index" : { "_index" : "test", "_id" : "2" } }
{ "field1" : "value2" }
索引刷新间隔:
# 调整刷新间隔
PUT /my_index/_settings
{
"index": {
"refresh_interval": "30s"
}
}
2. 查询优化
使用过滤器而非查询:
{
"query": {
"bool": {
"filter": [
{ "term": { "status": "published" } },
{ "range": { "publish_date": { "gte": "2023-01-01" } } }
]
}
}
}
避免深度分页:
# 使用search_after替代from/size
GET /my_index/_search
{
"size": 10,
"sort": [
{"timestamp": "asc"},
{"_id": "desc"}
],
"search_after": [1463538857, "654323"]
}
Elasticsearch监控
1. 集群健康状态
# 查看集群健康状态
GET /_cluster/health
# 查看节点信息
GET /_nodes
# 查看索引统计信息
GET /_stats
2. 关键指标
- 集群状态:green/yellow/red
- 节点数量:在线节点数
- 分片分布:主分片和副本分片状态
- 磁盘使用率:避免磁盘满导致写入失败
- 内存使用率:监控JVM堆内存使用情况
- 查询性能:查询延迟和吞吐量
Elasticsearch安全配置
1. 启用安全功能
# elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
2. 用户认证
# 设置内置用户密码
bin/elasticsearch-setup-passwords interactive
3. 角色权限管理
{
"cluster": ["monitor"],
"indices": [
{
"names": ["log-*"],
"privileges": ["read", "view_index_metadata"]
}
]
}
总结
Elasticsearch作为ELK Stack的核心组件,具有强大的分布式搜索和分析能力。通过合理的架构设计、配置优化和监控管理,可以构建高性能、高可用的日志分析平台。在实际应用中,需要根据业务需求和数据规模进行相应的调优和配置。