ELK 企业级日志分析系统部署与实践
ELK 企业级日志分析系统部署与实践
一、案例概述
日志分析是运维工程师定位系统故障、评估服务健康度、追溯安全事件的核心手段。日常运维场景中,日志主要分为三类:
- 系统日志:记录服务器硬件状态(如磁盘 IO、内存使用率)、操作系统进程(如 crond、sshd)运行信息,路径通常为
/var/log/messages(CentOS)或/var/log/syslog(Ubuntu); - 应用程序日志:记录业务服务运行细节,如 Apache 的访问日志(
access_log)、错误日志(error_log)、Java 应用的logs目录日志; - 安全日志:记录用户登录(
/var/log/secure)、权限变更、防火墙规则匹配等安全相关事件。
通过定期分析日志,可及时发现服务器性能瓶颈(如 CPU 持续高占用)、应用异常(如频繁 500 错误)、安全风险(如暴力破解登录)。
1.1 传统日志管理的痛点
传统运维中,日志分散存储在每台服务器本地,存在明显局限:
- 效率低下:排查跨服务器故障时,需通过
ssh逐台登录,用grep/awk/wc组合命令检索,耗时且易遗漏; - 功能薄弱:无法实现实时日志监控、多维度统计(如按 “IP + 时间” 筛选访问记录)、可视化展示(如请求量趋势图);
- 追溯困难:日志文件易被误删或覆盖(默认日志轮转策略可能导致历史日志丢失),无法长期留存与追溯。
1.2 ELK 的解决方案
开源实时日志分析平台 ELK(Elasticsearch + Logstash + Kibana)通过 “分工协作” 解决上述问题,三者核心定位如下:
| 组件 | 核心功能 | 角色定位 |
|---|---|---|
| Elasticsearch | 分布式全文搜索引擎,支持日志的索引创建、分布式存储、实时查询,基于 Lucene 开发 | “数据仓库” |
| Logstash | 日志采集与处理工具,支持多源输入、数据清洗、多目标输出,基于 JRuby 运行 | “数据搬运工 + 清洁工” |
| Kibana | 可视化分析平台,提供 Web 界面实现日志的查询、统计、图表展示、仪表盘定制 | “数据展示窗口” |
官方地址:https://www.elastic.co/products(需注意组件版本兼容性,本文采用 5.x 系列,与 Java 8 完全兼容)。
1.3 ELK 工作原理与流程
1.3.1 架构流程
【APPServer集群】→→【logstash Agent 采集器】→→【ElasticSearch Cluster】→→【Kibana Server】→→【Browser】
- 日志集中采集:通过 Logstash Agent 部署在业务服务器,监控日志文件变化(或通过 Beats 轻量采集器补充采集);
- 日志格式化处理:Logstash 通过 Filter 插件清洗日志(如提取 IP、时间戳、请求方法,过滤冗余字段);
- 索引与分布式存储:Elasticsearch 将格式化日志创建索引(按日期分片,如
system-2024.10.01),并分布式存储到集群节点; - 可视化查询与分析:Kibana 读取 Elasticsearch 索引,提供 “日志检索、趋势图表、自定义仪表盘” 功能,支持运维人员快速定位问题。
二、案例前置知识点
2.1 Elasticsearch 核心概念与细节
Elasticsearch 是 ELK 的 “数据存储与查询核心”,需理解其分布式架构相关概念,避免部署后出现性能瓶颈或数据丢失。
| 概念 | 定义与作用 | 类比关系型数据库 | 关键注意事项 |
|---|---|---|---|
| 接近实时(NRT) | 文档索引后约 1 秒可被搜索,平衡实时性与性能(写入时先存内存缓冲区,1 秒后刷盘) | - | 若需更高实时性,可手动触发刷盘(POST /_flush),但会增加 IO 压力 |
| 集群(Cluster) | 由 1 + 节点组成,共享数据并提供服务,集群名唯一(默认elasticsearch) | 数据库实例 | 生产环境需自定义集群名(如prod-elk-cluster),避免不同环境节点误加入 |
| 节点(Node) | 单台服务器,属于某一集群,通过节点名标识(默认随机生成) | 数据库服务器 | 可通过node.roles配置节点角色:主节点(master)、数据节点(data)、协调节点(coordinating) |
| 索引(Index) | 相似特征文档的集合(如 “Apache 访问日志索引”),名称必须全小写 | 数据库 | 索引名建议包含业务类型 + 时间(如apache-access-2024.10),便于生命周期管理 |
| 类型(Type) | 索引内的逻辑分类(如同一索引下分 “用户日志”“订单日志”),7.x 后废弃 | 数据表 | 5.x 版本仍支持,建议一个索引对应一个类型,避免字段冲突 |
| 文档(Document) | 可索引的最小单元,以 JSON 格式存储(如一条 Apache 访问记录) | 数据行 | 文档需包含@timestamp字段(时间戳),便于 Kibana 按时间筛选 |
| 分片(Shard) | 索引的水平拆分,每个分片是独立索引,可分布在不同节点 | 分表 | 分片数创建后不可修改,需提前规划(单分片大小建议 20-50GB,100GB 日志建议 2-5 个分片) |
| 副本(Replica) | 分片的拷贝,用于故障恢复与查询负载分担 | 数据备份 | 副本数可动态调整(如PUT /index-name/_settings {"number_of_replicas":1}),副本需部署在不同节点 |
默认配置说明:5.x 版本中,每个索引默认创建 5 个主分片 + 1 个副本,若集群有 2 个节点,总分片数为 10(5 主 + 5 副),需确保节点磁盘空间充足。
2.2 Logstash 核心组件与工作流
Logstash 的核心逻辑是 “Input → Filter → Output” 的数据流处理,三者均通过插件实现,需掌握常用插件配置。
2.2.1 核心组件
| 组件 | 功能描述 | 部署位置 |
|---|---|---|
| Shipper | 日志采集端,监控本地日志文件(如/var/log/messages),发送日志到 Indexer | 业务服务器(如 Apache 主机) |
| Indexer | 日志处理端,接收 Shipper 数据,通过 Filter 清洗后写入存储(如 ES) | 中心服务器(可选独立部署) |
| Broker | 中间缓冲层,对接多 Shipper 与多 Indexer,避免日志丢失(如 Redis/Kafka) | 高并发场景必备 |
| Search and Storage | 日志查询与本地存储(如 Elasticsearch、文件),5.x 后通常直接对接 ES | 与 Indexer 同节点 |
| Web Interface | 基于 Kibana 的 Logstash 监控界面(需安装logstash-kibana插件) | Kibana 同节点 |
2.2.2 常用插件示例(补充原文档未展开内容)
-
Input 插件:除stdin(标准输入)、file(文件)外,常用beats对接 Filebeat)、redis(从 Redis 读取日志);
示例(对接 Filebeat):
input {beats {port => 5044 # Filebeat数据发送端口} } -
Filter 插件
补充 3 个核心插件:
1.grok提取非结构化日志为结构化字段(如 Apache 访问日志);示例(提取 Apache 访问日志字段):
filter {if [type] == "access" {grok {match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:response_size}" }}date { # 将日志时间字段解析为ES的@timestampmatch => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"}mutate { # 删除冗余字段remove_field => ["ident", "auth"]}} }2.date`:统一日志时间格式,避免 ES 使用 “采集时间” 替代 “日志实际时间”;
3.
mutate:修改字段(如重命名、删除、类型转换); -
Output 插件:除
stdout(标准输出)、elasticsearch外,常用file(本地存储)、kafka(缓冲到 Kafka)。
2.3 Kibana 核心功能与使用技巧
Kibana 是 ELK 的 “前端门面”,需掌握索引管理、日志查询、可视化定制的实操细节,补充原文档未覆盖的高级功能。
2.3.1 核心功能扩展
-
索引模式管理:创建索引模式后,可设置 “默认时间字段”(如
@timestamp)、隐藏冗余字段(如message中的冗余内容); -
Discover 查询
:支持 Lucene 查询语法,示例:
- 全文搜索:
error(查询包含 “error” 的所有日志); - 字段过滤:
status_code:500(查询 HTTP 500 错误日志); - 时间范围:选择 “Last 1h”(查询近 1 小时日志);
- 全文搜索:
-
Visualize 图表:除原文档提到的类型外,补充 “数据表格”(展示 TOP 10 访问 IP)、“热力图”(展示时段请求分布);
-
Dashboard 权限控制:通过 Kibana 的 “Roles” 功能,为不同用户分配仪表盘查看 / 编辑权限(如开发人员仅能查看应用日志仪表盘)。
三、案例环境与部署步骤(完全保留原文档核心,补充细节)
3.1 环境规划(原文档配置完全保留)
| 主机角色 | 操作系统 | 主机名 | IP 地址 | 核心软件 | 硬件建议(补充) |
|---|---|---|---|---|---|
| ES 主节点 / Kibana | CentOS 7.4 | node1 | 192.168.100.41 | Elasticsearch 5.5.0、Kibana 5.5.1 | 4 核 8G+、SSD 100G+ |
| ES 从节点 | CentOS 7.4 | node2 | 192.168.100.42 | Elasticsearch 5.5.0 | 4 核 8G+、SSD 100G+ |
| 日志采集端 | CentOS 7.4 | apache | 192.168.100.43 | Logstash 5.5.1、Apache httpd | 2 核 4G、HDD 50G+ |
3.1.1 前置环境准备(补充原文档未提及的系统配置)
所有节点需执行以下操作,避免部署中出现权限、内存问题:
-
关闭防火墙与 SELinux(原文档命令保留,补充验证):
# 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 关闭SELinux(临时+永久) setenforce 0 && sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 验证:SELinux状态为disabled getenforce # 输出Disabled -
配置 Java 环境
(原文档保留,补充版本校验):
# 安装Java 8(若未安装) yum install java-1.8.0-openjdk-devel -y # 验证:需为1.8.0_xxx版本 java -version # 输出openjdk version "1.8.0_181"及以上 -
调整系统参数
(补充 ES 必备配置,避免内存、文件句柄不足):
# 编辑limits.conf,增加ES用户资源限制 cat >> /etc/security/limits.conf << EOF elasticsearch soft nofile 65536 elasticsearch hard nofile 65536 elasticsearch soft nproc 4096 elasticsearch hard nproc 4096 EOF # 编辑sysctl.conf,调整虚拟内存 cat >> /etc/sysctl.conf << EOF vm.max_map_count=262144 EOF # 生效配置 sysctl -p
3.2 部署 Elasticsearch 集群(原步骤保留,补充校验与问题排查)
3.2.1 节点 1(node1:192.168.100.41)配置
-
修改主机名与域名解析(原命令保留,补充验证):
hostnamectl set-hostname node1 cat >> /etc/hosts << EOF 192.168.100.41 node1 192.168.100.42 node2 EOF # 验证:ping node2可通 ping node2 -c 2 -
安装 Elasticsearch RPM 包(原命令保留,补充下载方式):
# 若未上传RPM包,可通过官方源下载(补充) rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch cat >> /etc/yum.repos.d/elasticsearch.repo << EOF [elasticsearch-5.x] name=Elasticsearch repository for 5.x packages baseurl=https://artifacts.elastic.co/packages/5.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md EOF # 安装 yum install elasticsearch-5.5.0 -y -
修改 Elasticsearch 主配置文件(原配置保留,补充注释说明):
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak vim /etc/elasticsearch/elasticsearch.yml关键配置(带补充说明):
cluster.name: my-elk-cluster # 集群名,所有节点必须一致 node.name: node1 # 节点名,每个节点唯一 node.master: true # 允许该节点成为主节点(补充原文档缺失) node.data: true # 允许该节点存储数据(补充原文档缺失) path.data: /data/elk_data # 数据存储路径,需独立磁盘挂载(生产建议) path.logs: /var/log/elasticsearch/ # 日志路径 bootstrap.memory_lock: false # 生产环境建议设为true(锁定内存,避免swap),需配合系统参数调整 network.host: 0.0.0.0 # 绑定所有IP,允许外部访问 http.port: 9200 # HTTP端口(ES API与Head插件访问) transport.tcp.port: 9300 # 节点间通信端口(补充原文档缺失) discovery.zen.ping.unicast.hosts: ["node1:9300", "node2:9300"] # 单播发现,指定通信端口 discovery.zen.minimum_master_nodes: 2 # 脑裂防护(补充原文档缺失,公式:(主节点数/2)+1) -
创建数据目录并授权(原命令保留,补充磁盘检查):
# 检查/data目录是否挂载独立磁盘(补充) df -h | grep /data # 确认有独立挂载 mkdir -p /data/elk_data chown -R elasticsearch:elasticsearch /data/elk_data/ # 递归授权,避免子目录权限不足 -
启动服务并验证(原命令保留,补充多维度校验):
systemctl daemon-reload systemctl enable elasticsearch.service && systemctl start elasticsearch.service # 验证1:查看服务状态(active为正常) systemctl status elasticsearch.service # 验证2:查看端口监听(9200和9300均需监听) netstat -antp | grep java # ES基于Java运行,进程名为java # 验证3:通过API查看节点信息(补充) curl http://192.168.100.41:9200 # 预期输出:包含"name":"node1"、"cluster_name":"my-elk-cluster"
3.2.2 节点 2(node2:192.168.100.42)配置
步骤与 node1 完全一致,仅需修改elasticsearch.yml中的node.name: node2,其余配置(集群名、数据路径、发现地址等)完全相同。
关键验证:启动后执行curl http://192.168.100.41:9200/_cat/nodes?v,输出应包含 2 个节点(node1、node2),且master列中 node1 或 node2 有*标识(主节点)。
3.2.3 集群健康状态检查(原步骤保留,补充状态含义)
-
查看集群健康:
curl http://192.168.100.41:9200/_cluster/health?pretty状态说明(补充):
green:所有主分片 + 副本分片均正常;yellow:主分片正常,副本分片异常(如仅 1 个节点,副本无法分配);red:主分片异常,数据不可用(需紧急排查,查看日志/var/log/elasticsearch/my-elk-cluster.log)。
-
查看分片分布(补充原文档缺失):
curl http://192.168.100.41:9200/_cat/shards?v可查看每个索引的主分片(
p)、副本分片(r)分布在哪个节点。
3.3 安装 Elasticsearch-Head 插件(原步骤保留,补充替代方案与问题排查)
Elasticsearch-Head 是 ES 集群可视化工具,原文档采用源码编译安装,补充 “Chrome 插件” 替代方案(更便捷),同时保留原步骤。
3.3.1 方案 1:源码编译安装(原步骤保留,补充优化)
-
安装依赖环境(原命令保留,补充 Node.js 快速安装方式):
yum install gcc gcc-c++ make -y # 补充:源码编译耗时久,生产环境建议用yum安装Node.js(需先安装EPEL源) yum install epel-release -y yum install nodejs -y node -v # 输出v6.17.1及以上即可(兼容Head插件) -
安装 PhantomJS(原命令保留,补充缺失依赖):
cd /usr/local/src tar xjvf phantomjs-2.1.1-linux-x86_64.tar.bz2 cp phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin # 补充:若执行phantomjs报错“libfontconfig.so.1缺失”,安装依赖 yum install fontconfig -y phantomjs -v # 输出2.1.1即正常 -
安装并启动 Head 插件(原命令保留,补充后台运行优化):
cd /usr/local/src tar xzvf elasticsearch-head.tar.gz cd elasticsearch-head npm install --registry=https://registry.npm.taobao.org # 用淘宝源加速安装(补充) # 补充:修改Head默认端口(若9100被占用) vim Gruntfile.js # 找到port: 9100,修改为其他端口(如9101) # 后台启动(补充:用nohup确保断开SSH后仍运行) nohup npm run start & # 验证:查看进程 ps -ef | grep grunt
3.3.2 方案 2:Chrome 浏览器插件(补充便捷方案)
- 打开 Chrome 浏览器,进入 “应用商店” 搜索 “Elasticsearch Head”;
- 安装后点击插件图标,输入
http://192.168.100.41:9200,点击 “连接” 即可(无需配置跨域,适合个人运维)。
3.3.3 常见问题排查(补充)
- Head 无法连接 ES:
- 检查 ES 跨域配置(
http.cors.enabled: true和http.cors.allow-origin: "*"); - 检查 ES 服务是否正常(
systemctl status elasticsearch); - 检查节点间网络(
telnet 192.168.100.41 9200,确保端口可通)。
- 检查 ES 跨域配置(
3.4 部署 Logstash(原步骤保留,补充配置优化与验证)
3.4.1 安装 Logstash(原步骤保留,补充源安装方式)
# 补充:通过官方源安装(无需手动上传RPM)
cat >> /etc/yum.repos.d/logstash.repo << EOF
[logstash-5.x]
name=Logstash repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install logstash-5.5.1 -y
systemctl enable logstash.service && systemctl start logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
3.4.2 Logstash 功能测试(原步骤保留,补充输出解读)
-
标准输入→标准输出(原命令保留,补充输出含义):
logstash -e 'input { stdin{} } output { stdout{} }' # 输入“test log”,预期输出: # 2024-10-01T08:00:00.000Z apache test log # 格式:[时间戳] [主机名] [输入内容] -
标准输入→Elasticsearch 输出(原命令保留,补充 ES 索引验证):
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.100.41:9200"] } }' # 输入“es test”后,通过Head插件查看: # 索引列表会新增“logstash-2024.10.01”(默认按日期命名)
3.4.3 配置 Logstash 采集日志(原配置保留,补充生产优化)
-
采集系统日志(/var/log/messages)(原配置保留,补充 sincedb 说明):
vim /etc/logstash/conf.d/system.conf配置补充说明:
input {file {path => "/var/log/messages"type => "system"start_position => "beginning" # 首次采集从文件开头开始,后续从上次结束位置(sincedb记录)sincedb_path => "/dev/null" # 禁用sincedb(每次重启都从开头采集),生产环境建议保留默认(/var/lib/logstash/plugins/inputs/file/.sincedb_xxx)sincedb_write_interval => 15 # sincedb写入间隔(秒),补充优化} } output {elasticsearch {hosts => ["192.168.100.41:9200"]index => "system-%{+YYYY.MM.dd}" # 按日期拆分索引,便于后续清理document_type => "system_log" # 文档类型,补充原文档缺失} }启动与验证(补充配置校验):
chmod o+r /var/log/messages # 补充:校验配置文件语法(避免启动失败) logstash -f /etc/logstash/conf.d/system.conf -t # 预期输出“Configuration OK” systemctl restart logstash.service # 验证:通过Head插件查看“system-2024.10.01”索引是否有数据 -
采集 Apache 日志(原配置保留,补充 Filter 优化):
vim /etc/logstash/conf.d/apache_log.conf补充 Filter 配置(结构化日志):
input {file {path => "/etc/httpd/logs/access_log"type => "access"start_position => "beginning"sincedb_path => "/dev/null"}file {path => "/etc/httpd/logs/error_log"type => "error"start_position => "beginning"sincedb_path => "/dev/null"} } # 补充Filter:结构化Apache访问日志 filter {if [type] == "access" {grok {match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:response_size}" }}date {match => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"}mutate {remove_field => ["ident", "auth", "log_time"] # 删除无用字段}} } output {if [type] == "access" {elasticsearch {hosts => ["192.168.100.41:9200"]index => "apache_access-%{+YYYY.MM.dd}"}}if [type] == "error" {elasticsearch {hosts => ["192.168.100.41:9200"]index => "apache_error-%{+YYYY.MM.dd}"}} }启动与验证(补充日志生成):
# 生成测试日志(访问Apache) curl http://192.168.100.43 # 查看Logstash日志,确认无错误 tail -f /var/log/logstash/logstash-plain.log # 通过Head插件查看“apache_access-2024.10.01”索引的结构化字段(如client_ip、status_code)
3.5 部署 Kibana(原步骤保留,补充高级配置与使用)
3.5.1 安装 Kibana(原步骤保留,补充源安装)
# 补充:通过官方源安装
cat >> /etc/yum.repos.d/kibana.repo << EOF
[kibana-5.x]
name=Kibana repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install kibana-5.5.1 -y
3.5.2 配置 Kibana(原配置保留,补充优化)
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
vim /etc/kibana/kibana.yml
补充配置(优化访问与性能):
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.url: "http://192.168.100.41:9200"
kibana.index: ".kibana" # Kibana配置存储索引,需确保ES可写入
elasticsearch.pingTimeout: 1500 # ES连接超时时间(毫秒),补充
elasticsearch.requestTimeout: 30000 # ES请求超时时间(毫秒),补充
server.maxPayloadBytes: 10485760 # 最大请求 payload 大小(10MB),补充
3.5.3 启动与访问(原步骤保留,补充权限控制)
systemctl enable kibana.service && systemctl start kibana.service
# 补充:若需限制Kibana访问IP,配置防火墙(示例允许192.168.100.0/24网段)
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" port protocol="tcp" port="5601" accept' --permanent
firewall-cmd --reload
浏览器访问http://192.168.100.41:5601,首次登录需创建索引模式:
- 点击 “Management”→“Index Patterns”→“Create index pattern”;
- 输入 “system-*”,点击 “Next step”;
- 选择 “@timestamp” 作为默认时间字段,点击 “Create index pattern”;
- 重复上述步骤,创建 “apache_access-” 和 “apache_error-” 索引模式。
3.5.4 Kibana 高级使用(补充原文档缺失)
- Discover 日志查询:
- 选择 “apache_access-*” 索引模式,在搜索框输入 “status_code:404”,可查询所有 404 错误日志;
- 点击字段列表中的 “client_ip”,选择 “Add”,可在结果中显示客户端 IP。
- Visualize 图表制作(示例:Apache 访问量趋势):
- 点击 “Visualize”→“Create a visualization”→“Line chart”;
- 选择 “apache_access-*” 索引模式;
- X 轴选择 “Date Histogram”,字段选择 “@timestamp”,间隔设为 “1h”;
- Y 轴选择 “Count”(默认),点击 “Apply changes”,生成近 24 小时访问量趋势图。
- Dashboard 仪表盘定制:
- 点击 “Dashboard”→“Create a dashboard”;
- 点击 “Add”,选择已创建的 “访问量趋势图”“TOP 10 客户端 IP 表格”;
- 调整图表位置与大小,点击 “Save”,命名为 “Apache 运维仪表盘”;
- 补充:点击 “Share” 可生成链接,或导出为 PDF(需安装插件)。
四、生产环境补充优化(原文档基础上扩展)
4.1 Elasticsearch 优化(补充细节)
-
内存优化:
-
修改/etc/elasticsearch/jvm.options,堆内存设为物理内存的 50%(不超过 32GB):
-Xms8g # 初始堆内存(若服务器为16GB内存) -Xmx8g # 最大堆内存(与初始值一致,避免频繁扩容) -
启用内存锁定bootstrap.memory_lock: true,需确保/etc/security/limits.conf
中elasticsearch用户的memlock限制为unlimited
echo "elasticsearch soft memlock unlimited" >> /etc/security/limits.conf echo "elasticsearch hard memlock unlimited" >> /etc/security/limits.conf
-
-
磁盘与 IO 优化:
-
数据目录
path.data挂载 SSD 硬盘,IOPS 建议≥1000; -
关闭磁盘缓存(
bootstrap.system_call_filter: false),避免系统缓存与 ES 缓存冲突; -
定期清理过期索引(如保留 30 天),可通过 Cron+ES API 实现:
# 清理30天前的system索引(添加到crontab,每天凌晨执行) echo 'curl -XDELETE "http://192.168.100.41:9200/system-$(date -d "30 days ago" +%Y.%m.%d)"' >> /etc/cron.d/elk_clean
-
-
集群扩展:
- 当日志量增长时,新增数据节点(配置
node.master: false,仅作为数据存储); - 启用 ES 索引生命周期管理(ILM,5.x 需安装插件),自动实现 “热→温→冷” 数据分层存储。
- 当日志量增长时,新增数据节点(配置
4.2 Logstash 优化(补充高并发场景)
-
引入缓冲层(Redis/Kafka):
当业务服务器数量>50 台时,直接用 Logstash Shipper 对接 ES 易导致 ES 压力过大,需引入 Redis 作为缓冲:
-
Logstash Shipper 输出到 Redis:
output {redis {host => "192.168.100.44" # Redis节点IPport => 6379data_type => "list"key => "logstash:apache" # 队列键名} } -
中心 Logstash 从 Redis 读取日志并输出到 ES:
input {redis {host => "192.168.100.44"port => 6379data_type => "list"key => "logstash:apache"threads => 5 # 多线程读取,提升效率} }
-
-
多管道配置:
不同类型日志(如系统日志、Apache 日志)独立处理,避免单管道阻塞:
# 创建管道配置目录 mkdir /etc/logstash/pipelines # 编辑管道配置文件 vim /etc/logstash/pipelines.yml配置内容:
- pipeline.id: systempath.config: "/etc/logstash/conf.d/system.conf"pipeline.workers: 2 # 工作线程数(建议等于CPU核心数) - pipeline.id: apachepath.config: "/etc/logstash/conf.d/apache_log.conf"pipeline.workers: 2
4.3 Kibana 优化(补充监控与权限)
-
启用 Kibana 监控:
安装
x-pack插件(5.x 版本需手动安装),监控 Kibana 运行状态:/usr/share/kibana/bin/kibana-plugin install x-pack systemctl restart kibana.service访问
http://192.168.100.41:5601/app/monitoring,可查看 Kibana 响应时间、请求量。 -
权限控制:
通过
x-pack实现用户权限管理(如 “运维组” 可编辑仪表盘,“开发组” 仅可查看):- 点击 “Management”→“Users”→“Create User”;
- 设置用户名(如 “dev_user”)、密码,角色选择 “read_only”;
- 关联索引模式(如仅允许访问 “apache_access-*”)。
4.4 Beats 集成(补充轻量采集方案)
原文档提到 Beats 但未展开,补充 Filebeat(轻量日志采集器)的部署,替代 Logstash Shipper(资源占用更低,适合海量服务器)。
4.4.1 在 Apache 主机(192.168.100.43)安装 Filebeat
# 安装Filebeat
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
cat >> /etc/yum.repos.d/elastic.repo << EOF
[elastic-5.x]
name=Elastic repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF
yum install filebeat-5.5.1 -y
4.4.2 配置 Filebeat 采集 Apache 日志
vim /etc/filebeat/filebeat.yml
关键配置:
filebeat.prospectors:
- input_type: logpaths:- /etc/httpd/logs/access_log # Apache访问日志路径document_type: access # 日志类型,与Logstash对应
- input_type: logpaths:- /etc/httpd/logs/error_log # Apache错误日志路径document_type: erroroutput.logstash:hosts: ["192.168.100.43:5044"] # Logstash Beats输入端口
4.4.3 配置 Logstash 接收 Filebeat 数据
vim /etc/logstash/conf.d/filebeat.conf
配置内容:
input {beats {port => 5044 # 与Filebeat输出端口一致}
}
filter {# 同3.4.3中的Apache Filter配置,结构化日志if [type] == "access" {grok {match => { "message" => "%{IPORHOST:client_ip} %{USER:ident} %{USER:auth} \[%{HTTPDATE:log_time}\] \"%{WORD:method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_version}\" %{NUMBER:status_code} %{NUMBER:response_size}" }}date {match => ["log_time", "dd/MMM/yyyy:HH:mm:ss Z"]target => "@timestamp"}}
}
output {if [type] == "access" {elasticsearch { hosts => ["192.168.100.41:9200"]; index => "apache_access-%{+YYYY.MM.dd}" }}if [type] == "error" {elasticsearch { hosts => ["192.168.100.41:9200"]; index => "apache_error-%{+YYYY.MM.dd}" }}
}
启动与验证:
systemctl start filebeat && systemctl enable filebeat
systemctl restart logstash.service
# 通过Head插件查看索引数据,确认Filebeat日志正常采集
五、常见问题排查(补充原文档缺失场景)
5.1 Elasticsearch 问题
-
ES 服务启动失败,日志提示 “max virtual memory areas vm.max_map_count [65530] is too low”:
解决:执行
sysctl -w vm.max_map_count=262144,并写入/etc/sysctl.conf永久生效。 -
集群脑裂(出现多个主节点):
解决:确保
discovery.zen.minimum_master_nodes配置正确(公式:(主节点数 / 2)+1),重启异常节点。 -
索引分片无法分配(状态为 unassigned):
查看原因:
curl http://192.168.100.41:9200/_cluster/allocation/explain?pretty;常见原因:节点磁盘空间不足(需清理磁盘,确保使用率<85%)、副本数超过节点数(减少副本数)。
5.2 Logstash 问题
-
Logstash 启动失败,日志提示 “Permission denied”:
解决:检查日志文件权限(如
/var/log/messages需 Logstash 用户可读),执行chmod o+r /var/log/messages。 -
Logstash 到 ES 的连接超时:
解决:1. 检查 ES 服务是否正常;2. 检查网络(
telnet 192.168.100.41 9200);3. 增加 ES 连接超时配置(elasticsearch { hosts => ["xxx"]; timeout => 30 })。 -
日志采集重复:
解决:1. 禁用 sincedb(
sincedb_path => "/dev/null")仅用于测试,生产环境需保留默认;2. 确保日志文件不会被重复写入(如避免日志轮转后文件名重复)。
5.3 Kibana 问题
-
Kibana 页面提示 “Elasticsearch is down”:
解决:1. 检查
elasticsearch.url配置是否正确;2. 检查 ES 是否正常运行(curl http://192.168.100.41:9200);3. 检查 Kibana 日志(/var/log/kibana/kibana.log)。 -
Discover 页面无日志数据:
解决:1. 确认索引模式的 “默认时间字段” 正确(如
@timestamp);2. 调整时间范围(如选择 “Last 24h”);3. 检查 ES 索引是否有数据(通过 Head 插件)。 -
Kibana 页面加载慢:
解决:1. 启用 Kibana 缓存(
server.cache.enabled: true);2. 优化 ES 查询(如减少返回字段、增加索引分片)。
六、附录:常用命令汇总(补充便捷参考)
6.1 Elasticsearch 命令
| 功能 | 命令 |
|---|---|
| 查看集群节点 | curl http://192.168.100.41:9200/_cat/nodes?v |
| 查看集群健康 | curl http://192.168.100.41:9200/_cluster/health?pretty |
| 查看索引列表 | curl http://192.168.100.41:9200/_cat/indices?v |
| 删除索引 | curl -XDELETE http://192.168.100.41:9200/index-name |
| 查看文档 | curl http://192.168.100.41:9200/index-name/type-name/doc-id?pretty |
6.2 Logstash 命令
| 功能 | 命令 |
|---|---|
| 校验配置文件 | logstash -f /etc/logstash/conf.d/xxx.conf -t |
| 前台启动(查看日志) | logstash -f /etc/logstash/conf.d/xxx.conf |
| 后台启动 | nohup logstash -f /etc/logstash/conf.d/xxx.conf & |
| 查看 Logstash 日志 | tail -f /var/log/logstash/logstash-plain.log |
6.3 Kibana 命令
| 功能 | 命令 |
|---|---|
| 查看 Kibana 状态 | systemctl status kibana.service |
| 重启 Kibana | systemctl restart kibana.service |
| 查看 Kibana 日志 | tail -f /var/log/kibana/kibana.log |
| 安装插件 | /usr/share/kibana/bin/kibana-plugin install 插件名 |
七、总结
本文基于原文档的核心部署步骤,补充了生产环境必备的系统配置、性能优化、问题排查、高级功能(如 Beats 集成、权限控制),确保从 “部署成功” 到 “稳定运行” 的全流程覆盖。ELK 的核心价值在于 “日志集中化、结构化、可视化”,实际应用中需根据业务规模(服务器数量、日志量)调整架构(如小规模用 “ELK”,大规模用 “Filebeat+Kafka+ELK”),并定期维护(索引清理、性能监控),最终实现运维效率的提升与故障的快速定位。
如需进一步深入,可参考官方文档:
- Elasticsearch 5.5 文档:https://www.elastic.co/guide/en/elasticsearch/reference/5.5/index.html
- Logstash 5.5 文档:https://www.elastic.co/guide/en/logstash/5.5/index.html
- Kibana 5.5 文档:https://www.elastic.co/guide/en/kibana/5.5/index.html
