文章目录
- [ELK 企业级日志分析系统](#ELK 企业级日志分析系统)
- ELK部署指南
-
- 环境准备(在Node1、Node2节点上操作)
- [部署 Elasticsearch 软件(在Node1、Node2节点上操作)](#部署 Elasticsearch 软件(在Node1、Node2节点上操作))
- [安装 Elasticsearch-head 插件(在Node1、Node2节点上操作)](#安装 Elasticsearch-head 插件(在Node1、Node2节点上操作))
- [ELK Stack Logstash 部署(在 Apache 节点上操作)](#ELK Stack Logstash 部署(在 Apache 节点上操作))
-
- [1. 更改主机名](#1. 更改主机名)
- [2. 安装 Apache 服务](#2. 安装 Apache 服务)
- [3. 安装 Java 环境](#3. 安装 Java 环境)
- [4. 安装 Logstash](#4. 安装 Logstash)
- [5. 测试 Logstash](#5. 测试 Logstash)
- [6. 定义 Logstash 配置文件](#6. 定义 Logstash 配置文件)
-
- [示例配置文件 `system.conf`](#示例配置文件
system.conf
) - 常用参数说明
- 创建必要的目录和文件
- [启动 Logstash](#启动 Logstash)
- 查看索引信息
- 清理锁文件
- [示例配置文件 `system.conf`](#示例配置文件
- [ELK Stack Kibana 部署(在 Node1 节点上操作)](#ELK Stack Kibana 部署(在 Node1 节点上操作))
-
- [1. 安装 Kibana](#1. 安装 Kibana)
- [2. 设置 Kibana 的主配置文件](#2. 设置 Kibana 的主配置文件)
- [3. 创建日志文件,启动 Kibana 服务](#3. 创建日志文件,启动 Kibana 服务)
- [4. 验证 Kibana](#4. 验证 Kibana)
- [5. 将 Apache 服务器的日志添加到 Elasticsearch 并通过 Kibana 显示](#5. 将 Apache 服务器的日志添加到 Elasticsearch 并通过 Kibana 显示)
- [Filebeat + ELK Stack 部署](#Filebeat + ELK Stack 部署)
-
- [在 Node1 节点上操作](#在 Node1 节点上操作)
ELK 企业级日志分析系统
日志主要包括系统日志 、应用程序日志 和安全日志 。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。
往往单台机器的日志我们使用grep、awk等工具就能基本实现简单分析,但是当日志被分散存储在不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。就很繁琐、效率低下。当务之急我们使用集中化的日志管理,例如:开源的rsyslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。
一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
ELK平台是一套完整的日志集中处理解决方案,它将ElasticSearch、Logstash和Kibana三个开源工具配合使用,以满足用户对日志的查询、排序、统计等强大需求。
完整日志系统基本特征:
- 收集:能够采集多种来源的日志数据
- 传输:能够稳定的把日志数据解析过滤并传输到存储系统
- 存储:存储日志数据
- 分析:支持 UI 分析
- 警告:能够提供错误报告,监控机制
ELK的组成及功能
-
Elasticsearch
- 简介:Elasticsearch是一个基于Lucene的分布式搜索和分析引擎,它提供了搜集、分析、存储数据三大功能。它是用Java开发的,并可通过RESTful Web接口与用户进行通信。
- 特点 :
- 分布式:Elasticsearch可以扩展到上百台服务器,处理PB级别的数据。
- 实时性:提供近乎实时的搜索和分析能力。
- 高性能:通过分布式索引和分片技术,实现高效的搜索和查询。
- 可扩展性:支持动态扩展,增加或减少节点以应对不同的负载需求。
- 多用途:不仅限于日志分析,还可以用于网站搜索、大数据分析等多种场景。
-
Logstash
- 简介:Logstash是ELK的中央数据流引擎,它主要负责从各种数据源采集数据,对数据进行过滤、分析、丰富和转换,然后输出到指定的目的地(如Elasticsearch)。
- 特点 :
- 动态数据源:支持从多种数据源(如文件、数据库、消息队列等)采集数据。
- 强大插件功能:具有丰富的插件库,支持各种数据处理和转换操作。
- 数据管道模型:采用数据管道模型,将数据的采集、处理、输出过程抽象为输入、过滤器和输出三个阶段。
- 性能优化:支持批量处理和缓存机制,以提高数据处理效率和稳定性。
-
Kibana
- 简介:Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在Elasticsearch指标中的日志数据。
- 特点 :
- 数据可视化:提供丰富的数据可视化工具,如图表、表格、地图等,帮助用户直观地理解数据。
- 动态仪表板:支持创建动态仪表板,实时显示Elasticsearch查询的变化。
- 简单易用:具有简单的、基于浏览器的界面,用户可以快速上手并进行数据分析。
- 高级数据分析:支持执行高级数据分析操作,如聚合、排序、筛选等。
工作原理:
- 在所有需要收集日志的服务器上部署Logstash(或替代方案如Filebeat)。
- Logstash收集日志,对数据进行过滤、分析和格式化处理。
- 处理后的日志数据被发送到Elasticsearch进行索引和存储。
- 用户通过Kibana的图形界面查询、分析和可视化存储在Elasticsearch中的日志数据。
扩展组件及功能
-
Filebeat
- 简介:Filebeat是一个轻量级的日志文件数据搜集器,通常安装在需要采集数据的客户端上。它能够快速收集指定目录和格式的日志文件,并将其发送到Logstash或Elasticsearch进行进一步处理。
- 优势:相比Logstash,Filebeat在资源消耗和性能上具有明显优势。它占用较少的内存和CPU资源,能够高效地处理高并发日志数据。
- 应用场景:常应用于ELFK(ELK+Filebeat)架构中,作为Logstash的替代方案,以减轻资源消耗并提高性能。
-
缓存/消息队列(Redis、Kafka、RabbitMQ等)
- 简介:缓存/消息队列组件用于对高并发日志数据进行流量削峰和缓冲。它们能够保护数据不丢失,并对整个架构进行应用解耦。
- 功能 :
- 流量削峰:在高并发场景下,缓存/消息队列能够吸收并存储大量的日志数据,从而减轻后端处理系统的压力。
- 数据缓冲:在数据生成和处理之间存在时间差时,缓存/消息队列能够存储临时数据,确保数据的完整性和一致性。
- 应用解耦:通过引入缓存/消息队列,可以将日志数据的生成、处理和存储等过程进行解耦,提高系统的灵活性和可扩展性。
- 应用场景:在大型分布式系统中,缓存/消息队列组件常用于构建高可用性和可扩展性的日志处理架构。
-
Fluentd
- 简介:Fluentd是一个流行的开源数据收集器,用于从各种数据源收集数据并发送到指定的目的地。相比Logstash,Fluentd更加轻量级、易用和资源消耗更少。
- 优势:Fluentd支持多种数据源和目的地,具有丰富的插件和灵活的配置选项。它使用Go语言编写,具有较高的性能和可靠性。
- 应用场景:常应用于EFK(Elasticsearch+Fluentd+Kibana)架构中,特别是在Kubernetes集群中进行数据统一收集时,Fluentd是一个受欢迎的选择。
ELK的工作原理
- 数据收集:Logstash作为数据收集引擎,从各种数据源(如日志文件、数据库等)采集数据。
- 数据处理:Logstash对采集到的数据进行过滤、分析、丰富和转换等操作,以满足后续存储和分析的需求。
- 数据存储:处理后的数据被存储到Elasticsearch中,Elasticsearch会对数据进行索引和存储,以便进行高效的搜索和查询。
- 数据分析和可视化:用户通过Kibana的图形化界面,对存储在Elasticsearch中的数据进行搜索、分析和可视化操作。Kibana提供了丰富的数据可视化工具,帮助用户直观地理解数据并做出决策。
ELK的应用场景
ELK主要用于部署在企业架构中,收集多台设备上多个服务的日志信息,并将其统一整合后提供给用户。虽然ELK在日志分析领域具有广泛应用,但它不仅仅适用于日志分析,还可以支持其他任何数据分析和收集的场景。例如:
- 日志分析:收集、分析并可视化系统日志、应用程序日志和安全日志等,帮助系统运维和开发人员了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。
- 监控和报警:通过与Kibana等工具结合,提供数据的可视化和实时监控功能,及时发现并处理潜在问题。
- 数据可视化:利用Kibana的图形化界面,将存储在Elasticsearch中的数据以图表、表格等形式展示出来,帮助用户直观地理解数据并做出决策。
- 商业智能(BI):支持复杂数据查询和分析,帮助企业从数据中获取洞察并优化业务决策。
ELK部署指南
环境准备(在Node1、Node2节点上操作)
-
关闭防火墙和SELinux
bashsystemctl stop firewalld setenforce 0
-
设置Java环境
-
检查Java版本
bashjava -version
-
如果没有安装Java,使用以下命令安装:
bashyum -y install java-1.8.0-openjdk*
-
部署 Elasticsearch 软件(在Node1、Node2节点上操作)
-
安装 Elasticsearch RPM 包
-
上传
elasticsearch-6.7.2.rpm
到/opt
目录 -
安装 RPM 包
bashcd /opt rpm -ivh elasticsearch-6.7.2.rpm
-
-
修改 Elasticsearch 主配置文件
-
备份原配置文件
bashcp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
-
编辑配置文件
bashvim /etc/elasticsearch/elasticsearch.yml
-
修改以下配置项:
yamlcluster.name: my-elk-cluster node.name: node1 # Node2节点为node2 node.master: true node.data: true path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 discovery.zen.ping.unicast.hosts: ["192.168.80.10:9300", "192.168.80.11:9300"]
-
-
ES 性能调优参数
-
修改
/etc/security/limits.conf
bash* soft nofile 65536 * hard nofile 65536 * soft nproc 32000 * hard nproc 32000 * soft memlock unlimited * hard memlock unlimited
-
修改
/etc/systemd/system.conf
bashDefaultLimitNOFILE=65536 DefaultLimitNPROC=32000 DefaultLimitMEMLOCK=infinity
-
修改
/etc/sysctl.conf
bashvm.max_map_count=262144
-
使配置生效
bashsysctl -p
-
-
启动 Elasticsearch
-
启动服务
bashsystemctl start elasticsearch.service
-
设置开机自启
bashsystemctl enable elasticsearch.service
-
检查端口是否监听
bashnetstat -antp | grep 9200
-
-
查看节点信息
- 浏览器访问
http://192.168.80.10:9200
和http://192.168.80.11:9200
查看节点信息。 - 浏览器访问
http://192.168.80.10:9200/_cluster/health?pretty
和http://192.168.80.11:9200/_cluster/health?pretty
查看集群健康状态。 - 浏览器访问
http://192.168.80.10:9200/_cluster/state?pretty
检查集群状态信息。
- 浏览器访问
安装 Elasticsearch-head 插件(在Node1、Node2节点上操作)
Elasticsearch 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,使用 npm 工具(NodeJS 的包管理工具)进行安装。安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。
依赖软件安装
-
编译安装 Node.js
-
上传
node-v8.2.1.tar.gz
到/opt
-
安装编译依赖
bashyum install gcc gcc-c++ make -y
-
解压并编译安装
bashcd /opt tar zxvf node-v8.2.1.tar.gz cd node-v8.2.1/ ./configure make && make install
-
-
安装 PhantomJS
-
上传
phantomjs-2.1.1-linux-x86_64.tar.bz2
到/opt
-
解压并复制到系统路径
bashcd /opt tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 cd /opt/phantomjs-2.1.1-linux-x86_64/bin cp phantomjs /usr/local/bin
-
安装 Elasticsearch-head 数据可视化工具
-
上传并解压 Elasticsearch-head
-
上传
elasticsearch-head-master.zip
到/opt
-
解压并安装依赖包
bashcd /opt unzip elasticsearch-head-master.zip cd /opt/elasticsearch-head/ npm install
-
-
修改 Elasticsearch 主配置文件
-
编辑
/etc/elasticsearch/elasticsearch.yml
bashvim /etc/elasticsearch/elasticsearch.yml
-
添加以下内容以开启跨域访问支持
yamlhttp.cors.enabled: true http.cors.allow-origin: "*"
-
重启 Elasticsearch 服务
bashsystemctl restart elasticsearch
-
-
启动 Elasticsearch-head 服务
-
在解压后的
elasticsearch-head
目录下启动服务bashcd /opt/elasticsearch-head/ npm run start &
-
检查服务是否启动成功
bashnetstat -natp | grep 9100
-
使用 Elasticsearch-head 查看 Elasticsearch 信息
- 通过浏览器访问
http://192.168.80.10:9100/
地址并连接群集。 - 如果看到群集健康值为 green 绿色,代表群集很健康。
Elasticsearch 索引管理
Elasticsearch 提供了一系列的 RESTful API 来管理索引,包括创建、查看、修改、删除索引以及管理索引别名等操作。
创建索引
-
使用
PUT
请求创建一个名为index-demo
的索引。bashcurl -XPUT localhost:9200/index-demo
查看索引
-
使用
GET
请求查看index-demo
索引的设置信息。bashcurl -XGET localhost:9200/index-demo/_settings
修改索引
-
使用
PUT
请求修改index-demo
索引的设置,例如设置副本数量为 2。bashcurl -XPUT localhost:9200/index-demo/_settings \ -H "Content-Type: application/json" \ -d '{"number_of_replicas": 2}'
创建索引别名
-
使用
POST
请求创建一个名为user_info_alicas
的别名,指向index-demo
索引。bashcurl -XPOST localhost:9200/_aliases \ -H "Content-Type: application/json" \ -d '{"actions":[{"add":{"index":"index-demo","alias":"user_info_alicas"}}]}'
删除索引别名
-
使用
POST
请求删除index-demo
索引上的user_info_alicas
别名。bashcurl -XPOST localhost:9200/_aliases \ -H "Content-Type: application/json" \ -d '{"actions":[{"remove":{"index":"index-demo","alias":"user_info_alicas"}}]}'
删除索引
-
使用
DELETE
请求删除单个索引index-demo
。bashcurl -XDELETE localhost:9200/index-demo
-
使用
DELETE
请求删除多个索引,例如index-demo
和index-demo2
。bashcurl -XDELETE localhost:9200/index-demo,index-demo2
ELK Stack Logstash 部署(在 Apache 节点上操作)
Logstash 是 ELK Stack 中负责数据采集和处理的组件。在本案例中,Logstash 部署在 Apache 服务器上,用于收集 Apache 服务器的日志信息并发送到 Elasticsearch。
1. 更改主机名
bash
hostnamectl set-hostname apache
2. 安装 Apache 服务
bash
yum -y install httpd
systemctl start httpd
3. 安装 Java 环境
bash
yum -y install java-1.8.0-openjdk*
java -version
4. 安装 Logstash
-
上传
logstash-6.7.2.rpm
到/opt
目录 -
安装 Logstash
bashcd /opt rpm -ivh logstash-6.7.2.rpm systemctl start logstash.service systemctl enable logstash.service ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
5. 测试 Logstash
-
使用命令行测试 Logstash 的基本功能
bashlogstash -e 'input { stdin{} } output { stdout{} }' logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
-
使用 Logstash 将信息写入 Elasticsearch
bashlogstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.80.10:9200"] } }'
6. 定义 Logstash 配置文件
Logstash 配置文件主要由三部分组成:input
、output
和 filter
(可选)。
- Input:数据源,如文件、Kafka、Redis 等。
- Filter:数据处理层,包括格式化、类型转换、过滤等。
- Output:数据输出目标,如 Elasticsearch、stdout 等。
示例配置文件 system.conf
yaml
input {
file{
path => "/var/log/messages"
type => "system"
start_position => "beginning"
sincedb_path => "/etc/logstash/sincedb_path/log_progress"
add_field => {"log_hostname"=>"${HOSTNAME}"}
}
}
output {
elasticsearch {
hosts => ["192.168.80.10:9200","192.168.80.11:9200"]
index => "system-%{+yyyy.MM.dd}"
}
}
常用参数说明
path
:日志文件路径,支持通配符。type
:Event 的 type 字段。start_position
:读取文件的位置,beginning
或end
。ignore_older
:监控文件的时长。sincedb_path
:记录文件读取进度的路径。add_field
:添加自定义字段。
创建必要的目录和文件
bash
mkdir /etc/logstash/sincedb_path/
touch /etc/logstash/sincedb_path/log_progress
chown logstash:logstash /etc/logstash/sincedb_path/log_progress
启动 Logstash
bash
logstash -f system.conf
查看索引信息
浏览器访问 http://192.168.80.10:9100/
查看索引信息。
清理锁文件
bash
rm -f /var/lib/logstash/.lock
ELK Stack Kibana 部署(在 Node1 节点上操作)
Kibana 是 ELK Stack 中的可视化工具,用于展示和分析 Elasticsearch 中的数据。在本案例中,Kibana 部署在 Node1 节点上。
1. 安装 Kibana
-
上传
kibana-6.7.2-x86_64.rpm
到/opt
目录 -
安装 Kibana
bashcd /opt rpm -ivh kibana-6.7.2-x86_64.rpm
2. 设置 Kibana 的主配置文件
-
编辑
/etc/kibana/kibana.yml
bashvim /etc/kibana/kibana.yml
-
修改以下配置项:
yamlserver.port: 5601 server.host: "0.0.0.0" elasticsearch.hosts: ["http://192.168.80.10:9200","http://192.168.80.11:9200"] kibana.index: ".kibana" logging.dest: /var/log/kibana.log i18n.locale: "zh-CN"
3. 创建日志文件,启动 Kibana 服务
-
创建日志文件并设置权限
bashtouch /var/log/kibana.log chown kibana:kibana /var/log/kivana.log
-
启动 Kibana 服务
bashsystemctl start kibana.service systemctl enable kibana.service
-
检查端口监听情况
bashnetstat -natp | grep 5601
4. 验证 Kibana
- 浏览器访问
http://192.168.80.10:5601
- 第一次登录需要添加一个 Elasticsearch 索引:
- Management -> Index Pattern -> Create index pattern
- 输入索引名
system-*
并创建
- 单击 "Discover" 按钮可查看图表信息及日志信息。
5. 将 Apache 服务器的日志添加到 Elasticsearch 并通过 Kibana 显示
-
编辑
/etc/logstash/conf.d/apache_log.conf
bashvim /etc/logstash/conf.d/apache_log.conf
-
添加以下配置:
yamlinput { file{ path => "/etc/httpd/logs/access_log" type => "access" start_position => "beginning" } file{ path => "/etc/httpd/logs/error_log" type => "error" start_position => "beginning" } } output { if [type] == "access" { elasticsearch { hosts => ["192.168.80.10:9200","192.168.80.11:9200"] index => "apache_access-%{+yyyy.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["192.168.80.10:9200","192.168.80.11:9200"] index => "apache_error-%{+yyyy.MM.dd}" } } }
-
启动 Logstash
bashcd /etc/logstash/conf.d/ /usr/share/logstash/bin/logstash -f apache_log.conf
-
浏览器访问
http://192.168.80.10:9100
查看索引是否创建。 -
浏览器访问
http://192.168.80.10:5601
登录 Kibana,添加apache_access-*
和apache_error-*
索引,并查看相应的图表及日志信息。
Filebeat + ELK Stack 部署
Filebeat 是一个轻量级的日志收集器,用于将日志文件发送到 Logstash 或 Elasticsearch。在本案例中,Filebeat 部署在独立的 Filebeat 节点上,并将日志发送到 Logstash 进行处理,最终存储在 Elasticsearch 中并通过 Kibana 进行可视化。
在 Node1 节点上操作
-
安装 Filebeat
-
上传
filebeat-6.7.2-linux-x86_64.tar.gz
到/opt
目录 -
解压并移动到指定目录
bashtar zxvf filebeat-6.7.2-linux-x86_64.tar.gz mv filebeat-6.7.2-linux-x86_64/ /usr/local/filebeat
-
-
设置 Filebeat 的主配置文件
-
编辑
/usr/local/filebeat/filebeat.yml
bashcd /usr/local/filebeat vim filebeat.yml
-
配置文件内容如下:
yamlfilebeat.inputs: - type: log enabled: true paths: - /var/log/nginx/access.log - /var/log/*.log tags: ["filebeat"] fields: service_name: nginx log_type: access from: 192.168.80.13
-
注释掉 Elasticsearch 输出配置,启用 Logstash 输出配置
yamloutput.logstash: hosts: ["192.168.80.12:5044"]
-
-
启动 Filebeat
-
后台运行 Filebeat
bashnohup ./filebeat -e -c filebeat.yml > filebeat.out &
-
-
在 Logstash 组件所在节点上新建一个 Logstash 配置文件
-
编辑
/etc/logstash/conf.d/filebeat.conf
bashcd /etc/logstash/conf.d vim filebeat.conf
-
配置文件内容如下:
yamlinput { beats { port => "5044" } } filter { grok { match => ["message", "(?<remote_addr>%{IPV6}|%{IPV4})[\s\-]+\[(?<logTime>.*)\]\s+\"(?<method>\S+)\s+(?<url_path>/.*) (?<http_ver>.+)\"\s+(?<rev_code>\d+) \d+ \"(?<req_addr>.*/?)\" \"(?<UserAgents>.*)\" \"(?<other_info>.*)\""] } } output { elasticsearch { hosts => ["192.168.80.10:9200","192.168.80.11:9200"] index => "%{[fields][service_name]}-%{+yyyy.MM.dd}" } stdout { codec => rubydebug } }
-
启动 Logstash
bashlogstash -f filebeat.conf
-
-
验证 Kibana
- 浏览器访问
http://192.168.80.10:5601
登录 Kibana - 添加索引
filebeat-*
- 单击 "Discover" 按钮可查看图表信息及日志信息。
- 浏览器访问