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 里的库
- 分片:水平拆分单元,决定数据分布
- 副本:冗余备份,提高读性能和容错
下表帮你快速区分三者关系:
| 概念 | 作用 | 可修改 | 常见误区 |
|---|---|---|---|
| 索引 | 存储与检索的命名空间 | 名称不可修改 | 把索引当数据库表用(其实是库) |
| 分片 | 分散数据到多节点 | 创建后不可改主分片数 | 以为分片越多越好(浪费资源) |
| 副本 | 提供高可用与查询负载 | 随时可调整 | 副本数设太高导致写入慢 |
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 图把这一章的核心逻辑串起来了,你看着可能会更清楚:
2.5 安装后的几个检查点
装好 ES 以后别急着丢一边。我个人习惯跑一遍下面这组快速检查,能筛掉 80% 的初期问题:
curl localhost:9200/_cat/indices?v—— 看有没有索引(刚装完是空的)curl localhost:9200/_cat/health?v—— 确认集群状态- 检查
logs/elasticsearch.log里有没有ERROR或WARN级别的集群发现问题 - 随手建个测试索引:
curl -XPUT "localhost:9200/test-index",再删掉
好了,核心概念和安装上手就说这么多。配置得再漂亮,不跑起来都是纸上谈兵。建议你花半小时搭个单机版,再找两台虚拟机搭个三节点集群试试,过程中遇到启动报错几乎是正常的,别急——对照日志里的关键词去排查就行。