目录
一、为什么要做日志分析平台?
二、ELK+Filebeat+Kafka+Zookeeper架构
三、搭建ELK+Filebeat+Kafka+Zookeeper
1、3台机子安装zookeeper 192.168.100.14/15/16
1.1 解压安装zookeeper软件包
1.2 修改Zookeeper配置配置文件
1.3 设置myid号以及启动脚本
1.4 3台机器启动zookeeper
2、安装kafka 192.168.100.14/15/16
2.1 安装 kafka(3台机子都要操作)
2.2 修改配置文件
2.3 将相关命令加入到系统环境当中
2.4 启动kafka
Kafka 命令行操作
2.5 创建topic
2.6 测试topic
3、配置数据采集层filebeat(192.168.100.17)
3.1 定制日志格式
3.2 上传、解压安装包
3.3 修改配置文件filebeat.yml
3.4 启动filebeat
4、所有组件部署完成之后,开始配置部署
4.1 在kafka上创建一个话题nginx-es
4.2 修改logstash的配置文件
4.3 验证网页
4.4 Kibana上创建索引
随着业务量的增长,每天业务服务器将会产生上亿条的日志,单个日志文件达几个GB,这时我们发现用Linux自带工具,cat grep awk 分析越来越力不从心了,而且除了服务器日志,还有程序报错日志,分布在不同的服务器,查阅繁琐。
待解决的问题:
① 大量不同种类的日志成为了运维人员的负担,不方便管理;
② 单个日志文件巨大,无法使用常用的文本工具分析,检索困难;
③ 日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志。
整体的架构如上图所示
这个架构图从左到右,总共分为5层,每层实现的功能和含义分别介绍如下:
第一层、数据采集层
数据采集层位于最左边的业务服务器集群上,在每个业务服务器上面安装了filebeat做日志收集,然后把采集到的原始日志发送到Kafka+zookeeper集群上。第二层、消息队列层
原始日志发送到Kafka+zookeeper集群上后,会进行集中存储,此时,filbeat是消息的生产者,存储的消息可以随时被消费。第三层、数据分析层
Logstash作为消费者,会去Kafka+zookeeper集群节点实时拉取原始日志,然后将获取到的原始日志根据规则进行分析、清洗、过滤,最后将清洗好的日志转发至Elasticsearch集群。第四层、数据持久化存储
Elasticsearch集群在接收到logstash发送过来的数据后,执行写磁盘,建索引库等操作,最后将结构化的数据存储到Elasticsearch集群上。第五层、数据查询、展示层
Kibana是一个可视化的数据展示平台,当有数据检索请求时,它从Elasticsearch集群上读取数据,然后进行可视化出图和多维度分析。
ip地址 | 所属集群 | 安装软件包 |
192.168.100.11 | Elasticsearch | Elasticsearch集群 |
192.168.100.12 | Elasticsearch | Elasticsearch集群 |
192.168.100.13 | Logstash | 数据转发 |
192.168.100.14 | kafka+zookeeper | kafka+zookeeper |
192.168.100.15 | kafka+zookeeper | kafka+zookeeper |
192.168.100.16 | kafka+zookeeper | kafka+zookeeper |
192.168.100.17 | filebeat | 配置数据采集层 |
本实验基于ELK已经搭好的情况下
Zookpeer下载地址:apache-zookeeper-3.7.1-bin.tar.gz
cd /opt
上传apache-zookeeper-3.7.1-bin.tar.gz包
tar zxf apache-zookeeper-3.7.1-bin.tar.gz 解包
mv apache-zookeeper-3.7.1-bin /usr/local/zookeeper-3.7.1 #将解压的目录剪切到/usr/local/
cd /usr/local/zookeeper-3.7.1/conf/
cp zoo_sample.cfg zoo.cfg 备份复制模板配置文件为zoo.cfg
cd /usr/local/zookeeper-3.5.7/conf #进入zookeeper配置文件汇总
ls 后可以看到zoo_sample.cfg模板配置文件
cp zoo_sample.cfg zoo.cfg 复制模板配置文件为zoo.cfg
vim zoo.cfg
tickTime=2000
#通信心跳时间,Zookeeper服务器与客户端心跳时间,单位毫秒
initLimit=10
#Leader和Follower初始连接时能容忍的最多心跳数( tickTime的数量),这里表示为10*2s
syncLimit=5
#Leader和Follower之间同步通信的超时时间,这里表示如果超过5*2s,Leader认为Follwer死掉,并从服务器列表中删除Follwer
dataDir=/usr/local/zookeeper-3.7.1/data
#●修改,指定保存Zookeeper中的数据的目录,目录需要单独创建
dataLogDir=/usr/local/zookeeper-3.7.1/1ogs
#●添加,指定存放日志的目录,目录需要单独创建
clientPort=2181 #客户端连接端口#添加集群信息
server.1=192.168.100.14:3188:3288
server.2=192.168.100.15:3188:3288
server.3=192.168.100.16:3188:3288把配置好的文件发送给另外2台机器
scp zoo.cfg [email protected]:/usr/local/zookeeper-3.5.7/conf
scp zoo.cfg [email protected]:/usr/local/zookeeper-3.5.7/conf
创建数据目录和日志目录
mkdir /usr/local/zookeeper-3.7.1/data
mkdir /usr/local/zookeeper-3.7.1/logsls /usr/local/zookeeper-3.7.1/ 查看是否创建
到这里就不要设置同步了,下面的操作,做好一台机器一台机器的配置。
echo 1 >/usr/local/zookeeper-3.7.1/data/myid
# node1上配置echo 2 >/usr/local/zookeeper-3.7.1/data/myid
#node2上配置echo 3 >/usr/local/zookeeper-3.7.1/data/myid
#node3上配置
3台节点需要执行的脚本
#//配置启动脚本,脚本在开启启动执行的目录中创建
vim /etc/init.d/zookeeper
#!/bin/bash
#chkconfig:2345 20 90
#description:Zookeeper Service Control Script
ZK_HOME='/usr/local/zookeeper-3.5.7'
case $1 in
start)
echo "----------zookeeper启动----------"
$ZK_HOME/bin/zkServer.sh start
;;
stop)
echo "---------- zookeeper停止-----------"
$ZK_HOME/bin/zkServer.sh stop
;;
restart)
echo "---------- zookeeper 重启------------"
$ZK_HOME/bin/zkServer.sh restart
;;
status)
echo "---------- zookeeper 状态------------"
$ZK_HOME/bin/zkServer.sh status
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
esaccd /usr/local/zookeeper-3.7.1/bin
在节点1服务操作
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper #加入到系统管理service zookeeper start 启动服务
service zookeeper status 查看状态后 是 follower
在节点2服务操作
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper #加入到系统管理service zookeeper start 启动服务
service zookeeper status 查看状态后 是 leader 第二台启动的,他是leader
在节点3服务操作
chmod +x /etc/init.d/zookeeper
chkconfig --add zookeeper #加入到系统管理service zookeeper start 启动服务
service zookeeper status 查看状态后 是 follower
上传kafka_2.13-2.7.1.tgz到/opt
tar zxf kafka_2.13-2.7.1.tgz
mv kafka_2.13-2.7.1 /usr/local/kafka
cd /usr/local/kafka/config/
cp server.properties server.properties.bak
vim server.properties
192.168.100.14配置
21行 broker.id=0
31行 listeners=PLAINTEXT://192.168.100.14:9092
123行 zookeeper.connect=192.168.100.14:2181,192.168.100.15:2181,192.168.100.16:2181
192.168.100.15配置
21行 broker.id=1
31行 listeners=PLAINTEXT://192.168.100.15:9092
123行 zookeeper.connect=192.168.100.14:2181,192.168.100.15:2181,192.168.100.16:2181
192.168.100.16配置
21行 broker.id=2
31行 listeners=PLAINTEXT://192.168.100.16:9092
123行 zookeeper.connect=192.168.100.14:2181,192.168.100.15:2181,192.168.100.16:2181
vim /etc/profile 末行加入
export KAFKA_HOME=/usr/local/kafka
export PATH=$PATH:$KAFKA_HOME/binsource /etc/profile
cd /usr/local/kafka/config/
kafka-server-start.sh -daemon server.properties
netstat -antp | grep 9092
创建topic
kafka-topics.sh --create --zookeeper 192.168.121.10:2181,192.168.121.12:2181,192.168.121.14:2181 --replication-factor 2 --partitions 3 --topic test
–zookeeper:定义 zookeeper 集群服务器地址,如果有多个 IP 地址使用逗号分割,一般使用一个 IP 即可
–replication-factor:定义分区副本数,1 代表单副本,建议为 2
–partitions:定义分区数
–topic:定义 topic 名称
查看当前服务器中的所有 topic
kafka-topics.sh --list --zookeeper 192.168.121.10:2181,192.168.121.12:2181,192.168.121.14:2181
查看某个 topic 的详情
kafka-topics.sh --describe --zookeeper 192.168.121.10:2181,192.168.121.12:2181,192.168.121.14:2181
发布消息
kafka-console-producer.sh --broker-list 192.168.121.10:9092,192.168.121.12:9092,192.168.121.14:9092 --topic test
消费消息
kafka-console-consumer.sh --bootstrap-server 192.168.121.10:9092,192.168.121.12:9092,192.168.121.14:9092 --topic test --from-beginning
–from-beginning:会把主题中以往所有的数据都读取出来
修改分区数
kafka-topics.sh
--zookeeper 192.168.80.10:2181,192.168.80.11:2181,192.168.80.12:2181 --alter --topic test --partitions 6
删除 topic
kafka-topics.sh
--delete --zookeeper 192.168.80.10:2181,192.168.80.11:2181,192.168.80.12:2181 --topic test
[root@localhost bin]# pwd
/usr/local/kafka/bin
[root@localhost bin]# kafka-topics.sh --create --zookeeper \
> 192.168.100.14:2181,192.168.100.15:2181,192.168.100.16:2181 \
> --partitions 3 \
> --replication-factor 2 \
> --topic test
Created topic test.
[root@localhost bin]# kafka-topics.sh
--describe --zookeeper 192.168.100.14:2181
发布消息
kafka-console-producer.sh
--broker-list 192.168.100.14:9092,192.168.100.15:9092,192.168.100.16:9092 --topic test
kafka-console-producer.sh --broker-list 192.168.100.15:9092 --topic test
消费消息
kafka-console-consumer.sh --bootstrap-server 192.168.100.15.9092 –topic test --from-beginning
zhangsan
a
v
vim /etc/nginx/nginx.conf
log_format json '{"@timestamp":"$time_iso8601",'
'"@version":"1",'
'"client":"$remote_addr",'
'"url":"$uri",'
'"status":"$status",'
'"domain":"$host",'
'"host":"$server_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"referer": "$http_referer",'
'"ua": "$http_user_agent"'
'}';access_log /var/log/nginx/access.log json;
cd /opt 上传包
tar zxf filebeat-6.5.4-linux-x86_64.tar.gz 解压
mv filebeat-6.5.4-linux-x86_64 /usr/local/filebeat 剪切位置ls /usr/local
cd /usr/local/filebeat
vim filebeat.yml
- type: log ##21行,指定log类型,从日志文件中读取消息
enabled: true ##24行,开启日志收集功能,默认为false
paths: #27行- /var/log/httpd/access_log ##28行,指定监控的日志文件
tags:["access"] #29行
fields: #31行
enable #32行
paths: #33行
- /var/log/httpd/error_log #34行tags: ["error"] #35行
output.kafka: #153行
enable: true #154行
hosts: ["192.168.100.14:9092,192.168.100.15:9092,192.168.100.16:9092"]
./filebeat -c filebeat.yml & 后台启动
netstat -natp | grep filebeat
kafka-topics.sh --create --zookeeper
192.168.100.14:2181,192.168.100.15:2181,192.168.100.16:2181
--replication-factor 1 --partitions 1 –topic nginx-es
vim /etc/logstash/conf.d/nginxlog.conf
input{
kafka{
topics=>"nginx-es"
#codex=>"json"
decorate_events=>true
bootstrap_servers=>"192.168.100.14:9092,192.168.100.15:9092,192.168.100.16:9092"
}
}
output {
elasticsearch {
hosts=>["192.168.100.11:9200"]
index=>'nginx-%{+YYYY-MM-dd}'
}
}
systemctl restart logstash