笔记内容:搭建ELK日志分析平台(上)—— ELK介绍及搭建 Elasticsearch 分布式集群
笔记日期:2018-03-02html
需求背景:java
为何要用到ELK:node
通常咱们须要进行日志分析场景:直接在日志文件中 grep、awk 就能够得到本身想要的信息。但在规模较大也就是日志量多而复杂的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。须要集中化的日志管理,全部服务器上的日志收集汇总。常看法决思路是创建集中式日志收集系统,将全部节点上的日志统一收集,管理,访问。git
大型系统一般都是一个分布式部署的架构,不一样的服务模块部署在不一样的服务器上,问题出现时,大部分状况须要根据问题暴露的关键信息,定位到具体的服务器和服务模块,构建一套集中式日志系统,能够提升定位问题的效率。bootstrap
一个完整的集中式日志系统,须要包含如下几个主要特色:vim
而ELK则提供了一整套解决方案,而且都是开源软件,之间互相配合使用,完美衔接,高效的知足了不少场合的应用。是目前主流的一种日志系统。windows
ELK简介:浏览器
ELK是三个开源软件的缩写,分别为:Elasticsearch 、 Logstash以及Kibana , 它们都是开源软件。不过如今还新增了一个Beats,它是一个轻量级的日志收集处理工具(Agent),Beats占用资源少,适合于在各个服务器上搜集日志后传输给Logstash,官方也推荐此工具,目前因为本来的ELK Stack成员中加入了 Beats 工具因此已更名为Elastic Stack。安全
Elastic Stack包含:bash
Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特色有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。详细可参考Elasticsearch权威指南
Logstash 主要是用来日志的搜集、分析、过滤日志的工具,支持大量的数据获取方式。通常工做方式为c/s架构,client端安装在须要收集日志的主机上,server端负责将收到的各节点日志进行过滤、修改等操做在一并发往elasticsearch上去。
Kibana 也是一个开源和免费的工具,Kibana能够为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,能够帮助汇总、分析和搜索重要数据日志。
ELK Stack (5.0版本以后)--> Elastic Stack == (ELK Stack + Beats)。目前Beats包含六种工具:
关于x-pack工具:
ELK官网:
中文指南:
https://www.gitbook.com/book/chenryn/elk-stack-guide-cn/details
ELK架构图:
准备3台机器,这样才能完成分布式集群的实验,固然能有更多机器更好:
角色划分:
ELK版本信息:
配置三台机器的hosts文件内容以下:
$ vim /etc/hosts 192.168.77.128 master-node 192.168.77.130 data-node1 192.168.77.134 data-node2
而后三台机器都得关闭防火墙或清空防火墙规则。
先上官方的安装文档:
https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
我这里也是经过官方给的源进行安装,如下操做3台机器上都要执行,由于三台机器都须要安装es:
[root@master-node ~]# rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch [root@master-node ~]# vim /etc/yum.repos.d/elastic.repo # 增长如下内容 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md [root@master-node ~]# yum install -y elasticsearch
若是使用官方的源下载实在太慢的话,也能够直接下载rpm包进行安装:
[root@master-node ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.0.0.rpm [root@master-node ~]# rpm -ivh elasticsearch-6.0.0.rpm
elasticsearch配置文件在这两个地方,有两个配置文件:
[root@master-node ~]# ll /etc/elasticsearch 总用量 16 -rw-rw---- 1 root elasticsearch 2869 2月 17 03:03 elasticsearch.yml -rw-rw---- 1 root elasticsearch 2809 2月 17 03:03 jvm.options -rw-rw---- 1 root elasticsearch 5091 2月 17 03:03 log4j2.properties [root@local ~]# ll /etc/sysconfig/elasticsearch -rw-rw---- 1 root elasticsearch 1613 2月 17 03:03 /etc/sysconfig/elasticsearch [root@master-node ~]#
elasticsearch.yml
文件用于配置集群节点等相关信息的,elasticsearch
文件则是配置服务自己相关的配置,例如某个配置文件的路径以及java的一些路径配置什么的。
官方的配置文档:
https://www.elastic.co/guide/en/elasticsearch/reference/6.0/rpm.html
开始配置集群节点,在 192.168.77.128 上编辑配置文件:
[root@master-node ~]# vim /etc/elasticsearch/elasticsearch.yml # 增长或更改如下内容 cluster.name: master-node # 集群中的名称 node.name: master # 该节点名称 node.master: true # 意思是该节点为主节点 node.data: false # 表示这不是数据节点 network.host: 0.0.0.0 # 监听所有ip,在实际环境中应设置为一个安全的ip http.port: 9200 # es服务的端口号 discovery.zen.ping.unicast.hosts: ["192.168.77.128", "192.168.77.130", "192.168.77.134"] # 配置自动发现 [root@master-node ~]#
而后将配置文件发送到另外两台机器上去:
[root@master-node ~]# scp /etc/elasticsearch/elasticsearch.yml data-node1:/tmp/ [root@master-node ~]# scp /etc/elasticsearch/elasticsearch.yml data-node2:/tmp/
到两台机器上去更改该文件,修改如下几处地方:
192.168.77.130:
[root@data-node1 ~]# vim /tmp/elasticsearch.yml node.name: data-node1 node.master: false node.data: true [root@data-node1 ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes [root@data-node1 ~]#
192.168.77.134:
[root@data-node2 ~]# vim /tmp/elasticsearch.yml node.name: data-node2 node.master: false node.data: true [root@data-node2 ~]# cp /tmp/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml cp: overwrite ‘/etc/elasticsearch/elasticsearch.yml’? yes [root@data-node2 ~]#
完成以上的配置以后,到主节点上,启动es服务:
systemctl start elasticsearch.service
主节点启动完成以后,再启动其余节点的es服务。
排错记录:
我这里启动主节点的时候没有启动成功,因而查看es的日志,可是却并无生成,那就只能去看系统日志了:
[root@master-node ~]# ls /var/log/elasticsearch/ [root@master-node ~]# tail -n50 /var/log/messages
错误日志以下:
如图,能够看到是JDK的路径配置得不对,无法在PATH里找到相应的目录。
因而查看JAVA_HOME环境变量的值指向哪里:
[root@master-node ~]# echo $JAVA_HOME /usr/local/jdk1.8/ [root@master-node ~]# ls /usr/local/jdk1.8/ bin db javafx-src.zip lib man release THIRDPARTYLICENSEREADME-JAVAFX.txt COPYRIGHT include jre LICENSE README.html src.zip THIRDPARTYLICENSEREADME.txt [root@master-node ~]#
发现指向的路径并无错,那就多是忘记在profile里写export了,因而在profile的末尾加上了这一句:
export JAVA_HOME JAVA_BIN JRE_HOME PATH CLASSPATH
使用source命令从新加载了profile以后,从新启动es服务,可是依旧启动不起来,因而我发现我忽略了一条错误日志:
这是没法在环境变量中找到java可执行文件,那就好办了,作一个软连接过去便可:
[root@master-node ~]# ln -s /usr/local/jdk1.8/bin/java /usr/bin/
再次启动es服务,此次就终于启动成功了:
[root@master-node ~]# systemctl restart elasticsearch.service [root@master-node ~]# ps aux |grep elasticsearch elastic+ 2655 9.4 31.8 3621592 1231396 ? Ssl 15:42 0:14 /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.4M9NarAc -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -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 -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet root 2735 0.0 0.0 112660 968 pts/0 S+ 15:44 0:00 grep --color=auto elasticsearch [root@master-node ~]# netstat -lntp |grep java # es服务会监听两个端口 tcp6 0 0 :::9200 :::* LISTEN 2655/java tcp6 0 0 :::9300 :::* LISTEN 2655/java [root@master-node ~]#
9300端口是集群通讯用的,9200则是数据传输时用的。
主节点启动成功后,依次启动其余节点便可,我这里其余节点都是启动正常的。
集群的健康检查:
[root@master-node ~]# curl '192.168.77.128:9200/_cluster/health?pretty' { "cluster_name" : "master-node", "status" : "green", # 为green则表明健康没问题,若是是yellow或者red则是集群有问题 "timed_out" : false, # 是否有超时 "number_of_nodes" : 3, # 集群中的节点数量 "number_of_data_nodes" : 2, # 集群中data节点的数量 "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@master-node ~]#
查看集群的详细信息:
[root@master-node ~]# curl '192.168.77.128:9200/_cluster/state?pretty' { "cluster_name" : "master-node", "compressed_size_in_bytes" : 354, "version" : 4, "state_uuid" : "QkECzZHVQJOXB7K_9CgXYQ", "master_node" : "SGez5oKUTa2eIijLp8MsLQ", "blocks" : { }, "nodes" : { "4sJURH6cTsykgLberJ6pVw" : { "name" : "data-node1", "ephemeral_id" : "t16_uw92T5ajJqp2HWodrg", "transport_address" : "192.168.56.128:9300", "attributes" : { } }, "SGez5oKUTa2eIijLp8MsLQ" : { "name" : "master", "ephemeral_id" : "eJZX20tpSNyJCHgBIC4x4Q", "transport_address" : "192.168.77.128:9300", "attributes" : { } }, "nZ4L5-KwSdirnluhJTGn7Q" : { "name" : "data-node2", "ephemeral_id" : "pQENcoUcRY6fTs7SamX2KQ", "transport_address" : "192.168.77.134:9300", "attributes" : { } } }, "metadata" : { "cluster_uuid" : "jZPv-awrQDe163Nu3y2hHw", "templates" : { }, "indices" : { }, "index-graveyard" : { "tombstones" : [ ] } }, "routing_table" : { "indices" : { } }, "routing_nodes" : { "unassigned" : [ ], "nodes" : { "nZ4L5-KwSdirnluhJTGn7Q" : [ ], "4sJURH6cTsykgLberJ6pVw" : [ ] } }, "restore" : { "snapshots" : [ ] }, "snapshot_deletions" : { "snapshot_deletions" : [ ] }, "snapshots" : { "snapshots" : [ ] } } [root@master-node ~]#
检查没有问题后,咱们的es集群就搭建完成了,很简单。
这个集群的状态信息也能够经过浏览器查看:
可是显示出来的也是一堆字符串,咱们但愿这些信息能以图形化的方式显示出来,那就须要安装kibana来为咱们展现这些数据了。
更多使用curl命令操做elasticsearch的内容,可参考如下文章: