第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_orderssystem_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——增删改查,把数据玩起来。