概念
Elasticsearch 有几个核心概念,先理解这些概念将有助于掌握 Elasticsearch。近实时(Near Realtime / NRT)Elasticsearch 是一个近实时的搜索平台,从生成文档索引到文档成为可搜索,有一个轻微的延迟(通常是一秒钟)。
集群(Cluster)
ES 默认就是集群状态,整个集群是一份完整、互备的数据。集群是一个或多个节点(服务器)的集合。集群中的节点一起存储数据,对外提供搜索功能。集群由一个唯一的名称标识,该名称默认是“elasticsearch”。集群名称很重要,节点都是通过集群名称加入集群。集群不要重名,取名一般要有明确意义,否则会引起混乱。例如,开发、测试和生产集群的名称可以使用logging-dev、logging-test和logging-prod。集群节点数不受限制,可以只有一个节点。
节点(Node)
节点是一个服务器,属于某个集群。节点存储数据,参与集群的索引和搜索功能。与集群一样,节点也是通过名称来标识的。默认情况下,启动时会分配给节点一个UUID(全局惟一标识符)作为名称。如有需要,可以给节点取名,通常取名时应考虑能方便识别和管理。默认情况下,节点加入名为 elasticsearch 的集群,通过设置节点的集群名,可加入指定集群。
索引(Index)
索引是具有某种特征的文档集合,相当于一本书的目录。例如,可以为客户数据建立索引,为订单数据建立另一个索引。索引由名称标识(必须全部为小写,可以使用该名称,对索引中的文档进行建立索引、搜索、更新和删除等操作。一个集群中,索引数量不受限制。类似于 rdbms的database(5.x),对于用户来说是一个逻辑数据库,虽然物理上会被分多个shard 存放,也可能存放在多个 node 中。 6.x 7.x index 相当于 table
类型(Type)
类似于 rdbms 的 table,但是与其说像 table,其实更像面向对象中的 class , 同一 Json的格式的数据集合。(6.x 只允许建一个,7.0 被废弃,造成 index 实际相当于 table级)
文档(Document)
文档是可以建立索引的基本信息单元,相当于书的具体章节。例如,可以为单个客户创建一个文档,为单个订单创建另一个文档。文档用 JSON
(JavaScript 对象表示法)表示。在索引中,理论上可以存储任意数量的文档。类似于 rdbms 的 row、面向对象里的 object
字段|属性(Field)
相当于字段、属性
分片与副本(Shards & Replicas)
索引可能存储大量数据,数据量可能超过单个节点的硬件限制。例如,一个索引包含 10 亿个文档,将占用 1TB 的磁盘空间,单个节点的磁盘放不下。Elasticsearch 提供了索引分片功能,创建索引时,可以定义所需的分片数量。每个分片本身都是一个功能齐全,独立的“索引”,可以托管在集群中的任何节点上。分片之所以重要,
主要有 2 个原因:
◼ 允许水平切分内容,以便内容可以存储到普通的服务器中
◼ 允许跨分片操作(如查询时,查询多个分片),提高性能/吞吐量
分片如何部署、如何跨片搜索完全由 Elasticsearch 管理,对外是透明的。网络环境随时可能出现故障,如果某个分片/节点由于某种原因离线或消失,那么使用故障转移机制是非常有用的,强烈建议使用这种机制。为此,Elasticsearch 允许为分片创建副本。
副本之所以重要,主要有 2 个原因:
◼ 在分片/节点失败时提供高可用性。因此,原分片与副本不应放在同一个节点上。
◼ 扩展吞吐量,因为可以在所有副本上并行执行搜索。
总而言之,索引可以分片,索引分片可以创建副本。复制后,每个索引将具有主分片与副本分片。创建索引时,可以为每个索引定义分片和副本的数量。之后,还可以随时动态更改副本
数量。您可以使用_shrink 和_split api 更改现有索引的分片数量,但动态修改副本数量相当麻烦,最好还是预先计划好分片数量。默认情况下,Elasticsearch 中的每个索引分配一个主分片和一个副本(7.X 之前,默认是 5 片,副本是 0。7.X 默认改为 1 片,副本为 1)。如果集群中有两个节点,就可以将索引主分片部署在一个节点,副本分片放在另一个节点,提高可用性。
概念之间关系图
这张图可以展示出 ES 各组件之间的关系,整张表是一个 Cluster,横行是 Nodes,竖列是 Indices,深绿色方块是 Primary Shards,浅绿色方块是 Replica Shards。至于单个 Host 上的 Node 数目问题,在硬件资源有限的情况下,一般的做法是一个 Host只运行一个 ES 进程,也就是一个 Node。例外情况是,由于 ES 内存配置上的特殊要求(JVM Heap 不能超过 32G),如果你的 Host 特别 NB(16 Core CPU + 128G RAM + SSD 这种),完全可以在单个 Host 上运行多个 ES 进程以避免硬件资源的浪费。
本系列所有资源均来自于尚硅谷,仅供个人学习整理!!!