Elasticsearch 从入门到精通(一):基本介绍
- 1.Elasticsearch
- 2.Elasticsearch 使用案例
- 3.Elasticsearch 对比 Solr
- 4.Elasticsearch 基本概念及架构
- 4.1 Elasticsearch 基本概念
- 4.1.1 索引 index
- 4.1.2 映射 mapping
- 4.1.3 字段 Field
- 4.1.4 类型 Type
- 4.1.5 文档 document
- 4.1.6 集群 cluster
- 4.1.7 节点 node
- 4.1.8 分片和副本 shards & replicas
- 4.1.8.1 分片
- 4.1.8.2 副本
- 4.2 Elasticsearch 基本架构
1.Elasticsearch
Elasticsearch 是一个基于 Apache Lucene 的 开源搜索引擎。无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。
特点:
- 分布式的实时文件存储,每个字段都被索引并可被搜索
- 分布式的实时分析搜索引擎 —— 做不规则查询
- 可以扩展到上百台服务器,处理 PB 级结构化或非结构化数据
Elasticsearch 也使用 Java 开发,并使用 Lucene 作为其核心来实现所有索引和搜索的功能,但是它的目的是通过简单的 RESTful API 来隐藏 Lucene 的复杂性,从而让全文搜索变得简单。
ES 能做什么?
- 全文检索(全部字段)
- 模糊查询(搜索)
- 数据分析(提供分析语法,例如聚合)
2.Elasticsearch 使用案例
- 2013 年初,GitHub 抛弃了 Solr,采取 Elasticsearch 来做 PB 级的搜索。“GitHub 使用 Elasticsearch 搜索 20TB 的数据,包括 13 亿文件和 1300 亿行代码”。
- 维基百科:启动以 Elasticsearch 为基础的核心搜索架构。
- 百度:百度目前广泛使用 Elasticsearch 作为文本数据分析,采集百度所有服务器上的各类指标数据及用户自定义数据,通过对各种数据进行多维分析展示,辅助定位分析实例异常或业务层面异常。目前覆盖百度内部 20 多个业务线(包括 casio、云分析、网盟、预测、文库、直达号、钱包、风控等),单集群最大 100 台机。
- 新浪 使用 ES 分析处理 32 亿条实时日志。
- 阿里 使用 ES 构建挖财自己的日志采集和分析体系。
3.Elasticsearch 对比 Solr
- Solr 利用 Zookeeper 进行分布式管理,而 Elasticsearch 自身带有分布式协调管理功能。
- Solr 支持更多格式的数据,而 Elasticsearch 仅支持
json
文件格式。 - Solr 官方提供的功能更多,而 Elasticsearch 本身更注重于核心功能,高级功能多有第三方插件提供。
- Solr 在传统的搜索应用中表现好于 Elasticsearch,但在处理实时搜索应用时效率明显低于 Elasticsearch。
4.Elasticsearch 基本概念及架构
4.1 Elasticsearch 基本概念
4.1.1 索引 index
- 一个 索引 就是一个拥有几分相似特征的文档的集合。比如说,可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。
- 一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。
- 在一个集群中,可以定义任意多的索引。
4.1.2 映射 mapping
- Elasticsearch 中的 映射(Mapping)用来定义一个文档。
- Mapping 是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被索引等等,这些都是映射里面可以设置的。
4.1.3 字段 Field
- 相当于是数据表的 字段,对文档数据根据不同属性进行的分类标识。
4.1.4 类型 Type
- 每一个字段都应该有一个对应的 类型,例如:Text、Keyword、Byte 等。
4.1.5 文档 document
一个 文档 是一个可被索引的基础信息单元。比如,可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以 JSON(Javascript Object Notation)格式来表示,而 JSON 是一个到处存在的互联网数据交互格式。
4.1.6 集群 cluster
- 一个 集群 就是由一个或多个节点组织在一起,它们共同持有整个的数据,并一起提供索引和搜索功能。
- 一个集群由一个唯一的名字标识,这个名字默认就是
elasticsearch
。 - 这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。
4.1.7 节点 node
- 一个 节点 是集群中的一个服务器,作为集群的一部分,它存储数据,参与集群的索引和搜索功能。
- 一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做
elasticsearch
的集群中。 - 这意味着,如果在网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做
elasticsearch
的集群中。 - 在一个集群里,可以拥有任意多个节点。而且,如果当前网络中没有运行任何 Elasticsearch 节点,这时启动一个节点,会默认创建并加入一个叫做
elasticsearch
的集群。
4.1.8 分片和副本 shards & replicas
4.1.8.1 分片
- 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有 10 亿文档的索引占据 1TB 的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。
- 为了解决这个问题,Elasticsearch 提供了将索引划分成多份的能力,这些份就叫做分片。
- 当创建一个索引的时候,可以指定你想要的分片的数量。
- 每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
- 分片很重要,主要有两方面的原因:
- 允许水平分割 / 扩展你的内容容量。
- 允许在分片之上进行分布式的、并行的操作,进而提高性能 / 吞吐量。
- 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由 Elasticsearch 管理的,对于作为用户来说,这些都是透明的。
4.1.8.2 副本
- 在一个网络 / 云的环境里,失败随时都可能发生,在某个分片 / 节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做副本分片,或者直接叫副本。
- 副本之所以重要,有两个主要原因:
- 在分片 / 节点失败的情况下,提供了高可用性。注意到复制分片从不与原 / 主要(
original
/primary
)分片置于同一节点上是非常重要的。 - 扩展搜索量 / 吞吐量,因为搜索可以在所有的副本上并行运行。
- 在分片 / 节点失败的情况下,提供了高可用性。注意到复制分片从不与原 / 主要(
- 每个索引可以被分成多个分片。一个索引有 0 个或者多个副本。
- 一旦设置了副本,每个索引就有了主分片和副本分片,分片和副本的数量可以在索引创建的时候指定。
- 在索引创建之后,可以在任何时候动态地改变副本的数量,但是不能改变分片的数量。
4.2 Elasticsearch 基本架构
- Gateway 是 ES 用来存储索引的文件系统,支持多种类型。
- Gateway 的上层是一个分布式的 Lucene 框架。
- Lucene 之上是 ES 的模块,包括:索引模块、搜索模块、映射解析模块 等。
- ES 模块之上是 Discovery、Scripting 和第三方插件。
- Discovery 是 ES 的节点发现模块,不同机器上的 ES 节点要组成集群需要进行消息通信,集群内部需要选举 master 节点,这些工作都是由 Discovery 模块完成。支持多种发现机制,如 Zen 、EC2、gce、Azure。
- Scripting 用来支持在查询语句中插入 Javascript、Python 等脚本语言,Scripting 模块负责解析这些脚本,使用脚本语句性能稍低。ES 也支持多种第三方插件。
- 再上层是 ES 的 传输模块 和 JMX。传输模块支持多种传输协议,如 Thrift、Memecached、HTTP,默认使用 HTTP。JMX 是 Java 的管理框架,用来管理 ES 应用。
- 最上层是 ES 提供给用户的 接口,可以通过 RESTful 接口和 ES 集群进行交互。