version:7.x
ES 是一个准实时的搜索平台,从一个索引创建到可搜索会有轻微的延迟,一般在1秒以内。
集群由一到多个节点组成,这些节点共同存储了所有数据,并提供了跨节点的联合索引和搜索功能。
集群由一个唯一的名称指定(默认为 elasticsearch ),节点可以被设置为通过名字加入集群,所以集群名称比较重要。
确保不要在同一个网络环境中为不同的集群使用听一个名字(跟ES的服务发现机制有关),否则你的节点可能会加入到错误的集群中。例如对于日志服务来说,可以使用log-dev,log-pre, log-prod 来简历不同的集群环境。
ES 的集群环境是自动组织的,只需要指定相同的集群名即可。
请注意,拥有一个只包含单个节点的集群是完全正常的。此外,您还可以拥有多个独立的集群,每个集群都有自己唯一的集群名称。
Node 是组成集群的一个单独的服务器,用于存储数据并提供集群的搜索和索引功能。与集群一样,节点也有一个唯一名字,默认在节点启动时会生成一个uuid作为节点名,该名字也可以手动指定。此名称对于项目管理非常重要,用来在网络中标识哪个服务器与哪个节点对应。
节点可以按照配置的集群名加入集群。默认情况下(假设各个节点可以相互发现),节点会加入到名为elasticsearch的集群中。
单个集群可以由任意数量的节点组成。如果只启动了一个节点,则会形成一个单节点的集群。
Index 有两层意思,作为动词表示建立索引 ,名次表示建立好的索引文件。
索引时具有某些类似特征的文档集合。例如客户索引、产品索引、订单索引等。
索引由一个全小写的名称标识,对数据的添加、删除、更新、搜索等操作,均需指定索引名称。
单个集群中可以创建任意数量的索引。
之前的版本中,索引和文档中间还有个类型的概念,每个索引下可以建立多个类型,文档存储时需要指定index和type。从6.0.0开始单个索引中只能有一个类型,7.0.0以后将将不建议使用,8.0.0 以后完全不支持。
类型用于定义文档属性,包括类型、分词器等。
弃用该概念的原因:
在之前的版本中把Index比作 RDB 的 Database,Type 比作 RDB 的 Table。这种不太恰当,RDB 中,Table 之前相互独立,同名的字段在两个表中毫无关系。但是在ES中,同一个 Index 下不同的 Type 如果有同名的字段,他们会被 luncene 当作同一个字段 ,并且他们的定义必须相同。所以,实际上之前的说法是不对的。因此 ES 官方将逐渐弃用 Type 的概念,每个Index只能定义一个 Mapping Type。
文档是构建索引的基本单元。例如一条客户数据、一条产品数据、一条订单数据都可以是一个文档。文档以json格式表示,json是一种普遍使用的互联网数据格式。
在index中可以存储任意数量的文档。虽然文档在物理上存储在索引文件中,但是必须在存储文档时将其分配给索引中特定的类型。
Shard
一个索引可以存储大量的数据,甚至超出单个节点的磁盘存储空间。例如一个索引存储了数十亿文档,这些文件占用超过1T的磁盘空间,单台机器无法存储或者由于太多而无法提供搜索服务。
为了解决这个问题,ES 提供了将单个索引分割成多个分片的功能。创建索引时,可以指定任意数量的分片。每个分片都是一个功能齐全且独立的“index”,且可以被托管到集群中的任意节点上。
分片有两个重要作用:
数据存储在哪个分片和搜索时文档聚合的机制完全由ES负责,这点对于用户来说是透明的。
Replicas:
在网络/云环境中随时可能发生故障,如果能在这些异常(不管什么原因导致分片下线或丢失)发生时有一定的容错机制,那真真是极好的。因此,ES 允许我们为分片生成一个或多个副本。
副本有两个重要作用:
数据层面,一个索引可以被分割为多个分片。一个索引可以指定零到多个副本,一旦指定副本,就会存在主分片和副本分片的概念。分片数和副本数可以在创建索引时指定,也可以动态修改。
通过_shrink
或_split
API 可以修改分片数量,但是这种操作比较困难,最好在创建时指定。
默认情况下,7.0以前一个索引有5个分片,1个副本(单节点时即使指定副本为1也不会创建副本),所以一个索引共10个分片。
7.0以后一个索引只有1个分片
每个分片都是一个Lucence索引。Lucence 对单个索引有最大文档数的限制,在 LUCENE-5843
规范中,最大数量为2,147,483,519(int.MAX_VALUE - 128)。可以通过/_cat/shards?v 查看分片状态。