目录
一、日志管理方案
二、完整日志系统基本特征
三、ELK 简介
ELK组件:
1、ElasticSearch
2、Logstash
3、Kibana
可以添加的其它组件:
1、Filebeat
2、缓存/消息队列(redis、kafka、RabbitMQ等)
3、Fluentd
三、ELK 的工作原理
四、ELK部署
1、Elasticsearch部署
①关闭防火墙和安全机制
②设置Java环境
③安装elasticsearch—rpm包
④修改elasticsearch主配置文件
⑤es 性能调优参数
⑥启动elasticsearch是否成功开启
⑦查看节点信息
2、安装 Elasticsearch-head 插件
①编译安装 node
②安装 phantomjs
③安装 Elasticsearch-head 数据可视化工具
④修改 Elasticsearch 主配置文件
⑤启动 elasticsearch-head 服务
⑥通过 Elasticsearch-head 查看 Elasticsearch 信息
⑦插入索引
3、 ELK Logstash 部署(在 Nginx 节点上操作)
①关闭防火墙和安全机制
②更改主机名
③设置Java环境
④安装nginx服务
⑤安装logstash
⑥测试 Logstash
⑦定义 logstash配置文件,读取nginx日志
4、ELK Kiabana 部署 Kiabana
①安装 Kiabana
②设置 Kibana 的主配置文件
③创建索引
1、服务器数量较少时
可以直接登录到目标主机查看日志,通过rsyslog工具或编写shell、python脚本实现日志收集,并集中保存到统一的日志服务器
2、服务区数量较多时
使用ELK大型日志系统,实现日志收集、存储、检索和分析
3、容器环境
使用ELK或Loki+Granfana
收集:能够采集多种来源的日志数据
传输:能够稳定的把日志数据解析过滤并传输到存储系统
存储:存储日志数据
分析:支持UI分析
警告:能够提供错误报告,监控机制
ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。
是基于Lucene(一个全文检索引擎的架构)开发的分布式存储检索数据库引擎,用来存储各类日志,并创建索引,方便全文检索。集群化部署,节点分三种类型:master/data/client,设置相同的cluster.name并使用Zen Discovery模块通过单播实现集群中节点的服务发现。
作为数据收集引擎。它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,然后存储到用户指定的位置,一般会发送给 Elasticsearch。
Logstash 由 Ruby 语言编写,运行在 Java 虚拟机(JVM)上,是一款强大的数据处理工具, 可以实现数据传输、格式处理、格式化输出。Logstash 具有强大的插件功能,常用于日志处理。
Kibana 通常与 Elasticsearch 一起部署,Kibana 是 Elasticsearch 的一个功能强大的数据可视化 Dashboard,Kibana 提供图形化的 web 界面来浏览 Elasticsearch 日志数据,可以用来汇总、分析和搜索重要数据。
轻量级的开源日志文件数据搜集器。通常在需要采集数据的客户端安装 Filebeat,并指定目录与日志格式,Filebeat 就能快速收集数据,并发送给 logstash 进行解析,或是直接发给 Elasticsearch 存储,性能上相比运行于 JVM 上的 logstash 优势明显,是对它的替代。常应用于 EFLK 架构当中
filebeat 结合 logstash 带来好处:
1)通过 Logstash 具有基于磁盘的自适应缓冲系统,该系统将吸收传入的吞吐量,从而减轻 Elasticsearch 持续写入数据的压力
2)从其他数据源(例如数据库,S3对象存储或消息传递队列)中提取
3)将数据发送到多个目的地,例如S3,HDFS(Hadoop分布式文件系统)或写入文件
4)使用条件数据流逻辑组成更复杂的处理管道
可以对高并发日志数据进行流量削峰和缓冲,这样的缓冲可以一定程度的保护数据不丢失,还可以对整个架构进行应用解耦
是一个流行的开源数据收集器。由于 logstash 太重量级的缺点,Logstash 性能低、资源消耗比较多等问题,随后就有 Fluentd 的出现。相比较 logstash,Fluentd 更易用、资源消耗更少、性能更高,在数据处理上更高效可靠,受到企业欢迎,成为 logstash 的一种替代方案,常应用于 EFK 架构当中。在 Kubernetes 集群中也常使用 EFK 作为日志数据收集的方案。
在 Kubernetes 集群中一般是通过 DaemonSet 来运行 Fluentd,以便它在每个 Kubernetes 工作节点上都可以运行一个 Pod。 它通过获取容器日志文件、过滤和转换日志数据,然后将数据传递到 Elasticsearch 集群,在该集群中对其进行索引和存储。
(1)在所有需要收集日志的服务器上部署Logstash;或者先将日志进行集中化管理在日志服务器上,在日志服务器上部署 Logstash。
(2)Logstash 收集日志,将日志格式化并输出到 Elasticsearch 群集中。
(3)Elasticsearch 对格式化后的数据进行索引和存储。
(4)Kibana 从 ES 群集中查询数据生成图表,并进行前端数据的展示。
总结:logstash作为日志搜集器,从数据源采集数据,并对数据进行过滤,格式化处理,然后交由Elasticsearch存储,kibana对日志进行可视化处理。
systemctl disable --now firewalld
setenforce 0
tar xf jdk-8u361-linux-x64.tar.gz
mv jdk1.8.0_361/ /usr/local/
vim /etc/profile.d/java.sh
source /etc/profile.d/java.sh
java -version
上传elasticsearch-6.7.2.rpm到/opt目录下
使用命令rpm -ivh elasticsearch-6.7.2.rpm或yum localinstall elasticsearch-6.7.2.rpm进行安装
vim /etc/elasticsearch/elasticsearch.yml
scp /etc/elasticsearch/elasticsearch.yml 192.168.130.20:`pwd`
scp /etc/elasticsearch/elasticsearch.yml 192.168.130.30:`pwd`
优化最大内存大小和最大文件描述符的数量
vim /etc/security/limits.conf
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* soft memlock unlimited
* hard memlock unlimited
vim /etc/systemd/system.conf
优化elasticsearch用户拥有的内存权限
vim /etc/sysctl.conf
在ES内存设置方面,可以遵循以下原则:
1.当机器内存小于64G时,遵循通用的原则,50%给ES,50%留给操作系统,供lucene使用
2.当机器内存大于64G时,遵循原则:建议分配给ES分配 4~32G 的内存即可,其它内存留给操作系统,供lucene使用
一个进程可以拥有的最大内存映射区域数,参考数据(分配 2g/262144,4g/4194304,8g/8388608)
sysctl -p
需重启系统生效配置
reboot
systemctl enable --now elasticsearch.service
浏览器访问 http://192.168.130.10:9200 、 http://192.168.130.20:9200、 http://192.168.130.30:9200 查看节点 Node01、Node02 、Node03的信息
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。
作用:在web界面实现图形化查看es集群状态,可以在任意一个es节点安装
安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。
node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
上传软件包 node-v8.2.1.tar.gz 到/opt
yum install gcc gcc-c++ make -y
tar zxvf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure && make -j2 && make install
上传软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到/opt
cd /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-master.zip 到/opt
cd /opt
unzip elasticsearch-head-master.zip
cd /opt/elasticsearch-head/
npm install #安装依赖包
vim /etc/elasticsearch/elasticsearch.yml
在末尾添加
http.cors.enabled: true
http.cors.allow-origin: "*"
systemctl restart elasticsearch
必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败
cd /opt/elasticsearch-head-master/
npm run start &
浏览器访问 http://192.168.130.30:9100/
通过命令插入一个测试索引
命令格式:
创建索引
curl -X PUT[|POST] http://IP:9200/<索引名>[/<类型>/<文档ID>?pretty&pretty] \
[-H 'content-Type: application/json' -d '{"键名1":"键值","键名2":"键值"}']删除索引
curl -X DELETE http://IP:9200/<索引名>[,<索引名2>,....]查看索引配置
curl -X GET http://IP:9200/<索引名>/_settings修改索引配置
curl -X PUT http://IP:9200/<索引名>/_settings \
-H 'content-Type: application/json' -d '{"键名":"键值"}'创建索引别名
curl -X POST http://IP:9200/_aliases \
-H 'content-Type: application/json' -d '{"actions":[{"add":{"index":"索引名","alias":"索引别名"}}]}'删除索引别名
curl -X POST http://IP:9200/_aliases \
-H 'content-Type: application/json' -d '{"actions":[{"remove":{"index":"索引名","alias":"索引别名"}}]}'
Logstash 一般部署在需要监控其日志的服务器。在本案例中,Logstash 部署在 nginx 服务器上,用于收集 nginx 服务器的日志信息并发送到 Elasticsearch。
systemctl disable --now firewalld
setenforce 0
hostnamectl set-hostname nginx
tar xf jdk-8u361-linux-x64.tar.gz
mv jdk1.8.0_361/ /usr/local/
vim /etc/profile.d/java.sh
export JAVA_HOME=/usr/local/jdk1.8.0_361
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile.d/java.sh
java -version
yum -y install epel-release.noarch
yum -y install nginx
systemctl enable --now nginx
上传软件包 logstash-6.7.2.rpm 到/opt目录下
cd /opt
rpm -ivh logstash-6.7.2.rpm
systemctl enable --now logstash.service
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
Logstash 命令常用选项:
-f:通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流。
-e:从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当作 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)。
-t:测试配置文件是否正确,然后退出。
-w:指定filter线程数量,默认线程数是5
-l:指定日志文件名称
logstash -e 'input { stdin{} } output { stdout{} }'
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.130.10:9200"] } }'
Logstash 配置文件基本由三部分组成:input、output 以及 filter(可选,根据需要选择使用)
●input:表示从数据源采集数据,常见的数据源如Kafka、日志文件等
file beats kafka redis stdin
●filter:表示数据处理层,包括对数据进行格式化处理、数据类型转换、数据过滤等,支持正则表达式
grok 对若干个大文本字段进行再分割成一些小字段 (?<字段名>正则表达式) 字段名: 正则表达式匹配到的内容
date 对数据中的时间格式进行统一和格式化
mutate 对一些无用的字段进行剔除,或增加字段
mutiline 对多行数据进行统一编排,多行合并或拆分
●output:表示将Logstash收集的数据经由过滤器处理之后输出到Elasticsearch。
elasticsearch stdout
vim /etc/logstash/conf.d/nginx.conf
input{
file {
path => "/var/log/nginx/access.log"
type => "nginx_access"
start_position => "beginning"
sincedb_path => "/etc/logstash/sincedb_path/log_progress"
add_field => { "log_hostname" => "${HOSTNAME}" }
}
file {
path => "/var/log/nginx/error.log"
type => "nginx_error"
start_position => "beginning"
sincedb_path => "/etc/logstash/sincedb_path/log_progress"
add_field => { "log_hostname" => "${HOSTNAME}" }
}
}
#filter{}
output{
if [type] == "nginx_access" {
elasticsearch{
hosts => ["192.168.130.10:9200","192.168.130.20:9200","192.168.130.30:9200"]
index => "nginx_access-%{+yyyy.MM.dd}"
}
}
if [type] == "nginx_error" {
elasticsearch{
hosts => ["192.168.130.10:9200","192.168.130.20:9200","192.168.130.30:9200"]
index => "nginx_error-%{+yyyy.MM.dd}"
}
}
}
logstash -f nginx.conf #启动logstash
Kiabana可以安装在任一节点
上传软件包 kibana-6.7.2-x86_64.rpm 到/opt目录
cd /opt
rpm -ivh kibana-6.7.2-x86_64.rpm
vim /etc/kibana/kibana.yml
touch /var/log/kibana.log
chown kibana. /var/log/kibana.log
systemctl enable --now kibana.service
浏览器访问 http://192.168.130.30:5601