当前位置:网站首页>PD 源码分析- Checker: region 健康卫士
PD 源码分析- Checker: region 健康卫士
2022-07-29 12:03:00 【InfoQ】
- 当有 region 的副本(peer) 处于非正常状态时,生成 operator 加速其变成正常状态
- 当 region 太大时,触发分裂。
- 当 Region 不符合当前的副本定义规则(placementrule) 时,生成对应调度
- 当前 region 过小时,尝试合并。
Check 执行主流程
ParalRegions
- paralRegions 默认每隔 10ms 顺序扫 region, 检查当前批次 region 是否需要生成调度。
- 间隔时间 10ms 可通过配置项 patrol-region-interval 进行调整。
- 每一轮巡检操作如下:
- Unsafe recover 检测
- 如果当前 cluster 处于 recovery 状态,跳过直到 unsafe recovery 完成
- checkPriorityRegions
- Priority region 主要来自于 checkRegion 中发现副本缺失时的 region
- checkSuspectRegions
- Suspect region 主要来自于placement-rule发生更新后,会将相关 region 放进来检查
- checkWaitingRegions
- 主要出现在 check region 中发现副本缺失,生成了 operator, 但是发现当前已经达到 storelimit 门槛。
- 扫当前集群 region 信息
- 从上一次 key 往后获取 128(const) 个 region
- 如果 regions 个数为 0,key 重置到起点 nil, 下一次重头扫
- 顺序对每一个 region 进行检查,看其是否有必要生成新的 operator
- 若已经有 pending 中的 operator, 则不需要
- CheckRegion 检查当前 region 是否需要新的 operator. 具体流程见下文。
- 将 key 设置为当前 region 的 end-key
- 检查CheckRegion生成的 operator,检查步骤如下
- 没有 operator, 继续下一个 region
- 超过 storeLimit 限制,将当前 region 加入到 waitingRegion, 在下一轮 iv (checkWaitingRegions) 里处理
- 当前 operator 可以进行
- 加入到 operatorController 中(opController.AddWaitingOperator)
- 当前 region 从 waitingRegion 中删除
- 当前 region 从 suspectRegion 中删除
- 更新统计信息
- 更新 region label 相关统计信息
- 如果正好扫完了所有 region(len(key)=0), 上报处理完整个集群的使用时间。
CheckRegion

jointStateChecker 副本中间状态安全卫士
- IsPaused, return
- 检查 region 状态
- Peers 都不在 joint state,return
- jointState 状态定义为:当前存在 peer 为 learner<-> voter 切换的中间状态,或新节点刚加入但还在成为 learner , voter 过程中。
- 创建 LeaveJointStateOperator
- operator builder 检查 region 基本信息,若存在异常,return
- Peers 离开了 joint state,return
- 创建 operator ,return
- 该 operator 优先级设置为最高
ScheduleDisabled
- 如果当前 region 被标记了 scheduleDisabled 停止调度 label, 返回 nil, 不需要新 operator
SplitChecker
- IsPaused, return
- 准备 split-key
- Label 中当前 region 所在返回内的所有 key
- 如果上述 key 个数为 0 且存在 placementrule, 则获取当前 placement rule 对应到本 region 的所有 key.
- splitChecker 根据 label 和 placementrule 检查是否需要 split
- Any Label 的 range 边界存在在当前 region 中,需要 split
- Any plancementrule 的 range 边界在当前 region 中,需要 split
ruleChecker(Placementrule 启用时副本检测)
Palacementrule 不启用时副本检测
- Learnerchecker 会将当前系统中所有 learner 变成 voter.
- ReplicaCHecker 会将缺失副本补全
- 补副本类的 operator 未到达上限,返回该 operator
- 补副本类的 operator 已经到达上限,对应 region 加入 regionWaitingList
Mergechecker
- 如果启用了 merge-checker, 则开始 merge checker, 如果发现当前 region 过小(比如大量的数据删除导致空 region), 则生成对应的 operator 进行合并。详细过程如下:
- 检查当前 merge 类的 operator 是否已经到达上限,若是返回 nil
- 如果系统刚启动或者 merge-checker 新添加,过一段时间才开始工作,返回 nil
- 更新当前 splitCache 里面的 TTL
- 检查当前 region 是否符合 merge 条件
- 如果 splitCache 里面有当前 region, 即当前 region 刚 split 过,不做 merge,return nil
- 如果 region approximate size 为 0,即 PD 还未收集到该 region 的信息,不做 merge, 返回 nil
- 检查 region 的 size 和 key 个数,如果比较大,不做 merge, 返回 nil
- 如果当前 region 不处于一个健康状态,如有 pending peer, 或 down peer, 不做 merge, 返回 nil
- 如果当前 region 有副本缺失,不做 merge, 返回 nil
- 如果当前 region 为热点 region,返回 nil
- 选取该 region 临近的两个 region prev & next
- 优先检查 next 是否符合 merge 到当前 region 的条件
- 如果 next 不符合,配置允许向前 merge, 检查 prev 是否符合条件
- 再次检查 target region 的 size 和 key 个数是否过大
- 检查 merge 后的新 region 是否会很快被分裂
- 合并后的 size 是否会过大
- 合并后的 keys 是否会过多
- 创建 merge operator
- 更新统计信息
- 返回 merge operators
边栏推荐
- 怎么以管理员身份运行cmd?以管理员身份运行cmd方法介绍
- 通过递归的方式实现树形结构
- 黑马四小时入门学习记录-2|本地应用
- XSS Vulnerability Analysis
- Kubernetes基本概念
- 基础架构之分布式配置中心
- 2.3 Insertion sort
- QCon Guangzhou Station is here!Exclusive custom backpacks are waiting for you!
- 惠及6亿人 投资98亿 沿江高铁武宜段最新进展来了!
- Based article 】 【 learn with Rust | Rust function and process control, rounding
猜你喜欢
随机推荐
DAY 27 daily SQL clock 】 【 丨 within a specified period of time all order products [difficult simple]
Insights into the development of the enterprise live broadcast industry in 2022
The interviewer training courseware (very practical in-house training courseware)
shell if else 使用
Building and sharing the root of the digital world: Alibaba Cloud builds a comprehensive cloud-native open source ecosystem
SQL clock in daily DAY 23 丨 】 the number of students have different subjects to test difficulty simple 】 【
Based article 】 【 learn with Rust | Rust function and process control, rounding
Recursion - Eight Queens Problem
MarkDown高阶语法手册
【每日SQL打卡】DAY 24丨不同国家的天气类型【难度简单】
【day04】IDEA、方法
three.js 报错信息 RGBELoader.js:46 RGBELoader Bad File Format: bad initial token
MySql启动、连接sqlog、主从复制、双机热备(开机时)
WordPress 常规设置
游戏合作伙伴专题:BreederDAO 与《王国联盟》结成联盟
【每日SQL打卡】DAY 21丨每个帖子的评论数【难度中等】
PHP uedtior报错 errorHandler is not defined
RediSearch 发布 v2.4.10 & v2.4.11 版本
How much is the test environment, starting from the actual needs
怎么以管理员身份运行cmd?以管理员身份运行cmd方法介绍









