环境搭建:Linux上部署Elasticsearch单节点与集群,配置安全认证(X-Pack)

这一章,咱们正式进入实操环节。

我个人习惯是先搭一个单节点环境快速验证,再扩展到集群。你想想看,如果单节点都跑不起来,集群更别谈。我之前有个项目,刚接手时同事直接上了三节点集群,结果发现配置参数全是默认的,数据都写不进……排查两天,最后发现只是单节点时没开安全认证的坑。所以,别急,一步步来。

1. 单节点部署——先说最简模式

说白了,单节点就是一台机器上跑一个Elasticsearch进程。部署前确保装了JDK 17+(ES 8.x起强制依赖JDK 17)。我用的是OpenJDK,没有版权问题。

核心步骤:下载→解压→修改配置→启动→验证。

具体命令如下(以Elasticsearch 8.6.0为例):

# 下载(国内可以用华为镜像加速)
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.0-linux-x86_64.tar.gz
tar -zxvf elasticsearch-8.6.0-linux-x86_64.tar.gz
cd elasticsearch-8.6.0/

# 修改配置文件 config/elasticsearch.yml
echo "cluster.name: audit-logs" >> config/elasticsearch.yml
echo "node.name: node-1" >> config/elasticsearch.yml
echo "path.data: /var/lib/elasticsearch" >> config/elasticsearch.yml
echo "path.logs: /var/log/elasticsearch" >> config/elasticsearch.yml
echo "network.host: 0.0.0.0" >> config/elasticsearch.yml
echo "http.port: 9200" >> config/elasticsearch.yml

# 创建数据和日志目录(确保属主是elasticsearch用户)
mkdir -p /var/lib/elasticsearch /var/log/elasticsearch
chown -R elasticsearch:elasticsearch /var/lib/elasticsearch /var/log/elasticsearch

# 切换到普通用户运行(ES禁止用root启动)
useradd elasticsearch
su - elasticsearch -c "/path/to/elasticsearch/bin/elasticsearch -d -p pid"

启动后,用 curl http://localhost:9200 查看返回信息。正常会看到类似:

{
  "name" : "node-1",
  "cluster_name" : "audit-logs",
  "cluster_uuid" : "xxxx",
  "version" : { ... },
  "tagline" : "You Know, for Search"
}

嗯,单节点就这么跑起来了。但我建议你立马做一件事:修改JVM堆大小,默认只有1GB,对于审计日志存储来说很快就不够。我在config/jvm.options里改成:

-Xms4g
-Xmx4g

堆大小不要超过物理内存的50%,且不要超过32GB——这是ES官方的硬性建议,超过32GB会切换成压缩指针模式,性能反而下降。

小技巧:单节点模式下,建议把discovery.type: single-node放进yml文件中,这样不用考虑选举和脑裂问题,启动更稳。

2. 集群部署——从单节点到多节点

咱们的审计日志系统一旦接入上百台机器,单节点扛不住的。这时候必须上集群。其实集群部署和单节点大同小异,关键是节点角色分配和节点发现配置。

我个人习惯用三个节点:两个主节点(master-eligible)和一个数据节点(data)。有时需要加协调节点(client)做负载均衡。看业务规模吧。

集群配置核心参数如下表:

参数 说明 示例值
cluster.name 集群名称,所有节点必须相同 audit-logs
node.name 节点唯一标识 node-master-1
node.master 是否具备主节点资格 true
node.data 是否存储数据 true
discovery.seed_hosts 节点发现种子IP列表 ["10.0.0.1", "10.0.0.2", "10.0.0.3"]
cluster.initial_master_nodes 初始主节点提名(首次启动用) ["node-master-1", "node-master-2"]

举个例子,第一个主节点的yml配置:

cluster.name: audit-logs
node.name: node-master-1
node.master: true
node.data: false   # 专用主节点不存数据
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.1
http.port: 9200
discovery.seed_hosts: ["10.0.0.2", "10.0.0.3"]
cluster.initial_master_nodes: ["node-master-1", "node-master-2"]

第二个主节点类似的,只改node.name和network.host。数据节点则设置node.master: false和node.data: true。

