环境搭建: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. 知识结构一览
下面这张图总结了单节点、集群、安全认证的部署逻辑,方便你对照着操作:
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出去拖慢性能。