ES内部模块简单了解

69 阅读9分钟

ES内部模块简单了解

Cluster模块

简述

  • 该模块封装了集群层面要执行的任务
  • 是主节点执行集群管理的封装实现,管理集群状态,维护集群层面的配置信息

集群状态

  • 集群状态在ES中封装为ClusterState类,可以通过_cluster/state API来获取集群状态

提交集群任务

  • 直接或间接提交集群任务的时机有以下几种情况
    • 集群拓扑变化
    • 模板、索引map、别名变化
    • 索引操作:创建、删除、open、close
    • pipeline的增删
    • 脚本的增删
    • gateway模块发布选举出的集群状态
    • 分片分配
    • 快照、reroute api等触发

集群任务的执行过程

  • 构建任务列表
    • 先根据任务的batchingKey从提交任务时记录的Hashmap中提取要执行的任务列表
  • 执行任务
  • 发布集群状态
    • 发布阶段:发布集群状态,等待响应
    • 提交阶段:收到的响应数量大于minimum_master_nodes数量,发送commit请求

任务管理API

任务管理API中的"任务"不一定是集群层面的任务,一般指周期性执行的任务,或者用户发起的任务

查看运行中的任务

  • get {host}/_tasks
  • get {host}/_task?nodes={node_name}

取消任务

  • post {host}/_tasks/node_id:task_id/_cancel

allocation模块

简述

  • 分片分配就是把一个分片指派到集群中某个节点的过程
  • 分配决策由主节点完成
  • 分配决策包含两个方面
    • 哪些分片应该分配给哪些节点
    • 哪个分片作为主分片,哪些作为副分片
  • ES对新建索引和已有索引都是通过两个基础组件完成工作,如下:
    • allocators尝试寻找最优节点来分配分片
    • deciders则负责判断并决定是否要进行这次分配
  • 封装了分片分配相关的功能和策略,包括主分片的分配和副分片的分配
  • 该模块由主节点调用

分片分配触发时机

  • index增删
  • node增删
  • 手工reroute
  • replica数量改变
  • 集群重启

分配器(allocators)

简述

  • 负责为某个特定的分片分配目的节点
  • 每个allocator的主要工作是根据某种逻辑得到一个节点列表
  • 然后调用deciders去决策,根据决策结果选择一个目的节点

分类

  • gatewayAllocator,为了找到现有分片
  • shardsAllocator,根据权重策略在集群的各节点键均衡分片分布

决策器(deciders)

分类

  • 负载均衡类
    • SameShardAllocationDecider,避免主副分片分配到同一个节点
    • AwarenessAllocationDecider,感知分配器,感知服务器、机架等,尽量分散存储shard
    • ShardsLimitAllocationDecider,同一个节点上允许存在的同一个index的shard数目
  • 并发控制类
    • ThrottlingAllocationDecider,recovery阶段的限速配置
    • ConcurrentRebalanceAllocationDecider,rebalance并发控制
    • DiskThresholdDecider,磁盘空间进行决策的分配器
  • 条件限制类
    • RebalanceOnlyWhenActiveAllocationDecider,所有shard都处于active状态下,才可以执行rebalance操作
    • FilterAllocationDecider
    • ReplicaAfterPrimaryActiveAllocationDecider,保证只在主分片分配完毕才开始分配分片副本
    • ClusterRebalanceAllocationDecider,通过集群中active的shard状态来决定是否可以执行rebalance

使用场景

新建索引

  • allocators负责找出拥有分片数量最少的节点列表,按分片数量升序排序,因此分片较少的节点会被优先选择
  • 对于新建索引,allocators的目标就是以更均衡的方式把新索引的分片分配到集群的节点中
  • 对于新建索引,allocators的目标就是以更均衡的方式把新索引的分片分配到集群的节点中 odeciders依次遍历allocators给出的节点,并判断是否把分片分配到该节点上

已有索引

  • 主分片
    • allocators只允许把主分片指定在已经拥有该分片完整数据的节点上
  • 副分片
    • allocators则是先判断其它节点上是否已有该分片的数据的副本
    • 如果有这种节点,则allocators优先把分片分配到其中一个节点
    • 因为副分片一旦分配,就需要从主分片中进行数据同步
    • 所以当一个节点只拥有分片中的部分数据时,也就意味着哪些未拥有的数据必须从主节点中复制得到,这样可以明显地提高副分片的数据恢复速度

Discovery模块

发现模块,负责发现集群中的节点,以及选举主节点

gateway模块

简述

  • 该模块负责集群元信息的存储和集群重启时的恢复
  • 负责对受到Master广播下来的集群状态数据的持久化存储,并在集群完全重启时恢复它们

Indices模块

索引模块,管理全局级的索引设置,不包括索引级的(索引分类:全局级、每个索引级)

HTTP模块

该模块允许通过JSON over HTTP的方式访问ES的API,本质上是完全异步的,这意味着没有阻塞线程等待响应

Transport模块

