Elasticsearch 原理与关键流程
一、Elasticsearch 基本原理
Elasticsearch 是一个基于 Lucene 的分布式搜索和分析引擎,主要特点包括:
- 分布式架构:自动分片数据并在集群中分布
- 近实时搜索:数据变更后短时间内即可搜索到
- 高可用性:通过副本机制保证数据安全
- RESTful API:通过 HTTP 接口进行操作
核心概念:
- 索引(Index):类似数据库中的表
- 类型(Type)(7.x后已弃用):原为索引中的逻辑分类
- 文档(Document):基本数据单元,JSON格式
- 分片(Shard):索引的水平分割单元
- 副本(Replica):分片的拷贝,提供高可用
二、文档读写流程
文档写入流程
-
客户端请求:
- 客户端发送写入请求到任意节点(协调节点)
-
路由确定:
- 协调节点根据文档ID的哈希值确定目标分片
- 公式:
shard = hash(document_id) % number_of_primary_shards
-
主分片写入:
- 请求被转发到主分片所在节点
- 先写入内存缓冲区(Index Buffer)
- 同时写入事务日志(Translog)以保证持久性
-
刷新(Refresh):
- 默认每1秒或Index Buffer满时触发
- 将内存中的数据生成新的段(Segment)并打开供搜索
- 此时数据可被搜索到(近实时)
-
刷盘(Flush):
- 默认每30分钟或Translog太大时触发
- 将内存中的数据提交到磁盘
- 清空Translog(生成新的Translog)
-
副本同步:
- 主分片将操作并行发送到所有副本分片
- 所有副本确认后才向客户端返回成功
文档读取流程
-
客户端请求:
- 客户端发送查询请求到任意节点(协调节点)
-
查询阶段(Query Phase):
- 协调节点将查询广播到所有相关分片(主或副本)
- 每个分片本地执行查询并返回匹配文档的ID和排序值
- 协调节点合并、排序结果集
-
取回阶段(Fetch Phase):
- 协调节点根据结果集中的ID向对应分片获取完整文档
- 合并后返回给客户端
三、底层删除数据的逻辑
Elasticsearch 的删除操作是特殊的标记删除机制:
-
删除标记:
- 删除文档时,不会立即从磁盘移除
- 而是在.del文件中标记该文档为已删除
-
搜索过滤:
- 查询时会检查.del文件,过滤掉已删除文档
-
段合并时真正删除:
- 在后台段合并(Segment Merge)过程中
- 新生成的段不会包含被删除的文档
- 此时才真正释放磁盘空间
-
更新操作的特殊性:
- 更新=删除旧文档+新增新文档
- 同样遵循上述删除逻辑
-
强制删除:
- 通过_forcemerge API可以强制合并段并清理删除
POST /index/_forcemerge?only_expunge_deletes=true
四、集群API
集群管理API
-
健康检查:
GET /_cluster/health GET /_cluster/health/index_name -
状态信息:
GET /_cluster/state GET /_cluster/stats -
节点信息:
GET /_nodes GET /_nodes/stats -
重新路由:
POST /_cluster/reroute { "commands": [ {"move": {"index": "test", "shard": 0, "from_node": "node1", "to_node": "node2"}}, {"cancel": {"index": "test", "shard": 0, "node": "node1"}} ] } -
设置更新:
PUT /_cluster/settings { "persistent": { "cluster.routing.allocation.enable": "all" }, "transient": { "indices.recovery.max_bytes_per_sec": "50mb" } }
索引管理API
-
创建索引:
PUT /index_name { "settings": { "number_of_shards": 3, "number_of_replicas": 1 }, "mappings": { "properties": { "field1": { "type": "text" }, "field2": { "type": "keyword" } } } } -
删除索引:
DELETE /index_name -
索引设置:
PUT /index_name/_settings { "index.number_of_replicas": 2 } -
索引别名:
POST /_aliases { "actions": [ { "add": { "index": "index1", "alias": "alias1" }}, { "remove": { "index": "old_index", "alias": "old_alias" }} ] }
监控与维护API
-
任务管理:
GET /_tasks GET /_tasks?nodes=nodeId1,nodeId2 -
缓存清理:
POST /index_name/_cache/clear -
段信息:
GET /index_name/_segments -
强制合并:
POST /index_name/_forcemerge?max_num_segments=1 -
索引统计:
GET /index_name/_stats GET /_stats
这些API提供了对Elasticsearch集群的全面控制,从基本的索引管理到高级的集群运维操作。
浙公网安备 33010602011771号