设为首页 收藏本站
查看: 1129|回复: 0

[经验分享] 离线部署ELK+kafka日志管理系统

[复制链接]

尚未签到

发表于 2019-1-28 09:41:38 | 显示全部楼层 |阅读模式
  1、简介

对于日志来说,最常见的需求就是收集、查询、显示,正对应logstashelasticsearchkibana的功能。

  
  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的配置配置node2node3,注意下面的参数三个节点各有差异
  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的配置配置node2node3,注意下面的参数三个节点各有差异
  Node2
  broker.id=1
  host.name=node2
  
  node3
  broker.id=2
  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: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、配置eskibana
  在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
  
  重启es服务
  在浏览器中输入http://192.168.1.105:9200/_plugin/head/,出现如图【ELK&kafka2】所示的画面。
  
ELK&kafka2

  

  5.4、配置kibana
  

  /home/apps # tar -zxvf kibana-4.5.1-linux-x64.tar.gz
  /home/apps # mv kibana-4.5.1-linux-x64/usr/local/kibana              
  
  编辑kibana配置文件
  /home/apps # cd /usr/local/kibana
  /usr/local/kibana # vi config/kibana.ym
  server.port: 5601
  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.7.tar.gz -C /usr/local
  # cd pcre-8.21/
  # ./configure
  # make && make install
  

  # cd nginx-1.2.7/
  # ./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.3.tar.gz
  # mv logstash-2.3.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 => 5
  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
  
  node4nginx日志文件中插入数据,可从图【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
  






运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-668544-1-1.html 上篇帖子: centos7搭建ELK开源实时日志分析系统 下篇帖子: 大型架构ELK
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表