menu

Junjielee Blog

在平凡中坚持前行,总会遇见不凡的自己

Elasticsearch介绍

这是进公司以来,第一次分享自己学习的东西 elasticsearch...

首先我的es的实践经验,几乎为0,断断续续学习了一段时间,写过demo对nginx,uwsgi,自定义的一些日志记录进行处理,对于大量的数据的处理没有经验,其实下面的我的分享文档(PPT)很多的内容,图片也是从别的地方引入的,不过大多东西也不会根据文字内容一字一句地读吧。

下面就是我分享的内容,我不喜欢做PPT,就直接写个md文件了


What is ELK

ELK = Elasticsearch + Logstash + Kibana = 一整套大规模日志实时处理解决方案

所谓“大规模”指的是 ELK 组成的系统以一种水平扩展的方式每天支持收集、过滤、索引和存储 TB 规模以上的各类日志

elk体系架构

What is Elasticsearch

Elasticsearch是实时全文搜索和分析引擎,是基于Lucene开发的可扩展的分布式系统

  • 分布式索引、搜索。
  • 索引自动分片、负载均衡。
  • 自动发现机器、组建集群。
  • 支持Restful 风格接口。
  • 配置简单等

应用场景:

  1. 站内搜索,全文搜索:主要和 Solr 竞争,属于后起之秀。
  2. NoSQL json文档数据库:主要抢占 Mongo 的市场.
  3. 监控,统计以及日志类时间序的数据的存储和分析以及可视化:这方面是引领者。

ES分布式搜索引擎总体框架图:

ES分布式搜索引擎总体框架图

  1. Transport: 内部的节点或者集群与客户端之间的交互方式(tcp(默认),http(json格式)、thrift、servlet、memcached、zeroMQ)
  2. JMX: 监控 es not recommended
  3. Discovery: zen(默认),自动节点发现机制,es是基于 p2p 的系统。首先它它会通过以广播的方式去寻找存在的节点,然后再通过多播协议来进行节点之间的通信,于此同时也支持点对点的交互操作。
  4. Scripting: 自定义脚本,用于查询,聚合等处理返回得结果或者提供查询方案.
  5. River: 数据源,提供通过其他方式将数据索引到es,官方的river有:couchDB、RabbitMQ、Twitter、Wikipedia
  6. Gateway: 索引的持久化存储方式,es 默认是先把索引存放到内存中去,当内存满了的时候再持久化到硬盘里。
  7. Index Module: 索引模块包括分词,分片控制和分配,字段映射,索引相似性配置,慢查询记录,文件系统配置和控制事务和刷新模块。

概念

  1. 集群(Cluster)一组拥有共同的 cluster name 的节点。
  2. 节点(Node) 集群中的一个 Elasticearch 实例。
  3. 分片(Primary shard)索引的子集,索引可以切分成多个分片,分布到不同的集群节点上。分片对应的是 Lucene 中的索引(倒排索引)。
  4. 副本分片(Replica shard)每个主分片可以有一个或者多个副本。
  5. 索引 -> 类型 -> 文档 ->字段:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices   -> Types  -> Documents -> Fields

简单的操作

REST API

  1. 创建,删除索引
  2. 添加一条记录,修改,删除
  3. 搜索
  4. aggs

Mapping == Schema

dynamic-mapping 以及 schema-free

dynamic-mapping相当于根据用户提交的数据,动态检测字段类型,自动给数据库表建立表结构,也可以动态增加字段,所以它叫做schema-free,而不是schema-less。

  • 优点: 用户能一定程度享受schema-less的好处,不用提前建立表结构,同时因为实际上是有schema的,可以做查询上的优化,检索效率要比纯schema-less的数据库高许多。
  • 缺点: 已经创建的索引不能变更数据类型

类型

底层存储模型 - 倒排索引

Elasticsearch使用一种叫做倒排索引(inverted index)的结构来做快速的全文搜索。倒排索引由在文档中出现的唯一的单词列表,以及对于每个单词在文档中的位置组成。

倒排索引

探究ES操作

剖析写

Translog(预写日志、事务日志),任何最近的变更都能从translog搜索到,因此客户端可以访问到所有的近实时变更。(近实时)

