CentOS7搭建开源分布式搜索平台ELK实现日志实时搜索并展示图表

    一、简介 

Elasticsearch是个基于Lucene实现的开源、分布式、restful的全文本搜索引擎,此外他还是一个分布式实时文档存储,其中每个文档的每个filed均是可被索引的数据,且可被搜索,也是一个带实时分析功能的搜索引擎,能够扩展至数以百计的节点实时处理PB级别的数据。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬件信息、检查配置过程中的错误及错误发生的原因。经常分析日志可以了解服务器的负荷,性能安全性,从而及时采取措施纠正错误。

通常,日志被分散的储存不同的设备上。如果你管理数十上百台服务器,你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。当务之急我们使用集中化的日志管理,例如:开源的syslog,将所有服务器上的日志收集汇总。集中化管理日志后,日志的统计和检索又成为一件比较麻烦的事情,一般我们使用grep、awk和wc等Linux命令能实现检索和统计,但是对于要求更高的查询、排序和统计等要求和庞大的机器数量依然使用这样的方法难免有点力不从心。因此使用一款能够自动实时收集日志的工具则完美的解决我们的问题,ELK官网提供的开源解决方案有elasticsearch、logstash、kiabana。

    ELK原理架构图:


说明:在此架构图中logstash agent负责将所有的应用服务日志收集并汇报给elasticsearch cluster集群中,而kibana则从ES集群中抽取数据生成图表,再返还给系统管理员。

    二、ELK平台搭建

①ES平台是依赖于jdk的环境基础上进行的,所以在安装elasticsearch之前需安装jdk开发环境。

②各个节点之间需做到时间同步,可使用时间服务器进行同步。

③各个节点之间能够通过主机名见名知意,方便自己的操作。

安装配置如下:

实验环境 实验所需软件
CentOS7:(kernel-3.10.0-327.el7.x86_64) elasticsearch-1.7.2.noarch.rpm
Java: Openjdk version  ”1.8.0_65″ java-1.8.0-openjdk/openjdk-devel

#本文重要通过rpm包安装其环境极其软件,可自行到相依的官网下载rpm或源码包进行编译安装。

#安装openjdk开发环境
yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel java-1.8.0-openjdk-headless
#配置其环境变量
export JAVA_HOME=/usr
source java.sh 
[[email protected] ~]# java -version
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
[[email protected] ~]#
#安装elasticsearch    
yum -y elasticsearch-1.7.2.noarch.rpm 
#编辑配置文件,不使用默认的cluster.name和node.name可根据自己业务的需求进行修改
cluster.name= alrenES     node.name= "node2.alren.com"   
#启动服务,查看其监听的9300/tcp端口
systemctl start elasticsearch.service  
[[email protected] ~]# systemctl status elasticsearch.service
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-12-05 21:05:47 CST; 19h ago
     Docs: http://www.elastic.co
 Main PID: 7143 (java)
   CGroup: /system.slice/elasticsearch.service
           └─7143 /bin/java -Xms256m -Xmx1g -Djava.awt.headless=true -XX...

Dec 05 21:05:47 node2.alren.com systemd[1]: Started Elasticsearch.
Dec 05 21:05:47 node2.alren.com systemd[1]: Starting Elasticsearch...
[[email protected] ~]#

ES集群组件:

Cluster:集群的标识为集群名称,默认为elasticsearch,节点就是靠此名字来加入到哪个集群中,一个节点只能属于一个集群。

Node:运行单个ES实例的主机即为节点,用于存储数据,参与集群索引及搜索操作,节点的表示依靠节点名称。

Shard:将索引切割成为物理存储组件,每个shard都是一个独立且完整的索引,创建索引时,ES默认将其分隔为5个shard,用户也可以按需自行定义,但一旦创建则不可修改,同时会产生一个replica副本。

ES Cluster工作流程:

启动服务时,elasticsearch会监听在9300/tcp端口上,通过多播的方式查找同一类的集群的其他节点,并与之建立通信。集群中的所有节点会选举一个主节点负责管理整个集群状态,以及在集群范围内决定shard的分布方式,站在用户的角度而言,每个节点均可接受并响应用户的各类请求。

    三、集群各管理及其操作

常用的四类API:

①检查集群、节点、索引等健康状态与否,以及获取其相关的状态

②管理集群、节点、索引及元数据

③执行CRUD操作

④执行高级操作,例如paping,filetering等

使用curl -X命令查看其节点状态信息