启动顺序:先启动所有列在cluster.initial_master_nodes中的主节点,再启动数据节点。我第一次搭集群时顺序搞反了,结果数据节点一直报无法发现主节点——折腾了好久才发现。

注意:生产环境至少要3个主节点候选者,防止脑裂。ES 8.x默认使用Quorum机制,过半数存活才能选主。如果你只有2个主节点,挂1个整个集群就不可用了——我就是踩过这个坑。

3. X-Pack安全认证——给集群加把锁

审计日志数据属于敏感信息,不设安全认证等于裸奔。X-Pack从ES 7.x起就内置了,8.x更是默认开启安全功能。但我们手动配置一下,做到心里有数。

核心步骤:

  • 在elasticsearch.yml中启用xpack安全:xpack.security.enabled: true
  • 设置内置用户密码:运行bin/elasticsearch-setup-passwords auto(自动生成密码)或interactive(手动输入)
  • 如果是集群,建议先在一台节点上执行密码设置,然后把config/下的安全相关文件同步到其他节点。
  • 传输层安全(TLS)可选,但生产环境强烈建议开启:配置证书和节点间加密通信

密码设置命令示例:

# 自动生成密码(会输出到终端,请立刻记下来)
bin/elasticsearch-setup-passwords auto

# 手动交互设置(推荐,方便管理)
bin/elasticsearch-setup-passwords interactive

设置完成后,用curl访问需要加-u参数:

curl -u elastic:your_password http://localhost:9200/_cat/indices?v

如果你像我一样喜欢用Kibana,记得在Kibana的kibana.yml里也配置elasticsearch.username和elasticsearch.password,不然连不上。

踩坑经验:我曾经在生产环境开启了xpack.security后,忘记为kibana_system用户设置密码,导致Kibana一直报“Authentication required”。记住,elasticsearch-setup-passwords会为elastic、kibana_system、logstash_system等内置用户生成密码,一个都不能少。

如果要开启节点间TLS加密通信,需要生成证书:

bin/elasticsearch-certutil ca -pem -out /etc/elasticsearch/certs/ca.pem
bin/elasticsearch-certutil cert --ca /etc/elasticsearch/certs/ca.pem -pem --out /etc/elasticsearch/certs/node.pem

然后每个节点yml中加上:

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: /etc/elasticsearch/certs/node.pem
xpack.security.transport.ssl.truststore.path: /etc/elasticsearch/certs/ca.pem

小技巧:如果你在开发环境或者内网测试环境,可以暂时不配TLS,只开密码认证。但审计日志系统最终要上生产,我建议一开始就配好TLS,切换成本更小。

4. 知识结构一览

下面这张图总结了单节点、集群、安全认证的部署逻辑,方便你对照着操作:

Elasticsearch 部署架构与安全认证流程 单节点 node.name: node-1 discovery.type: single-node path.data / path.logs 集群(audit-logs) 主节点1 master: true data: false 主节点2 master: true data: false 数据节点 master: false data: true X-Pack 安全认证配置 启用安全 xpack.security.enabled: true 设置内置用户密码 elasticsearch-setup-passwords TLS加密通信(可选) elasticsearch-certutil 单节点适合开发验证;集群至少3主节点保证高可用 安全认证是审计日志系统的第一道防线,务必开启

5. 验证与后续建议

部署完别急着走,先跑几个检查命令:

  • curl http://localhost:9200/_cluster/health?pretty 查看集群状态,期望返回 green 或 yellow(yellow表示有未分配副本,在单节点时正常)
  • curl -u elastic:pass http://localhost:9200/_cat/nodes?v 查看节点列表
  • 尝试写入一条测试文档,确认安全认证生效

避免翻车的点:

  • 如果使用systemctl管理服务,记得把ES_PATH_CONF环境变量设对,否则默认加载/etc/elasticsearch/下的配置而不是你自定义的目录。
  • 防火墙规则:开放9200(HTTP API)和9300(集群通信)端口,不然节点之间握手失败。
  • 内存锁定:生产环境建议bootstrap.memory_lock: true防止ES被swap出去拖慢性能。