第3章 Elasticsearch 入门:核心概念与安装实战
好,咱们正式开始接触 Elasticsearch 了。说实话,我第一次看到 ES 的文档时,心里是有点懵的——什么分片、副本、倒排索引,一堆新名词砸过来。但别怕,这些东西说白了都不复杂。今天我就带你把这些概念一个一个掰开揉碎,再亲手把 ES 跑起来。
3.1 Elasticsearch 到底是什么?
Elasticsearch 是一个基于 Lucene 的分布式搜索引擎。嗯,这句话很官方。我换个说法:它就是一个能存数据、能飞快搜索数据的数据库,只不过它不是为了事务而生的,而是为了搜索和分析。
你想想看,传统数据库用 LIKE 查询,数据量一上去就慢得像蜗牛。ES 不一样,它用了倒排索引,搜索速度基本不受数据量影响。我在项目中遇到过客户抱怨 MySQL 搜索要 10 秒,换成 ES 后直接降到 50 毫秒——这差距,谁用谁知道。
核心定位:Elasticsearch 不是用来替代 MySQL 的,它是用来做搜索、日志分析、全文检索的。记住这个定位,后面就不会用错地方。
3.2 核心概念:一次讲透
这些概念你以后天天都要打交道,我尽量用大白话讲清楚。
3.2.1 索引(Index)
索引是 ES 里最上层的逻辑容器。你可以把它理解成 MySQL 里的数据库。一个索引里可以存很多文档,每个文档都有不同的字段。
举个例子:你要做一个商品搜索系统,那就建一个 products 索引。所有商品数据都往这个索引里放。
我的习惯:索引名我一般用小写字母,多个单词用下划线连接,比如 user_orders、system_logs。这样在命令行里操作时不容易出错。
3.2.2 文档(Document)
文档是 ES 里最小的数据单元。说白了,就是一条 JSON 数据。比如一个商品信息:
{
"id": 1001,
"name": "华为Mate60",
"price": 6999,
"category": "手机",
"description": "搭载麒麟芯片,支持卫星通信"
}
每个文档都有一个唯一的 _id,你可以自己指定,也可以让 ES 自动生成。我个人习惯是尽量用业务 ID,这样查起来方便。
3.2.3 分片(Shard)
这是 ES 能处理海量数据的关键。一个索引的数据量可能很大,比如 10 亿条日志。ES 会把索引切成多个分片,每个分片就是一个独立的 Lucene 索引。
为什么要分片?说白了就是分摊压力。10 亿条数据放在一台机器上,谁也扛不住。分成 5 个分片,每个分片只存 2 亿条,查询时 5 个分片同时干活,速度自然快。
我曾经踩过的坑:分片数一旦设置就不能改了(除非重建索引)。我刚开始时图省事,一个索引只设了 1 个分片,结果数据量上来后,想扩都扩不了。所以,分片数要提前规划好。一般建议每个分片 20-40GB 数据,你可以根据总数据量反推分片数。
3.2.4 副本(Replica)
副本就是分片的备份。每个分片都可以有 0 个或多个副本。副本的作用有两个:
- 高可用:某个节点挂了,副本能顶上,数据不丢
- 提升查询性能:查询请求可以同时打到主分片和副本上,相当于多了几倍的查询能力
默认情况下,ES 会给每个索引创建 1 个副本。也就是每个分片有 1 份主分片 + 1 份副本,总共 2 份数据。
我的建议:生产环境至少保留 1 个副本。如果集群节点数多(比如 5 个以上),可以设 2 个副本,进一步提高容错性。但别设太多,副本多了写性能会下降。
3.2.5 节点与集群
一个 ES 实例就是一个节点(Node)。多个节点组成一个集群(Cluster)。集群通过一个名字来标识,默认叫 elasticsearch。
节点有不同的角色:
| 角色 | 说明 | 我的建议 |
|---|---|---|
| Master 节点 | 负责集群管理,比如创建索引、分配分片 | 至少 3 个,避免脑裂 |
| Data 节点 | 负责存储数据、执行查询 | 主要节点,根据数据量扩展 |
| Ingest 节点 | 负责数据预处理 | 按需配置,小集群可以不用 |
3.3 安装与启动:动手试试
光说不练假把式。咱们现在就把 ES 跑起来。我以 Linux 环境为例,Windows 和 Mac 也类似。
3.3.1 环境准备
ES 依赖 Java 环境。注意:ES 7.x 以上版本内置了 JDK,所以你不用额外装 Java。但如果你要用其他 Java 应用,建议还是装一个 JDK 11 或 17。
# 检查 Java 版本(可选)
java -version
3.3.2 下载与安装
我习惯用 tar 包安装,方便控制版本。
# 下载 ES 7.17.10(我推荐这个版本,稳定且兼容性好)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-linux-x86_64.tar.gz
# 解压
tar -xzf elasticsearch-7.17.10-linux-x86_64.tar.gz
# 进入目录
cd elasticsearch-7.17.10/
注意:ES 不能用 root 用户启动!这是安全限制。你需要创建一个普通用户:
useradd esuser
chown -R esuser:esuser elasticsearch-7.17.10/
su esuser
3.3.3 启动 ES
# 前台启动(方便看日志)
./bin/elasticsearch
# 后台启动
./bin/elasticsearch -d
启动后,打开另一个终端,验证一下:
curl http://localhost:9200
如果返回类似下面的 JSON,说明启动成功了:
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "xxxx",
"version" : {
"number" : "7.17.10",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "xxxx",
"build_date" : "2023-04-12T09:49:36.111Z",
"build_snapshot" : false,
"lucene_version" : "8.11.1",
"minimum_wire_compatibility_version" : "6.8",
"minimum_index_compatibility_version" : "6.0.0"
},
"tagline" : "You Know, for Search"
}
3.3.4 配置调整(必做)
默认配置只适合开发环境。生产环境必须改几个地方:
# 编辑 config/elasticsearch.yml
# 1. 修改集群名称
cluster.name: my-production-cluster
# 2. 修改节点名称
node.name: node-1
# 3. 绑定 IP(允许外部访问)
network.host: 0.0.0.0
# 4. 设置数据路径
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
# 5. 设置内存(别超过物理内存的 50%)
# 编辑 config/jvm.options
-Xms4g
-Xmx4g
我曾经犯过的错:第一次部署时没改 network.host,结果只能本机访问,远程死活连不上。还有一次把 -Xmx 设成了 32G,结果机器只有 16G 内存,ES 直接启动失败。嗯,这些坑你记住就好。
3.4 验证集群状态
启动后,用这个命令看看集群健康状态:
curl http://localhost:9200/_cluster/health?pretty
返回结果:
{
"cluster_name" : "my-production-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 1,
"number_of_data_nodes" : 1,
"active_primary_shards" : 0,
"active_shards" : 0,
"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
}
状态有三种:
- green:一切正常,所有分片和副本都分配好了
- yellow:主分片正常,但副本没分配(常见于单节点集群)
- red:有主分片丢失,数据可能不完整
单节点集群显示 yellow 是正常的,因为副本没法分配到其他节点上。等后面加了节点,就会变成 green。
3.5 本章小结
今天咱们把 ES 的核心概念都过了一遍:索引是数据库,文档是数据行,分片是切分数据,副本是备份。然后亲手装了一个 ES 实例,验证了集群状态。
说实话,安装这一步虽然简单,但很多人会卡在配置上。如果你遇到启动失败,先检查日志(在 logs/ 目录下),90% 的问题都能从日志里找到答案。
下一章,咱们开始真正操作 ES——增删改查,把数据玩起来。