A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
  • 收集-能够采集多种来源的日志数据
  • 传输-能够稳定的把日志数据传输到中央系统
  • 存储-如何存储日志数据
  • 分析-可以支持 UI 分析
  • 警告-能够提供错误报告,监控机制 警告-能够提供错误报告,监控机制
完整的日志数据作用
  • 信息查找。通过检索日志信息,定位相应的bug,找出解决方案。
  • 服务诊断。通过对日志信息进行统计、分析,了解服务器的负荷和服务运行状态,找出耗时请求进行优化等等。
  • 数据分析。如果是格式化的log,可以做进一步的数据分析,统计、聚合出有意义的信息,比如根据请求中的商品id,找出TOP10用户感兴趣商品。
ELK下载地址ELK官网:https://www.elastic.co/
elasticsearch下载地址:https://www.elastic.co/downloads/elasticsearch
elasticsearch安装文档:https://www.elastic.co/guide/en/elasticsearch/reference/6.4/install-elasticsearch.html
kibana下载地址:https://www.elastic.co/downloads/kibana
kibana安装文档:https://www.elastic.co/guide/en/kibana/6.4/install.html
logstash下载地址:https://www.elastic.co/downloads/logstash
logstash安装文档:https://www.elastic.co/guide/en/logstash/6.4/installing-logstash.html
beats插件下载地址:https://www.elastic.co/downloads/beats
beats插件安装文档:https://www.elastic.co/guide/en/beats/libbeat/6.4/getting-started.html
ELK架构架构一:

此架构由Logstash分布于各个节点上搜集相关日志、数据,并经过分析、过滤后发送给远端服务器上的Elasticsearch进行存储。Elasticsearch将数据以分片的形式压缩存储并提供多种API供用户查询,操作。用户亦可以更直观的通过配置Kibana Web方便的对日志查询,并根据数据生成报表。
架构二:

各个节点上的Logstash先将数据或日志传递给Kafka(或者Redis),并将队列中消息或数据间接传递给Logstash,Logstash过滤、分析后将数据传递给Elasticsearch远端服务器进行存储。最后由Kibana将日志和数据呈现给用户。因为引入了Kafka(或者Redis),所以即使远端Logstash server因故障停止运行,数据将会先被存储下来,从而避免数据丢失。
架构图三:

beats替换logstach,更灵活,消耗资源更少,扩展性更强。
ELK介绍Logstash是一个ETL工具,负责从每台机器抓取日志数据,对数据进行格式转换和处理后,输出到Elasticsearch中存储。Elasticsearch是一个分布式搜索引擎和分析引擎,用于数据存储,可提供实时的数据查询。Kibana是一个数据可视化服务,根据用户的操作从Elasticsearch中查询数据,形成相应的分析结果,以图表的形式展现给用户。ELK是三个开源软件的缩写,分别表示:Elasticsearch , Logstash, Kibana;
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能
logstach主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。一般工作方式为c/s架构,client端安装在需要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操作在一并发往elasticsearch上去。
logstach工作原理
Logstash使用管道方式进行日志的搜集处理和输出。

logstach事件处理包含三个阶段:输入input–>处理filter–>输出output;是一个接收,处理,转发日志的工具。支持系统日志,webserver日志,错误日志,应用日志,总之包括所有可以抛出来的日志类型。
Input:输入数据到logstach
  • file:从文件系统的文件中读取;
  • syslog:在514端口上监听系统日志消息;
  • redis:从redis service中读取;
  • beats:从filebeat中读取;
  • Filters:数据中间处理,对数据进行操作;
filetr:outputs是logstash处理管道的最末端组件
  • grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。
  • mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
  • drop:丢弃outputs是logstash处理管道的最末端组件一部分events不进行处理。
  • clone:拷贝 event,这个过程中也可以添加或移除字段。
  • geoip:添加地理信息(为前台kibana图形化展示使用);
  • Outputs:一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。
