离线部署ELK+Kafka日志管理系统
1、简介
对于日志来说,最常见的需求就是收集、查询、显示,正对应logstash、elasticsearch、kibana的功能。ELK日志系统在系统中,主要可解决的问题:
- 基于日志的数据挖掘
- 问题排查,上线检查
- 根据关键字查询日志详情
- 异常数据自动触发消息通知
- 服务器监控,应用监控,Bug管理
- 统计分析,比如接口的调用次数、执行时间、成功率等
- 性能分析,用户行为分析,安全漏洞分析,时间管理
Logstash:
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。与其他监控系统的整合也很方便,可以将数据输出到zabbix、nagios等。还可以把数据统计后输出到graphite,实现统计数据的可视化显示。
logstash对日志的处理逻辑很简单,就是一个pipeline的过程:
inputs >> codecs >> filters>> outputs
agent分布在每一台需要采集数据的节点上,agent只是Logstash承担的一个角色,与此对应的是indexer。agent会分别将各自获取的日志作为输入输出到一个消息代理(例如redis或者kafka),indexer会将消息代理作为输入再输出到ES上,由ES做indexing。其实Logstash在整个过程中只负责输入输出,对Logstash而言并没有agent和index之分。如果日志量小的话完全不需要设置indexer,直接将ES作为agent的输出源。
Elasticsearch:
elasticsearch是基于lucene的开源搜索引擎,主要的特点有
- real time
- distributed
- high availability
- document oriented
- schema free
- restful api
kibana:
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。kibana是根据前台过滤的条件,生成query 发送到elasticsearch,然后根据返回的值重绘页面。
下面用一张图来展示整个架构:
以上是我查看网上资料最终总结的,感谢各位大神的贡献。
2、测试环境说明
下面通过在测试环境下搭建ELK日志系统来对ELK进行更加深入的认识。
软件环境:
logstash-2.3.3.tar.gz marvel-2.3.3.tar.gzelasticsearch-2.3.3.zip kibana-4.5.1-linux-x64 marvel-agent-2.3.3.zip elasticsearch-head-master.zip license-2.3.3.zip jdk-8u101-linux-x64.tar.gz kafka_2.10-0.10.0.1.tgz zookeeper-3.4.6.tar.gz
服务器和角色:
192.168.1.101 kafka+zookeeper
192.168.1.102 kafka+zookeeper
192.168.1.103 kafka+zookeeper logstash shipper
192.168.1.104 logstash shipper
192.168.1.105 elasticsearch kibana
192.168.1.106 logstash indexer
说明:
本篇分别对上边的物理节点标识为node1—node6,下面都以这种称谓。
Node1和nide2以及node3三台节点上搭建kafka+zookeeper集群,另外node3本身也是一个nginx服务器。
Node4上搭建nginx服务器,和node3一起负责logstash日志数据生产端,把nginx日志传给kafka集群。
日志传输方向:
Nginx日志-->logstash shipper-->kafka+zookeeper-->logstash indexer-->elasticsearch
最后kibana负责展示es收集到的数据
3、 配置java环境
各节点配置jdk1.8的环境
/home/apps # tar -zxvf jdk-8u101-linux-x64.tar.gz
/home/apps # ln -sv /home/apps/jdk1.8.0_101/usr/local/jdk1.8.0_101
`/usr/local/jdk1.8.0_101' ->`/home/apps/jdk1.8.0_101'
编辑环境变量文件,注释掉之前的java环境配置,添加下面的内容
/home/apps # vi /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_101
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
/home/apps #source /etc/profile
/home/apps # java -version
java version "1.8.0_101"
Java(TM) SE Runtime Environment (build1.8.0_101-b13)
Java HotSpot(TM) 64-Bit Server VM (build25.101-b13, mixed mode)
4、搭建kafka+zookeeper集群环境
4.1、node1上安装配置zookeeper
解压包
# tar -xf kafka_2.10-0.10.0.1.tgz -C /usr/local
# tar -zxf zookeeper-3.4.6.tar.gz -C /usr/local
# cd /usr/local
# mv kafka_2.10-0.10.0.1/ kafka
# mv zookeeper-3.4.6/ zookeeper
生成zookeeper配置文件
# cd zookeeper/conf
# cp zoo_sample.cfg zoo.cfg
编辑配置文件
# vi zoo.cfg
dataDir=/usr/local/zookeeper/tmp/zookeeper
server.1=192.168.1.101:2888:3888
server.2=192.168.1.102:2888:3888
server.3=192.168.1.103:2888:3888
# cd ..
# mkdir -p tmp/zookeeper
# echo "1" >tmp/zookeeper/myid
4.2、配置node2和node3的zookeeper
依照node1的配置配置node2和node3,注意下面的参数三个节点各有差异
Node2:
# echo "2" >tmp/zookeeper/myid
Node3:
# echo "3" >tmp/zookeeper/myid
其他配置都一样
4.3、依次启动三个节点的服务
# ./bin/zkServer.sh start conf/zoo.cfg
Using config:/usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
查看三个节点的状态
Node1:
# ./bin/zkServer.sh status
JMX enabled by default
Using config:/usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
Node2:
# ./bin/zkServer.sh status
JMX enabled by default
Using config:/usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
Node3:
# ./bin/zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
4.4、配置node1的kafka
# cd ../kafka
# vi config/server.properties
broker.id=0
port=9092
host.name=node1
log.dirs=/usr/local/kafka/tmp/kafka-logs
num.partitions=2
zookeeper.connect=192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181
4.5、配置Node2和node3的kafka
依照node1的配置配置node2和node3,注意下面的参数三个节点各有差异
Node2:
broker.id=1
host.name=node2
node3:
broker.id=2
host.name=node3
说明:
host.name是节点的主机名
依次启动三个节点的kafka
# ./bin/kafka-server-start config/server.properties
4.6、创建topic验证集群是否正常
Node1上创建topic
/usr/local/kafka# bin/kafka-topics.sh --create --zookeeper 192.168.1.100:2181--replication-factor 3 --partitions 2 --topic test1
Created topic "test1".
Node2上发送消息至kafka(2节点模拟producer)
/usr/local/kafka # bin/kafka-console-producer.sh --broker-list 192.168.1.100:9092 --topic test1
hello world
Node3显示消息的消费(3节点模拟consumer)
/usr/local/kafka # bin/kafka-console-consumer.sh --zookeeper 192.168.1.100:2181 --topic test1 --from-beginning
hello world
可以看到在node2节点的输入的信息可以在nide3节点显示,说明集群正常使用。
使用下面的命令可以查看zookeeper服务的端口
# netstat -nlpt | grep -E "2181|2888|3888"
5、配置es和kibana
在node5节点配置es
5.1、创建elasticsearch账户
# groupadd eSUSEr
# useradd -d /home/esuser -m esuser
# passwd esuser
/home/apps # unzip elasticsearch-2.3.3.zip
/home/apps # mv elasticsearch-2.3.3 /usr/local/elasticsearch
5.2、编辑es配置文件
# cd /usr/local/elasticsearch/
编辑es配置文件
# vi config/elasticsearch.yml
cluster.name: es_cluster
node.name: node5
path.data: /usr/local/elasticsearch/data
path.logs: /usr/local/elasticsearch/logs
network.host: 192.168.1.105
http.port: 9200
# mkdir data logs
修改目录权限
/home/apps # chown -R esuser:esuser /usr/local/elasticsearch/
切换到esuser用户,启动es服务
/usr/local/elasticsearch> ./bin/elasticsearch
可使用下面命令查看es服务端口情况
# netstat -nlpt | grep -E "9200|9300"
浏览器输入http://192.168.1.105:9200/,显示如下所示信息,说明服务正常
{
"name" : "node5",
"cluster_name" : "es_cluster",
"version" : {
"number" : "2.3.3",
"build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
"build_timestamp" : "2016-05-17T15:40:04Z",
"build_snapshot" : false,
"lucene_version" : "5.5.0"
},
"tagline" : "You Know, for Search"
}
5.3、ES插件配置
/home/apps # unzip elasticsearch-head-master.zip
# mv elasticsearch-head-master /usr/local/elasticsearch/plugins/head
在浏览器中输入http://192.168.1.105:9200/_plugin/head/,出现如图【ELK&kafka1】所示的画面。
ELK&kafka1
marvel插件的安装
/usr/local/elasticsearch # ./bin/plugininstall file:///home/apps/license-2.3.3.zip
-> Installing fromfile:/home/apps/license-2.3.3.zip...
Trying file:/home/apps/license-2.3.3.zip...
Downloading .DONE
Verifying file:/home/apps/license-2.3.3.zipchecksums if available ...
NOTE: Unable to verify checksum fordownloaded plugin (unable to find .sha1 or .md5 file to verify)
Installed license into/usr/local/elasticsearch/plugins/license
/usr/local/elasticsearch # ./bin/plugininstall file:///home/apps/marvel-agent-2.3.3.zip
-> Installing fromfile:/home/apps/marvel-agent-2.3.3.zip...
Tryingfile:/home/apps/marvel-agent-2.3.3.zip ...
Downloading ..DONE
Verifyingfile:/home/apps/marvel-agent-2.3.3.zip checksums if available ...
NOTE: Unable to verify checksum fordownloaded plugin (unable to find .sha1 or .md5 file to verify)
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: plugin requires additional permissions @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
* java.lang.RuntimePermission setFactory
* javax.net.ssl.SSLPermission setHostnameVerifier
Seehttp://docs.Oracle.com/javase/8/docs/technotes/guides/security/permissions.html
for descriptions of what these permissionsallow and the associated risks.
Continue with installation? [y/N]y
Installed marvel-agent into/usr/local/elasticsearch/plugins/marvel-agent