摘要:在企业客户里, SQL Server 在传统的制造业依然散发着持久的生命力,SQL Server 的 CDC 复杂度相比 Oracle 较低, 因此标准的官方派做法就是直接使用这个 CDC 接口进行同步,但江湖上也有通过裸解析 ldf 文件来直接读取数据库变更,本文将就这两大门派展开探讨。

 

前言

上次发的关于Oracle CDC 的文章反响不错, 而像这种类型的数据库还有好几个, 这里把三大闭源数据库先讲一遍: Oracle, SQL Server 和 DB2。
 
在企业客户里, SQL Server 的使用范围远远超过我之前的预期, 这个在互联网用户那边几乎见不到的数据库, 在传统的制造业, 企业客户里依然散发着持久的生命力, 在 DB Engine 的排名里, SQL Server 仅次于 Oracle 与 Mysql, 排在第三, 是TAPDATA 在客户场景落地的时候经常碰见的数据库之一。
 

两大门派

SQL Server 的 CDC 复杂度相比 Oracle 较低, 且官方从 08 版本就天然支持这个功能, 只是在 16 版本之前, 这个设置只有在企业版才有, 在 16 版本之后, 在社区版也可以开启功能, 因此标准的官方派做法就是直接使用这个 CDC 接口进行同步。
 
在开启 CDC 功能之后, SQL Server 会将变更的内容同步到一张表中, 有主键, 业务方通过轮询这张带主键的表拿到新的事务变更。
 
这是最好实现的方案之一, 问题有好几个:
  1. 08 版本之前不支持。
  2. 16 版本之前只支持企业版。
  3. 依靠轮询, 实时性较差, 且 CDC 表本身也存在延迟, 正常情况下的延迟往往超过秒级。
  4. 如果忘记从表中取走数据, 这张表会无限膨胀。
  5. 被取走的数据会被清理, 无法回放日志。
  6. 配置复杂, 需要考虑 ALWAYSON 的情况下, 可用节点切换的 CDC 作业恢复的触发等配置。
 
SQL Server 在进行事务操作时, 会将操作记录在以 ldf 结尾的文件中, 因此江湖中各路草莽瞄准了这一点, 也开发了属于自己的数据追踪套路。
 
有很多做操作审计, 或者数据同步的厂商开始尝试绕过 CDC, 通过裸解析 ldf 文件来直接读取数据库变更, 具有的优势是:
  1. 负载与数据库分开, 性能可单独优化, 速度很快, 瓶颈在 IO 上。
  2. 可屏蔽各种部署结构带来的差异, ldf 文件是永恒的。
  3. 事件触发, 相比轮询 CDC 表, 消息延迟很低, 可以在几十毫秒内。
 
劣势是增加了部署复杂度, 需要在数据库机器上部署一个单独的 Agent 用来做日志的采集, 且需要自行考虑高可用切换时 Agent 传输日志的问题。
 
相比 Oracle 多样的版本, 和完全无法捉摸的二进制格式, SQL Server 的解析较为简单, 业界实现的各种商业产品也非常多, 不过目前没有看到在 Linux 下可用的版本, 也没有看到开源的实现出现。
 

TAPDATA 的解法

在默认情况下, TAPDATA 使用了轮询 CDC 增量表的方式进行数据获取, 这种方式对用户使用比较友好, 不需要额外部署服务, 同时, 支持 ALWAYSON 的自动切换, CDC 任务的自动恢复等高可用特性, 方便易上手。
 
在数据量非常大, CDC Table 性能不足, 或者客户对 CDC 延时有极高要求时, TAPDATA 可以通过 Agent 传输 + 裸日志文件解析的形式, 在获得数倍于传统方式性能的同时, 有效降低了延迟
 

一个小问题

Oracle 日志解析因为比较困难, 开源项目比较少, SQL Server 相对来说内容少很多, 而且 Google 一下有大量的商业软件在基于裸日志解析做一些审计, 观察, 同步的事情, 为什么依然看不到像样的开源项目呢?
 
进一步了解Tapdata 实时数据服务平台,更多技术文章可前往 Tapdata 技术博客。Tapdata 自研的异构数据库实时同步工具—— Tapdata Cloud ,现已免费开放给技术开发者使用,目前支持 Oracle、MySQL、PostgreSQL、SQL Server、MongoDB、Elasticsearch 、达梦、Kafka等主流库之间的数据迁移和同步,即将支持 DB2、Sybase ASE、Redis、GBase、GaussDB 等。
 
本文作者:Tapdata 技术合伙人肖贝贝,源文地址

