Elasticsearch日志分析系统
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.什么是Elasticsearch
一个采用Restful API标准的高扩展性的和高可用性的实时数据分析的全文搜索工具。高扩展性体现在Elasticsearch添加节点非常简单,基本新的节点无需做复杂的配置,接入Elasticsearch的集群就可以了,自动会被发现;高可用体现在Elasticsearch它是分布式的,每个节点它都有备份,所以down一两个节点不会出现任何问题的;实时数据分析体现在Elasticsearch它是试试的搜索平台,同时它支持PB级的这种大数据的搜索能力,从索引的一个文档到这个文档能被搜索到的时间只有一个轻微的延迟,通常是一秒,所以说它的实时性是非常高的。Elasticsearch是基于P2P的系统。它首先通过广播的机制讯早存在的节点,然后再通过这个多播协议来进行节点间的通信,同时也支持点对点的交互。
二.Elasticsearch的主要概念
Node(节点):
单个的装有Elasticsearch服务并且提供故障转移和扩展的服务器。
Cluster(集群):
一个集群就是由一个或多个node组织在一起,共同工作,共同分享整个数据具有负载均衡功能的集群。
Document(文档):
一个文档是可以被索引的基础信息单元。
Index(索引):
索引就是一个拥有几分相似特征的文档的集合。
Type(类型):
一个索引中,你可以定义一种或多种类型。
Field(列):
Field是Elasticsearchd的最小单位,相当于数据的某一列。
Shards(分片):
Elasticsearch将索引分成若干份,每个部门就是一个shard。
Replicas(复制):
Replicas是索引一份或多份拷贝。
三.Elasticsearch对应数据库的关系

我们知道Elasticsearch是NSQL,是非关系型数据库,它的Index对应关系型数据库(如MySQL)的Database,Type类型对应的就是Table,Document对应的就是Row,而Filed对应的就是Column等等。
四.Elasticsearch架构

这幅图我们先从下往上看,底层是Gateway,这个gateway就是Elasticsearch支持的索引数据的存储格式。当这个Elasticsearch关闭再启动的时候,它就会从这个gateway里面多去索引数据。图中我们可以清晰的看到它支持的一些格式,有本地的Loacal FileSystem。还有分布式的Sharad FileSeystem,当然还支持当前比较流行的Hadoop HDFS还有一些亚马逊的S3等等。
那么接下来Gateway上面这层就是Lucene的框架。这个Elasticsearch就是基于Lucene这个框架而写的。而Lucene又是基于JAVA语言编写的,也就是说如果我们想要安装es,肯定是需要安装Java虚拟机的,而对于不同的版本对于Java的版本要求也不一致,比如目前最新版本的5.6.x系列要求最低Java版本就是1.8以上哟~
而在Lucene在往上就是这个Elasticsearch对数据的加工处理方式了。我们可以看到有创建index的模块,还有搜索的模块以及mapping(定义索引下面type字段的处理规则,比如说索引如何建立,还有索引数据类型等等。相当于这个关系型数据库里的schema。)和River(它是一个运行在Elasticsearch集群内部的一个插件,主要就是用来从外部获取异构数据,然后在Elasticsearch里创建索引,常见的插件有RabbitMQ River还有Twitter River)模块。
再往上一层的第一块就是Elasticsearch自动发现节点的机制(Discovery),这个Zen是用来实现节点自动发现,还有Master节点选取用的。加入Master出现了故障,不能工作了,那么其他的这个节点会自动选举,然后产生一个新的Master。Scripting这块区域是Elasticsearch的脚本执行功能。有了这个功能就可以很方便对查询出来的数据进行加工处理,它支持mvel,js,python,Etc这样的脚本类型。那么最右边的这个3rd Plugins,它的意思说Elasticsearch支持安装很多第三方的插件(比如:中文分词,状态监控这样的插件等等,插件安装也非常简单)。因为Elasticsearch的社区支持力度是比较大的,所以说会有很多种插件提供给用户使用。这样就会让Elasticsearch使用的就更加的简单方便。
再往上一层就是正数第二次就是Elasticsearch的交互方式了。外面可以看到有三种协议,Thrift,Memcached和HTTP,默认Elasticsearch是用HTTP协议传输的。
最顶层就是Elasticsearch的API支持ID模式了,目前RESTFul这样的API接口的标准是非常流行的,所以说Elasticsearch也采用了这种标准,Elasticsearch可以支持JAVA语言,同时JAVA语言也是对Elasticsearch支持度最好的语言。因为Lucenn也是用JAVA开发的。通过JAVA当前最流行的这种开发语言,可以很好的开发处一套工具去管理和操作这个Elasticsearch。
五.对比Elasticsearch与Solr
当前采用Elasticsearch这个搜索引擎的公司特别多,包括有名的Adobe,ebay,微软,Facebook,orange,Mozilla等等。同比跟Elasticsearch这样同性质的工具也有很多,比如说solr和splunk等等。下面有一张2015年8月的搜索引起排行榜:

我们可以看到Solr排行是第一的,当这个Elasticsearch也是名列前茅,处于第二代位置,它的使用率还是挺高的。Solr和Elasticsearch都是全文搜索比较火的引擎,他们有什么区别呢?Elasticsearch侧重实时数据分析,solr在这一方面是远不及Elasticsearch的。当然,Solr支持文本格式比Elasticsearch多:比如:html,pdf,word,excel,cvs等等。而Elasticsearch只支持json的格式。所以大家在选择工具的同时,也要根据自己项目的情况去选择。这样才有利于我们项目的开展。
Elasticsearch的官网地址:https://www.elastic.co/products/elasticsearch
六.什么是RESTFul
我们知道Elasticsearch是完全基于RESTFul设计风格的全文搜索引擎,包括我们现在接触到的很多开源软件,其实很多都是基于RESTFul这种风格的。现在很流行邓凯元软件(架构),比如Openstack,它也是RESTFul风格的。接下来我们就了解一下RESTFul基本知识。
API:
Application Programming Interface的缩写,中文意思就是应用程序接口;一个程序有了API之后,程序员和运维人员就能更加方便的通过命令或者是程序去调用和使用它,使用接口其实就是通过这个接口,获取或者修改一些数据。
XML:
可扩展标记语言,是一种程序与程序之间传输数据的标记语言;它的内容都是由标签组成的,非常有规律,阅读起来也非常的简洁明了。但是XML也有不少缺点,第一,XML文件格式比较庞大复杂,输出占用带宽;第二,服务端和客户端都要花费大量的代码去解析XML,而且解析这个XML会花费资源和时间;第三,不同浏览器之间解析XML的方式不一致,需要重复并写很多代码,代码多不容易维护等等。
但是随着互联网的技术(比如微博和微信技术)的不断发展,用户对web应用的交互就越来越多了,因此数据交互也越来越频繁,如果数据形式还是以XML的话,那就会非常的复杂和花费时间。所以XML慢慢开始就废弃了,随之替代它的是另外一种更方便简洁的数据形式,即JSON。
JSON:
英文JavaScript object notation的缩写,它是一种新型的轻量级数据交换格式;它有很多优点,第一,数据格式比较简单,易于阅读,易于读写;第二,格式是压缩的,占用带宽比较小;第三,易于解析;第四,支持很多种玉玉,包括C,C++,JAVA,Perl,PHP,Python等等(当前流行玉玉都支持);第五点,JSON数据直接能为服务端的代码(程序)使用,能简化服务端以及客户端的代码开发量,这样就利于维护。正是因为这些优点,加上现在这种JS前端技术的不断发展,出现了很多前端JS的一些框架。比如说AngularJS和ExrtJS等等。有了这些成熟的JS框架工具,那么这前端和后端的开发都已经完全分离了。所以JSON这种数据交换方式就在web开发界被慢慢普及了。
使用JSON的人越来越多,大家都希望遵循一种风格去设计程序,RESTFul(Representational State Transfer)这种风格就孕育而生了。其实,REST这个词很早就提出来了,在2000年的时候,这个概念有Apache基金会的第一人主席Roy Fielding,在他的博士论文中第五章就提到过REST这个概念。REST是英文单词Representational State Transfer的缩写,中文意思是“表现层状态转化”,我们可以把它拆分理解,“表现层”它指的是“资源表现层”,这里的资源就是指网络上的信息(比如说,一段文本,一张图片,一个小电影什么的),那么每一个资源它在网络上都有全球唯一标识(URI)。所以说我们把资源具体呈现出来的这种形式叫做表现层。我们知道Elasticsearch默认是使用http协议的,而http又是一种无状态(服务端它不会去记录客户端的所有信息和操作,数据的状态它只保存在服务端)的协议,因此,如果这个客户端想要操作这个服务器,必须要通过某些方法(GET,POST,PUT,DELETE),通过这些方法,才能让服务器发生状态转化,而这种转化需要建立在“表现层”之上的。所以我们称之为表现层状态转化。
七.安装Elasticsearch
Elasticsearch官方文档地址:https://www.elastic.co/guide/en/elasticsearch/reference/current/docs.html
1.操作环境
[root@yinzhengjie ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# uname -r
2.6.-.el6.x86_64
[root@yinzhengjie ~]#
[root@yinzhengjie ~]# uname -m
x86_64
[root@yinzhengjie ~]#
2.安装jdk,配置JAVA环境变量
a>.下载Java虚拟机

b>.卸载旧版本的JAVA
[root@yinzhengjie jdk]# java -version ----->检查当前版本
java version "1.7.0_65" ------>当前版本是1.
OpenJDK Runtime Environment (rhel-2.5.1.2.el6_5-x86_64 u65-b17)
OpenJDK -Bit Server VM (build 24.65-b04, mixed mode)
[root@yinzhengjie jdk]#
[root@yinzhengjie jdk]# yum -y groupremove java* ------>卸载相关Java组件
[root@yinzhengjie jdk]# java -version ------>再次查看当前Java版本
java version "1.5.0" ------->当前版本是1.
gij (GNU libgcj) version 4.4. (Red Hat 4.4.-) Copyright (C) Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
[root@yinzhengjie jdk]#
[root@yinzhengjie jdk]# yum -y remove java*
[root@yinzhengjie jdk]# java -version ------->再次查看Java版本应该报错说明卸载成功。
-bash: /usr/bin/java: 没有那个文件或目录
[root@yinzhengjie jdk]#
c>.安装Java
[root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/jdk && cd /yinzhengjie/application/jdk
[root@yinzhengjie jdk]# yum -y install lrzsz
[root@yinzhengjie jdk]# rz ------>上传我们已经下载的文件
rz waiting to receive.
zmodem trl+C ȡ % KB KB/s :: Errorsr.gz... [root@yinzhengjie jdk]# ll
总用量
-rw-r--r--+ root root 10月 : jdk-8u151-linux-x64.tar.gz
[root@yinzhengjie jdk]#
[root@yinzhengjie jdk]# tar xf jdk-8u151-linux-x64.tar.gz
[root@yinzhengjie jdk1..0_151]# tail - /etc/profile
#ADD BY YINZHENGJIE
export JAVA_HOME=/yinzhengjie/application/jdk/jdk1..0_151
export JAVA_BIN=/yinzhengjie/application/jdk/jdk1..0_151/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
[root@yinzhengjie jdk1..0_151]#
[root@yinzhengjie jdk1..0_151]# source /etc/profile ------->重新读取该配置文件
[root@yinzhengjie jdk1..0_151]# java -version -------->再一次的检查当前JAVA版本
java version "1.8.0_151" ------->当前版本为1.8版本,表示安装成功。
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) -Bit Server VM (build 25.151-b12, mixed mode)
[root@yinzhengjie jdk1..0_151]#
3.安装Elasticsearch
a>.下载elasticsearch软件包

b>.源码安装并运行Elasticsearch
[root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/elasticsearch && cd /yinzhengjie/application/elasticsearch
[root@yinzhengjie elasticsearch]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.tar.gz
[root@yinzhengjie elasticsearch]# rz
rz waiting to receive.
zmodem trl+C ȡ % KB KB/s :: Errorsr.gz... [root@yinzhengjie elasticsearch]# tar xf elasticsearch-5.6..tar.gz
[root@yinzhengjie elasticsearch]# useradd yinzhengjie
[root@yinzhengjie elasticsearch]# chown yinzhengjie:yinzhengjie elasticsearch-5.6. -R
[root@yinzhengjie elasticsearch]# cd elasticsearch-5.6./bin/
[root@yinzhengjie bin]# su yinzhengjie
[yinzhengjie@yinzhengjie bin]$ ./elasticsearch -d ------>用非root用户在后台运行
[root@yinzhengjie ~]# lsof -i: ------>查看服务是否正常启动
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java yinzhengjie 137u IPv6 0t0 TCP localhost:wap-wsp (LISTEN)
java yinzhengjie 138u IPv6 0t0 TCP localhost:wap-wsp (LISTEN)
[root@yinzhengjie ~]#
[yinzhengjie@yinzhengjie bin]$ exit
exit
[root@yinzhengjie bin]#
[root@yinzhengjie bin]#
[root@yinzhengjie bin]# ps -ef | grep elasticsearch | grep -v grep
: pts/ :: /yinzhengjie/application/jdk/jdk1..0_151/bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction= -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF- -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread= -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/yinzhengjie/application/elasticsearch/elasticsearch-5.6. -cp /yinzhengjie/application/elasticsearch/elasticsearch-5.6./lib/* org.elasticsearch.bootstrap.Elasticsearch -d
[root@yinzhengjie bin]#
[root@yinzhengjie bin]# curl 127.0.0.1:9200 ------->用curl命令验证安装的es是否可用。
{
"name" : "uJy1--c",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "mQ8mfu3bQQGdo-jSECJQhQ",
"version" : {
"number" : "5.6.3",
"build_hash" : "1a2f265",
"build_date" : "2017-10-06T20:33:39.012Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
[root@yinzhengjie bin]#
d>.rpm安装并运行Elasticsearch
[root@yinzhengjie ~]# mkdir -pv /yinzhengjie/application/elasticsearch && cd /yinzhengjie/application/elasticsearch
[root@yinzhengjie elasticsearch]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.3.rpm
[root@yinzhengjie elasticsearch]# rpm --install elasticsearch-5.6..rpm
[root@yinzhengjie elasticsearch]#
[root@yinzhengjie elasticsearch]# ln -s `which java` /sbin/java ----->需要手动做一个软连接
[root@yinzhengjie elasticsearch]# service elasticsearch start ----->做好连接之后可用启动服务
[root@yinzhengjie elasticsearch]#
[root@yinzhengjie elasticsearch]# lsof -i: ------->检查服务是否正常启动
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java elasticsearch 135u IPv6 0t0 TCP localhost:wap-wsp (LISTEN)
java elasticsearch 137u IPv6 0t0 TCP localhost:wap-wsp (LISTEN)
[root@yinzhengjie elasticsearch]#
[root@yinzhengjie elasticsearch]# curl 127.0.0.1: ------->验证是否按照成功
{
"name" : "BAzujhz",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "7jz3RzqdTiS--VoQADAE5g",
"version" : {
"number" : "5.6.3",
"build_hash" : "1a2f265",
"build_date" : "2017-10-06T20:33:39.012Z",
"build_snapshot" : false,
"lucene_version" : "6.6.1"
},
"tagline" : "You Know, for Search"
}
[root@yinzhengjie elasticsearch]#
e>.目录结构说明(以下是源码安装的目录结构作为说明)
[root@yinzhengjie elasticsearch-5.6.]# ll
total
drwxr-xr-x. yinzhengjie yinzhengjie Oct : bin -------->运行elasticsearch实例和管理插件的一些脚本;
drwxr-xr-x. yinzhengjie yinzhengjie Oct : config --------->配置文件路径,包含elasticsearch.yml文件,注意RPM安装的存放位置应该是/etc/elasticsearch这个目录;
drwxrwxr-x. yinzhengjie yinzhengjie Oct : data --------->在每个索引/碎片的数据文件的位置,可以有多个目录;
drwxr-xr-x. yinzhengjie yinzhengjie Oct : lib ---------->elasticsearch使用的库;
-rw-r--r--. yinzhengjie yinzhengjie Oct : LICENSE.txt
drwxr-xr-x. yinzhengjie yinzhengjie Oct : logs ---------->存放日志的文件夹,注意如果是RPM方式安装的话应该在/var/log/elasticsearch这个目录里面,官网文档是有说明的。
drwxr-xr-x. yinzhengjie yinzhengjie Oct : modules
-rw-r--r--. yinzhengjie yinzhengjie Oct : NOTICE.txt
drwxr-xr-x. yinzhengjie yinzhengjie Oct : plugins --------->存放已经安装的插件的存放位置
-rw-r--r--. yinzhengjie yinzhengjie Oct : README.textile
[root@yinzhengjie elasticsearch-5.6.]#
八.Elasticsearch相关插件。
elasticsearch支持很多插件,本篇文章只介绍两个常用插件,即Head插件和Bigdesk插件。除了这两个插件,elasticsearch还支持很多的插件,如果想了解的童鞋可自行上网搜索。(使劲戳我)
1.Head插件安装
a>.Head插件介绍
head插件是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序。GitHub地址:https://github.com/mobz/elasticsearch-head。
b>.安装head插件
2.Bigdesk插件安装