2. Elasticsearch 基础与安装

这一章咱们把 Elasticsearch 的核心概念说透,再上手装一套能跑起来的实例。ES 这东西,说白了就是一个基于 Lucene 的分布式搜索引擎。我刚开始接触时也觉得概念多,但拆开来看没那么复杂。

2.1 核心概念:索引、分片、副本

先讲三个最基础、也最绕不开的概念——索引(Index)、分片(Shard)、副本(Replica)。你可以把 ES 类比成一个关系型数据库,索引 ≈ 数据库,类型(老版本)≈ 表,文档 ≈ 行。但千万别深钻这个比喻,ES 的索引是真正干搜索活的单位。

索引(Index)

索引就是一类相似文档的集合。举个例子,你把公司所有服务器审计日志存进去,可以建一个 audit-logs-2025 的索引。每个文档都是一个 JSON 对象。嗯,这里要注意:索引名必须小写,不能有特殊符号。

分片(Shard)

一个索引的数据量可能很大,ES 会把它切分成多个分片,分布到集群的不同节点上。分片是 ES 做水平扩展的根基。我个人习惯把主分片数在创建索引时就定好,因为一旦创建就不能改了——除非重建索引。

副本(Replica)

副本就是主分片的拷贝。副本越多,搜索吞吐量越高,但写入性能会下降(因为要同步)。默认每个主分片配一个副本。我曾经遇到过一个场景:日志量突增,副本数设了 3 个,结果写入延迟飙到 2 秒……后来把副本临时降为 1,才扛住峰值。

概念速记卡片
  • 索引:数据容器,类似 MySQL 里的库
  • 分片:水平拆分单元,决定数据分布
  • 副本:冗余备份,提高读性能和容错

下表帮你快速区分三者关系:

概念 作用 可修改 常见误区
索引 存储与检索的命名空间 名称不可修改 把索引当数据库表用(其实是库)
分片 分散数据到多节点 创建后不可改主分片数 以为分片越多越好(浪费资源)
副本 提供高可用与查询负载 随时可调整 副本数设太高导致写入慢
个人经验: 做审计日志场景,主分片数按节点数的 1.5~2 倍设置比较保险。比如 3 节点集群,主分片设 5 个或 6 个就够了。副本数默认 1 个,除非你对查询并发要求特别大。

2.2 Elasticsearch 安装(单机模式)

先走一遍单机安装,让你有个体感。我用的版本是 7.17.x(LTS,稳定且兼容性好)。你可以在虚拟机或 Docker 里操作。

步骤 1:下载解压

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.27-linux-x86_64.tar.gz
tar -xzf elasticsearch-7.17.27-linux-x86_64.tar.gz
cd elasticsearch-7.17.27/

步骤 2:配置单机

编辑 config/elasticsearch.yml,至少改这几项:

cluster.name: elk-audit
node.name: node-1
path.data: /var/lib/elasticsearch/data
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.type: single-node

注意 discovery.type: single-node 是单机模式的关键,不加它 ES 会尝试集群发现然后报错。

步骤 3:启动

# 不能用 root 运行,一定要建普通用户
useradd -m esuser
chown -R esuser:esuser /opt/elasticsearch-7.17.27/
su - esuser -c "/opt/elasticsearch-7.17.27/bin/elasticsearch -d -p pid"

步骤 4:验证

curl http://localhost:9200

返回类似下面的 JSON 就成功了:

{
  "name" : "node-1",
  "cluster_name" : "elk-audit",
  "cluster_uuid" : "xxx",
  "version" : {
    "number" : "7.17.27"
  },
  "tagline" : "You Know, for Search"
}
避坑指南: 我曾经头一天还好好的,第二天启动报错 max file descriptors [4096] for elasticsearch process is too low。解决办法:在 /etc/security/limits.conf 里加两行——
esuser soft nofile 65536
esuser hard nofile 65536
然后重新登录用户。另外内存不够也会崩,建议至少留 2GB 给 ES。

2.3 Elasticsearch 安装(集群模式)

生产环境肯定要搭集群。单机练手没毛病,但审计日志量一大,单节点扛不住的。集群模式其实就是把上面的配置改几个参数,然后多节点启动就行。

集群配置要点

  • 所有节点的 cluster.name 必须相同
  • 每个节点 node.name 不同
  • 至少指定一个 discovery.seed_hosts(种子节点)
  • 选主节点候选:node.master: true(建议至少 3 台)
  • 数据节点:node.data: true

三节点最小集群示例

节点 1 配置(node-1,master 候选 + 数据节点)

cluster.name: elk-audit-cluster
node.name: node-1
node.master: true
node.data: true
path.data: /data/elasticsearch/data
path.logs: /data/elasticsearch/logs
network.host: 192.168.1.101
http.port: 9200
transport.port: 9300
discovery.seed_hosts: ["192.168.1.101:9300", "192.168.1.102:9300", "192.168.1.103:9300"]
cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]

节点 2 配置——类似,改 node.name: node-2、network.host: 192.168.1.102。节点 3 同理。

启动顺序无所谓,三个节点都起来后,访问任意一个节点的 9200 端口,用这个 API 检查集群健康:

curl http://192.168.1.101:9200/_cluster/health?pretty

结果里的 "status" : "green" 表示所有主分片和副本都分配好了。yellow 意味着副本有未分配(单节点集群常见)。red 表示有主分片丢了,需要排查。

我建议:刚搭建完集群,先跑一下 GET /_cat/nodes?v,确认所有节点都在。我就在一个项目里犯过迷糊——配完发现有个节点没加入,一看防火墙没开 9300 端口。

2.4 核心概念与安装知识体系

下面这张 SVG 图把这一章的核心逻辑串起来了,你看着可能会更清楚:

Elasticsearch 基础与安装知识体系 核心概念 索引(Index) 分片(Shard) 副本(Replica) 单机安装 下载解压 配置 single-node 创建非 root 用户 启动并验证 集群安装 统一 cluster.name 设置 discovery.seed_hosts 指定 initial_master_nodes 检查 health 状态 核心概念决定安装选型 分片数影响索引性能 → 单机测试分片少设,生产按节点数算 副本数影响容错与写入 → 集群正式上线后动态调整 运维要点:JVM 堆大小、文件描述符、防火墙端口(9200/9300)

2.5 安装后的几个检查点

装好 ES 以后别急着丢一边。我个人习惯跑一遍下面这组快速检查,能筛掉 80% 的初期问题:

  1. curl localhost:9200/_cat/indices?v —— 看有没有索引(刚装完是空的)
  2. curl localhost:9200/_cat/health?v —— 确认集群状态
  3. 检查 logs/elasticsearch.log 里有没有 ERROR 或 WARN 级别的集群发现问题
  4. 随手建个测试索引:curl -XPUT "localhost:9200/test-index",再删掉
又一个坑: 别忘了把 ES 的数据目录和日志目录配在非系统盘(比如独立数据盘)。我维护过一个日志平台,系统盘写满后 ES 直接罢工,重启都起不来——数据目录权限也丢了。教训惨痛。

好了,核心概念和安装上手就说这么多。配置得再漂亮,不跑起来都是纸上谈兵。建议你花半小时搭个单机版,再找两台虚拟机搭个三节点集群试试,过程中遇到启动报错几乎是正常的,别急——对照日志里的关键词去排查就行。