一般大型系统是一个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
一个完整的集中式日志系统,需要包含以下几个主要特点:
- 收集-能够采集多种来源的日志数据
- 传输-能够稳定的把日志数据传输到中央系统
- 存储-如何存储日志数据
- 分析-可以支持 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 :: |
|