2. 环境规划与准备:服务器选型建议、操作系统要求、JDK版本选择、网络与防火墙规划

在搭建ELK日志检索发布准入环境之前,必须对底层基础设施进行严谨规划。服务器选型、操作系统版本、JDK版本以及网络策略直接决定集群的稳定性、性能与运维成本。本章从生产环境视角给出可落地的配置建议。

2.1 服务器选型建议

ELK各组件对计算与存储资源的需求差异较大,建议按组件角色分别规划服务器规格。以下为基于日均日志量1TB~5TB的中型集群推荐配置:

组件 CPU(核) 内存(GB) 磁盘类型 磁盘容量(GB) 推荐实例数
Elasticsearch 数据节点 16~32 64~128 NVMe SSD 2000~4000 3~5
Elasticsearch 协调/主节点 8~16 16~32 SSD 200 3
Logstash 8~16 16~32 SSD 500 2~4
Kibana 4~8 8~16 SSD 200 1~2
Kafka(可选缓冲层) 16~32 32~64 NVMe SSD 2000~5000 3
选型要点: Elasticsearch 数据节点对内存和磁盘IO要求最高,建议使用物理机或高性能云主机(如 AWS i3 系列、阿里云 i2 系列)。Logstash 为CPU密集型,建议与ES数据节点分离部署。Kibana 对资源要求较低,可复用协调节点或独立低配实例。

2.2 操作系统要求

ELK 官方对操作系统有明确兼容性列表。生产环境推荐以下两个长期支持版本:

  • CentOS 7.9+(内核 3.10.0-1160+)—— 企业运维生态成熟,与 SELinux、systemd 集成良好。
  • Ubuntu 20.04 LTS(内核 5.4+)—— 内核较新,对 NVMe、CPU 调度优化更好,适合云原生部署。
操作系统初始化清单(CentOS 7 示例):
# 关闭防火墙与SELinux(生产环境按需配置)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

# 设置文件描述符与进程限制
cat >> /etc/security/limits.conf <> /etc/sysctl.conf

2.3 JDK版本选择

Elasticsearch 7.x ~ 8.x 官方推荐使用 OpenJDK 17(LTS),Logstash 与 Kibana 同样基于 JDK 运行。JDK 版本选择直接影响 GC 性能与安全补丁支持。

JDK 版本 ELK 兼容性 GC 特性 生产建议
OpenJDK 11 ES 7.0~7.16 官方支持 G1GC 成熟,CMS 已弃用 仅用于存量集群升级过渡
OpenJDK 17 ES 7.17+ / 8.x 官方推荐 ZGC 可启用,G1GC 默认优化 新装集群首选
避坑提示: 不要使用 Oracle JDK 8 或 OpenJDK 8,ES 7.17 之后已不再支持。不要使用 OpenJDK 18/19 等非LTS版本,ES 未做充分测试。安装后务必验证版本:java -version 应显示 openjdk version "17.0.x"。

2.4 网络与防火墙规划

ELK 集群内部组件间通信依赖多个 TCP 端口,必须提前规划网络策略。以下为默认端口清单:

组件 端口 协议 用途 防火墙策略
Elasticsearch 9200 HTTP REST API / 客户端访问 仅开放给Kibana、Logstash、应用服务器
Elasticsearch 9300 TCP 节点间传输(集群通信) 仅ES节点间互通
Kibana 5601 HTTP Web UI 访问 仅开放给运维/用户网段
Logstash 5044 TCP Beats 输入(Filebeat等) 仅开放给日志采集服务器
Logstash 9600 HTTP 监控 API 仅内网运维
iptables 规则示例(仅允许内网访问ES 9200):
# 允许Kibana服务器访问
iptables -A INPUT -p tcp --dport 9200 -s 10.0.1.100 -j ACCEPT
# 允许Logstash服务器访问
iptables -A INPUT -p tcp --dport 9200 -s 10.0.2.0/24 -j ACCEPT
# 拒绝其他来源
iptables -A INPUT -p tcp --dport 9200 -j DROP

2.5 整体环境架构图

下图展示了一个典型的中型ELK生产环境网络拓扑与组件关系:

ELK 生产环境网络拓扑与组件关系 应用服务器 Filebeat / Logstash 日志采集 Agent Kafka 集群 消息缓冲 / 削峰 3节点 Logstash 集群 数据解析 / 过滤 2~4节点 Elasticsearch 数据节点 × 3~5 协调/主节点 × 3 Kibana 可视化 / 检索 1~2节点 说明:应用日志 → Kafka 缓冲 → Logstash 解析 → Elasticsearch 存储 → Kibana 检索展示

2.6 网络隔离与安全组策略

生产环境建议采用 三层网络隔离 模型:

  1. 采集层(应用服务器、Filebeat)—— 仅能访问 Kafka 或 Logstash 的 5044 端口。
  2. 处理层(Kafka、Logstash)—— 仅能访问 Elasticsearch 的 9200 端口,且限制源 IP。
  3. 存储与展示层(Elasticsearch、Kibana)—— Kibana 5601 仅对运维人员或 VPN 网段开放,禁止公网直接暴露。
最佳实践: 如果使用云环境,优先使用安全组(Security Group)而非节点内防火墙。安全组规则按“最小权限”原则配置,例如:
允许 TCP 9200 源:10.0.2.0/24(Logstash子网)
允许 TCP 5601 源:10.0.0.0/16(内网运维)

2.7 环境准备检查清单

在进入安装步骤前,请逐项确认以下条件:

检查项 预期值 验证命令
操作系统版本 CentOS 7.9+ / Ubuntu 20.04 cat /etc/redhat-release 或 lsb_release -a
JDK 版本 OpenJDK 17.0.x java -version
文件描述符 ≥ 655360 ulimit -n
vm.max_map_count ≥ 262144 sysctl vm.max_map_count
swap 状态 关闭 swapon --show(无输出)
防火墙端口 按规划开放 iptables -L -n 或 firewall-cmd --list-all
主机名解析 /etc/hosts 包含所有节点 ping es-node-1
常见失败原因: 忽略 vm.max_map_count 设置会导致 Elasticsearch 启动报错 max virtual memory areas vm.max_map_count [65530] is too low;未关闭 swap 会导致 ES 性能剧烈抖动。请务必在安装前完成所有系统调优。