转自

离线部署ELK+kafka日志管理系统 - xiaoxiaozhou - 51CTO技术博客
http://xiaoxiaozhou.blog.51cto.com/4681537/1854684

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..0_101/usr/local/jdk1..0_101

`/usr/local/jdk1..0_101' ->`/home/apps/jdk1.8.0_101'

编辑环境变量文件,注释掉之前的java环境配置,添加下面的内容

/home/apps # vi /etc/profile

JAVA_HOME=/usr/local/jdk1..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..0_101-b13)

Java HotSpot(TM) -Bit Server VM (build25.-b13, mixed mode)

4、搭建kafka+zookeeper集群环境

4.1、node1上安装配置zookeeper

解压包

# tar -xf kafka_2.-0.10.0.1.tgz -C /usr/local

# tar -zxf zookeeper-3.4..tar.gz -C /usr/local

# cd /usr/local

# mv kafka_2.-0.10.0.1/ kafka

# mv zookeeper-3.4./ zookeeper

生成zookeeper配置文件

# cd zookeeper/conf

# cp zoo_sample.cfg zoo.cfg

编辑配置文件

# vi zoo.cfg

dataDir=/usr/local/zookeeper/tmp/zookeeper

server.=192.168.1.101:: 

server.=192.168.1.102:: 

server.=192.168.1.103::

# cd ..

# mkdir -p tmp/zookeeper

# echo "" >tmp/zookeeper/myid

4.2、配置node2和node3的zookeeper

依照node1的配置配置node2和node3,注意下面的参数三个节点各有差异

Node2:

# echo "" >tmp/zookeeper/myid

Node3:

# echo "" >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=

port= 

host.name=node1

log.dirs=/usr/local/kafka/tmp/kafka-logs

num.partitions=

zookeeper.connect=192.168.1.101:,192.168.1.102:,192.168.1.103:

4.5、配置Node2和node3的kafka

依照node1的配置配置node2和node3,注意下面的参数三个节点各有差异

Node2:

broker.id=

host.name=node2

node3:

broker.id=

host.name=node3

说明:

host.name是节点的主机名

依次启动三个节点的kafka

# ./bin/kafka-server-start.sh config/server.properties

4.6、创建topic验证集群是否正常

Node1上创建topic

/usr/local/kafka# bin/kafka-topics.sh --create --zookeeper 192.168.1.100: --replication-factor  --partitions  --topic test1

Created topic "test1".

Node2上发送消息至kafka(2节点模拟producer)

/usr/local/kafka # bin/kafka-console-producer.sh --broker-list 192.168.1.100: --topic test1

hello world 

Node3显示消息的消费(3节点模拟consumer)

/usr/local/kafka # bin/kafka-console-consumer.sh --zookeeper  192.168.1.100: --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..zip

/home/apps # mv elasticsearch-2.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: 

# 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..zip...

Trying file:/home/apps/license-2.3..zip...

Downloading .DONE

Verifying file:/home/apps/license-2.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..zip...

Tryingfile:/home/apps/marvel-agent-2.3..zip ...

Downloading ..DONE

Verifyingfile:/home/apps/marvel-agent-2.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

重启es服务

在浏览器中输入http://192.168.1.105:9200/_plugin/head/,出现如图【ELK&kafka2】所示的画面。

ELK&kafka2

5.4、配置kibana

/home/apps # tar -zxvf kibana-4.5.-linux-x64.tar.gz

/home/apps # mv kibana-4.5.-linux-x64/usr/local/kibana             

编辑kibana配置文件

/home/apps # cd /usr/local/kibana

/usr/local/kibana # vi config/kibana.ym

server.port: 

server.host: "192.168.1.105"

elasticsearch.url:"http://192.168.1.105:9200"                                                                                      

启动kibana

# ./bin/kibana &

在浏览器中输入192.168.1.105:5601,可以【ELK&kafka3】所示的画面。

ELK&kafka3

在Kibana中把marvel插件安装完成(安装过程需要一些时间)

/home/apps # cd /usr/local/kibana/

/usr/local/kibana # ./bin/kibana plugin--install marvel --url file:///home/apps/marvel-2.3.3.tar.gz

Installing marvel

Attempting to transfer from file:///home/apps/marvel-2.3.3.tar.gz

Transferring 1597693bytes....................

Transfer complete

Extracting plugin archive

Extraction complete

Optimizing and caching browser bundles...

Plugin installation complete

