基本概念
ES 有一些基础概念,在学习之初就了解这些基础概念将会极大地简化您的学习过程
近实时搜索
ES 是一个近实时的搜索引擎,这意味着一个文档索引从写入索引到能被检索到会存在一个轻微的延迟(通常一秒左右)
集群(Cluster)
集群是一个或多个节点(服务)的集合,它们拥有全部的数据,并且在所有节点之间提供索引和搜索的功能。一个集群拥有一个唯一的命名,默认叫 elasticsearch
,这个名字很重要,因为节点需要通过这个名字才能加入一个集群。
确保你的集群名在不同环境不会被重复使用,否则节点可能会加入错误的集群。例如你可以使用 logging-dev
,logging-stage
,logging-prod
表示开发集群,预发布(译者公司称作沙箱)集群和生产集群。
注意,保留一个单节点的集群是不错的(此处译者不太明白,可能是为了测试使用?),此外,还可以有多个独立的集
群,每个集群都有自己独特的集群名称。
节点(Node)
节点是集群中单独的服务器,它存储数据,参与集群的索引和搜索功能。和集群一样,节点也有一个唯一命名表示,默认是随机的 UUID,在节点启动时分配。如果你不想用默认命名可以自定义,命名用于管理集群中哪个服务器对应哪个节点。
节点可以通过配置加入特定的集群,默认加入命名为 elasticsearch
的集群。就是说如果你在你的网络中启动若干节点(假设他们能发现彼此),那么他们会自动的组织并加入 elasticsearch
这个集群。
一个集群内你想配置多少节点就配置多少节点。此外如果你的网络中没有其他es节点运行,启动一个节点就可以形成一个默认的 elasticsearch 集群
(译者批注:节点并不是越多越好,节点多能够保证集群高可用,但同时给 master 节点维护集群带来一定压力,并且会加大运维工作)
索引(Index)
索引是一系列拥有相似特征的文档的集合。例如,你有一个索引保存顾客数据,有一个索引保存商品目录信息,还有其他索引保存订单信息。索引也有一个命名(必须全部小写),这个命名用于对索引中文档的增删改查操作。
一个集群中索引个数也是任意的
(译者批注:同理索引个数也要控制,索引越多master节点管理压力越大,而且当索引较大个数较多时,创建索引等操作耗时也会增加。区分和数据库中的索引,概念不同)
类型(Type)
一个索引可以定义多个类型,类型是对索引的逻辑分区,这都取决于你的设置。一般来说一个t类型中定义的都是一系列同义字段的文档。假设你有一个博客平台,所有数据存储在同一个索引中,在这个索引中包括用户类型,博客类型,评论类型等等。
(译者批注:目前为止读者可以将索引看做关系型数据库中的数据库,类型看做表。 type 本质上是索引中的一个元数据字段,并不是物理分区的。而且该特性在 6.0 版本中被限制成一个固定值,不再支持多个type,预计7.0将会被删除,因此建议一个索引对应一个 type 即可)
文档
文档是索引数据的基本单元。例如,你可以有一个存储单个用户数据的文档,一个存储单个产品的文档,一个存放单个订单的文档。文档用JSON格式。
一个索引/类型中可以存储若干文档,注意虽然文档尽管在物理上存储在索引上,但是也必须要给文档指定具体类型。
(译者批注:同理文档并非越多越好,文档过多导致索引过大,影响读写效率)
分片(shard)和副本(replica)
索引可以存储大量的数据,能够超过单个机器硬件瓶颈。例如一个10亿文档占用空间1TB的索引,在单个机器的磁盘上存不下,亦或单个节点的搜索效率太低。
为了解决这个问题,ES能够将索引拆分成多个块,也叫做分片。当你创建索引的时候,你可以指定分片个数。每个分片都是一个具有完整功能并独立的“索引”,它们可以存在于集群中的任意节点。
分片有两个主要功能:
能够进行水平扩容
能够分布式的并行的在分片之间操作(多个节点上)从而提升系统性能和吞吐量
分片如何分布,搜索请求文档结果如何聚合都是在ES内部管理,对用户来说是透明的。
在网络或云环境中,失败/错误是难免的,为了防止分片或节点因为不明原因离线或丢失
,推荐要有一个故障转移机制,为此,elasticsearch 允许你创建多个分片的拷贝,我们叫做副本分片,简称副本
副本有两个主要功能:
为防止节点或分片发生失败,副本可以提供高可用机制。正因为这样,副本和他的原始分片不能存在同一个节点中(译者注:存在同一个节点则一旦丢失则全部丢失,就没意义了)
因为搜索可以再所有分片副本上执行,副本可以提高搜索吞吐率和搜索并发量。
总结一下,每个索引可以被分成多个分片,一个索引也可以由0个(没有)或多个副本。一旦复制,每个索引都会具有主分片(复制的来源)和副本(主分片的副本)。分片和副本可以在索引创建期间指定。索引创建后,你可以任意的动态调整副本个数,但是主分片不能修改。
默认的每个索引有 5 个分片和 1 个副本(译者注:这里 1 个副本是针对每个分片来说的),意味着假设你的集群有至少两个节点,你的索引将有5个主分片和另外5个副本,每个索引 10 个片。
提示:每个分片其实是一个 Lucene 索引,单个Lucene索引有最大的文档数限制,例如LUCENE-5843 . 阈值是2,147,483,519 = Integer.MAX_VALUE - 128 个文档。你可以通过 API
_cat/shards
“cat shards”)去监控分片的大小。
(译者注:合理的控制分片个数和分片大小对性能有很大帮助。分片不宜过大,否则文件打开读取过慢,影响查询和写入效率,这点需要通过业务合理控制文档数以及路由的合理利用等;分片不宜过多,否则查询聚合过程中文档会过多,内存占用过大,而且在集群恢复时分片平移耗时徒增)
弄明白这些后,我们来看些好玩的…