Output:outputs是logstash处理管道的最末端组件
  • elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
  • file:将event数据保存到文件中。
  • graphite:将event数据发送到图形化组件;
  • Codecs:codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。
Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。
Beats包含六种工具:Packetbeat(搜集网络流量数据)
Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
Filebeat(搜集文件数据)
Winlogbeat(搜集 Windows 事件日志数据)
Metricbeat(从系统和服务收集指标,发送系统和服务统计信息的轻量级方法)
Auditbeat(收集liunx审计框架数据并监视文件完整性)
ELK安装部署安装方式源码包安装和rpm包安装,本文采用rpm包安装
安装环境准备
系统centos7.0,关闭防火墙和selinux;
36作为主节点,37和38作为数据节点;
主机名以及ip地址安装版本
server36:192.168.50.136elasticsearch6.4 ,kibana6.4
server37:192.168.50.137elasticsearch6.4,logstach6.4
server38:192.168.50.138elasticsearch6.4elasticsearch是基于java开发的,需要节点安装java
[root@server36 ~]# java -version
openjdk version “1.8.0_181”
OpenJDK Runtime Environment (build 1.8.0_181-b13)
OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)
主节点安装:
[root@server36 ~]# rpm -ivh elasticsearch-6.4.0.rpm
[root@server36 ~]# rpm -ivh kibana-6.4.0-x86_64.rpm
数据节点1安装:
[root@server6 ~]# rpm -ivh elasticsearch-6.4.0.rpm
[root@server6 ~]# rpm -ivh logstash-6.4.0.rpm
数据节点2安装:
[root@server38 ~]# rpm -ivh elasticsearch-6.4.0.rpm
elasticsearch的配置文件:
[root@server36 ~]# ll /etc/elasticsearch/
total 28
-rw-rw----. 1 root elasticsearch  207 Sep 26 16:10 elasticsearch.keystore
-rw-rw----. 1 root elasticsearch 3009 Aug 18 07:23 jvm.options
-rw-rw----. 1 root elasticsearch 6380 Aug 18 07:23 log4j2.properties
|  |  |
|–|--|
|  |  |
主节点修改配置文件:
[root@server36 ~]# vim /etc/elasticsearch/elasticsearch.yml集群的名字:17 cluster.name: my-ELK节点名字和描述:23 node.name: master24 node.master: true25 node.data: false数据存放目录:path.data: /var/lib/elasticsearch日志存放目录:path.logs: /var/log/elasticsearch是否锁定内存大小:#bootstrap.memory_lock: true启动集群后监听的ip地址:57 network.host: 192.168.50.136集群默认使用的端口:61 http.port: 9200检测集群的节点:70 discovery.zen.ping.unicast.hosts: ["192.168.50.136", "192.168.50.137", "192.168.50.138"]

将修改的文件scp给其他节点:
[root@server36 ~]# scp /etc/elasticsearch/elasticsearch.yml root@192.168.50.137:/etc/elasticsearch/root@192.168.50.137's password: elasticsearch.yml                                                                    100% 2923     1.6MB/s   00:00    [root@server36 ~]# scp /etc/elasticsearch/elasticsearch.yml root@192.168.50.138:/etc/elasticsearch/root@192.168.50.138's password: elasticsearch.yml                                                                    100% 2923     2.7MB/s   00:00   

数据节点1做如下修改:
节点名字和描述:
23 node.name: data-node1
24 node.master: false
25 node.data: true
57 network.host: 192.168.50.137
数据节点2做如下修改:
节点名字和描述:
23 node.name: data-node2
24 node.master: false
25 node.data: true
57 network.host: 192.168.50.138
开始启动集群的节点,启动主节点:
[root@server36 ~]# systemctl start elasticsearch.service
[root@server36 ~]# systemctl status elasticsearch.service  #查看状态
[root@server36 ~]# systemctl enable elasticsearch.service
依次启动数据节点:
[root@server37 ~]# systemctl start elasticsearch.service
[root@server37 ~]# systemctl status elasticsearch.service
[root@server37 ~]# systemctl enable elasticsearch.service
[root@server38 ~]# systemctl start elasticsearch.service
[root@server38 ~]# systemctl status elasticsearch.service
[root@server38 ~]# systemctl enable elasticsearch.service
如果服务没有启动,查看日志:
[root@server36 ~]# tail -f /var/log/messages
[root@server36 ~]# ls /var/log/elasticsearch/
gc.log.0.current   my-ELK_deprecation.log             my-ELK_index_search_slowlog.log
my-ELK_access.log  my-ELK_index_indexing_slowlog.log  my-ELK.log
查看服务端口是否正常:9300端口是集群通信用的,9200则是数据传输时用的。
[root@server36 ~]# netstat -lnpt | grep javatcp6       0      0 :::9200                 :::*                    LISTEN      9550/java           tcp6       0      0 :::9300                 :::*                    LISTEN      9550/java           [root@server36 ~]# ps aux | grep elasticsearchelastic+   9550  2.1 64.8 3240592 647164 ?      Ssl  17:32   0:25 /bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.vVmOUXxj -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/var/log/elasticsearch/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=rpm -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quietelastic+   9598  0.0  0.0  72136   704 ?        Sl   17:32   0:00 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controllerroot       9701  0.0  0.0 112704   976 pts/0    R+   17:53   0:00 grep --color=auto elasticsearch

其他节点服务以及端口正常!
检查集群健康状况
[root@server36 ~]# curl -XGET 'http://192.168.50.136:9200/_cluster/health?pretty'{  "cluster_name" : "ELK",  "status" : "green",   #green表示正常  "timed_out" : false,      "number_of_nodes" : 3,  #3表示三个节点  "number_of_data_nodes" : 2,  #2个数据节点  "active_primary_shards" : 0,  "active_shards" : 0,  "relocating_shards" : 0,  "initializing_shards" : 0,  "unassigned_shards" : 0,  "delayed_unassigned_shards" : 0,  "number_of_pending_tasks" : 0,  "number_of_in_flight_fetch" : 0,  "task_max_waiting_in_queue_millis" : 0,  "active_shards_percent_as_number" : 100.0}

