目录
(3)删除系统自带openjdk并安装jdk1.8.0_201
Ⅱ、node1、node2节点部署elasticsearch
Ⅲ、node1、node2节点安装elasticsearch-head插件
(3)安装elasticsearch-head数据可视化工具
Ⅵ、apache节点服务器的日志添加到 ES 并通过 Kibana 显示
一、ELK
ELK 是一整套解决方案,是三个软件产品的首字母缩写: Elasticsearch,Logstash 和 Kibana。这三款软件都是开源软件,通常是配合使用, 而且又先后归于 Elastic.co 公司名下,故被简称为 ELK 协议栈。
Ⅰ、部署jdk
(1)环境
三台centos7(jdk1.8.0_201),软件安装包
node1: 192.168.116.22 (elasticsearch、kibana[node、phantomjs])
node2: 192.168.116.23 (elasticsearch)
apache:192.168.116.120 (logstash、apache)
(2)关闭防火墙,配置时间同步
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
ntpdate ntp.aliyun.com
(3)删除系统自带openjdk并安装jdk1.8.0_201
rpm -qa | grep java
#查看系统自带的openjdk
rpm -evh --nodeps ***
#进行删除
rpm -ivh jdk-8u201-linux-x64.rpm
#安装jdk1.8.0_201的rpm包
vim /etc/profile.d/java.sh
#配置环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
#1.输出定义java的工作目录
#2.输出指定java所需的类文件
#3.输出重新定义环境变量,$PATH一定要放在$JAVA_HOME的后面,让系统先读取到工作目录中的版本信息
source /etc/profile.d/java.sh
#读取profile
java -version
#查看jdk版本
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
Ⅱ、node1、node2节点部署elasticsearch
(1)安装elasticsearch
rpm -ivh elasticsearch-5.5.0.rpm
#安装elasticsearch
systemctl daemon-reload && systemctl enable elasticsearch.service
#加载系统服务
(2)修改主配置文件
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
#备份配置文件
vim /etc/elasticsearch/elasticsearch.yml
#17行,取消注释,指定群集名称
cluster.name: my-elk-cluster
#23行,取消注释,指定节点名称
node.name: node1
#33行,取消注释,指定数据存放路径
path.data: /data/elk_data
#37行,取消注释,指定日志存放路径
path.logs: /var/log/elasticsearch/
#43行,取消注释,不在启动的时候锁定内存(前端缓存,与IOPS-性能测试方式,每秒读写次数相关)
bootstrap.memory_lock: false
#55行,取消注释,设置监听地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
#59行,取消注释,ES服务的默认监听端口为9200
http.port: 9200
#68行,取消注释,集群发现通过单播实现,指定要发现的节点node1、node2
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
---wq
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-elk-cluster
node.name: node1
path.data: /data/elk_data
path.logs: /var/log/elasticsearch/
bootstrap.memory_lock: false
network.host: 0.0.0.0
http.port: 9200
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
#------------------此处省略部分内容-----------------
将node1的elasticsearch配置文件复制给node2,修改node.name为node2即可。
mkdir -p /data/elk_data
#创建数据存放路径
chown elasticsearch:elasticsearch /data/elk_data/
#授权给elasticsearch用户
(3)启动elasticsearch
systemctl start elasticsearch.service
netstat -natp | grep 9200 #启动较慢,需等待
tcp6 0 0 :::9200 :::* LISTEN 1478/java
查看节点信息
浏览器访问
http://192.168.116.22:9200
http://192.168.116.23:9200
查看节点 node1、node2 的信息
浏览器访问
http://192.168.116.22:9200/_cluster/health?pretty
http://192.168.116.23:9200/_cluster/health?pretty
查看群集的健康情况,可以看到status值为green(绿色),表示节点健康运行
Ⅲ、node1、node2节点安装elasticsearch-head插件
ES 在 5.0 版本后,插件需要作为独立服务进行安装,需要使用 npm 工具(NodeJS 的包管理工具)安装。安装 Elasticsarch-head 需要提前安装好依赖软件 node 和 phantomjs。
(1)编译安装node
node是一个基于 Chrome V8 引擎的 JavaScript 运行环境。
phantomjs是一个基于 webkit 的 JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
yum install -y gcc gcc-c++ make
tar zxvf node-v8.2.1.tar.gz -C/opt
cd /opt/node-v8.2.1/
./configure
make -j 4 && make install
(2)安装phantomjs
mkdir /usr/local/elk/
tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C/usr/local/elk/
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin
(3)安装elasticsearch-head数据可视化工具
tar zxvf elasticsearch-head.tar.gz -C /usr/local/elk/
cd /usr/local/src/elasticsearch-head/
npm install
(4)启动elasticsearch-head 服务
vim /etc/elasticsearch/elasticsearch.yml
##末行添加以下内容
http.cors.enabled: true ##开启跨域访问支持,默认为false
http.cors.allow-origin: "*" ##指定跨域访问允许的域名地址为所有
systemctl restart elasticsearch.service
netstat -antp | grep 9200
node1:
node2:
cd /usr/local/elk/elasticsearch-head/
npm run start &
[1] 71012
> [email protected] start /usr/local/src/elasticsearch-head
> grunt server
Running "connect:server" (connect) task
Waiting forever...
Started connect web server on http://localhost:9100
^C
netstat -natp | grep 9100
tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 71022/grunt
node1:
node2:
通过 Elasticsearch-head 查看 ES 信息
通过浏览器访问 http://192.168.161.11:9100 地址并连接群集
(5)创建索引
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-
Type: application/json' -d '{"user":"zhangsan","mesg":"hello world"}'
浏览器查看索引;索引默认被分片为 5 个,并且有一个副本。
点击数据浏览,查看 创建的索引的信息
Ⅳ、apache节点部署logstash
(1)部署httpd、jdk
yum install -y httpd
systemctl enable --now httpd
rpm -qa | grep java
#查看系统自带的openjdk
rpm -evh --nodeps ***
#进行删除
rpm -ivh jdk-8u201-linux-x64.rpm
#安装jdk1.8.0_201的rpm包
vim /etc/profile.d/java.sh
#配置环境变量
export JAVA_HOME=/usr/java/jdk1.8.0_201-amd64
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
#1.输出定义java的工作目录
#2.输出指定java所需的类文件
#3.输出重新定义环境变量,$PATH一定要放在$JAVA_HOME的后面,让系统先读取到工作目录中的版本信息
source /etc/profile.d/java.sh
#读取profile
java -version
#查看jdk版本
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
(2)安装logstash
rpm -ivh logstash-5.5.1.rpm
systemctl enable logstash.service --now
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
常用选项
-f 通过这个选项可以指定 Logstash 的配置文件,根据配置文件配置 Logstash 的输入和输出流
-e 从命令行中获取,输入、输出后面跟着字符串,该字符串可以被当做 Logstash 的配置(如果是空,则默认使用 stdin 作为输入,stdout 作为输出)
-t 测试配置文件是否正确,然后退出
(3)定义输入和输出流
输入采用标准输入,输出采用标准输出
logstash -e 'input { stdin{} } output { stdout{} }'
···
2022-07-10T11:08:49.072Z apache
www.baidu.com #键入内容(标准输入)
2022-10-11T11:08:56.746Z apache www.baidu.com
2022-07-10T11:09:00.236Z apache
www.google.com #输入结果(标准输出)
2022-10-11T11:09:13.719Z apache www.google.com
rubydebug 输出详细格式显示,codec 为一种编解码器
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
....
The stdin plugin is now waiting for input:
19:11:17.849 [Api Webserver] INFO logstash.agent - Successfully started Logstash API endpoint {:port=>9600}
....
www.google.com
#stdin
{
"@version" => "1",
"message" => "www.google.com",
"@timestamp" => 2022-10-11T06:37:43.442372938Z,
"host" => {
"hostname" => "bak25"
},
"event" => {
"original" => "www.google.com"
}
}
#output
使用 logstash 将标准输入写入到 ES 中
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>
["192.168.116.22:9200"] } }'
(4)定义logstash配置文件
例如,修改 logstash 配置文件,让其收集系统日志 /var/log/messages,并将其输出到 elasticsearch 中
chmod o+r /var/log/messages
#赋予读的权限,让 Logstash 可以获取到该文件的内容
vim /etc/logstash/conf.d/system.conf
##该文件需自行创建,文件名可自定义
input {
file{
path =>"/var/log/messages"
#指定要收集的日志的位置
type =>"system"
#自定义日志类型标识
start_position =>"beginning"
#表示从开始处收集
}
}
output {
elasticsearch{
#输出到ES
hosts =>["192.168.161.11:9200", "192.168.161.12:9200"]
#指定ES服务器的地址和端口,为避免单机故障,建议写全
index =>"system-%{+YYYY.MM.dd}"
#指定输出到ES的索引格式
}
}
systemctl restart logstash.service
Ⅴ、node1节点部署kibana
(1)安装kibana的rpm包,并修改配置文件
cp /etc/kibana/kibana.yml /etc/kibana/kibana.yml.bak
#备份配置文件
vim /etc/kibana/kibana.yml
#2行,取消注释,kibana服务的默认监听端口为5601
server.port: 5601
#7行,取消注释,设置kibana的监听地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
#21行,取消注释,设置和ES建立连接的地址和端口
elasticsearch.url: "http://192.168.116.22:9200"
#30行,取消注释,设置在ES中添加.kibana索引
kibana.index: ".kibana"
(2)开启、验证kibana
systemctl enable --now kibana
netstat -natp | grep 5601
浏览器访问 http://192.168.116.22:5601
第一次登录需要添加一个 ES 索引,点击 create 创建,索引添加完成后,点击 Discover 按钮可查看图表信息及日志信息
Ⅵ、apache节点服务器的日志添加到 ES 并通过 Kibana 显示
vim /etc/logstash/conf.d/apache_log.conf
input {
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.116.22:9200", "192.168.116.23:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.116.22:9200", "192.168.116.23:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
cd /etc/logstash/conf.d
/usr/share/logstash/bin/logstash -f apache_log.conf
······
19:50:19.909 [[main]-pipeline-manager] INFO logstash.outputs.elasticsearch - Using mapping template from {:path=>nil}
确保apache开启可以提供服务,在elasticsearch上查看索引是否创建
在kibana上创建索引
点击创建
在discover查看
二、ELFK
由于 logstash 会大量占用系统的内存资源,一般我们会使用 filebeat 替换 logstash 收集日志的功能,组成 ELFK 架构;或用 fluentd 替代 logstash 组成 EFK(elasticsearch/fluentd/kibana),由于 fluentd 是由 Go 语言开发的,一般在 K8s 环境中使用较多
Download Filebeat • Lightweight Log Analysis | Elastic
Ⅰ、Filebeat工作流程
filebeat 将日志收集后交由 logstash 处理
logstash 进行过滤、格式化等操作,满足过滤条件的数据将发送给 ES
ES 对数据进行分片存储,并提供索引功能
Kibana 对数据进行图形化的 web 展示,并提供索引接口
在以上原有ELK系统中添加一个filebeat节点
环境
192.168.116.23 elasticsearch/logstash/mysql-slave (原node2)
192.168.116.22 elasticsearch/kibana/mysql-slave (原node1)
192.168.116.120 nigin/filebeat (原apache)
Ⅱ、下载安装Filebeat
关闭防火墙以及防护,下载安装Filebeat
systemctl disable --now firewalld
setenforce 0
(1)filebeat模块
查看、开启支持模块
#查看支持模块
filebeat modules list
#开启支持模块
filebeat modules enable system nginx mysql
查看支持模块
开启成功
(2)修改Filebeat主配置文件
#rpm方式安装
vim /etc/filebeat/filebeat.yml
#tar.gz方式安装
vim /安装目录/filebeat.yml
#配置文件来自Filebeat版本6.2.4
filebeat.prospectors:
#21行,指定log类型,从日志文件中读取消息
- type: log
#24行,开启日志收集功能,默认为false
enabled: true
#28行,指定监控的日志文件
paths:
- /usr/local/nginx/logs/access.log
- /usr/local/nginx/logs/erro.log
#31行,添加以下内容,注意格式
fields:
service_name: nginxlog
log_type: log
service_id: 192.168.116.120
#-------------------------- Elasticsearch output ------------------------------
该区域内容全部注释
#----------------------------- Logstash output --------------------------------
#157行,取消注释
output.logstash:
#159行,取消注释,指定logstash的IP和端口号
hosts: ["192.168.116.120:5044"]
Ⅲ、在logstash节点配置.conf文件
cd /etc/logstash/conf.d
vim logstash.conf
input {
beats {
port => "5044"
}
}
output {
elasticsearch {
hosts => ["192.168.116.22:9200", "192.168.116.23:9200"]
index => "%{[fields][service_name]}-%{+YYYY.MM.dd}"
}
stdout {
codec => rubydebug
}
}
Ⅳ、Filebeat节点启动Filebeat
确保logstash节点已开启,否则filebeat无法连接上logstash
#tar.gz方式安装
cd /安装目录/
./filebeat -e -c filebeat.yml
#启动filebeat,-e记录到stderr并禁用syslog /文件输出,-c指定配置文件
#rpm包方式安装
/usr/bin/filebeat -e -c /etc/filebeat/filebeat.yml
Ⅴ、查看索引
查看索引是否存在
*这里图文无关,应该是配置的nginxlog
在kibana上的logstash索引
三、搭建ELFK+Kafka+zookeeper
环境
192.168.116.22 elasticsearch
192.168.116.23 elasticsearch
192.168.116.25 logstash
192.168.116.26 kafka+zookeeper/nginx/filebeat
192.168.116.111 kafka+zookeeper
192.168.116.120 kafka+zookeeper
Ⅰ、数据流向
第一层、数据采集层
数据采集层位于最左边的业务服务器集群上,在每个业务服务器上面安装了filebeat 做日志收集,然后把采集到的原始日志发送到 Kafka+zookeeper 集群上。
第二层、消息队列层
原始日志发送到 Kafka+zookeeper 集群上后,会进行集中存储,此时,filbeat 是消息的生产者,存储的消息可以随时被消费。
第三层、数据分析层
Logstash 作为消费者,会去 Kafka+zookeeper 集群节点实时拉取原始日志,然后将获取到的原始日志根据规则进行分析、清洗、过滤,最后将清洗好的日志转发至 Elasticsearch 集群。
第四层、数据持久化存储
Elasticsearch 集群在接收到 logstash 发送过来的数据后,执行写磁盘,建索引库等操作,最后将结构化的数据存储到 Elasticsearch 集群上。
第五层、数据查询、展示层
Kibana 是一个可视化的数据展示平台,当有数据检索请求时,它从 Elasticsearch集群上读取数据,然后进行可视化出图和多维度分析
Ⅱ、搭建Kafka+Zookeeper并创建主题
创建nginx主题
kafka-topic.sh --create --bootstrap-server ljp26:9092,ljp111:9092,ljp120:9092
--partitions 3 --replication-factor 3 --topic nginx
topic信息
Ⅲ、filebeat节点配置
vim /etc/filebeat/filebeat.yml
# ============================== Filebeat inputs ===============================
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/access.log
#------------------------------- Kafka Output ----------------------------------
output.kafka:
hosts: ["192.168.116.26:9092","192.168.116.111:9092","192.168.116.120:9092"]
topic: 'nginx'
partition.round_robin:
reachable_only: true
/usr/share/filebeat/bin/filebeat -e -c /etc/filebeat/filebeat.yml
netstat -natp | grep filebeat
tcp 0 0 192.168.116.26:51640 192.168.116.26:9092 ESTABLISHED 35827/filebeat
Ⅳ、logstash节点配置
vim /etc/logstash/con.d/nginx.conf
input {
kafka {
bootstrap_servers => ["192.168.116.26:9092,192.168.116.111:9092,192.168.116.120:9092"]
topics => ["nginx"]
codec => json {
charset => "UTF-8"
}
decorate_events => false
}
}
output {
elasticsearch {
hosts => ["192.168.116.22:9200","192.168.116.23:9200"]
index => 'nginx-access-%{+YYYY.MM.dd}'
}
}
重新启动logstash
systemctl restart logstash.service