Lucene的段

Lucene段

由于段合并会耗尽资源,影响搜索性能,Elasticsearch会节制合并过程,为搜索提供足够的可用资源。

删除和更新

磁盘上的每个段都有一个相应的.del文件。当删除请求发送后,文档并没有真的被删除,而是在.del文件中被标记为删除。该文档依然能匹配查询,但是会在结果中被过滤掉。当段合并时,在.del文件中被标记为删除的文档将不会被写入新段。

在新的文档被创建时,Elasticsearch会为该文档指定一个版本号。当执行更新时,旧版本的文档在.del文件中被标记为删除,新版本的文档被索引到一个新段。旧版本的文档依然能匹配查询,但是会在结果中被过滤掉。

乐观并发控制

读操作

  1. 查询
  2. 提取

剖析读

深层分页在分布式搜索中是有害的

搜索相关性

相关性是由搜索结果中Elasticsearch打给每个文档的得分决定的。默认使用的排序算法是tf/idf(词频/逆文档频率)。

词频衡量了一个词项在文档中出现的次数 (频率越高 == 相关性越高),逆文档频率衡量了词项在全部索引中出现的频率,是一个索引中文档总数的百分比(频率越高 == 相关性越低)。最后的得分是tf-idf得分与其他因子比如(短语查询中的)词项接近度、(模糊查询中的)词项相似度等的组合。

服务发现以及选举机制

  1. 节点启动后先ping(ES 的一个RPC命令)。如果 discovery.zen.pinga.unicast.hosts 有设置,则ping设置中的host,否则尝试ping localhost 的几个端口, Elasticsearch 支持同一个主机启动多个节点)
  2. Ping的response会包含该节点的基本信息以及该节点认为的master节点
  3. 选举开始,先从各节点认为的master中选,规则很简单,按照id的字典序排序,取第一个。
  4. 如果各节点都没有认为的master,则从所有节点中选择,规则同上。这里有个限制条件就是 discovery.zen.minimum_master_nodes,如果节点数达不到最小值的限制,则循环上述过程,直到节点数足够可以开始选举。
  5. 最后选举结果是肯定能选举出一个master,如果只有一个local节点那就选出的是自己。
  6. 如果当前节点是master,则开始等待节点数达到 discovery.zen.minimum_master_nodes,然后才提供服务。
  7. 如果当前节点不是master,则尝试加入master。

Elasticsearch 将以上服务发现以及选主的流程叫做 ZenDiscovery 。由于它支持任意数目的集群(1-N),所以不能像 Zookeeper/Etcd 那样限制节点必须是奇数,也就无法用投票的机制来选主,而是通过一个规则,只要所有的节点都遵循同样的规则,得到的信息都是对等的,选出来的主节点肯定是一致的。但分布式系统的问题就出在信息不对等的情况,这时候很容易出现脑裂(Split-Brain)的问题,解决方案就是设置一个`discovery.zen.minimum_master_nodes`值,要求可用节点必须大于这个值(一般是超过半数节点),才能对外提供服务。

discovery.zen.minimum_master_nodes = int(# of master eligible nodes/2)+1

Elasticsearch 插件

它支持插件机制,有丰富的插件:比如和 mongoDB、couchDB 同步的river 插件,分词插件,Hadoop 插件,脚本支持插件等。

head, kopf ...

谁在用?

Github

GitHub使用ElasticSearch搜索20TB的数据,包括13亿文件和1300亿行代码。

Foursquare

实时搜索5千万地理位置信息?Foursquare每天使用ElasticSearch做到了。

SoundCloud

SoundCloud使用ElasticSearch为1.8亿用户提供即时而精准的音乐搜索服务

Fog Creek

Elasticsearch使Fog Creek可以在400亿行代码中进行一个月3千万次的查询

StumbleUpon

Elasticsearch是StumbleUpon的关键部件,它每天为社区提供百万次的推荐服务。

友情链接

solr vs elasticsearch 功能比较

elasticsearch vs solr 性能比较

MongoDB vs. Elasticsearch: The Quest of the Holy Performances