乐趣区

Elasticsearch系列Elasticsearch的基本概念及工作原理

基本概念

Elasticsearch 有几个核心的概念,花几分钟时间了解一下,有助于后面章节的学习。

NRT

Near Realtime,近实时,有两个层面的含义,一是从写入一条数据到这条数据可以被搜索,有一段非常小的延迟(大约 1 秒左右),二是基于 Elasticsearch 的搜索和分析操作,耗时可以达到秒级。

Cluster

集群,对外提供索引和搜索的服务,包含一个或多个节点,每个节点属于哪个集群是通过集群名称来决定的(默认名称是 elasticsearch),集群名称搞错了后果很严重。命名建议是研发、测试环境、准生产、生产环境用不同的名称增加区分度,例如研发使用 es-dev,测试使用 es-test,准生产使用 es-stg,生产环境使用 es-pro 这样的名字来区分。如果是中小型应用,集群可以只有一个节点。

Node

单独一个 Elasticsearch 服务器实例称为一个 node,node 是集群的一部分,每个 node 有独立的名称,默认是启动时获取一个 UUID 作为名称,也可以自行配置,node 名称特别重要,Elasticsearch 集群是通过 node 名称进行管理和通信的,一个 node 只能加入一个 Elasticsearch 集群当中,集群提供完整的数据存储,索引和搜索的功能,它下面的每个 node 分摊上述功能(每条数据都会索引到 node 上)。

shard

分片,是单个 Lucene 索引,由于单台机器的存储容量是有限的(如 1TB),而 Elasticsearch 索引的数据可能特别大(PB 级别,并且 30GB/ 天的写入量),单台机器无法存储全部数据,就需要将索引中的数据切分为多个 shard,分布在多台服务器上存储。利用 shard 可以很好地进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升集群整体的吞吐量和性能。
shard 在使用时比较简单,只需要在创建索引时指定 shard 的数量即可,剩下的都交给 Elasticsearch 来完成,只是创建索引时一旦指定 shard 数量,后期就不能再更改了。

replica

索引副本,完全拷贝 shard 的内容,shard 与 replica 的关系可以是一对多,同一个 shard 可以有一个或多个 replica,并且同一个 shard 下的 replica 数据完全一样,replica 作为 shard 的数据拷贝,承担以下三个任务:

  1. shard 故障或宕机时,其中一个 replica 可以升级成 shard。
  2. replica 保证数据不丢失(冗余机制),保证高可用。
  3. replica 可以分担搜索请求,提升整个集群的吞吐量和性能。

shard 的全称叫 primary shard,replica 全称叫 replica shard,primary shard 数量在创建索引时指定,后期不能修改,replica shard 后期可以修改。默认每个索引的 primary shard 值为 5,replica shard 值为 1,含义是 5 个 primary shard,5 个 replica shard,共 10 个 shard。
因此 Elasticsearch 最小的高可用配置是 2 台服务器。

Index

索引,具有相同结构的文档集合,类似于关系型数据库的数据库实例(6.0.0 版本 type 废弃后,索引的概念下降到等同于数据库表的级别)。一个集群里可以定义多个索引,如客户信息索引、商品分类索引、商品索引、订单索引、评论索引等等,分别定义自己的数据结构。
索引命名要求全部使用小写,建立索引、搜索、更新、删除操作都需要用到索引名称。

type

类型,原本是在索引 (Index) 内进行的逻辑细分,但后来发现企业研发为了增强可阅读性和可维护性,制订的规范约束,同一个索引下很少还会再使用 type 进行逻辑拆分(如同一个索引下既有订单数据,又有评论数据),因而在 6.0.0 版本之后,此定义废弃。

Document

文档,Elasticsearch 最小的数据存储单元,JSON 数据格式,类似于关系型数据库的表记录(一行数据),结构定义多样化,同一个索引下的 document,结构尽可能相同。

工作原理

简单地了解一下 Elasticsearch 的工作原理。

启动过程

当 Elasticsearch 的 node 启动时,默认使用广播寻找集群中的其他 node,并与之建立连接,如果集群已经存在,其中一个节点角色特殊一些,叫 coordinate node(协调者,也叫 master 节点),负责管理集群 node 的状态,有新的 node 加入时,会更新集群拓扑信息。如果当前集群不存在,那么启动的 node 就自己成为 coordinate node。

应用程序与集群通信过程

虽然 Elasticsearch 设置了 Coordinate Node 用来管理集群,但这种设置对客户端(应用程序)来说是透明的,客户端可以请求任何一个它已知的 node,如果该 node 是集群当前的 Coordinate,那么它会将请求转发到相应的 Node 上进行处理,如果该 node 不是 Coordinate,那么该 node 会先将请求转交给 Coordinate Node,再由 Coordinate 进行转发,搓着各 node 返回的数据全部交由 Coordinate Node 进行汇总,最后返回给客户端。

集群内 node 有效性检测

正常工作时,Coordinate Node 会定期与拓扑结构中的 Node 进行通信,检测实例是否正常工作,如果在指定的时间周期内,Node 无响应,那么集群会认为该 Node 已经宕机。集群会重新进行均衡:

  1. 重新分配宕机的 Node,其他 Node 中有该 Node 的 replica shard,选出一个 replica shard,升级成为 primary shard。
  2. 重新安置新的 shard。
  3. 拓扑更新,分发给该 Node 的请求重新映射到目前正常的 Node 上。

小结

本篇章简单的向大家介绍了一下 Elasticsearch 的基本概念和工作原理,让大家有个比较浅显的认识,后续会结合实际的例子,来了解一下 Elasticsearch 基本的用法。

退出移动版