ELK Stack是Elasticserach、Logstash、Kibana三种工具组合而成的一个日志解决方案。ELK能够将咱们的系统日志、访问日志、运行日志、错误日志等进行统一收集、存储分析和搜索以及图形展示。相比传统的CTRL+F或者数据库语句来进行数据查询,ELK支持分布式搜搜,数据量可达PB级别,检索速度更快速,接近实时处理,而且更智能,能够去掉一些没有特殊含义的词汇,好比“这,的,是”,还能够进行搜索补全与搜索纠错。java
LogStash:node
负责日志的收集,而且能够输出到指定位置,如Redis、kafka、以及最主要的ElasticSearch中,一般会在全部须要收集日志的服务器上安装Logstash,而后由Logstash agent端发送到Logstash的Server端linux
ElasticSearch:nginx
使用JAVA开发、基于Lucene搜索引擎库的全文搜索工具,经过RESTful API(一种接口设计规范,让接口更易懂)隐藏了Lucene本来的复杂性。实现了日志数据的分布式、实时分析,而且能够进行搜索补全与纠错等功能,是ELK最核心的组件。相比MySQL库和表的概念,在ES中把库叫作索引。redis
Kibana:数据库
负责数据的展现与统计,是一个图形化的管理系统。json
下面一一介绍这几个系统的安装搭建。 浏览器
一、ElasticSearch默认工做在集群模式下,扩展性很强,而且支持自动发现。因此在实验环境中须要至少2台服务器来搭建,可是为了防止脑裂,创建使用基数台服务器。在部署ElasticSearch前须要先部署JAVA环境,因此第一步是安装JDK,这里偷懒使用yum安装了openjdk,生产环境仍是建议用JDK的源码包(暂时不支持JDK 9)。ruby
1 yum install java-1.8.0-openjdk.x86_64
二、下载ElasticSearch,官网地址是www.elastic.co(不是com),其每一个Products下都有专门的文档用于参考。服务器
下载tar包解压,而后进入config目录,该目录下除了有一个主配置文件elasticsearch.yml须要配置外,还有一个jvm.options文件用于JVM的调优
1 tar zxf elasticsearch-6.3.tar.gz 2 3 cd elasticsearch-6.3/config
jvm.options文件主要是JVM优化相关,关于垃圾回收这块使用默认配置就能够了,咱们要调整的就是最大内存和最小内存的设置。一般设置为同样大小,具体的值能够设置为系统最大内存的一半或三分之二
1 -Xms1g #程序启动时占用内存的大小 2 3 -Xmx1g #程序启动后最大可占用内存的大小
三、修改ElasticSearch的配置,编辑elasticsearch.yml
1 cluster.name: my-application #集群名称,相同集群名称的节点会自动加入到该集群 2 3 node.name: r1 #节点名称,两个节点不能重复 4 5 path.data: /path/to/data #指定数据存储目录 6 7 path.logs: /path/to/logs #指定日志存储目录 8 9 network.host: 0.0.0.0 #本机地址或者4个0 10 11 http.port: 9200 #指定端口 12 13 discovery.zen.ping.unicast.hosts: ["192.168.44.130"] #集群中master节点初始化列表,经过列表中的机器来自动发现其余节点
三、运行bin/elasticsearch 启动服务(加-d是在后台运行)。启动后服务会监听在9200端口,还有个9300端口用于集群间通讯。若是配置文件中监听的端口是外网地址,在运行Elasticsearch时会遇到一些内核报错,具体报错和解决方法以下(作好配置后,须要注销用户从新登陆才会生效):
(1)don't run elasticsearch as root:
解决办法:Elasticsearch是不容许使用root用户来运行的,因此须要把ElasticSearch目录全部者修改成其余用户,并切换到该用户去执行。用浏览器打开能看到以下信息表明安装成功:
(2)Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c5330000, 986513408, 0) failed; error='Cannot allocate memory' (errno=12):
解决办法:内存不足,升级内存
(3)Exception in thread "main" java.nio.file.AccessDeniedException
解决办法:运行Elasticsearch程序的用户权限不够,把Elasticsearch目录权限修改下便可
(4)max virtual memory areas vm.max_map_count [65530] is too low
解决办法:修改/etc/sysctl.conf,增长一行vm.max_map_count= 262144。而后执行sysctl -p使其生效
(5)max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]
解决办法:修改/etc/security/limits.conf,作如下配置
1 * soft nproc 65536 2 * hard nproc 65536 3 * soft nofile 65536 4 * hard nofile 65536
(6)max number of threads [3812] for user [elkuser] is too low, increase to at least [4096]
解决办法:修改/etc/security/limits.d/20-nproc.conf,作如下配置
1 * soft nproc 4096 2 * hard nproc 4096
Elasticsearch接口说明:
ES启动后如何验证节点是否在集群中呢?ES是使用RESTful形式的接口对外提供访问,因此咱们要访问ES接口的话可使用curl命令。ES有四类API,做用大概以下:
一、用来检查集群节点、索引当前状态
二、管理集群节点、索引及元数据
三、执行增删改查操做
四、执行高级操做,例如paging,filtering
Elasticsearch 经常使用API有cat、cluster等,下面是一些简单介绍:
经过curl能够看到cat这个API下有不少子功能
一、Elasticsearch集群健康检查:
经过cat、cluster两个API均可以进行集群健康检查,green表明集群彻底正常;yellow表明集群正常,部分副本分片不正常;red表明集群故障,数据可能会丢失
1 http://localhost:9200/_cat/health 2 3 http://localhost:9200/_cat/health?v #显示信息更详尽 4 5 http://localhost:9200/_cluster/health 6 7 http://localhost:9200/_cluster/health?pretty(加上pretty会将内容格式化再输出,更美观)
二、查询全部节点列表
1 http://localhost:9200/_cat/nodes?v
三、查询全部索引
1 http://localhost:9200/_cat/indices?v
curl命令在Elasticsearch中的使用
使用curl能够经过模拟http请求的方式去建立和管理索引,经常使用选项以下:
-X:指定http的请求方法,如HEAD,POST,PUT,DELETE
-d:指定要传输的数据
-H:指定http请求头信息
一、使用curl新增索引
1 curl -XPUT "localhost:9200/blog_test?pretty" #新增一个blog_test索引
二、删除索引
1 curl -X DELETE "localhost:9200/bolg_test?pretty"
三、查询建立的索引
1 http://localhost:9200/_cat/indices?v
下面是更贴近实际操做的curl命令,插入了两条数据
1 #为blog索引新增两条记录,指定type为article,ID为2和3 2 3 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/2?pretty' -d ' 4 5 { 6 7 "title": "test", 8 9 "content":"testsfsdfdsfdsf", 10 11 "PV":10 12 13 }' 14 15 16 17 curl -XPUT -H "Content-Type: application/json" 'localhost:9201/blog/article/3?pretty' -d ' 18 19 { 20 21 "title": "test", 22 23 "content":"testsfsdfdsfdsf", 24 25 "PV":23 26 27 }'
查询索引和数据搜索
1 #经过ID来查询 2 3 curl -XGET 'localhost:9200/blog/article/2?pretty' 4 5 #指定具体的索引和type进行搜索 6 7 curl -XGET 'http://localhost:9200/blog/article/_search?q=title:test'
一、下载Logstash 6.3
依然是在ELK的官方网站www.elastic.co,本文以源码包形式进行Logstash的安装。其实Logstash的安装很简单,只要保证JDK正常运行(目前只支持JDK8),而后直接解压Logstash便可。这里咱们解压到了/usr/local/logstash下,而且创建一个软链接
1 tar zxf logstash-6.3.tar.gz 2 3 mv logstash-6.3 /usr/local/ 4 5 ln -s logstash-6.3.logstash
二、配置与命令行启动Logstash
在Logstash目录下有不少子目录,可是大多数是不用去关注和修改的(仅有2个配置文件可能须要略微修改,一个是config/logstash.yml,可能须要修改启动进程数以及日志信息;一个是jvm.options,这个和Elasticsearch是同样的,主要是优化内存)。bin目录下有启动服务须要的脚本,如今能够用命令行来启动Logstash测试是否正常(运行后多等一下子才有反应):
1 cd logstash-6.3 2 3 bin/logstash -e 'input{ stdin{} } output{ stdout{} }' #-e选项是直接用命令行模式,采用标准输入,标准输出 4 5 Settings: Default pipeline workers: 1 6 7 Pipeline main started 8 9 hello world #这里手动输入的hello world,做为标准输入 10 11 2016-05-19T01:59:03.797Z 0.0.0.0 hello world #标准输出的结果显示在屏幕 12 13 nihao 14 15 2016-05-19T02:00:20.013Z 0.0.0.0 nihao
使用codec指定输出格式(codec是一种解码编码的工具)
1 [root@server bin]# ./logstash -e 'input{ stdin{} } output{ stdout{codec => rubydebug} }' # -e选项是直接用命令行模式,输入采用标准输入,输出采用的codec风格 2 3 Settings: Default pipeline workers: 1 4 5 Pipeline main started 6 7 hello world 8 9 { 10 11 "message" => "hello world", #输入的内容 12 13 "@version" => "1", #版本号 14 15 "@timestamp" => "2016-05-19T02:09:43.921Z", #自动生成时间戳 16 17 "host" => "0.0.0.0" #数据是由哪一个节点发过来的
三、自定义Logstash配置文件
生产环境中须要用到的规则更为复杂,使用命令行显然不可取。因此能够自定义规则文件,而后让Logstash根据规则进行工做。下面是经过配置文件指定Logstash的数据输入输出的示例,配置文件里主要是写明input、output规则,filter规则是须要过滤内容时才会有:
1 input{ 2 3 stdin {} 4 5 } 6 7 8 9 output{ 10 11 stdout{ 12 13 codec => rubydebug 14 15 } 16 17 }
启动服务时加上-t选项能够检查配置文件是否正确,-f选项就是配置文件的路径
1 logstash -t -f /etc/logstash.conf
启动成功后会看到Pipeline main started这样的信息出来,这个时候咱们就能够输入信息给Logstash了,咱们输入的信息会经过标准输出显示到屏幕上,如图:
在Logstash中输入的数据咱们能够经过日志文件来获取,固然输出的数据咱们也能够指定到本身须要的容器中,如Elasticsearch里。要经过日志文件来获取输入信息的话就须要用到最经常使用的input插件——file(官方文档里有详细介绍每一个input插件的使用方式,output插件同理)。下面是一个使用file插件的简单案例,因为output依然是标准输出,因此会有疯狂刷屏的状况出现:
1 vi etc/logstash.conf 2 3 input { 4 5 file { 6 7 path => [ "/var/log/secure" ] #文件路径 8 9 type => "system" #相似打个标记,自定义 10 11 start_position => "beginning" #从文件头部读取,相反还有end 12 13 } 14 15 } 16 17 18 output { 19 20 stdout { 21 22 codec => rubydebug 23 24 } 25 26 }
file插件使用了一个sincedb文件来记录当前文件读区位置,即便从新启动服务也不会丢失文件的读取位置。默认状况下sincedb文件放在运行Logstash的用户的主目录中,能够用sincedb_path选项自定义存放路径。
总结:在实际工做中Logstash数据收集的一个流程大概是:数据源→经过input插件(如file、redis、stdin)→output插件→写到Elasticsearch。在官网文档中能够看到有不少其余input插件,如图:
下面看看如何将Logstash收集到的数据提交给Elasticsearch。这里须要使用一个output插件——elasticsearch。使用方法也很简单,只须要在配置文件里指定插件就能够了,以下:
1 [root@server ~]# cat /etc/logstash.conf 2 3 input{ 4 5 file{ 6 7 path=> "/var/log/audit/audit.log" 8 9 type=> "system" 10 11 start_position=> "beginning" 12 13 } 14 15 } 16 17 output{ 18 19 elasticsearch{ #输出到es 20 21 hosts=> ["192.168.44.129:9200","192.168.44.130:9200"] 22 23 } 24 25 }
文件设置好了后运行logstash的程序,再到Elasticsearch就能够查看到数据了
1 [root@server ~]# /usr/local/logstash/bin/logstash -f /etc/logstash.conf
在生产环境中启动Logstash都是放后台运行,咱们能够一次运行多个程序,由于Logstash不会占用端口,加-w选项能够启动多个线程,提升效率,默认是2,例:
1 nohup /logstash/bin/logstash agent -f /logstash/conf/indexer-xire.conf -w 4 &
继Elasticsearch和Logstash以后,轮到了Kibana。Kibana是为Elasticsearch提供的可视化平台,负责数据的美观展现。Kibana的安装和Logstash同样极其简单,并且不须要在每一个客户端都安装,一般想让哪台服务器做为展现就用哪台安装一个kibana,Kibana是从Elasticsearch中获取数据的,即便安装在Elasticsearch集群以外的节点也是没有问题的。
1 tar zxf kibana-6.3-linux-x64.tar.gz 2 3 mv kibana-6.3-linux-x64 /usr/local/ 4 5 ln -s /usr/local/kibana-6.3-linux-x64 /usr/local/kibana
配置很简单,修改配置文件config/kibana.yml里的如下信息便可:
1 vi config/kibana.yml 2 3 server.port: 5601 #服务端口 4 5 server.host: "0.0.0.0" #修改成本机地址 6 7 elasticsearch.url: "http://192.168.44.129:9200" #ES的地址与端口 8 9 kibana.index: ".kibana"
运行bin/kibana能够直接启动服务,可是一般是放后台运行,因此加上nohup吧(从2.x到6.x都是这个方式)
1 nohup kibana &
Kibana服务默认监控在5601端口,浏览器访问http://IP:5601能够打开Kibana的界面(不要用IE内核访问)。第一次访问Kibana会提示配置索引,输入在ES中存在的索引名字后Kibana会自动进行正则匹配(一般用Logstash发送的数据索引名是以logstash打头,用filebeat就是filebeat打头,固然也能够在Logstash配置文件的output段使用index选项自定义索引)
1 output { 2 3 elasticsearh { 4 5 hosts => ["http://127.0.0.1:9200"] 6 7 index => "nginx-%{+YYYY.MM.dd}" 8 9 } 10 11 }
左侧导航栏有不少选项,Discover用于和Elasticsearch交互和展现搜索结果;Visualize用于报表生成,好比有一个银行系统,里面有不少用户,如今想统计每一个存钱区间的人数,存款在1万如下有多少人,5万如下有多少人等,用这个报表系统就能够方便的进行操做。
右上角有个时间过滤器,默认是logstash索引最后15分钟的数据,没有的话就会显示No results found。点击过滤器后能够在左侧选择过滤条件,分为了快速查找(Quick)、相对时间(Relative)、绝对时间(Absolute)。
在中间部分有绿色的直方图,点击绿色区域会跳转到对应时间的数据,而且显示该时间内产生了多少数据,如图:
在页面左侧能够选择索引以及字段:
经过kibana进行全文搜索也很简单,只须要在搜索框里输入关键词,而后就会自动把匹配的日志给展现出来:
Kibana的监控页
和Nginx同样,Kibana也有一个监控页用于查看服务器当前情况,固然在生产中最好也使用Nginx作好权限审核,不要让任何人均可以登陆,Kibana监控页访问地址是http://URL/status!
至此一个高效多功能的日志系统就初步完成了。