一个集群就是由一个或多个节点组织在一起,它们共同持有你整个的数据,并一起提供索引和搜索功能。一个集群由一个唯一的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为一个节点只能通过指定某个集群的名字,来加入这个集群。在产品环境中显式地设定这个名字是一个好习惯,但是使用默认值来进行测试/开发也是不错的。
可以通过GET /_cluster/health获取集群健康状况,它有红、黄、绿三种状态之分。
一个节点可以通过配置集群名称的方式来加入一个指定的集群。默认情况下,每个节点都会被安排加入到一个叫做“elasticsearch”的集群中,这意味着,如果你在你的网络中启动了若干个节点,并假定它们能够相互发现彼此,它们将会自动地形成并加入到一个叫做“elasticsearch”的集群中。在一个集群里,只要你想,可以拥有任意多个节点。而且,如果当前你的网络中没有运行任何Elasticsearch 节点, 这时启动一个节点, 会默认创建并加入一个叫做“elasticsearch”的集群。
节点是Elasticsearch运行中的实例,而 集群 则包含一个或多个具有相同 cluster.name 的节点,它们协同工作,共享数据,并共同分担工作负荷。由于节点是从属集群的,集群会自我重组来均匀地分发数据。集群中的一个节点会被选为master节点,它将负责管理集群范畴的变更,例如创建或删除索引,添加节点到集群或从集群删除节点。master节点无需参与文档层面的变更和搜索,这意味着仅有一个master节点并不会因流量增长而成为瓶颈。任意一个节点都可以成为master节点。我们例举的集群只有一个节点,因此它会扮演master节点的角色。
作为用户,我们可以访问包括master节点在内的集群中的任一节点。每个节点都知道各个文档的位置,并能够将我们的请求直接转发到拥有我们想要的数据的节点。无论我们访问的是哪个节点,它都会控制从拥有数据的节点收集响应的过程,并返回给客户端最终的结果。这一切都是由Elasticsearch透明管理的。
一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引。一个索引由一个名字来标识(必须全部是小写字母的),并且当我们要对对应于这个索引中的文档进行索引、搜索、更新和删除的时候,都要使用到这个名字。在一个集群中,如果你想,可以定义任意多的索引。
在Elasticsearch中,我们的数据都在分片中被存储以及索引,索引只是一个逻辑命名空间,它可以将一个或多个分片组合在一起。然而,这只是一个内
部的运作原理,我们的程序可以根本不用关心分片。对于我们的程序来说,我们的文档存储在索引中。剩下的交给Elasticsearch就可以了。
索引名称必须要全部小写,也不能以下划线开头,不能包含逗号。
每一个类型都拥有自己的映射(mapping)或者结构定义,它们定义了当前类型下的数据结构,类似于数据库表中的列。所有类型下的文档会被存储在同一个索引下,但是映射会告诉Elasticsearch不同的数据应该如何被索引。
划分时需要注意一些限制条件,例如不同的文档类型对同一字段不能设置为不同的字段类型。
一个文档是一个可被索引的基础信息单元。比如,你可以拥有某一个客户的文档,某一个产品的一个文档,当然,也可以拥有某个订单的一个文档。文档以JSON(JavascriptObject Notation)格式来表示,而JSON 是一个到处存在的互联网数据交互格式。在一个index/type 里面,只要你想,你可以存储任意多的文档。注意,尽管一个文档,物理上存在于一个索引之中,文档必须被索引/赋予一个索引的type。
与关系型数据库不同,ES的文档不需要有固定的结构,不同文档可以具有不同的字段集合,而且在程序开发时不需要知道文档的字段。当然用户可以通过模式映射(schema mapping)定义文档结构。
在Elasticsearch中,文档这个单词有特殊的含义。它指的是在Elasticsearch中被存储到唯一ID下的由最高级或者根对象 (rootobject )序列化而来的JSON。
一个文档不只包含了数据。它还包含了元数据(metadata) —— 关于文档的信息。有三个元数据元素是必须存在的,它们是:
id是一个字符串,当它与 _index 以及 _type 组合时,就可以来代表Elasticsearch中一个特定的文档。
至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由Elasticsearch 管理的,对于作为用户的你来说,这些都是透明的。
在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了,这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,Elasticsearch 允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。默认情况下,Elasticsearch 中的每个索引被分片5 个主分片和1 个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5 个主分片和另外5 个复制分片(1 个完全拷贝),这样的话每个索引总共就有10 个分片。
与关系数据库对照关系
与传统的关系型数据库有一些大致的相似之处:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引 ⇒ 类型 ⇒ 文档 ⇒ 字段(Fields)
=============================
DB -> Databases -> Tables -> Rows -> Columns
ES -> Indices -> Types -> Documents -> Fields
=============================
River
代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。
Gateway
代表es索引的持久化存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到硬盘。当这个es集群关闭再重新启动时就会从gateway中读取索引数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
discovery.zen
代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。
Transport
代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议(9300端口)进行交互,同时它支持http协议(json格式)(9200端口)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。