1,github 源码地址
2,ES架构图
1、网关Gateway层
底层文件系统: ES用来存储索引文件的一个文件系统且它支持很多类型。例如:本地磁盘、共享存储(做snapshot的 时候需要用到)、hadoop的hdfs分布式存储、亚马逊的S3。
职责: 它的主要职责是用来对数据进行长持久化以及整个集群重启之后可以通过gateway重新恢复数据。代表 es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。
数据安全: 当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地 文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
存储数据: 存储索引信息,集群信息,mapping 等等
2、districted lucene directory
Gateway 上层就是一个 lucene 的分布式框架 lucene 是做检索的,但是它是一个单机的搜索引擎,像 这种es分布式搜索引擎系统,虽然底层用 lucene ,但是需要在每个节点上都运行 lucene 进行相应的 索引、查询以及更新,所以需要做成一个分布式的运行框架来满足业务的需要。
3、四大模块组件
districted lucene directory 之上就是一些 ES 的四大模块`:
Index Module 是索引模块,就是对数据建立索引也就是通常所说的建立一些倒排索引等; Search Module 是搜索模块,就是对数据进行查询搜索;
Mapping Module 是数据映射与解析模块,就是你的数据的每个字段可以根据你建立的表结构通
过mapping进行映射解析,如果你没有建立表结构,es就会根据你的数据类型推测你的数据结构 之后自己生成一个mapping,然后都是根据这个mapping进行解析你的数据;
River Module 在es2.0之后应该是被取消了,它的意思表示是第三方插件,例如可以通过一些自 定义的脚本将传统的数据库(mysql)等数据源通过格式化转换后直接同步到es集群里,这个 River大部分是自己写的,写出来的东西质量参差不齐,将这些东西集成到es中会引发很多内部 bug,严重影响了es的正常应用,所以在es2.0之后考虑将其去掉。
4、自动发现Discovery、Script ES 四大模块组件之上有 Discovery 模块:
es是一个集群包含很多节点,很多节点需要互相发现对方,然后组成一个集群包括选主的,这些es都是 用的discovery模块,默认使用的是 Zen。es是一个基于p2p的系统,它先通过广播寻找存在的节点,再 通过多播协议来进行节点之间的通信,同时也支持点对点的交互。 es查询还可以支撑多种script即脚本语言,包括mvel、js、python等等
5、通信(Transport)
代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http 协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成) 节点间通信端口默认:9300-9400 JMX就是java的一个远程监控管理框架,因为es是通过java实现的。
6、 RESTful接口层 最上层就是ES暴露给我们的 访问接口
官方推荐的方案就是这种Restful接口,直接发送http请求,方便后续使用nginx做代理、分发包括可能 后续会做权限的管理,通过http很容易做这方面的管理。如果使用java客户端它是直接调用api,在做负 载均衡以及权限管理还是不太好做。
3,ES 概念说明
Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档 (document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在 Elasticsearch中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。Elasticsearch 比传统关系型数据库如下:
Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> (Types) -> Documents -> Fields
1 索引 index
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产 品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并 且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在 一个集群中,可以定义任意多的索引。
2 类型 type
在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类/分区,其语义 完全由你来定。通常,会为具有一组共同字段的文档定义一个类型。比如说,我们假设你运营一个博客 平台并且将你所有的数据存储到一个索引中。在这个索引中,你可以为用户数据定义一个类型,为博客 数据定义另一个类型,当然,也可以为评论数据定义另一个类型。
3 文档 document
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文 档,当然,也可以拥有某个订单的一个文档。文档以JSON(Javascript Object Notation)格式来表 示,而JSON是一个到处存在的互联网数据交互格式。
在一个index/type里面,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之 中,文档必须被索引/赋予一个索引的type。
4 字段Field
相当于是数据表的字段,对文档数据根据不同属性进行的分类标识
5 映射 mapping
mapping是处理数据的方式和规则方面做一些限制,如某个字段的数据类型、默认值、分析器、是否被 索引等等,这些都是映射里面可以设置的,其它就是处理es里面数据的一些使用规则设置也叫做映射, 按着最优规则处理数据对性能提高很大,因此才需要建立映射,并且需要思考如何建立映射才能对性能 更好。