Elasticsearch 是一个开源的、分布式的、基于 RESTful API 的搜索和分析引擎。它构建在 Apache Lucene 之上,能够近乎实时地存储、搜索和分析海量数据。
它的核心用途和特点:
- 全文搜索:这是它的老本行。能快速从大量文本中找出相关结果,支持复杂的查询、高亮、拼写纠错等。常见于网站商品搜索、应用内容搜索。
- 数据分析与聚合:除了搜索,还能对数据进行统计、分析和可视化(通常配合 Kibana 使用),常用于日志和指标分析(如运维监控、安全分析)。
- 高扩展与高性能:采用分布式架构,可以通过增加节点来轻松扩展,处理 PB 级数据。数据会被分片并在集群中复制,保证了高可用性和性能。
- 近实时 (NRT):从数据写入到可被搜索,延迟通常在 1 秒内,满足了大多数实时性要求高的场景。
- 模式自由 (Schema-less):以 JSON 文档格式存储数据,可以灵活适应数据结构的变化。也支持明确定义映射(Mapping)以优化性能。
- 丰富的生态系统 :它是 Elastic Stack (ELK/EFK) 的核心组件,常与 Logstash (数据采集处理)、Kibana (数据可视化)、Beats(轻量数据采集器)配合使用,构成完整的数据处理解决方案。
典型应用场景:
- 电商平台:商品目录的快速搜索、过滤和推荐。
- 日志和指标分析:集中收集服务器、应用日志,进行故障排查和性能监控。
- 应用程序性能监控 (APM):追踪应用请求性能。
- 企业搜索:整合公司内部不同系统的文档、数据,提供统一搜索入口。
简单来说,Elasticsearch 是一个为处理大规模、多样化数据并提供快速搜索和深度洞察而设计的强大工具。
核心概念
- 文档 (Document)
- 是什么 :Elasticsearch 中最基本的数据单元,类似于数据库中的一行记录。它以 JSON 格式表示一个可被索引的数据实体。
- 例子:一个商品信息、一篇博客文章、一条日志记录。
- 索引 (Index)
- 是什么 :文档的集合,类似于数据库中的"表"。它是进行查询、更新和删除操作的主要对象。
- 关键点:索引名称必须小写。在逻辑上,它代表一类相似的数据。
- 类型 (Type) - 已逐步弃用
- 历史 :在 7.x 版本之前,一个索引中可以定义多种类型(类似于表中的"结构")。自 7.0 起,一个索引只能包含一个
_doc类型,并在 8.0 中完全移除。现在通常将不同类型的数据放在不同的索引中。
- 历史 :在 7.x 版本之前,一个索引中可以定义多种类型(类似于表中的"结构")。自 7.0 起,一个索引只能包含一个
- 映射 (Mapping)
- 是什么 :定义了索引中文档的结构和字段属性,类似于数据库的"表结构"或"模式"。
- 作用:定义每个字段的数据类型(如 text, keyword, date, long)以及如何被索引(如是否分词、是否可聚合)。
- 节点 (Node)
- 是什么 :一个运行中的 Elasticsearch 服务器实例,是集群的组成部分。
- 类型:有主节点、数据节点、协调节点等不同角色,共同协作。
- 集群 (Cluster)
- 是什么 :由一个或多个节点组成的集合,共同持有全部数据并提供跨节点的联合索引与搜索能力。
- 分片 (Shard)
- 是什么 :索引的子集。一个索引在创建时可以被分成多个分片,分布在不同节点上。
- 目的 :
- 水平拆分数据,允许存储超过单台机器容量的大索引。
- 并行化操作,提高性能和吞吐量。
- 类型 :
- 主分片:存储数据,数量在索引创建时固定。
- 副本分片:主分片的拷贝,用于提供高可用性和提升读取性能。
简单类比(与传统数据库对比):
| Elasticsearch | 传统关系型数据库 |
|---|---|
| 索引 | 数据库 |
| 文档 | 一行记录 |
| 字段 | 一列 |
| 映射 | 表结构 |
| 查询 DSL | SQL |
- 为什么大家都用 ES?
比传统数据库(MySQL)搜索快得多
支持模糊搜索、分词、拼音、同义词等复杂查询
能轻松支撑 亿级数据、高并发查询
生态成熟:Kibana 可视化、Beats 采集、各种语言客户端 - 典型技术栈
最常见组合叫 ELK:
Elasticsearch:存储、搜索、分析
Logstash:数据采集、清洗、传输
Kibana:界面可视化、报表、dashboard
es命令行操作
bash
1.查看集群健康状态
[root@es1-0001 ~]# curl -u user:pass -X GET "http://192.168.9.138:9200/_cluster/health?pretty"
{
"cluster_name" : "my-prod-es-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 7,
"active_shards" : 14,
"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
}
#查看节点信息
[root@oams-prd-es1-0001 ~]# curl -u user:pass -X GET "http://192.168.9.138:9200/_cat/nodes?v"
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.9.136 1 61 1 0.01 0.05 0.02 cdhilmrstw - es1-0002
192.168.9.138 3 61 0 0.00 0.03 0.03 cdhilmrstw * es1-0001
192.168.9.137 4 60 2 0.36 0.34 0.14 cdhilmrstw - es1-0003
#查看所有索引
[root@es1-0001 ~]# curl -u user:pass -X GET "http://192.168.9.138:9200/_cat/indices?v"
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open .security-7 SeUaLcvJRWiYaCwizc4znw 1 1 8 0 61.5kb 30.7kb
green open km_index 20KU35HDTPSbau1ZnMRpcg 1 1 0 0 416b 208b
green open search_record 8TMhjI-dTtCPGphRDcTwig 5 1 1 0 14.5kb 7.2kb
#创建索引
[root@es1-0001 ~]# curl -u user:pass -X PUT "http://192.168.9.138:9200/my-index?pretty"
{
"acknowledged" : true,
"shards_acknowledged" : true,
"index" : "my-index"
}
#删除索引
[root@es1-0001 ~]# curl -u user:pass -X DELETE "http://192.168.9.138:9200/my-index?pretty"
{
"acknowledged" : true
}
Elasticsearch迁移
ESM(Elasticsearch Migration Tool)是一款由 Go 语言开发的轻量级、高性能开源 ES 数据迁移工具,适合跨版本、跨集群、离线 / 在线迁移,尤其适合日志索引批量迁移场景。
核心特性
ini
跨版本迁移:支持在 Elasticsearch 1.x 至 7.x 等不同版本间迁移数据。
灵活迁移模式:支持全量迁移和增量同步(--sync参数),后者仅同步发生变更的文档。
数据与配置迁移:可复制索引的设置(--copy_settings)和映射(--copy_mappings),并允许覆盖分片数等配置。
数据转换:支持字段重命名(--rename)、字段过滤(白名单 --fields或黑名单 --skip)以及查询过滤(-q)。
性能可控:通过调节 Scroll API 参数、工作线程数(-w)和批量大小(-b)来控制迁移速度,减少对源集群的影响。
多种I/O支持:支持直接从集群到集群迁移,也支持将数据转储到本地文件(-o)或从文件加载到集群(-i)。
与其他工具对比(日志场景)
| 方案 | 速度 | 跨版本 | 离线 | 过滤 | 易用性 |
|---|---|---|---|---|---|
| ESM | ⭐⭐⭐⭐⭐ | ✅ | ✅ | ✅ | 高 |
| reindex | ⭐⭐⭐⭐ | ✅ | ❌ | ✅ | 中 |
| elasticdump | ⭐⭐ | ✅ | ✅ | ✅ | 中 |
| logstash | ⭐⭐⭐ | ✅ | ❌ | ✅ | 低 |
| snapshot | ⭐⭐⭐⭐⭐ | ✅ | ✅ | ❌ | 中 |
基本使用方法
-
下载与安装:从 GitHub 获取 ESM 的二进制发布包,在 Linux 服务器上解压即可使用。
bash# 最新版(2026-03) wget https://github.com/medcl/esm/releases/download/v0.8.1/esm-linux-amd64 # 赋予执行权限 chmod +x esm-linux-amd64 mv esm-linux-amd64 esm -
前置条件 :确保源和目标集群网络互通,且在迁移期间不要对源集群索引进行增删改,以免数据不一致。
-
基础命令格式:
./esm -s <源集群URL> -d <目标集群URL> -x <源索引名> -y <目标索引名> [其他参数]
ESM 命令参数详细分类介绍
1. 核心必选参数
| 参数 | 全称 | 说明 | 示例 |
|---|---|---|---|
-s |
--source |
源集群地址 ,格式为 http(s)://host:port。 |
-s https://old-es:9200 |
-d |
--dest |
目标集群地址,格式同上。 | -d http://new-es:9200 |
-x |
--index |
要迁移的源索引名称 。支持多个索引(逗号分隔)、通配符(*)匹配、排除(-前缀)。 |
-x "log-*","-log-2020*"迁移所有以log-开头,但排除log-2020的索引 |
2. 认证与安全参数
| 参数 | 全称 | 说明 | 示例 |
|---|---|---|---|
-m |
--source_auth |
源集群的 HTTP Basic Auth 认证信息,格式为 username:password。 |
-m elastic:changeme |
-n |
--dest_auth |
目标集群的认证信息,格式同上。 | -n admin:@SecurePass123 |
--ca-certs |
指定用于验证 HTTPS 连接的 CA 证书文件路径。 | --ca-certs=/path/to/ca.crt |
3. 数据过滤与转换参数
| 参数 | 全称 | 说明 | 示例 |
|---|---|---|---|
-q |
--query |
使用 Elasticsearch 查询 DSL 来筛选要迁移的文档。 | -q '{"range": {"@timestamp": {"gte": "now-7d"}}}' |
--fields |
指定要迁移的字段白名单(逗号分隔)。 | --fields="id,title,content" |
|
--skip |
指定要跳过的字段黑名单(逗号分隔)。 | --skip="_source.temp_field,_source.debug_info" |
|
--rename |
重命名字段 ,格式为 old:new,old2:new2。 |
--rename="old_name:new_name,age:user_age" |
4. 性能调优参数(关键)
| 参数 | 全称 | 说明与建议 | 您的示例 |
|---|---|---|---|
-w |
--workers |
工作线程/协程数。增加此值可提高并发度,但会加大源/目标集群负载。根据集群性能和网络调整。 | -w 20(较高并发) |
-b |
--batch_size |
每个批次的大小(MB)。增大可减少网络往返次数,但需要更多内存。 | -b 10(适中) |
-c |
--scroll_size |
每次 Scroll API 请求获取的文档数量。默认通常为100。增大可提升读取吞吐量。 | (未指定,使用默认值) |
--sliced_scroll_size |
Sliced Scroll 的切片数 。将一个 Scroll 任务拆分成多个并行执行的切片,大幅提升大索引的读取速度 。建议设置为与 -w相近的值。 |
--sliced_scroll_size=20(与 -w=20配合良好) |
|
--buffer_count |
内存缓冲区中允许缓存的文档总数上限。防止内存溢出。 | --buffer_count=1000000(百万级缓冲) |
|
--refresh |
设置目标索引的刷新间隔 。设为 -1可在迁移期间完全禁用刷新 ,极大提升写入速度。迁移完成后务必手动恢复 (如 30s)。 |
--refresh或 --refresh=-1 |
5. 索引配置与模式参数
| 参数 | 全称 | 说明 | 您的示例 |
|---|---|---|---|
--copy_settings |
复制源索引的设置 (如分片数、副本数、刷新间隔等)到目标索引。注意:这会将目标索引的分片数也改为源索引的,若目标集群规模不同,可能需要手动调整。 | 已启用 | |
--copy_mappings |
复制源索引的映射(Mapping) 到目标索引。确保数据结构一致。 | 已启用 | |
-y |
--dest_index |
指定目标索引的名称。不指定时,默认使用与源索引相同的名称。 | (未指定,使用原名) |
--shards |
覆盖目标索引的主分片数 。配合 --copy_settings时,此参数优先级更高。 |
--shards=5 |
6. 运行模式与控制参数
| 参数 | 全称 | 说明 |
|---|---|---|
--sync |
开启增量同步模式 。ESM 将定期轮询(默认间隔5秒)源索引中 @timestamp字段的新增/更新文档并同步。无法同步删除操作。 |
|
--interval |
与 --sync配合使用,指定增量同步的轮询间隔(秒)。 |
|
-o |
--output |
将数据转储到本地文件,而非直接写入目标集群。 |
-i |
--input |
从本地文件读取数据并导入到目标集群。 |
案例
bash
[root@localhost ~]# ./esm-linux-amd64 -s https://192.168.245.252:9200 -d http://192.168.252.138:9200 -x "accesslog","errorlog","test1","test2" -m admin:123456@12 -n admin:654321@21 -w 20 -b 10 --sliced_scroll_size=20 --buffer_count=1000000 --copy_settings --copy_mappings --refresh