第二章:环境搭建——ES单机安装与配置、Kibana安装与配置、Head插件安装、集群模式搭建

好,咱们直接进入正题。环境搭建这块,说难不难,说简单吧,坑也不少。我当年第一次装ES的时候,光一个启动报错就折腾了半小时。后来才发现,是JDK版本没对上。嗯,咱们一步步来,把每个环节都捋清楚。

2.1 ES单机安装与配置

先说说单机版。我个人习惯,不管生产还是测试,都先跑一遍单机,验证基础功能没问题了,再考虑集群。

2.1.1 下载与解压

去官网下载对应操作系统的压缩包。我建议用tar.gz包,别用rpm或deb,因为后面调配置更方便。

# 下载(以7.17.x为例)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.10-linux-x86_64.tar.gz

# 解压
tar -zxvf elasticsearch-7.17.10-linux-x86_64.tar.gz

# 进入目录
cd elasticsearch-7.17.10/

2.1.2 核心配置

配置文件在 config/elasticsearch.yml。这里有几个关键项,我挨个说。

配置项 说明 我的建议值
cluster.name 集群名称,同一集群必须一致 my-es-cluster
node.name 节点名称,每个节点唯一 node-1
path.data 数据存储目录 /data/es/data
path.logs 日志目录 /data/es/logs
network.host 监听地址,生产环境别用0.0.0.0 192.168.1.100
http.port HTTP端口 9200
discovery.seed_hosts 集群发现节点列表 ["192.168.1.100"]
⚠️ 注意: 千万别用root用户启动ES!ES出于安全考虑,禁止root直接运行。我曾经在测试环境偷懒用root,结果启动报错“can not run elasticsearch as root”,老老实实建个普通用户吧。

2.1.3 启动与验证

# 创建专用用户
useradd esuser
chown -R esuser:esuser /data/es

# 切换用户启动
su esuser
./bin/elasticsearch -d  # -d表示后台运行

# 验证是否启动成功
curl http://localhost:9200

如果返回类似下面的JSON,说明启动成功了:

{
  "name" : "node-1",
  "cluster_name" : "my-es-cluster",
  "cluster_uuid" : "xxxx",
  "version" : {
    "number" : "7.17.10",
    "build_flavor" : "default"
  }
}
💡 小技巧: 启动后先看看日志。我习惯用 tail -f logs/elasticsearch.log 实时盯着,一旦有ERROR能立刻发现。别等出问题了再回头翻日志,那太被动了。

2.2 Kibana安装与配置

Kibana是ES的官方可视化工具。说白了,就是给你一个Web界面,不用再对着curl敲命令了。我个人觉得,Kibana的Dev Tools是调试ES查询最顺手的工具,没有之一。

2.2.1 下载与解压

注意版本号必须和ES一致。我见过有人ES装7.17,Kibana装8.x,结果连不上,折腾半天才发现版本不匹配。

wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.10-linux-x86_64.tar.gz
tar -zxvf kibana-7.17.10-linux-x86_64.tar.gz
cd kibana-7.17.10-linux-x86_64/

2.2.2 配置与启动

配置文件在 config/kibana.yml。核心就两个配置:

server.port: 5601
server.host: "0.0.0.0"          # 允许外部访问
elasticsearch.hosts: ["http://localhost:9200"]  # ES地址

启动命令:

./bin/kibana &  # 后台运行

启动后访问 http://你的IP:5601,看到Kibana界面就对了。

🔑 关键点: Kibana默认会尝试连接本地的ES。如果你的ES不在本机,记得改 elasticsearch.hosts 配置。我曾经帮一个同事排查问题,他ES在服务器A,Kibana装服务器B,结果忘了改这个配置,Kibana一直报连接拒绝。

2.3 Head插件安装

Head是一个第三方插件,用来查看ES集群状态、索引数据等。虽然现在Kibana功能很强了,但Head的简洁界面在某些场景下还是很有用的,比如快速查看分片分布。

2.3.1 安装方式

Head插件有两种安装方式:

  1. 浏览器插件方式:Chrome商店搜“Elasticsearch Head”,安装后直接访问ES地址即可。这种方式最简单,我推荐新手用。
  2. 独立部署方式:需要Node.js环境,适合需要自定义的场景。

这里说下独立部署:

# 安装Node.js(如果没装的话)
yum install -y nodejs

# 克隆Head项目
git clone https://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head

# 安装依赖
npm install

# 启动
npm run start &

启动后访问 http://localhost:9100,在连接地址栏输入你的ES地址即可。

⚠️ 跨域问题: Head插件访问ES时,可能会遇到跨域限制。需要在ES的 elasticsearch.yml 中添加:
http.cors.enabled: true
http.cors.allow-origin: "*"
然后重启ES。嗯,这个坑我踩过,当时Head一直显示连接失败,查了半天才发现是跨域没开。

2.4 集群模式搭建

单机版玩熟了,就该上集群了。集群的好处很明显:高可用、水平扩展、数据分片。我在生产环境维护过一个20节点的集群,每天处理上亿条日志,稳得很。

2.4.1 集群规划

假设我们搭建一个3节点的集群,节点信息如下:

节点名称 IP地址 角色
node-1 192.168.1.101 master + data
node-2 192.168.1.102 master + data
node-3 192.168.1.103 master + data

2.4.2 配置修改

每个节点的 elasticsearch.yml 配置如下(以node-1为例):

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

其他节点只需改 node.namenetwork.host 即可。

🔑 关键点: cluster.initial_master_nodes 这个配置只在集群首次启动时需要。它告诉ES哪些节点有资格成为主节点。一旦集群形成,这个配置就可以去掉了。我第一次搭集群时没加这个,结果三个节点互相找不到,日志里全是“master not discovered”的报错。

2.4.3 启动集群

按顺序启动每个节点:

# 在每个节点上执行
su esuser
./bin/elasticsearch -d

启动后,用以下命令检查集群状态:

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

返回结果中,status 字段如果是 green,说明集群健康;number_of_nodes 显示3,说明三个节点都加入了。

💡 小技巧: 集群启动后,用Head插件看一下分片分布。如果所有分片都在一个节点上,说明分片分配策略有问题。这时候可以手动触发分片再平衡:curl -X POST http://localhost:9200/_cluster/reroute?retry_failed=true

2.4.4 集群验证

咱们做个简单的验证:创建一个索引,写入一条数据,看看数据是否自动分片到不同节点。

# 创建索引,设置3个分片、1个副本
curl -X PUT "http://192.168.1.101:9200/test_index" -H 'Content-Type: application/json' -d'
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 1
  }
}'

# 写入一条数据
curl -X POST "http://192.168.1.101:9200/test_index/_doc" -H 'Content-Type: application/json' -d'
{
  "title": "Hello ES Cluster",
  "timestamp": "2024-01-01"
}'

# 查看分片分布
curl "http://192.168.1.101:9200/_cat/shards/test_index?v"

你会看到分片均匀分布在三个节点上,每个分片还有一个副本在另一个节点。这就是集群的魅力——单节点挂了,数据不丢,服务不停。

好了,环境搭建这块就这些。记住一个原则:先单机验证,再集群扩展。别一上来就搞集群,出了问题排查起来很头疼。下一章咱们开始玩真正的搜索功能,到时候你会觉得,前面这些搭建工作都是值得的。