大数据搜索与日志挖掘及可视化方案:ELK Stack:Elasticsearch、Logstash、Kibana (第2版)
上QQ阅读APP看书,第一时间看更新

1.2 走进Elasticsearch

1.2.1 相关概念

Elasticsearch 2.1.X在速度、安全性、可扩展性、硬件有效性等方面又有新提升。它提供新的基于Geo的和管道聚合的功能来实现更有效的数据分析,并能与安全控件Shield、监控控件Marvel、警报控件Watcher等更好地配合使用。参照参考文献[百度,2014],这里给出Elasticsearch中部分概念的解释。

(1)Cluster和Node:Elasticsearch中的Cluster是对外提供搜索服务的集群,组成这个Cluster的各个节点叫做Node。Node是Elasticsearch运行的实例;集群Cluster是一组有着同样cluster.name的节点,它们协同工作,互相分享数据,提供故障转移和扩展的功能。Node可分为IndexNode(提供读写)、DataNode(只提供数据存储和访问,负载均衡)等。节点之间是对等关系的(去中心化),而弱化的Master节点只不过多了维护集群状态的功能。每个节点上面的集群状态数据都是实时同步的。如果Master节点出故障,按照预定的程序,另一台Node机器会就被选举成为新的Master。从这点来看,它比某些大数据处理平台的鲁棒性强[Fu,2015]

(2)Shards:Elasticsearch将一个完整的索引分成若干部分,每个部分就是一个Shards,每个Shards实际上就是一个基于Lucene的索引。Shards存储在相同或不同的Node上;Shards的数量一般在索引创建前指定,且索引创建后不能更改(其初始配置也是可以修改的)。检索时,Elasticsearch会将查询发送到不同的Shards上并将返回结果合并,这个过程对用户来说是透明的。

(3)Replicas:Replicas是索引的冗余备份,可用于防止数据丢失或用来做负载均衡。一般地,Elasticsearch会自动对搜索请求进行负载均衡。

(4)Recovery:在有节点加入或退出集群Cluster或故障节点重新启动时,Elasticsearch会根据机器的负载情况,对索引分片Shards进行重新分配。

(5)River:River是一个运行在Elasticsearch集群内部的插件,主要用来从外部获取异构数据,然后在Elasticsearch里创建索引。常见的有couchDB river Plugin、RabbitMQ river Plugin、Twitter river Plugin、Wikipedia river Plugin、MongoDB river Plugin、JDBC river Plugin等。

(6)Gateway:是Elasticsearch索引数据快照的存储方式,当Elasticsearch集群关闭再重新启动时,就会从Gateway中读取索引数据快照。Elasticsearch支持多种类型的Gateway,有本地文件系统(像普通的Lucene 索引一样,这也是默认方式)、分布式文件系统(如freeds)、Hadoop的HDFS和Amazon的S3云存储服务等。

:Gateway与workDir的区别:Gateway存储完整的索引数据,workDir对外提供相应查询操作;Gateway可以是本地文件系统、共享文件系统或HDFS等云存储,workDir可以是内存、本地文件系统或两者结合;Gateway被假设是可靠的、持久化的数据存储,workDir被假设是不安全的运行环境,允许数据丢失。

(7)Discovery.zen:Discovery.zen代表Elasticsearch的自动发现节点机制。Zen用来做节点自动发现和Master节点选举,Master节点负责处理节点的加入和退出以及分片Shards的重新分配。Master不是固定不变的,当前Master出故障后,其他节点自动选举产生新的Master。只有当节点准备就绪以后,该节点才会被通知可以被使用。在config/elasticsearch.yml中可以进行相应参数的设置。

:Elasticsearch是一个基于P2P的系统,它通过广播机制寻找存在的节点,再通过多播协议来进行节点间的通信,同时也支持点对点的交互。因此,需要节点发现与Master选举机制。

(8)Transport:Transport代表Elasticsearch内部节点或集群与客户端的交互方式,默认内部使用TCP协议进行交互,同时它支持HTTP(JSON格式)、Thrift、Servlet、MemCached、ZeroMQ等传输协议(通过插件方式集成)。

(9)Index、Type、Document、Field:Index是Elasticsearch存储数据的地方,可以快速高效地对索引中的数据进行全文索引,类似于关系型数据库系统中的数据库;在Index下,一般会有多个存放数据的Type,Type类似于数据库中的数据表Table,用来存放具体数据;Document是类似关系数据库的一行数据,在一个Type里的每一Document都有一个唯一的ID作为区分。这里与关系型数据库不同的是,Document不需要有固定的结构,不同文档可以具有不同的字段集合。Field类似关系数据库的某一列,是Elasticsearch数据存储的最小单位。为了更好地理解Elasticsearch中的相应概念,文献[吴晓刚,2015]中给出了相关概念在传统的关系型数据库和Elasticsearch中的对应关系,参见表1.1。

表1.1  相关概念在关系型数据库和Elasticsearch中的对应关系

(10)Mapping:Mapping定义索引下Type的字段处理规则,如索引如何建立,索引的数据类型,是否保存原始索引JSON文档,是否压缩原始JSON文档,是否需要分词处理,如何进行分词处理等。一般地,一个索引文件下能存储不同映像的类型文件。Mapping也可通过语句删除,此时对应的类型文件下的所有数据也会被删除。