实时数据引擎系列(五): 关于 SQL Server 与 SQL Server CDC的更多相关文章

  1. Tapdata 肖贝贝:实时数据引擎系列(四)-关于 Oracle 与 Oracle CDC

      摘要:想实现 Oracle 的 CDC,排除掉一些通用的比如全量比对, 标记字段获取之外, 真正的增量形式获取变更, 有三种办法: Logminer .XStream .裸日志解析,但不管哪种方法 ...

  2. Tapdata肖贝贝:实时数据引擎系列(三) - 流处理引擎对比

      摘要:本文将选取市面上一些流计算框架包括 Flink .Spark .Hazelcast,从场景需求出发,在核心功能.资源与性能.用户体验.框架完整性.维护性等方面展开分析和测评,剖析实时数据框架 ...

  3. Tapdata 肖贝贝:实时数据引擎系列(六)-从 PostgreSQL 实时数据集成看增量数据缓存层的必要性

      摘要:对于 PostgreSQL 的实时数据采集, 业界经常遇到了包括:对源库性能/存储影响较大, 采集性能受限, 时间回退重新同步不支持, 数据类型较复杂等等问题.Tapdata 在解决 Pos ...

  4. 基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  5. 通过 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(二)

    我们上一篇<基于 WebSocket 实现 WebGL 3D 拓扑图实时数据通讯同步(一)>主要讲解了如何搭建一个实时数据通讯服务器,客户端与服务端是如何通讯的,相信通过上一篇的讲解,再配 ...

  6. SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型

    原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...

  7. SQLSERVER 免费对比数据库结构和数据的工具支持:SQL Server 2012, SQL Server 2008 and SQL Server 2005

    New xSQL Schema Compare - version 5 Compare the schemas of two SQL Server databases, review differen ...

  8. Tapdata 实时数据融合平台解决方案(五):落地

    作者介绍:TJ,唐建法,Tapdata 钛铂数据 CTO,MongoDB中文社区主席,原MongoDB大中华区首席架构师,极客时间MongoDB视频课程讲师. 通过前面几篇文章,我们从企业数据整合与分 ...

  9. 一文让你彻底了解大数据实时计算引擎 Flink

    前言 在上一篇文章 你公司到底需不需要引入实时计算引擎? 中我讲解了日常中常见的实时需求,然后分析了这些需求的实现方式,接着对比了实时计算和离线计算.随着这些年大数据的飞速发展,也出现了不少计算的框架 ...

随机推荐

  1. iOS全埋点解决方案-手势采集

    前言 ​ 随着科技以及业务的发展,手势的应用也越来越普及,因此对于数据采集,我们要考虑如果通过全埋点来实现手势的采集. 一.手势识别器 ​ 苹果为了降低开发者在手势事件处理方面的开发难度,定义了一个抽 ...

  2. 想学会SOLID原则,看这一篇文章就够了!

    背景 在我们日常工作中,代码写着写着就出现下列的一些臭味.但是还好我们有SOLID这把'尺子', 可以拿着它不断去衡量我们写的代码,除去代码臭味.这就是我们要学习SOLID原则的原因所在. 设计的臭味 ...

  3. drools中query的使用

    一.背景 我们知道在drools中是存在工作内存的,我们的Fact对象会加入到工作内存中,同时我们自己也可以在drl文件中使用insert/modify/update/delete等方法,修改工作内存 ...

  4. Soa: 一个轻量级的微服务库

    Soa 项目地址:Github:MatoApps/Soa 介绍 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合. 感谢 Rabbi ...

  5. Nexus5x 刷机

    1.刷机方式 线刷 线刷的本质的是对分区的全部内容的替换,线刷的包通常比较大. 卡刷 顾名思义,将升级包放在存储卡上,然后进入Recovery引导模式对系统进行刷机.卡刷本质是对文件的替换过程.它不会 ...

  6. Flask框架实现登录注册功能(mysql数据库)

    前言: 本例使用Flask框架完成登录和注册操作,包括前端(index.html,regist.html)和后端(app.py)两部分,前端页面不过多介绍,直接进入后端部分: 逻辑思路: 登录部分:运 ...

  7. MySQL之SQL语句优化

    语句优化 即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行. 条件简化 移除不必要的括号 select * from x where ((a = 5)); 上面 ...

  8. 给IDEA道个歉,这不是它的BUG,而是反编译插件的BUG。

    你好呀,我是歪歪. 上周我不是发了<我怀疑这是IDEA的BUG,但是我翻遍全网没找到证据!>这篇文章吗. 主要描述了在 IDEA 里面反编译后的 class 文件中有这样的代码片段: 很明 ...

  9. Codeforces Round #746

    挺喜欢这场题目的 A: 水,不写了 B: Hemose Shopping 嘲讽自己一下啦~真的是caii 题意:一个数列,我们通过交换两个点(两点满足距离大于等于\(x\)),问能否排序成功. 思路: ...

  10. GO的日志库log竟然这么简单!

    前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...