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的调用,它是对一个分配读写到左的最终提供者