1.2.2 Elasticsearch API的简单使用方式

1.非客户端方式

(1)通过HTTP方式的JSON格式进行调用。关于HTTP的相关参数设置可在elasticsearch.yml中进行相关设置(出于安全考虑,也可禁用HTTP接口,只需在配置文件中将http.enabled设置为false即可)。本书在介绍Elasticsearch的使用时,除第5章外,都是基于这种方式使用Elasticsearch API的。

(2)通过Thrift软件框架方式。Thrift结合了功能强大的软件堆栈和代码生成引擎,以构建在C++、Java等编程语言间的无缝、高效服务。可通过Thrift方式实现跨语言操作。本书第5章基于Java客户端的编程实现方法,就是基于这种方式实现的。

(3)通过MemCached方式。MemCached是分布式内存对象缓存系统,用于在动态系统中减少数据库负载并提升性能。它适合大型的分布式系统,对于单台服务器的应用,此种方式可能是不合适的。

2.客户端方式

对Java编程者来说,Elasticsearch内置了两个客户端。

(1)节点客户端:它以一个无数据节点的身份加入到集群中。换句话说,它自身是没有任何数据的,但是知道什么数据在集群中的哪一个节点上,然后就可以请求转发到正确的节点上并进行连接。

(2)传输客户端:更加轻量的传输客户端可被用来向远程集群发送请求。它不加入集群本身,而是把请求转发到集群中的节点。

这两个客户端都使用Elasticsearch的传输协议,通过9300端口与Java客户端进行通信。集群中的各个节点也是通过9300端口进行通信。

:Elasticsearch的9200端口是HTTP接口,9300端口是Transport接口。

1.2.3 部分插件简介

Elasticsearch的社区支持力度是比较大的。众多Java开源社区提供的丰富插件可以有效地帮助Elasticsearch初学者和中高级用户有效使用Elasticsearch。有些插件是可以自己安插到Elasticsearch中的,如前面提到的Head插件的安装。

1.Head

Head是一个用来监控Elasticsearch状态的客户端插件。完成该插件的安装后,用户在浏览器中输入http://ip address:9200/_plugin/head/,会打开类似图1.4的界面。图中显示了具有两个节点的结果(分别是Odin和War V,见左下角),每个节点拥有不同Index的数据(这里的三份Index分别为baike、goods和new)。

图1.4 Head界面

Head插件可以为用户(特别是初学者)提供很多便利,例如可以使用Head提供的HTTP客户端,通过HTTP的方式来操作Elasticsearch。在Head中,可以单击界面的相应标签来构建HTTP请求,辅以必要的PUT、GET等操作就能实现对应的功能。本书后续给出的例子有一部分就是基于Head插件来实现的。

2.Marvel

Marvel是Elasticsearch提供的图形化监控客户端,可以通过Marvel来查看Elasticsearch当前的各项状态指标。下面给出安装Marvel的主要步骤。

首先,将Marvel安装到Elasticsearch中,方法如下,结果如图1.5所示。

    bin/plugin install license
    bin/plugin install marvel-agent

图1.5 安装Marvel

其次,将Marvel安装到Kibana中。进入Kibana的bin目录,执行如下命令:

    bin/kibana plugin-install elasticsearch/marvel/latest

再次,分别启动Elasticsearch、Kibana。

最后,打开浏览器,输入:http://ip address:5601/app/marvel。结果如图1.6所示。

图1.6 Marvel界面

1.2.4 Elasticsearch基本架构

Elasticsearch的基本架构如图1.7所示。从该图中可以看出,Elasticsearch可以接受本地、共享、云平台上的数据;在Lucene提供的基本功能上,通过构建分布式索引,完成对大数据的加工处理。其中,Zen用来做节点自动发现和Master节点选举;EC2(Elastic Compute Cloud)借由提供Web服务的方式让使用者可以弹性地运行自己的Amazon机器映像,提供可调整的云计算能力。通过提供的Thrift、Memcached、HTTP等方式使用Elasticsearch的API。在顶层,用户可以用基于RESTful和客户端(如Java客户端)的方式来通过Elasticsearch API完成数据操作、管理等工作。

图1.7 Elasticsearch的基本架构

RESTful接口URL的格式如下:

    http://ip address:9200/<index>/<type>/[<ID>]

其中,index、type是必须提供的(index可以理解为数据库,type理解为数据表);ID是可选的(相当于数据库表中记录的主键,是唯一的。如果不提供,Elasticsearch会自动生成)。增、删、改分别对应HTTP请求的PUT、GET、DELETE方法。对于PUT方法来说,调用时如果数据不存在,就创建;如果数据已存在,则更新。Elasticsearch可能会返回一个HTTP状态码(类似“200 OK”等)以及一个JSON格式的信息体。

:Elasticsearch语句可能包括如下几部分[Fu,2015]

●相应的HTTP请求方法或者变量,如GET、POST、PUT、DELETE。

●集群中任意一个节点的访问协议、主机名以及端口。

●请求的路径。

●查询后再加上“? pretty”,可增强可读性。

●一个JSON编码的请求主体(如果需要的话)。