日志分析是咱们运维解决系统故障、发现问题的主要手段。为了能够集中管理多台服务器的日志记录,开源实时日志分析ELK平台应用而生,ELK由Elasticsearch、Logstash和Kibana三个开源工具组成,这三个工具能够分别部署在不一样的服务器上,而且相互关联,不过须要收集哪台服务器的日志,就必须在该服务器上部署Logstash。ELK的官网是:https://www.elastic.co/cn/
.前端
ELK的工做原理以下(懂得其中原理,才可部署一个高可用的ELK平台):
Logstash收集APPServer(应用服务器)产生的log,并存放到Elasticsearch群集中,而Kibana则从Elasticsearch群集中查询数据生成图表,在返回给browser(浏览器)。简单来讲,进行日志处理分析,通常须要如下几个步骤:java
- Logstash将日志进行集中化管理。
- 将日志格式化(Logstash)并输出到Elasticsearch。
- Elasticsearch对格式化后的数据进行索引和存储。
- Kibana对前端数据的展现。
搭建ELK平台:node
1、准备工做:linux
一、Node一、Node2节点内存最少分配4G,Apache节点无所谓。
二、下载所需软件包:https://pan.baidu.com/s/1aP7GDiRBdXzCZBbgiP1fAw
提取码:spuh
复制这段内容后打开百度网盘手机App,操做更方便哦三台服务器都要挂载我提供的.iso文件。
三、修改节点服务器名称,并经过本地/etc/hosts配置域名解析,检查Java环境,必须是Java 1.8或更高的版本
四、放行防火墙相关端口的流量,为了方便我直接关闭了防火墙。
五、全部服务器的时间最好同步,能够搭建时间同步服务器,也可手动同步。
node1节点配置:数据库
[root@node1 /]# hostname # 修改主机名 node1 [root@node1 /]# vim /etc/hosts # 配置解析文件,添加以下两行 ............................ 192.168.1.10 node1 192.168.1.20 node2 [root@node1 /]# java -version # 检查Java环境 openjdk version "1.8.0_102" OpenJDK Runtime Environment (build 1.8.0_102-b14) OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)
node2节点配置(跟node1基本类似):apache
[root@node2 /]# hostname # 修改主机名 node2 [root@node2 /]# vim /etc/hosts # 编写解析配置文件 .............................. 192.168.1.10 node1 # 添加 192.168.1.20 node2 # 添加 [root@node2 /]# java -version # 检查Java环境 openjdk version "1.8.0_102" OpenJDK Runtime Environment (build 1.8.0_102-b14) OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode)
2、安装Elasticsearch:
一、node1配置:npm
[root@node1 /]# mount /dev/sr0 /media/ # 挂载elk软件包 [root@node1 /]# cd /media/ [root@node1 media]# cp * /usr/src/ # 复制全部文件 [root@node1 media]# cd /usr/src/ [root@node1 src]# rpm -ivh elasticsearch-5.5.0.rpm # 安装 [root@node1 src]# systemctl daemon-reload [root@node1 src]# systemctl enable elasticsearch.service [root@node1 /]# vim /etc/elasticsearch/elasticsearch.yml #修改主配置文件 #修改以下,注意删除注释符号 cluster.name: my-elk-cluster #群集名字 node.name: node1 #节点名字 path.data: /data/elk_data #数据存放路径 path.logs: /var/log/elasticsearch/ #日志存放路径 bootstrap.memory_lock: false #在启动的时候不锁定内存 network.host: 0.0.0.0 #提供服务绑定的IP地址,0.0.0.0表明全部地址 http.port: 9200 #侦听端口 discovery.zen.ping.unicast.hosts: ["node1", "node2"] #群集发现经过单播实现 [root@node1 /]# mkdir -p /data/elk_data #建立数据存放目录 [root@node1 /]# chown elasticsearch:elasticsearch #更改属主及属组 /data/elk_data/ [root@node1 /]# systemctl start elasticsearch.service # qi'do启动服务 [root@node1 /]# netstat -anpt | grep 9200 #端口号不会立马看到,启动服务后再等待十秒左右才可查看到 tcp6 0 0 :::9200 :::* LISTEN 3992/java
二、node2配置:bootstrap
[root@node2 /]# mount /dev/sr0 /media/ # 挂载elk软件包 [root@node2 /]# cd /media/ [root@node2 media]# cp * /usr/src/ [root@node2 /]# cd /usr/src/ [root@node2 src]# rpm -ivh elasticsearch-5.5.0.rpm # 安装 [root@node2 src]# systemctl daemon-reload [root@node2 src]# systemctl enable elasticsearch.service [root@node2 /]# scp root@192.168.1.10:/etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/ # 将node1配置文件复制过来 The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established. ECDSA key fingerprint is 68:df:0f:ac:c7:75:df:02:88:7d:36:6a:1a:ae:27:23. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.1.10' (ECDSA) to the list of known hosts. root@192.168.1.10's password: # 输入密码 elasticsearch.yml 100% 2853 2.8KB/s 00:00 [root@node2 /]# vim /etc/elasticsearch/elasticsearch.yml #稍做修改 node.name: node2 #就更改一下节点名称便可,其他不变 [root@node2 /]# mkdir -p /data/elk_data # 建立数据存放目录 [root@node2 /]# chown elasticsearch:elasticsearch /data/elk_data/ # 设置属主属组 [root@node2 /]# systemctl start elasticsearch.service [root@node2 /]# netstat -anpt | grep 9200 tcp6 0 0 :::9200 :::* LISTEN 4074/java
三、查看节点信息:
node1:
node2:
访问http://192.168.1.10:9200/_cluster/health?pretty 查看群集的健康状态:
访问http://192.168.1.10:9200/_cluster/state?pretty 查看群集的状态信息:
经过以上方式查看群集状体对咱们显示的并不友好,能够经过安装Elasticsearch-head插件,能够更方便的管理群集:
.
在node1安装Elasticsearch-head插件(须要提早安装node和phantomjs):vim
[root@node1 /]# cd /usr/src/ [root@node1 src]# tar zxf node-v8.2.1.tar.gz # 解压node源码包 [root@node1 src]# cd node-v8.2.1/ [root@node1 node-v8.2.1]# ./configure && make && make install #安装,时间较长,约需40分钟左右 [root@node1 src]# tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 [root@node1 src]# cd phantomjs-2.1.1-linux-x86_64/bin/ [root@node1 bin]# cp phantomjs /usr/local/bin/ #复制该文件到指定目录 [root@node1 src]# tar zxf elasticsearch-head.tar.gz [root@node1 src]# cd elasticsearch-head/ [root@node1 elasticsearch-head]# npm install # 安装依赖包 [root@node1 elasticsearch-head]# vim /etc/elasticsearch/elasticsearch.yml #编辑主配置文件,在任意位置添加以下两行: http.cors.enabled: true #添加该行,开启跨域访问支持 http.cors.allow-origin: "*" #添加该行,跨域访问容许的域名地址 [root@node1 elasticsearch-head]# systemctl restart elasticsearch.service # 重启服务使配置生效 [root@node1 elasticsearch-head]# npm run start & #设置服务后台启动,若是前台启动,一旦关闭中断,服务也将关闭。 #而且启动服务时,必须在解压后的elasticsearch-head下启动服务, #进程会读取该目录下的一个文件,不然可能启动失败。 [root@node1 /]# netstat -anpt | grep 9100 tcp 0 0 0.0.0.0:9100 0.0.0.0:* LISTEN 49967/grunt [root@node1 /]# netstat -anpt | grep 9200 tcp6 0 0 :::9200 :::* LISTEN 49874/java
经过浏览器访问http://192.168.1.10:9100 来查看群集信息:
四、安装Kibana(可单独安装在一台服务器上,本人囊中羞涩、资源有限,因此安装在了node1上):跨域
[root@node1 /]# cd /usr/src/ [root@node1 src]# rpm -ivh kibana-5.5.1-x86_64.rpm [root@node1 src]# systemctl enable kibana.service [root@node1 src]# vim /etc/kibana/kibana.yml ........................ // 省略部份内容 server.port: 5601 #Kibana打开的端口 server.host: "0.0.0.0" #Kibana侦听的地址,0.0.0.0表明该主机上的全部地址 elasticsearch.url: "http://192.168.1.10:9200" #和Elasticsearch创建链接 kibana.index: ".kibana" #在Elasticsearch中添加.kibana索引 [root@node1 src]# systemctl start kibana.service
五、配置apache服务器(自行搭建网站):
[root@Web ~]# systemctl start httpd #启动httpd服务 [root@Web ~]# java -version #检查Java环境是否为1.8 openjdk version "1.8.0_102" OpenJDK Runtime Environment (build 1.8.0_102-b14) OpenJDK 64-Bit Server VM (build 25.102-b14, mixed mode) [root@Web ~]# mount /dev/cdrom /media #挂载我提供的.iso文件 mount: /dev/sr0 写保护,将以只读方式挂载 [root@Web ~]# cd /media [root@Web media]# rpm -ivh logstash-5.5.1.rpm #安装logstash [root@Web media]# systemctl daemon-reload [root@Web media]# systemctl enable logstash.service #设置开机自启动 [root@Web media]# cd /etc/logstash/conf.d/ #切换至指定路径 [root@Web conf.d]# vim apache_log.conf #编辑采集apache日志文件和系统日志 #如下就以系统日志为例作解释,其他的照着来就行,格式都差很少 input { file{ path => "/var/log/messages" #指定要收集的日志文件 type => "system" #指定类型为system,能够自定义,type值和output{ } 中的type对应便可 start_position => "beginning" #从开始处收集 } file{ path => "/etc/httpd/logs/access_log" type => "access" start_position => "beginning" } file{ path => "/etc/httpd/logs/error_log" type => "error" start_position => "beginning" } } output { if [type] == "system" { #若是type为system, elasticsearch { #就输出到Elasticsearch服务器 hosts => ["192.168.1.10:9200"] #Elasticsearch监听地址及端口 index => "system-%{+YYYY.MM.dd}" #指定索引格式 } } if [type] == "access" { elasticsearch { hosts => ["192.168.1.10:9200"] index => "apache_access-%{+YYYY.MM.dd}" } } if [type] == "error" { elasticsearch { hosts => ["192.168.1.10:9200"] index => "apache_error-%{+YYYY.MM.dd}" } } } #写完保存退出便可。 [root@Web ~]# chmod o+r /var/log/messages #赋予该目录其余人的读权限 [root@Web conf.d]# ln -s /usr/share/logstash/bin/logstash /usr/local/bin/ #建立命令软链接 [root@Web conf.d]# systemctl start logstash #启动服务 [root@Web conf.d]# logstash -f apache_log.conf & #指定刚才编写文件为Logstash的配置文件,而且在后台运行
六、建立索引:
一、经过浏览器访问 http://192.168.1.10:9100 查看索引是否建立:
关于索引,有几个很重要的概念:
刚才建立的索引,在我标记红框中,能够看到node1和node2对应的位置,都有绿色背景的0、一、二、三、四、5表示是该索引被分为了5个分片,其中由于在Logstash中指定的Elasticsearch服务器是node1,因此node1的分片是主分片,node2会自动同步node1的分片,node2的分片为备份分片,称为副本,用来提供数据冗余及负载分担。默认状况下,Elasticsearch自动对索引请求进行负载分担。
.
如今访问http://192.168.1.10:5601 登陆到Kibana,添加索引:
关于apache的错误日志索引,自行添加便可,添加完毕后,单击“discover”便可,在下面的下拉列表选择一个索引,如apache_access-,能够查看相应的图表及日志信息: