es概念
Elasticsearch 是一种分布式文档存储。Elasticsearch 存储的是序列化为 JSON 文档的复杂数据结构,而不是以列数据行的形式存储信息。当集群中有多个 Elasticsearch 节点时,存储的文档会分布在整个集群中,可以从任意节点立即访问。
文档存储后,会在 1 秒钟内编制索引并进行完全实时搜索。Elasticsearch 使用一种称为倒排索引的数据结构,支持非常快速的全文检索。倒排索引列出了任何文档中出现的每一个单词,并能识别每个单词出现的所有文档。
索引可以看作是文档的优化集合,而每个文档又是字段的集合,即包含数据的键值对。默认情况下,Elasticsearch 会为每个字段中的所有数据建立索引,每个索引字段都有一个专用的优化数据结构。
lucene
Lucene是一个成熟的全文检索库,由Java语言编写,具有高性能、可伸缩的特点,并且开源、免费.
Lucene的作者是Doug Cutting,2001年10月贡献给Apache,成为Apache基金会的一个子项目.
Lucene是一个IR库(Information Retrieval library).后来才由Shay Banon在其基础上开发了Elasticsearch.
集群
一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。
节点
组成集群的单位.根据角色划分不同的职责.节点可以多角色,所以节点可以有多个职责.
有以下角色分类:
主节点 master node (m)
主节点负责集群层面的相关操作,管理集群变更。
- 处理所有集群范围的功能,例如构建和删除索引、监控节点和分发分片。
- 控制描述索引的所有元数据,例如索引名称、分片数量和主分片位置。
- 管理节点操作,例如分片之间的数据分布以及执行集群级别的设置和策略。
- 主节点还监视所有节点的健康状况。 保证其他节点响应查询并有足够的存储空间来存储数据。
- 主节点存在容错性与高可用性, 当主节点挂了,集群会立即从拥有主节点角色的候选节点中选举出一个节点作为主节点.
需要满足的条件:
- 配置文件中’role.node:[“master”]’
- 被集群选举出来的节点.
候选节点
集群中可以参与主节点竞选的节点.
需要满足的条件:
- 配置文件中
role.node:["master"]
数据节点 data node (d)
负责保存数据、执行数据相关操作:CRUD、搜索、聚合等。数据节点对CPU、内存、I/O要求较高.
- 使用分片技术将数据分布在多个节点上,增强了性能和可扩展性.
- 接受集群分发的数据与搜索请求,并发搜索返回更快的执行结果.
满足条件:
- 配置文件中
role.node:["data"]或role.node:["data_xxx"]
数据层 data tires
不同热度的数据,通过 Data tiers 来界定。数据层是具有相同数据角色的节点的集合,通常共享相同的硬件配置文件。根据不同的热度,ES 把数据层定义为四个阶段:
- hot tier:处理时间序列数据(例如日志或指标)的索引负载,并保存您最近、最常访问的数据。
- warm tier:保存访问频率较低且很少需要更新的时间序列数据。
- cold tier:保存不经常访问且通常不更新的时间序列数据。
- frozen tier:保存很少访问且从不更新的时间序列数据,保存在可搜索的快照中
多层部署架构中,可以配置专门的数据角色分配数据节点到指定等级:data_countent,data_hot,data_warn,data_cold与data_frozen.
一个节点可以属于多个层,即通用data角色,但具有一个专用数据角色的节点无法拥有通用data角色.
内容层 Content Tier
处理用户创建的文档内容,包括CRUD、数据搜索和聚合等。
- 存储在内容层中的数据通常具有较长的数据保留要求,并且希望能够快速检索项目,无论它们有多旧。
- 优先考虑处理能力而不是 IO 吞吐量,因此它们可以处理复杂的搜索和聚合并快速返回结果。
- 内容层是必须的。不属于数据流的系统索引和其他索引会自动分配给内容层。
热数据层 Hot Tier
热层是时间序列数据的 Elasticsearch 入口点,保存最近、最常搜索的时间序列数据。
- 热层中的节点需要快速读取和写入,这需要更多的硬件资源和更快的存储 (SSD)。
- 为了弹性,热层中的索引应配置为使用一个或多个副本。
- 热层是必须的。作为数据流一部分的新索引会自动分配给热层。
温数据层:Warm Tier
存储不再被经常更新但是仍然被查询的索引数据,相比较于在hot层数据查询的频率要低。
- 查询的频率低于热层中最近索引的数据,时间序列数据就可以移动到温数据层。
- 温数据层通常保存最近几周的数据。仍然允许更新,但可能不频繁。
- 温数据层中的节点对读取和写入的速度没有太大的要求,对硬件资源和存储友好。
- 为了弹性,温数据层中的索引应配置为使用一个或多个副本。
冷数据层:Cold Tier
存储很少被获取的只读索引,该层耗费资源少,可以搜索快照索引减少资源需求。
- 冷层仍然是响应式查询层,但冷层中的数据不会正常更新。
- 在冷层中的数据,可以被压缩与缩小。
- 对于弹性,冷层可以使用完全安装的 可搜索快照索引,从而消除对副本的需求。
冻结层 Frozen Tier
数据不再被查询或很少被查询,它可能会从冷数据层移动到冻结层,并且保留至直到数据被删除之前。
- 使用部分安装的索引来存储和加载来自快照存储库的数据。
协调节点 coordination node (c)
负责在整个 Elasticsearch 集群中分发查询,不会自行搜索数据,而是将该任务分配给数据节点。
- 平均分配负载,确保快速有效地处理查询。
- 将查询分解为更小的子查询,并将它们分布在集群中进行处理。
- 协调节点角色不是一个独立的解决方案。 为了获得最佳性能,集群中的所有角色都必须进行适当的优化和配置。
满足条件:
- node.roles: []
摄取节点 ingest node (i)
数据摄取之前对数据进行预处理。由于某些处理器(如grok处理器)可能消耗较多资源,因此专门为摄取管道分配独立的节点有利于搜索操作不受摄取处理的影响。
某些 Elastic Stack 产品(例如 Beats 和 Logstash)提供了自己的摄取管道。 这些管道能够收集和转换来自各种来源的数据,包括日志、指标和网络流量。
满足条件:
- node.roles: [“ingest”]
- 创建摄取管道
机器学习节点 machine learning node (l)
提供机器学习的功能,此类节点运行作业并处理机器学习 API 请求。
满足条件:
- node.roles: [“ml”]
- CPU 必须能够处理 SSE4.2 指令
远程支持节点 remote eligible node (r)
Elasticsearch 可以支持远程集群,能够跨多个站点复制数据以实现冗余和灾难恢复。 通过跨集群复制,数据可以实时或近乎实时地复制到远程集群,因此即使主集群出现故障,数据也始终可用。
满足条件:
- node.roles: [“remote_cluster_client”]
转换节点 transform node (t)
可以简单地汇总大量数据并使用这些节点优化你的转换 API 请求,以获得更快、更高效的结果,还可以执行数据规范化和过滤,确保分析合法可靠。
满足条件:
- node.roles: [“transform”]
获取集群的节点角色
GET /_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.15.132.73 67 71 1 0.00 0.02 0.05 cdhilmrstw - es-cn-xxx-0001
10.15.132.71 65 70 2 0.00 0.01 0.05 cdhilmrstw * es-cn-xxx-0002
| 角色缩写 | 英文释义 | 中文释义 |
|---|---|---|
| c | cold node | 冷数据节点 |
| d | data node | 数据节点 |
| f | frozen node | 冷冻数据节点 |
| h | hot node | 热数据节点 |
| i | ingest node | 数据预处理节点 |
| l | machine learning node | 机器学习节点 |
| m | master-eligible node | 候选主节点 |
| r | remote cluster client node | 远程节点 |
| s | content node | 内容数据节点 |
| t | transform node | 转换节点 |
| v | voting-only node | 仅投票节点 |
| w | warm node | 温数据节点 |
| 空 | coordinating node only | 仅协调节点 |
索引 index
类似于我们Mysql里面的一个数据库.
es7之前的type:
- 在每一个index下面,可以有一个或者多个type,好比数据库里面的一张表。
- 相当于表结构的描述,描述每个字段的类型。
es7.x弱化type,一个索引只能有一个type,es8.x完全删除.
文档 document
是ES里面最小的数据单元,就好比表里面的一条数据。例如一个用户的文档、一个产品的文档等等。文档都是 JSON 格式的。
分片 shard
一台服务器,无法存储大量的数据,ES把一个index里面的数据,分为多个shard,分布式的存储在各个服务器上面。
Elasticsearch 提供了将索引划分成多份的能力,每一份就称之为分片,这样一个索引可以存储超出单个节点硬件限制的大量数据。
- 每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。
- 允许水平扩容
- 允许在分片上进行分布式,并行计算,实现高性能,高吞吐量。
- 在索引创建时,定义分片的数量,创建之后无法更改.
- 设置settings 中的 number_of_shards 来指定 分片数量.
一个 Lucene 索引 我们在 Elasticsearch 称作 分片 。 一个Elasticsearch 索引 是分片的集合。 当 Elasticsearch 在索引中搜索的时候, 他发送查询到每一个属于索引的分片(Lucene 索引),然后合并每个分片的结果到一个全局的结果集。
副本 replica
分布式的集群,难免会有一台或者多台服务器宕机,如果我们没有副本这个概念, 就会造成我们的shard发生故障,无法提供正常服务.
- 在分片/节点失败的情况下,提供了高可用性。因此,复制分片从不与原/主要分片置于同一节点上是非常重要的。
- 扩展搜索量/吞吐量,因为搜索可以在所有的副本上并行运行。
- 索引创建之后,可以在任何时候动态地改变副本的数量。
- 设置settings中的 number_of_replicas 来指定 副本数量.
- 同一个节点上面,副本和主分片是一定不会在一台机器上面的.所以当只有一个节点的时候,是无法创建副本的,当你新加入了一台节点,ES会自动的给你在新机器上创建一个之前分片的副本。
集群状态
Green,集群处于健康状态,所有的主分片和副本分片都正常运行。
Yellow,所有的主分片都运行正常,但是有部分副本分片不正常,意味着可能存在单点故障的风险(如果部分主分片没有备份了,一旦这个主分片数据丢失,将导致这些数据永久丢失)。如果集群只有 3 个数据节点,但是分配了 4 个副本(主分片 + 副本分片的总数),这个时候有一个副本无法分配的,因为相同的两份数据不应该被分配到同一个节点上。
Red,有部分主分片没有正常运行。