检查集群状态
[root@server36 ~]# curl -XGET 'http://192.168.50.136:9200/_cat/nodes'192.168.50.136 10 93 6 0.88 0.58 0.25 mi * master     *号表示master192.168.50.138 12 92 6 0.04 0.14 0.07 di - data-node2192.168.50.137 10 90 7 0.23 0.25 0.11 di - data-node1

检查集群详细状况
[root@server36 ~]# curl -XGET 'http://192.168.50.136:9200/_cluster/state/nodes?pretty'{  "cluster_name" : "ELK",  "compressed_size_in_bytes" : 9581,  "cluster_uuid" : "5ngUJ2q-S7WfQFaHAVvDhA",  "nodes" : {    "qA-0RcdDQy2vOOXK-64Zxw" : {      "name" : "master",      "ephemeral_id" : "a0I-6I2dRKOX935IlN95tQ",      "transport_address" : "192.168.50.136:9300",      "attributes" : {        "ml.machine_memory" : "1021906944",        "xpack.installed" : "true",        "ml.max_open_jobs" : "20",        "ml.enabled" : "true"      }    },    "VOfo7P6WQHWxx118ryjDJQ" : {      "name" : "data-node2",      "ephemeral_id" : "1Va2eWFKQgK042Dg7WjKeQ",      "transport_address" : "192.168.50.138:9300",      "attributes" : {        "ml.machine_memory" : "1021906944",        "ml.max_open_jobs" : "20",        "xpack.installed" : "true",        "ml.enabled" : "true"      }    },    "Si8PXyDARyGoGTcIxqKwNQ" : {      "name" : "data-node1",      "ephemeral_id" : "NXTrnH-mR_KCk7Yii0hn3w",      "transport_address" : "192.168.50.137:9300",      "attributes" : {        "ml.machine_memory" : "1910050816",        "ml.max_open_jobs" : "20",        "xpack.installed" : "true",        "ml.enabled" : "true"      }    }  }}

此时我们的集群已经搭建成功!
安装kibana
[root@server36 ~]# rpm -ivh kibana-6.4.0-x86_64.rpm
配置文件修改
[root@server36 ~]# vim /etc/kibana/kibana.yml
2 #server.port: 5601    #监听端口
7 server.host: “192.168.50.136”   #安装kibana服务器ip
27 # The URL of the Elasticsearch instance to use for all your queries.
28 elasticsearch.url: “http://192.168.50.136:9200”  #连接地址
97 logging.dest: /var/log/kibana.loet   #配置kibana的日志文件路经
创建日志文件
[root@server36 ~]# touch /var/log/kiban.log
[root@server36 ~]# chmod 777 /var/log/kiban.log
[root@server36 ~]# ll /var/log/kiban.log
-rwxrwxrwx. 1 root root 0 Sep 27 17:14 /var/log/kiban.log
检查监听端口
[root@server36 ~]# netstat -lnpt | grep :5601
tcp        0      0 192.168.50.136:5601     0.0.0.0:*               LISTEN      1308/node
web界面访问:192.168.50.136:5601

安装logstach
[root@server6 ~]# rpm -ivh logstash-6.4.0.rpm
安装完成先不要启动服务,先配置logstash收集syslog日志:
[root@server6 ~]# vim /etc/logstash/conf.d/syslog.confinput {  syslog {    type => "system-syslog"    port => 10514  }}output {  stdout {    codec => rubydebug  }}

检测配置文件是否有问题
[root@server6 bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf --config.test_and_exitOpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=NSending Logstash logs to /var/log/logstash which is now configured via log4j2.properties[2018-09-27T17:33:41,534][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specifiedConfiguration OK   #代表配置文件没有问题[2018-09-27T17:34:27,275][INFO ][logstash.runner          ] Using config.test_and_exit mode. Config Validation Result: OK. Exiting Logstash--path.settings 用于指定logstash的配置文件所在的目录-f 指定需要被检测的配置文件的路径--config.test_and_exit 指定检测完之后就退出

配置kibana服务的Ip和监听端口
[root@server37 bin]# vim /etc/rsyslog.conf  89 # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional90  *.* @@192.168.50.137:10514

让配置生效
[root@server6 bin]# systemctl restart rsyslog
制定配置文件,启动logstash
[root@server37 ~]# cd /usr/share/logstash/bin/
[root@server37 bin]# ./logstash --path.settings /etc/logstash/ -f /etc/logstash/conf.d/syslog.conf
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
#终端会停在这里。配置文件定义将信息输出到当前终端
打开新的窗口检查10514端口
[root@server37 ~]# netstat -lntp |grep 10514
tcp6       0      0 :::10514                ::

1 个回复

正序浏览
奈斯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马