简述

  • 传输模块用于集群内节点之间的内部通信
  • 从一个节点到另一个节点的每个调用都使用传输模块
  • 传输机制是完全异步的,这意味着没有阻塞线程等待响应
  • 默认情况下,传输模块使用9300端口通信
  • 传输模块有一个专用的tracer日志,当它被激活时,日志系统会记录传入和传出的请求
  • 传输模块,用于集群内节点之间的内部通信。从一个节点到另一个节点的每个请求都使用传输模块

配置信息

  • 传输模块配置,完整的配置请参照官方文档
  • 通用网络配置项,完整的配置请参照官方文档
    • network.host
    • discovery.zen.ping.unicast.hosts
    • http.port
    • network.bing_host
    • network.publish_host

Action处理

  • RPC处理
  • REST处理

总体架构

  • 网络层
    • 网络层是对内部给中传输模块的抽象,使得上层发送/接收数据时不必关系底层的实现
    • 在内部实现中,传输模块和HTTP模块统一封装到NetworkModule类中
  • 服务层
    • 服务层指网络模块的上层应用层,基于网络模块提供的Transport来收/发数据

Snapshot模块

简述

  • 快照模块是ES备份、迁移数据的重要手段
  • 它支持增量备份,支持多种类型的仓库存储

仓库

用于存储创建的快照,建议每个大版本创建单独的快照存储库

常见操作

  • 注册仓库命令
  • 获取仓库信息

快照

常见操作

  • 创建快照
    • put {host}/_snapshot/{backup_name}/{snapshot_name}
  • 获取快照信息
    • get {host}/_snapshot/{backup_name}/{snapshot_name}
  • 查看快照的详细信息
    • get {host}/_snapshot/_status
    • get {host}/_snapshot/{backup_name}/_status
    • get {host}/_snapshot/{backup_name}/{snapshot_name}/_status
  • 取消、删除快照
    • delete {host}/_snapshot/{backup_name}/{snapshot_name}
  • 从快照恢复
    • 要恢复一个快照,目标索引必须处于关闭状态
    • 默认情况下,快照中的所有索引都会被恢复,但不恢复集群状态。需要调节参数,可以选择地恢复部分索引和全局集群状态
    • post {host}/_snapshot/{backup_name}/{snapshot_name}_restore
  • 监控恢复进度
    • 可通过标准的恢复监控服务来监视恢复的状态
  • 创建快照的实现原理
    • Lucene快照负责获取最新的、已刷盘的分段文件列表,并保证这些文件不被删除,这个文件列表就是ES要执行复制的文件
    • ES负责数据复制、仓库管理、增量备份、以及快照删除

ThreadPool模块

简述

  • 每个节点都会创建一系列的线程池来执行任务,许多线程池都有与其相关任务队列,用来允许挂起请求,而不是丢弃它

线程池类型

  • fixed,线程池拥有固定数量的线程来处理请求,当线程空闲时不会销毁,当所有线程都繁忙时,请求被添加到等待队列中
  • scaling,该线程池的线程数量时动态的,介于核心线程数和最大线程数之间变化
  • direct,这种线程池对用户并不可见;当某个任务不需要在独立的线程执行,又想被线程池管理时,于是诞生了这种特殊的线程池:在调用者线程中执行任务
  • fixed_auto_queue_size,该线程池的线程数量为固定值,但队列类型不一样

ES中常见线程池

  • generic,用于通用的操作(如节点发现),线程池类型为scaling
  • index,用于index/delete操作,线程池类型为fixed,大小为处理器的数量,队列大小200,允许设置的最大线程数为1+处理器数量
  • search,用于count/search/suggest操作。线程池类型为fixed
  • get,用于get操作,线程池类型为fixed
  • snapshot,用于snaphost/restore操作,线程池类型为scaling
  • warmer,用于segment warm-up操作,线程池类型为scaling
  • refresh,用于refresh操作,线程池类型为scaling
  • listener,用于java客户端线程监听器被设置为true是执行动作,线程池类型为scaling
  • same,在调用者线程执行时,不转移到新的线程池
  • management,管理工作的线程池
  • flush,用于索引数据的flush操作
  • force_merge,用于Lucene分段的force merge

处理器设置

  • 默认情况下,ES自动探测CPU处理器数量。各个线程池的大小基于这个数量进行初始化
  • 如果想要手工指定处理器数量,则可以通过设置processors参数实现

查看线程池

  • get {host}/_cat/thread_pool
    • 该命令显示每个节点的线程池统计信息。默认情况下,所有线程池都返回活动、队列和被拒绝的统计信息
    • 需要特别留意被拒绝的信息,例如:bulk请求被拒绝意味着客户端写入失败
  • get {host}/_nodes
    • 该命令返回每个线程池的类型和配置信息,例如:线程数量、队列大小等
  • get {host}/_nodes/stats
    • 返回集群中一个或全部节点的统计数据
  • get {host}/_nodes/hot_threads
    • 返回集群中一个或全部节点的热点线程

Engine模块

该模块封装了对Lucene的操作以及translog的调用,它是对一个分配读写到左的最终提供者