Loading... ## 本篇文章用于Elasticsearch基本概念的入门介绍。 ### 1.ES基本概念 - 索引结构:ES存储是面向文档的存储的,各种文本内容以文档形式进行存储,文档包括种类 邮件、日志、网页内容,一般使用JSON作为分档序列化格式;存储结构包括**_index**、**_type**和**_id**,来标识一个文档。 - **_index**:指向一个或多个物理分片的逻辑命名空间。 - **_type**:用于区分同一个集合中的不同细分。多个_type可以在相同的索引中存在,字段不冲突即可。 - **_id**:文档标记符由系统自动生成或使用者提供。 - 分片(shard):分片时底层的读写单元。 - ES将数据副本分为主分片(primary shard)和副分片(replica shard),主数据作为权威数据,写过程为先主后从,恢复阶段以主分片为准。 - 分片的作用时可以分割巨大索引,使读写并行操作,读写请求最终落到某个分片上面,分片可以独立执行读写工作。 - 一个索引通常包含多个分片,一个分片为一个lucene索引,每个索引由多个分段分完成,每个分段是一个倒排索引。 - 常用示例:索引名称为 nginx_api_log*,分片名称为 nginx_api_log_2020_xx_xx - 动态更新索引:使用更多的索引,新增内容写到一个新的倒排索引中,查询时,每个索引都被轮流查询,查询完成再对结果进行合并。 - 通过关键词检索文档内容,会使用倒排索引的数据结构,倒排索引一旦被写入文件后就具有不变性(对文件访问不需要枷锁,读取索引可以被文件系统缓存) - 内存换种的数据被写入文件时,会产生一个新的Luence段,每个段都是一个倒排索引。 - 近实时搜索:es每秒钟产生一个新分段,新段先卸乳文件系统缓存,但稍后执行flush操作,写操作会很快被执行完,一旦写成功,就可以像其他文件被打开和读取。 - 写操作中,一般会先在内存中缓存一段数据,再将这些数据写入磁盘,每次写入磁盘的这批数据为一个分段。通过系统write接口写到磁盘的数据先未必到达内存中,write函数返回成功时,数据未必刷到磁盘中,通过flush刷新将数据写到此磁盘。无论数据是否被刷到磁盘中,只要write函数返回成功,数据已经可以读取可见。 - 新段不会立即刷新,如果主机出现意外情况,存在数据丢失分风险。但通过事物日志。当节点恢复的时候会重放translog中在最后一次的所有变更操作。 - 段合并:选择大小相似的分段进行合并。合并过程中,标记为删除的数据不会被写入新分段;合并结束后,久的分段数据被删除,标记删除的数据从磁盘删除。 ### 2.ES集群节点角色 es集群角色管理一般通过配置文件中的相关配置来调整 分别是 node.master、node.data、node.ingest 来确认节点角色属性。 - 主节点(Master node):负责集群层面的相关操作,管理集群变更,主节点全局唯一;主节点也可作为数据节点处理少量工作,但生产环境应该尽量避免分离主节点和数据节点;相关配置:node.master: true / node.data: false - 数据节点(Data node):负责保存数据、执行数据的相关操作:CRUD、搜索、聚合;数据节点需要较高的性能的CPU、内存、I/O;相关配置:node.master: false / node.data: true / node.ingest: false - 预处理节点(Ingest node):写入数据之前,通过事先定义好的processors(处理器)和pipeline(管道)对数据进行某种转换、富化;默认情况下所有节点都会启用ingest;相关配置(单独预处理节点):node.master: false / node.data: false / node.ingest: true - 协调节点(Coordinating node):协调节点转发客户端请求到数据节点,数据节点在本地请求执行请求并返回结果至协调节点,协调节点收集所有返回后将结果转发至客户端;相关配置:node.master: false / node.data: false / node.ingest: false - 部落节点(Tribe node):功能仅用于路由请求,本质为负载均衡器,已经从5.0版本被协调节点所取代。 ### 3.ES集群健康状态 ES集群存在下面三种状态,分别表示集群的正常运行、存在风险、故障的问题。同理,每个索引也存在相同的问题,假设丢失了一个副分片,则该分片所属的引擎和整个集群变成Yellow状态,但其他索引为Green状态。 - Green:所有主分片和副分片都正常运行。 - Yellow:所有主分片都运行正常,某个副分片存在问题,可能会出现单点故障的风险。 - Red:没有主分片可以正常运行。 ### 4.集群扩容 进群扩容增加节点时,分片会自动均衡分配到集群的各个节点。分片副本会自动实现数据冗余,从而防止硬件故障导致数据丢失。 下面掩饰es集群从单节点扩容到 三节点的过程(前提:Node1节点上面有三个主分片,没有副本分片) - Node1:Primary1 & Primary2 & Primary3 - Node1 --> Node2 - Node1: Primary1 & Primary2 & Primary3 - Node2: Replica1 & Replica2 & Replica3 - Node1|2 --> Node3 - Node1:Primary1 & Primary3 - Node2:Replica1 & Replica2 - Node3:Primary2 & Replica3 ### 5.ES内部模块简介 - Cluster:主节点执行集群管理,维护集群层面的配置信息。 - 管理集群状态,将新生成的集群状态发布到集群所有节点。 - 调用allocation模块执行分片分配,决策分片节点分配。 - 在集群个节点中迁移分片,保证数据平衡。 - Allocation:分片分配的功能和策略,由主节点调用用于主分片和副分片的分配。 - Discovery:负责发现集群中的节点和选举主节点,当有节点加入或推出,主节点会采取相应的动作。 - Gateway:持久化存储Master广播集群状态(cluster state)的数据,通常用于完全重启恢复集群。 - Indices:管理全局级的索引设置和索引数据恢复功能。(集群启动阶段需要主分片恢复和副分片恢复) - HTTP:通过JSON over HTTP方式访问ES API,访问为异步方式。 - Transport:集群内节点之间的内部通信,两个节点之间的请求转发。 - Engine:分片读写的提供者,用于Lucene操作和translog的调用。 Last modification:August 28th, 2020 at 07:03 pm © 允许规范转载