[[email protected] ~]# curl -X GET ‘ #?pretty则是显示  
{
  "status" : 200,#响应的状态码信息
  "name" : "node2.alren.com", #节点名
  "cluster_name" : "alrenES", #ES集群名称
  "version" : {
    "number" : "1.7.2", #elasticsearch版本
    "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
    "build_timestamp" : "2015-09-14T09:49:53Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}
[[email protected] ~]# curl -X GET  #查看支持的API接口 
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
[[email protected] ~]# curl -X GET  #查看其主节点为哪台主机 
c-iCqp3FQh27948gAsyKaw node3.alren.com 10.1.10.67 node3.alren.com
[[email protected] ~]# curl -X GET  #查看当前ES cluster集群的所有节点 
node2.alren.com 10.1.100.6  6 84 0.06 d m node2.alren.com
node4.alren.com 10.1.100.7  4 69 0.15 d m node4.alren.com
node3.alren.com 10.1.100.8 16 72 0.10 d * node3.alren.com
[[email protected] ~]# curl -X GET ‘ #查看集群状态 
{
  "cluster_name" : "alrenES", #集群名称
  "status" : "green",        #集群健康状态
  "timed_out" : false,    
  "number_of_nodes" : 3,    #集群总共的节点数量        
  "number_of_data_nodes" : 3,
  "active_primary_shards" : 8,
  "active_shards" : 16,
  "relocating_shards" : 0,
  "initializing_shards" : 0,
  "unassigned_shards" : 0,
  "delayed_unassigned_shards" : 0,
  "number_of_pending_tasks" : 0,
  "number_of_in_flight_fetch" : 0
}
[[email protected] ~]#

插件安装的两种方式:

给集群节点安装附加插件,可通插件扩展ES的功能,添加自定义的映射类型,自定义分析器,本地脚本,自定义发现方式。常用的插件有bigdesk,marvel,head,kopf等。

①直接解压插件的压缩包之或是插件放置于/usr/share/elasticsearch/plugins目录下即可

②使用全路径二进制脚本进行安装,例如:/usr/share/elasticsearch/bin/plugin -i bigdesk -u ftp://uri/bigdesk.lastest.zip ,安装完成之后可通过浏览器访问。访问的URL:http://uri:9200/_plugin/plugin_name

    插件实例图一:

   插件实例图二:

CRUD操作的相关API:增、删、改、查

1、创建文档:向索引中插入数据时将会自动创建索引

curl -X PUT ‘http://localhost:9200/students/class1/1?pretty‘ -d 
‘{
"name":"tom",
"gender":"male",
"age":21
}‘
#同理插入第二个则修改相应的值即可
curl -X PUT ‘http://localhost:9200/students/class1/2?pretty‘ -d 
‘{
"name":"jerry",
"gender":"female",
"age":21
}‘

2、获取文档:查询插入的内容

curl -X GET ‘http://localhost:9200/students/class1/1?pretty‘

3、更新文档:PUT方法会直接覆盖至原有的文档信息,想要局部的更新使用_update

curl -X POST ‘http://localhost:9200/students/class1/2/_update?pretty‘ -d 
‘{
"doc":{"age":10}
}‘

4、删除文档及其索引

curl -X DELETE ‘http://localhost:9200/students/class1/2/‘ 
curl -X DELETE ‘http://localhost:9200/students‘

5、查看当前索引

curl -X GET ‘localhost:9200/_cat/indeces?v‘

项目小实战:

IP地址、软件规划: 

IP地址 实验所需软件 环境部署 主机名
10.1.10.65
logstash-1.5.4-1

redis

openjdk-1.8.0 node1
10.1.10.66
logstash-1.5.4-1

openjdk-1.8.0
node2

10.1.10.67
elasticsearch-1.7.2

kibana-4.1.2

openjdk-1.8.0 node3

    各个节点配置如下:

#node1需安装openjdk环境及logstash、redis 
yum -y install java-1.8.0-openjdk-devel java-1.8.0-openjdk java-1.8.0-openjdk-headless
yum -y install logstash-1.5.4-1.noarch.rpm 
yum -y install redis  

#node1配配置如下:
修改/etc/redis/redis.conf
bind 0.0.0.0 
修改/etc/logstash/conf.d/apache.conf 
input {
  file {
    path    => ["/var/log/httpd/access_log"]
    type    => "httpd_log"
    start_position  => "beginning"
  }
}

filter {
  grok {
    match => {"message" => "%{COMBINEDAPACHELOG}"}
  }
}

output {
  redis {
    port  => "6379"
    host  => ["127.0.0.1"]
    data_type   => "list"
    key   => "logstash-httpd_log"
  }
}

#完成上诉步骤后,启动服务 
#启动httpd服务,进行访问,查看本机的redis是否存在数据
[[email protected] ~]# redis-cli
127.0.0.1:6379> llen logstash-httpd_log
(integer) 72
127.0.0.1:6379> LINDEX logstash-httpd_log 0
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET / HTTP/1.1\\\" 403 4897 \\\"-\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.430Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/\",\"httpversion\":\"1.1\",\"response\":\"403\",\"bytes\":\"4897\",\"referrer\":\"\\\"-\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
127.0.0.1:6379> LINDEX logstash-httpd_log 1
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET /noindex/css/bootstrap.min.css HTTP/1.1\\\" 304 - \\\"http://10.1.10.65/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.431Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/noindex/css/bootstrap.min.css\",\"httpversion\":\"1.1\",\"response\":\"304\",\"referrer\":\"\\\"http://10.1.10.65/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
127.0.0.1:6379> LINDEX logstash-httpd_log 3
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:03 +0800] \\\"GET /images/apache_pb.gif HTTP/1.1\\\" 304 - \\\"http://10.1.10.65/\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:04.431Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:03 +0800\",\"verb\":\"GET\",\"request\":\"/images/apache_pb.gif\",\"httpversion\":\"1.1\",\"response\":\"304\",\"referrer\":\"\\\"http://10.1.10.65/\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
.............
127.0.0.1:6379> LINDEX logstash-httpd_log 71
"{\"message\":\"10.1.250.79 - - [08/Dec/2016:10:32:04 +0800] \\\"GET /noindex/css/fonts/Light/OpenSans-Light.ttf HTTP/1.1\\\" 404 240 \\\"http://10.1.10.65/noindex/css/open-sans.css\\\" \\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\",\"@version\":\"1\",\"@timestamp\":\"2016-12-08T02:32:05.490Z\",\"host\":\"node1.alren.com\",\"path\":\"/var/log/httpd/access_log\",\"type\":\"httpd_log\",\"clientip\":\"10.1.250.79\",\"ident\":\"-\",\"auth\":\"-\",\"timestamp\":\"08/Dec/2016:10:32:04 +0800\",\"verb\":\"GET\",\"request\":\"/noindex/css/fonts/Light/OpenSans-Light.ttf\",\"httpversion\":\"1.1\",\"response\":\"404\",\"bytes\":\"240\",\"referrer\":\"\\\"http://10.1.10.65/noindex/css/open-sans.css\\\"\",\"agent\":\"\\\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36\\\"\"}"
127.0.0.1:6379>

#node2节点:从10.1.10.65中的redis取数据并能读取出来到elasticsearch集群中
编辑/etc/logstash/conf.d/server.conf  

input {
  redis {
    port => "6379"
    host => "10.1.10.65"
    data_type => "list"
    key  => "logstash-httpd_log"
  }
}

output {
   elasticsearch {
  	cluster => "logs"
	index   => "logstash-%{+YYYY.MM.dd}"
   }
}

#测试是否能够取得数据,使用logstash -f ./server.conf --configtest后查看node1上redis是否还存在数据
测试成功则使用:logstash -f ./server.conf & 

#node3上安装配置elasticsearch和kibana  
yum -y install elasticsearch-1.7.2.noarch.rpm
tar xf kibana-4.2.1.tar.gz -C /usr/local/ 
cd /usr/local/
ln -sv kibana-4.2.1 kibana  

#启动服务
systemctl start elasticserach.service 
/usr/local/kibana/bin/kibana &  

#查看其集群状态及绘制图表信息  
{
  "status" : 200,
  "name" : "Havok",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.2",
    "build_hash" : "e43676b1385b8125d647f593f7202acbd816e8ec",
    "build_timestamp" : "2015-09-14T09:49:53Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

实验图:

上诉为不可用状态,原因是logstash未连接至elasticsearch,elasticsearch未能从logstash中取得数据,如配置成功,将会出现create按钮,接下来将是一些图表上的操作就不过多解释和介绍。

总结:ELK是一个高度插件化的日志收集分析的软件,很多功能需借助其他辅助插件完成日志收集,想学好elk只能多看官方文档,文档地址:https://www.elastic.co/guide/index.html,朋友们只能帮助你到这了,接下来的如还很长。

时间: 2025-01-02 16:33:54

CentOS7搭建开源分布式搜索平台ELK实现日志实时搜索并展示图表的相关文章

centos7搭建伪分布式集群

centos7搭建伪分布式集群 需要 centos7虚拟机一台: jdk-linux安装包一个 hadoop-2.x安装包1个(推荐2.7.x) 一.设置虚拟机网络为静态IP(最好设成静态,为之后编程提供方便,不设置静态ip也可以) 1.进入网络配置查看ip 2.选择NAT模式链连接 3.点击NAT设置,记住网关IP,后面要用到 4.进入终端,输入命令: cd  /etc/sysconfig/network-scripts,然后 vim ./ifcfg-eth0,(有的虚拟机是文件是:ifcfg

开源分布式搜索平台ELK+Redis+Syslog-ng实现日志实时搜索

logstash + elasticsearch + Kibana+Redis+Syslog-ng ElasticSearch是一个基于Lucene构建的开源,分布式,RESTful搜索引擎.设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便.支持通过HTTP使用JSON进行数据索引. logstash是一个应用程序日志.事件的传输.处理.管理和搜索的平台.你可以用它来统一对应用程序日志进行收集管理,提供 Web 接口用于查询和统计.其实logstash是可以被别的替换,比如常见

宜信开源|分布式任务调度平台SIA-TASK的架构设计与运行流程

一.分布式任务调度的背景 无论是互联网应用或者企业级应用,都充斥着大量的批处理任务.我们常常需要一些任务调度系统来帮助解决问题.随着微服务化架构的逐步演进,单体架构逐渐演变为分布式.微服务架构.在此背景下,很多原先的任务调度平台已经不能满足业务系统的需求,于是出现了一些基于分布式的任务调度平台. 1.1 分布式任务调度的演进 在实际业务开发过程中,很多时候我们无可避免地需要使用一些定时任务来解决问题.通常我们会有多种解决方案:使用 Crontab 或 SpringCron (当然这种情况可能机器

开源分布式任务调度平台Cuckoo-Schedule

1         概述 1.1      平台概述 Cuckoo-Schedule是基于Quartz-Schedule的轻量级任务调度框架,具有易学习.易上手.开发高效稳定的特点.Demo地址:http://cuckoo.hellosr.com,测试用户:guest,密码:123456. Cuckoo-Schedule对调度模块与执行模块进行解耦,调度模块支持集部署.任务分组.任务依赖.权限管理.邮件告警.调度日志记录等功能,并提供WEB页面对任务进行管理,支持任务实时调度情况的查看.变更以及

Lucene.net 实现近实时搜索(NRT)和增量索引

Lucene做站内搜索的时候经常会遇到实时搜索的应用场景,比如用户搜索的功能.实现实时搜索,最普通的做法是,添加新的document之后,调用 IndexWriter 的 Commit 方法把内存中的索引提交到硬盘:然后重新打开IndexReader,进行搜索.但是索引一般存储在硬盘上,而且当索引文件比较大的时候,Commit操作和重新打开IndexReader效率比较低. 于是就想,可否一份索引的IndexWriter始终打开,当需要添加或删除Document时,直接调用该IndexWrite

elk开源分布式日志分析平台

elk 开源分布式日志分析平台 一.简介1.核心组成2.三大组件3.elk 的工作流程4.elk 的帮助手册二.Logstash 和 elasticsearch(elasticsearch 和 logstash 依赖 java环境)1.java2.nginx 的安装3.redis 的安装4.安装 elasticsearch5.安装 logstash6.安装 kibana三.检验 elk 的日志结果 一.简介1.核心组成>.elk 由 Elasticsearch,Logstash 和 Kibana

搭建部署 分布式ELK平台 (一)

搭建部署 分布式ELK平台 ELK 是什么 ? ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写 – Elasticsearch:负责日志检索和储存 – Logstash:负责日志的收集和分析.处理 – Kibana:负责日志的可视化 这三款软件都是开源软件,通常是配合使用,而且又先后归于 Elastic.co 公司名下,故被简称为 ELK ELK 能做什么? ? ELK组件在海量日志系统的运维中,可用于解决: – 分布式日志数据集中式查询和管理 – 系统监控,包含系统

centos7搭建ELK Cluster日志分析平台(一)

应用场景:ELK实际上是三个工具的集合,ElasticSearch + Logstash + Kibana,这三个工具组合形成了一套实用.易用的监控架构, 很多公司利用它来搭建可视化的海量日志分析平台. 官网下载地址:https://www.elastic.co/downloads  Elasticsearch: 一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口. Elasticsearch是用Java开发的,并作为Apache许可条款

centos7搭建ELK Cluster集群日志分析平台(三)

续  centos7搭建ELK Cluster集群日志分析平台(一) 续  centos7搭建ELK Cluster集群日志分析平台(二) 已经安装好elasticsearch 5.4集群和logstash 5.4 安装kibana步骤 1.下载安装Kibana  ~]#wget https://artifacts.elastic.co/downloads/kibana/kibana-5.4.0-x86_64.rpm 如果链接失效,官网下载:https://www.elastic.co/down