重启kibana后,访问kibana,可以【ELK&kafka4】所示的画面。

ELK&kafka4

6、Node4日志生产端配置

6.1、 node4节点安装配置nginx

# tar -zxf pcre-8.21.tar.gz -C /usr/local

# tar -zxf nginx-1.2..tar.gz -C /usr/local

# cd pcre-8.21/

# ./configure

# make && make install

# cd nginx-1.2./

# ./configure --with-http_stub_status_module --prefix=/usr/local/nginx

# make && make install

在nginx配置文件中的http {}段添加下面的内容:

log_format  main  '$remote_addr - $remote_user [$time_local] '

                           '"$request" $status $body_bytes_sent '

                           '"$http_referer" "$http_user_agent" ';

/usr/local/nginx/sbin # ./nginx -s reload

6.2、logstash配置

# tar -zxvf logstash-2.3..tar.gz

# mv logstash-2.3. /usr/local/logstash

配置logstash生产端文件

/usr/local # cd logstash/

/usr/local/logstash # mkdir logs etc

/usr/local/logstash # vi etc/logstash_nginx_shipper.conf 

input {

   file {

       type => "nginx-access"

       path => "/usr/local/nginx/logs/access.log"

   }

}

output {

stdout { codec => rubydebug }

kafka {

bootstrap_servers => "192.168.1.101:9092,192.168.1.102:9092,192.168.1.103:9092"

topic_id => "nginx-messages"

compression_type => "snappy"

}

}

说明:

配置文件中的stdout { codec => rubydebug }参数是为了在标准输出显示信息

通过这个文件的配置node4节点可以把nginx产生的日志信息发送到kafka集群

6.3、node3节点生产端的配置

因为node3本身就是一个nginx web服务器,所以只需要一个logstash配置文件就可以了,依照node4节点产生一个相同的文件。

日志消费端配置

依照node4的logstash配置,只不过配置文件不同,node6的配置文件如下所示:

/usr/local/logstash # vi etc/logstash_nginx_indexer.conf 

input {

kafka {

zk_connect =>"192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181"

topic_id => "nginx-messages"

codec => plain

reset_beginning => false

consumer_threads => 

decorate_events => true

}

}

output {

#stdout {

#       debug => true

#       debug_format => json

#   }

stdout { codec => rubydebug }

elasticsearch {

hosts => "192.168.1.105:9200"

index =>"nginx-messages-%{+YYYY-MM}"

}

}

7、验证

启动服务加载文件

日志生产端Node4:

/usr/local/logstash # ./bin/logstash -f etc/logstash_nginx_shipper.conf

日志消费端node6:

/usr/local/logstash # ./bin/logstash -f etc/logstash_nginx_indexer.conf

往node4的nginx日志文件中插入数据,可从图【ELK&kafka5】和【ELK&kafka6】看到多了nginx的索引,es中出现数据。

ELK&kafka5

ELK&kafka6

日志生产端Node3:

/usr/local/logstash # ./bin/logstash -f etc/logstash_nginx_shipper.conf  

往node3的nginx日志文件中插入数据,可从图【ELK&kafka7】看到es中出现的数据。

ELK&kafka7

在kibana的访问页面首先做配置,建立一个和es里展示的索引相对应的索引名“nginx-mes

sages-*”,如图【ELK&kafka8】否则的话不能创建索引。

ELK&kafka8

可从图【ELK&kafka9】看到kibana中出现的数据。

ELK&kafka9

8、  拓展

接下来还有很多的工作要做,例如环境架构的适用性和高可用、日志的格式化和过滤、kibana图表的分析、索引的清理、ELK系统的优化等等。

9、参考文章

http://lx.wxqrcode.com/index.php/post/101.html

http://blog.csdn.net/dabokele/article/details/51765136

http://blog.csdn.net/ubuntu64fan/article/details/26683941

本文出自 “xiaoxiaozhou” 博客,请务必保留此出处http://xiaoxiaozhou.blog.51cto.com/4681537/1854684

