Starocks中的一致性检查ConsistencyChecker

背景

本文基于Starrocks 3.1.7

结论

SR一致性检查主要是涉及两个部分:1. tablet元数据的一致性检查每间隔两个两个小时进行检查,检查TabletInvertedIndex LocalMetastore的tablet的一致性,如果tablet既不在当前catalog中也不在回收站里,就直接从当前的TabletInvertedIndex 删除掉2. tablet的数据的一致性检查从 23点到4点 一直循环进行 一致性检查,如果上一批还没完,则等待上一批的全部检查完才进行下一批的一致性检查,以db/table/partition/index/tablet这种层次 按照 lastCheckTime 从远到近排序,选择最多100个tablet进行一致性校验, 选择的tablet条件为:1. 不是 olap table以及不是物化视图的的 Normal表不校验2. 分区副本数据为1的不校验3. 已经校验的tablet不校验

其中涉及到的 变量为 consistency_check_end_time consistency_check_start_time 以及 MAX_JOB_NUM

分析

涉及到的数据链路如下:

getConsistencyChecker().start();||\/Daemon.runOneCycle||\/ConsistencyChecker.runAfterCatalogReady

主要的逻辑也是在runAfterCatalogReady中:

  if (System.currentTimeMillis() - lastTabletMetaCheckTime > Config.consistency_tablet_meta_check_interval_ms) {checkTabletMetaConsistency();lastTabletMetaCheckTime = System.currentTimeMillis();}// for each round. try chose enough new tablets to check// only add new job when it's work timeif (itsTime() && getJobNum() == 0) {List<Long> chosenTabletIds = chooseTablets();for (Long tabletId : chosenTabletIds) {CheckConsistencyJob job = new CheckConsistencyJob(tabletId);addJob(job);}}jobsLock.writeLock().lock();try {// handle all jobsIterator<Map.Entry<Long, CheckConsistencyJob>> iterator = jobs.entrySet().iterator();while (iterator.hasNext()) {Map.Entry<Long, CheckConsistencyJob> entry = iterator.next();CheckConsistencyJob oneJob = entry.getValue();JobState state = oneJob.getState();switch (state) {case PENDING:if (!oneJob.sendTasks()) {clearJob(oneJob);iterator.remove();}break;case RUNNING:int res = oneJob.tryFinishJob();if (res == -1 || res == 1) {// cancelled or finishedclearJob(oneJob);iterator.remove();}break;default:break;}} // end while} finally {jobsLock.writeLock().unlock();}
  • 进行tabllet元数据的检查,间隔为两个小时,主要是在checkTabletMetaConsistency方法中,该方法的主要就是判断如果tablet既不在当前catalog中也不在回收站
    里,就直接从当前的TabletInvertedIndex 删除掉,逻辑比较清晰。
  • tablet数据的一致性检查
    • 首先是判断是否是处于一致性检查的时间断,consistency_check_start_time(默认是23),consistency_check_end_time(默认是4),也就是每天的23点到4点之间进行一致性检查 且等待上一批次的一致性检查任务都结束了才进行下一轮的检查
    • 再次是选择进行一致性检查的tablet,见方法 chooseTablets ,这块逻辑也很清晰,以db/table/partition/index/tablet这种层次 按照 lastCheckTime 从
      远到近排序,选择最多100个tablet进行一致性校验
    • 组装成 CheckConsistencyJob ,并放入到jobs中
    • 调用sendTasks方法,从jobs中 构造AgentBatchTask,并提交給backend,进行一致性检查
        AgentBatchTask batchTask = new AgentBatchTask();...for (Replica replica : tablet.getImmutableReplicas()) {// 1. if state is CLONE, do not send task at this timeif (replica.getState() == ReplicaState.CLONE|| replica.getState() == ReplicaState.DECOMMISSION) {continue;}if (replica.getDataSize() > maxDataSize) {maxDataSize = replica.getDataSize();}CheckConsistencyTask task = new CheckConsistencyTask(null, replica.getBackendId(),tabletMeta.getDbId(),tabletMeta.getTableId(),tabletMeta.getPartitionId(),tabletMeta.getIndexId(),tabletId, checkedSchemaHash,checkedVersion);// add task to sendbatchTask.addTask(task);// init checksum as '-1'checksumMap.put(replica.getBackendId(), -1L);++sentTaskReplicaNum;}...for (AgentTask task : batchTask.getAllTasks()) {AgentTaskQueue.addTask(task);}AgentTaskExecutor.submit(batchTask);
      
      • 构建AgentBatchTask实例,
      • 对于每一个tablet的replica副本,构建CheckConsistencyTask,并加到AgentBatchTask中去,并在最后添加到AgentTaskQueue队列中,便于进行跟踪
      • 调用AgentTaskExecutor.submit(batchTask)把任务提交到后端的backend中去执行,主要代码在AgentBatchTask.run方法中
           public void run() {for (Long backendId : this.backendIdToTasks.keySet()) {BackendService.Client client = null;TNetworkAddress address = null;boolean ok = false;try {ComputeNode computeNode = GlobalStateMgr.getCurrentSystemInfo().getBackend(backendId);if (RunMode.getCurrentRunMode() == RunMode.SHARED_DATA && computeNode == null) {computeNode = GlobalStateMgr.getCurrentSystemInfo().getComputeNode(backendId);}if (computeNode == null || !computeNode.isAlive()) {continue;}String host = computeNode.getHost();int port = computeNode.getBePort();List<AgentTask> tasks = this.backendIdToTasks.get(backendId);// create AgentClientaddress = new TNetworkAddress(host, port);client = ClientPool.backendPool.borrowObject(address);List<TAgentTaskRequest> agentTaskRequests = new LinkedList<TAgentTaskRequest>();for (AgentTask task : tasks) {agentTaskRequests.add(toAgentTaskRequest(task));}client.submit_tasks(agentTaskRequests);
        
        • 根据每个tablet的backend的host和port,构建Thrift client,并调用toAgentTaskRequest把每个AgentTask转换为thridt格式的请求
        • 调用client.submit_tasks提交到backend执行CHECK_CONSISTENCY任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/465724.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDK1.5 java代码打包jar HmacSha256

文章目录 demo地址背景实现编写代码编译class文件打包 JAR 文件执行生成的 JAR 文件辅助验证方式 常见问题和解决方法常规生成jar方案maven插件idea工具 demo地址 https://github.com/xiangge-zx/HmacSha256 背景 最近接到一个需求,做一个可以用来HmacSha256加密的小工具&am…

数据结构与算法分析:专题内容——动态规划1之理论讲解(代码详解+万字长文+算法导论+力扣题)

一、前言 The future is independent of the past given the present 未来独立于过去&#xff0c;只基于当下。 马尔可夫链&#xff0c;即状态空间中经过从一个状态到另一个状态的转换的随机过程。 0 在开始之前请认真理解下面这段话&#xff1a; 决策类求最优解问题&#xf…

25.停车场管理系统(基于web的Java项目)

目录 1.系统的受众说明 2.相关技术与方法 3.系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 需求分析 3.2.1 系统功能描述 3.2.2 用例图分析 4. 系统设计 4.1 系统类分析 5. 系统详细设计与实现 5.1 用户登录 5.2 系统信…

【网络】自定义协议——序列化和反序列化

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是序列化和分序列&#xff0c;并且自己能手撕网络版的计算器。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不…

.NET 8 中 Entity Framework Core 的使用

本文代码&#xff1a;https://download.csdn.net/download/hefeng_aspnet/89935738 概述 Entity Framework Core (EF Core) 已成为 .NET 开发中数据访问的基石工具&#xff0c;为开发人员提供了强大而多功能的解决方案。随着 .NET 8 和 C# 10 中引入的改进&#xff0c;开发人…

Docker学习—Docker的安装与使用

Docker安装 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…

ArcGIS006:ArcMap常用操作151-200例动图演示

摘要&#xff1a;本文介绍了ArcMap邻域分析、栅格表面分析、水文分析、区域分析、提取分析等工具箱中的工具功能。包括计算图层间点、线、面要素间的距离、位置和角度&#xff0c;创建缓冲区&#xff0c;添加计算信息到属性表&#xff0c;分割面要素&#xff0c;编号&#xff0…

小菜家教平台(三):基于SpringBoot+Vue打造一站式学习管理系统

目录 前言 今日进度 详细过程 相关知识点 前言 昨天重构了数据库并实现了登录功能&#xff0c;今天继续进行开发&#xff0c;创作不易&#xff0c;请多多支持~ 今日进度 添加过滤器、实现登出功能、实现用户授权功能校验 详细过程 一、添加过滤器 自定义过滤器作用&…

SQL进阶技巧:如何计算复合增长率?

目录 0 场景描述 1 数据准备 2 问题分析 3 小结 0 场景描述 复合增长率是第N期的数据除以第一期的基准数据&#xff0c;然后开N-1次方再减去1得到的结果。假如2018年的产品销售额为10000&#xff0c;2019年的产品销售额为12500&#xff0c;2020年的产品销售额为15000&…

python-docx -- 读取word图片

文章目录 概念介绍形状对象读取图片自定义图形 概念介绍 从概念上来讲&#xff0c;word文档分为两层&#xff0c;一个文本层&#xff0c;一个绘画层&#xff1b; 文本层&#xff0c;从上到下&#xff0c;从左到右&#xff0c;流式排版&#xff0c;本页填满则开启新页面&#…

Python数据可视化seaborn

产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…

释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作

作者&#xff1a;来自 Elastic Matt Scourfield, Andrew Crothers, Brian Lambert 组织依靠知识产权 (IP) 来推动创新、保持竞争优势并创造收入来源。对于希望将新产品推向市场的公司来说&#xff0c;弄清楚谁拥有哪些专利是一项必不可少的能力。搜索数百万项专利可能既困难又耗…

协议栈攻击分类(CISP-PTE笔记)

CISP-PTE笔记 协议栈攻击分类 1.协议栈自身的脆弱性 ​ 1&#xff09;缺乏数据源验证机制 ​ 2&#xff09;缺乏完整性验证机制 ​ 3&#xff09;缺乏机密性验证机制 2.网络接口层攻击 3.网络层攻击 4.应用层攻击 网络攻击的基本模式 被动威胁&#xff08;不影响通信双…

SpringBoot3集成Junit5

目录 1. 确保项目中包含相关依赖2. 配置JUnit 53. 编写测试类4、Junit5 新增特性4.1 注解4.2 断言4.3 嵌套测试4.4 总结 在Spring Boot 3中集成JUnit 5的步骤相对简单。以下是你可以按照的步骤&#xff1a; 1. 确保项目中包含相关依赖 首先&#xff0c;确保你的pom.xml文件中…

智慧城市智慧城市项目方案-大数据平台建设技术方案(原件Word)

第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章 政策标准保障…

算法练习:904. 水果成篮

题目链接&#xff1a;904. 水果成篮。 题目意思就是可以选取两个种类的水果不能超过两个种类&#xff0c;该种类个数没有限制&#xff0c; 但是一旦超过两个种类的水果就要停止计数。 示例中数组编号就是就是种类&#xff0c;就是不能出现三个不同编号的数。 1.暴力解法&…

wincc中全局脚本C(c语言脚本)的研究和解密

文章目录 前言一、分析 前言 很多时候我们在wincc中写全局脚本时会为自己的脚本添加密码&#xff0c;但很久很久以后再想修改密码忘记了怎么办呢。 一、分析 经过分析编码有了下面成功 ![请添加图片描述](https://i-blog.csdnimg.cn/direct/33baf91a49da410e82f16b4fbd746c48…

Java+控制台 商城销售系统

Java控制台 商城销售系统 一、系统介绍二、功能展示1.系统登陆2.二维数组实现商城销售系统3.类集实现商城销售系统 四、其它1.其他系统实现 一、系统介绍 实现一个xx商城销售系统的登录功能: 1)&#xff09;打开系统&#xff0c;给出欢迎信息。 2&#xff09;将用户名和密码定…

微服务中常用分布式锁原理及执行流程

1.什么是分布式锁 分布式锁是一种在分布式系统环境下实现的锁机制&#xff0c;它主要用于解决&#xff0c;多个分布式节点之间对共享资源的互斥访问问题&#xff0c;确保在分布式系统中&#xff0c;即使存在有多个不同节点上的进程或线程&#xff0c;同一时刻也只有一个节点可…

A15基于Spring Boot的宠物爱心组织管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…