专栏首页爱可生开源社区分布式 | DBLE 新全局表检查实现浅析

分布式 | DBLE 新全局表检查实现浅析

作者:孙正方

爱可生 DBLE 核心研发成员,拥有丰富的分布式数据库中间件开发、咨询以及调优经验,擅长数据库中间件问题排查和处理,对线上中间件部分排错有深入的实践与认知。

本文来源:原创投稿

*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

背景

在 dble 2.19.11.0 之前的版本中,继承于 Mycat 的实现,全局表检查是一个 server 级别的功能,并且通过在创建全局表的时候添加列 _dble_op_time 来进行实现。在实际使用中带来了许多棘手的问题。

  • 开关不便
  • 结果集处理不便
  • 数据导入处理不便

在 dble 2.19.11.0 中,考虑到生产中实际使用的场景和定义情况,按照以下的几点要求,对于全局表检查进行了重新的设计:

  • 检查开关在表格级别(只有部分表格需要检查)
  • 检查触发的具体时间需要能精确定义
  • 检查的方式要求可以自定义
  • 检查方式自定义要求足够足够简单明确

实现原理

根据以上提供的明确要点,dble 引入了 quartz 框架来进行定时任务的时间控制,并且在 schema.table 级别的标签上添加了以下的几个可选项:

  • globalCheck
  • cron
  • globalCheckClass

并且在加载过程中,将每一个 table 的全局表检查,作为一个独立的定时任务加载到 quartz 中去,之后便交由 quartz 进行触发和执行。

而至于每一个独立的定时任务,则可以和其他的 dble 中的自定义功能一样,由用户自定义以下几个方法:

  • getCountSQL (全局表检查 SQL 执行定义)
  • getFetchCols (全局表检查结果集列定义)
  • resultEquals (全局表检查结果对比方法)
  • failResponse (全局表检查失败反馈方法)
  • resultResponse (全局表检查结果反馈方法)

具体的执行逻辑和流程如下图所示:

简单的描述为以下步骤:

  • start/reload 的时候将表格所配置的定时任务加入到 quartz 中
  • quartz 触发定时任务
  • 实例化 AbstractConsistencyChecker 并执行
  • 根据方法 getCountSQL 确定需要执行的 SQL,并将 SQL 下发执行
  • 根据方法 getFetchCols 确定需要获取的 SQL 执行结果列
  • 根据方法 resultEquals 对于不同 MySQL 上的检查结果进行对比
  • 根据 failResponse 和 resultResponse 方法进行结果的反馈

全局表检查使用实例

当然,dble 内置了两种全局表检查的默认方法,并提供了对应的简称:

  • CHECKSUM
  • COUNT

顾名思义,以上的两种默认方法分别通过在不同的 MySQL 节点求取同名表的 checksum 值以及 count 的数量来进行比较不同 MySQL 节点上的数据的一致性。

具体则可以按照以下进行配置:

<!--dble内置CHECKSUM检查方式-->

<table name="tb_global1" dataNode="dn1,dn2" type="global" globalCheck="true" cron="0 * * * * ?" globalCheckClass="CHECKSUM"/>

<!--dble内置COUNT检查方式-->

<table name="tb_global2" dataNode="dn1,dn2" type="global" globalCheck="true" cron="0 * * * * ?" globalCheckClass="COUNT"/>

本文分享自微信公众号 - 爱可生开源社区(ActiontechOSS),作者:孙正方

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-04-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 分布式 | dble 中分布式时间戳方式的全局序列

    爱可生 dble 项目团队成员,主要负责 dble 相关的日常测试工作,擅长对 dble 中出现的问题进行排查。热爱测试工作,余生欲将测试工作进行到底。

    爱可生开源社区
  • 分布式 | DBLE Release Notes 详细解读 2.20.04.0

    以下对 DBLE 2.20.04.0 版本的 Release Notes 进行详细解读。

    爱可生开源社区
  • 分布式 | DBLE 3.20.07.0 来啦!

    以下对 DBLE 3.20.07.0 版本的 Release Notes 进行详细解读。

    爱可生开源社区
  • Selenium2+python自动化63-二次封装(click/send_kesy)

    前言 我们学了显示等待后,就不需要sleep了,然后查找元素方法用参数化去定位,这样定位方法更灵活了,但是这样写起来代码会很长了,于是问题来了,总不能每次定位一...

    上海-悠悠
  • python开发_stat

    当我们使用os.stat(path)获取一个文件(夹)信息的时候, os.stat(path)本身返回的是一个元组如: nt.stat_result(s...

    Hongten
  • Apache自定义报错页面

    简单、
  • Python之数据聚合与分组运算

    Python之数据聚合与分组运算 1. 关系型数据库方便对数据进行连接、过滤、转换和聚合。 2. Hadley Wickham创建了用于表示分组运算术语“spl...

    王小雷
  • salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)

    Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pd...

    用户1169343
  • ES6核心特性

    ES6 虽提供了许多新特性,但我们实际工作中用到频率较高并不多,根据二八法则,我们应该用百分之八十的精力和时间,好好专研这百分之二十核心特性,将会收到事半功倍的...

    Fundebug
  • Shapefile属性操作之增

    《Python空间数据处理实战》系列的博文好久都没有更新了,今天乘周末有点时间,补了个觉,然后写几篇博文。

    卡尔曼和玻尔兹曼谁曼

扫码关注云+社区

领取腾讯云代金券