离线部署ELK+kafka日志管理系统【转】的更多相关文章

  1. ELK + kafka 日志方案

    概述 本文介绍使用ELK(elasticsearch.logstash.kibana) + kafka来搭建一个日志系统.主要演示使用spring aop进行日志收集,然后通过kafka将日志发送给l ...

  2. [原创]ubuntu14.04部署ELK+redis日志分析系统

    ubuntu14.04部署ELK+redis日志分析系统 [环境] host1:172.17.0.4 搭建ELK+redis服务 host2:172.17.0.3 搭建logstash+nginx服务 ...

  3. lagstash + elasticsearch + kibana 3 + kafka 日志管理系统部署 02

    因公司数据安全和分析的需要,故调研了一下 GlusterFS + lagstash + elasticsearch + kibana 3 + redis 整合在一起的日志管理应用: 安装,配置过程,使 ...

  4. Centos7 之安装Logstash ELK stack 日志管理系统

    一.介绍 The Elastic Stack - 它不是一个软件,而是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案.它可以从任何来源 ...

  5. ELK+Kafka学习笔记之搭建ELK+Kafka日志收集系统集群

    0x00 概述 关于如何搭建ELK部分,请参考这篇文章,https://www.cnblogs.com/JetpropelledSnake/p/9893566.html. 该篇用户为非root,使用用 ...

  6. CentOS 7下安装Logstash ELK Stack 日志管理系统(上)

    介绍 The Elastic Stack - 它不是一个软件,而是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案.它可以从任何来源,任 ...

  7. ELK+kafka日志收集分析系统

    环境: 服务器IP 软件 版本 192.168.0.156 zookeeper+kafka zk:3.4.14  kafka:2.11-2.2.0 192.168.0.42 zookeeper+kaf ...

  8. 170228、Linux操作系统安装ELK stack日志管理系统--(1)Logstash和Filebeat的安装与使用

    安装测试环境:Ubuntu 16.04.2 LTS 前言 (1)ELK是Elasticsearch,Logstash,Kibana 开源软件的集合,对外是作为一个日志管理系统的开源方案.它可以从任何来 ...

  9. 利用docker部署elk交换机日志分析

    今天我们来聊一下利用docker部署elk日志分析系统,这里解析一下elk是啥东西.elk分别是Elasticsearch,Logstash和Kibana的首字母缩写. Elasticsearch是一 ...

随机推荐

  1. bzoj1318[spoj 744] Longest Permutation

    题意 给出一个长度为n的,所有元素大小在[1,n]的整数数列,要求选出一个尽量长的区间使得区间内所有元素组成一个1到区间长度k的排列,输出k的最大值 n<=1e5 分析 不会做,好菜啊.jpg ...

  2. Python下json中文乱码解决办法

    json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,只需要 #coding=utf8 import json js = json.loads('{" ...

  3. 【纪念】NOIP2018前夕——一些想说的话

    刚刚复习了一下相关的内容,决定一会儿就洗洗睡了.在睡觉之前,决定写点东西. 有的时候真的很迷茫,选择了一条超过自己能力范围的路,每天挣扎在各种各样难题的面前,文化成绩一落千丈……在从前觉得这一切都是有 ...

  4. 【刷题】BZOJ 2599 [IOI2011]Race

    Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...

  5. [洛谷P5136]sequence

    题目大意:有$T(T\leqslant10^5)$组询问,每次求$A_n(n\leqslant10^{18})$:$$A_n=\left\lceil\left(\dfrac{\sqrt5+1}2\ri ...

  6. 【BZOJ4767】两双手(动态规划,容斥)

    [BZOJ4767]两双手(动态规划,容斥) 题面 BZOJ 题解 发现走法只有两种,并且两维坐标都要走到对应的位置去. 显然对于每个确定的点,最多只有一种固定的跳跃次数能够到达这个点. 首先对于每个 ...

  7. BZOJ1264 [AHOI2006]基因匹配Match 【LCS转LIS】

    题目链接 BZOJ1264 题解 平凡的\(LCS\)是\(O(n^2)\)的 显然我们要根据题目的性质用一些不平凡的\(LCS\)求法 这就很巧妙了,, 我们考虑\(A\)序列的每个位置可能匹配\( ...

  8. redis的Pub/Sub功能

    Pub/Sub功能(即Publish,Subscribe)意思是发布及订阅功能.简单的理解就像我们订阅blog一样,不同的是,这里的客户端与server端采用长连接建立推送机制,一个客户端发布消息,可 ...

  9. Linux内核分析5

    周子轩 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.学习总结 通过gdb ...

  10. springMVC和mybatis的原理

    mybatis是什么? mybatis是一个持久层框架,是apache下的开源项目,前身是itbatis,是一个不完全的ORM框架,mybatis提供输入和输出的映射,需要程序员自己写sql语句,my ...