1.【工具】Datax的码下基本概念(初识ETL工具)
2.MySQL 核心模块揭秘 | 12 期 | 创建 savepoint
3.第三届oceanbase数据库大赛决赛|赛题相关源码解析
4.企业如何实践开源协同
5.深入探秘高性能并发:C++如何在Linux巧妙应用Futex实现线程锁同步(ob_latch.cpp篇)大篇幅(3万字)
6.MySQL 核心模块揭秘 | 13 期 | 回滚到 savepoint
【工具】Datax的基本概念(初识ETL工具)
ETL技术的实质是将数据经过抽取、清洗转换之后加载到数据仓库的码下过程。DataX是码下由阿里巴巴研发并开源的异构数据源离线同步工具,能实现不同数据源之间的码下数据同步,包括关系型数据库、码下NoSQL数据存储、码下无忧箱体王源码无结构化数据存储、码下时间序列数据库以及阿里的码下云数仓数据存储。DataX是码下阿里云DataWorks数据集成的开源版本,用于在阿里巴巴集团内广泛使用的码下离线数据同步工具/平台,支持包括MySQL、码下Oracle、码下OceanBase、码下SqlServer、码下Postgre、码下HDFS、Hive、ADS、HBase、TableStore(OTS)、MaxCompute(ODPS)、Hologres、DRDS等各种异构数据源之间的高效数据同步。
DataX采用Framework + plugin的架构,数据同步步骤将数据的读取、写入操作抽象为由Reader/Writer插件处理,纳入整个同步框架。其核心组件包括Job、Task、Channel以及Transformer。
Job代表数据同步任务;Task代表运行一个单独的同步线程,该线程使用一个Channel作为Reader与Writer的数据传输媒介;数据流转方向为Reader—>Channel—>Writer。
Transformer模式提供强大的数据转换功能,DataX内置丰富数据转换实现类,用户可根据自身需求扩展数据转换。
DataX的安装部署可选择直接下载工具包或下载源码自主编译。下载后解压至本地目录即可运行同步作业。自检脚本为:python { YOUR_DATAX_HOME}/bin/datax.py { YOUR_DATAX_HOME}/job/job.json。
若数据源同步遇到格式不匹配问题,可以修改相应的reader与writer代码,然后maven编译,后续会提供具体源码修改示例。
DataX的源码可在gitee上找到,以解决github地址在国内可能存在的连接问题。参考网址提供了更多关于ETL工具-Datax的头像变成狗源码资源。
MySQL 核心模块揭秘 | 期 | 创建 savepoint
回滚操作,除了回滚整个事务,还可以部分回滚。部分回滚,需要保存点(savepoint)的协助。本文我们先看看保存点里面都有什么。
作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源
本文基于 MySQL 8.0. 源码,存储引擎为 InnoDB。
InnoDB 的事务对象有一个名为undo_no 的属性。事务每次改变(插入、更新、删除)某个表的一条记录,都会产生一条 undo 日志。这条 undo 日志中会存储它自己的序号。这个序号就来源于事务对象的 undo_no 属性。
也就是说,事务对象的 undo_no 属性中保存着事务改变(插入、更新、删除)某个表中下一条记录产生的 undo 日志的序号。
每个事务都维护着各自独立的 undo 日志序号,和其它事务无关。
每个事务的 undo 日志序号都从 0 开始。事务产生的第 1 条 undo 日志的序号为 0,第 2 条 undo 日志的序号为 1,依此类推。
InnoDB 的 savepoint 结构中会保存创建 savepoint 时事务对象的 undo_no 属性值。
我们通过 SQL 语句创建一个 savepoint 时,server 层、binlog、InnoDB 会各自创建用于保存 savepoint 信息的结构。
server 层的 savepoint 结构是一个SAVEPOINT 类型的对象,主要属性如下:
binlog 的 savepoint 结构很简单,是一个 8 字节的整数。这个整数的值,是创建 savepoint 时事务已经产生的 binlog 日志的字节数,也是接下来新产生的 binlog 日志写入 trx_cache 的 offset。
为了方便介绍,我们把这个整数值称为binlog offset。html介绍页源码
InnoDB 的 savepoint 结构是一个trx_named_savept_t 类型的对象,主要属性如下:
创建 savepoint 时,server 层会分配一块 字节的内存,除了存放它自己的 SAVEPOINT 对象,还会存放 binlog offset 和 InnoDB 的 trx_named_savept_t 对象。
server 层的 SAVEPOINT 对象占用这块内存的前 字节,InnoDB 的 trx_named_savept_t 对象占用中间的 字节,binlog offset 占用最后的 8 字节。
客户端连接到 MySQL 之后,MySQL 会分配一个专门用于该连接的用户线程。
用户线程中有一个m_savepoints 链表,用户创建的多个 savepoint 通过 prev 属性形成链表,m_savepoints 就指向最新创建的 savepoint。
server 层创建 savepoint 之前,会按照创建时间从新到老,逐个查看链表中是否存在和本次创建的 savepoint 同名的 savepoint。
如果在用户线程的 m_savepoints 链表中找到了和本次创建的 savepoint 同名的 savepoint,需要先删除 m_savepoints 链表中的同名 savepoint。
找到的同名 savepoint,是 server 层的SAVEPOINT 对象,它后面的内存区域分别保存着 InnoDB 的 trx_named_savept_t 对象、binlog offset。
binlog 是个老实孩子,乖乖的把 binlog offset 写入了 server 层为它分配的内存里。删除同名 savepoint 时,不需要单独处理 binlog offset。
InnoDB 就不老实了,虽然 server 层也为 InnoDB 的 trx_named_savept_t 对象分配了内存,但是 InnoDB 并没有往里面写入内容。
事务执行过程中,用户每次创建一个 savepoint,InnoDB 都会创建一个对应的 trx_named_savept_t 对象,并加入 InnoDB 事务对象的 trx_savepoints 链表的末尾。
因为 InnoDB 自己维护了一个存放 savepoint 结构的链表,server 层删除同名 savepoint 时,InnoDB 需要找到这个链表中对应的 savepoint 结构并删除,流程如下:
InnoDB 从事务对象的 trx_savepoints 链表中删除 trx_named_savept_t 对象之后,server 层接着从用户线程的 m_savepoints 链表中删除 server 层的SAVEPOINT 对象,也就连带着清理了 binlog offset。
处理完查找、删除同名 savepoint 之后,server 层就正式开始创建 savepoint 了,这个过程分为 3 步。
第 1 步,字幕网yellow源码binlog 会生成一个 Query_log_event。
以创建名为test_savept 的 savepoint 为例,这个 event 的内容如下:
binlog event 写入 trx_cache 之后,binlog offset 会写入 server 层为它分配的 8 字节的内存中。
第 2 步,InnoDB 创建 trx_named_savept_t 对象,并放入事务对象的 trx_savepoints 链表的末尾。
trx_named_savept_t 对象的 name 属性值是 InnoDB 的 savepoint 名字。这个名字是根据 server 层为 InnoDB 的 trx_named_savept_t 对象分配的内存的地址计算得到的。
trx_named_savept_t 对象的savept 属性,是一个 trx_savept_t 类型的对象。这个对象里保存着创建 savepoint 时,事务对象中 undo_no 属性的值,也就是下一条 undo 日志的序号。
第 3 步,把 server 层的 SAVEPOINT 对象加入用户线程的 m_savepoints 链表的尾部。
server 层会创建一个SAVEPOINT 对象,用于存放 savepoint 信息。
binlog 会把binlog offset 写入 server 层为它分配的一块 8 字节的内存里。
InnoDB 会维护自己的 savepoint 链表,里面保存着trx_named_savept_t 对象。
如果 m_savepoints 链表中存在和本次创建的 savepoint 同名的 savepoint, 创建新的 savepoint 之前,server 层会从链表中删除这个同名的 savepoint。
server 层创建的 SAVEPOINT 对象会放入m_savepoints 链表的末尾。
InnoDB 创建的 trx_named_savept_t 对象会放入事务对象的trx_savepoints 链表的末尾。
第三届oceanbase数据库大赛决赛|赛题相关源码解析
第三届OceanBase数据库大赛决赛中,选手们需要掌握的比赛知识点已由官方答疑材料详尽解析,这里我们汇总了与比赛相关的架构和概念要点。OceanBase 4.0架构采用无共享集群,由对等节点组成,每个节点独立运行存储、SQL和事务引擎,提供高可用、高性能和低成本服务。单机分布式一体化设计使4.x版本在单机内操作时性能更优。
核心概念包括数据分区(如范围分区、哈希分区等),副本分布保证数据可靠性,OBServer管理分区数据并协调其他节点执行SQL请求。集群通过OBProxy和负载均衡层实现全集群负载均衡。
OceanBase中的关键组件如总控服务负责资源调度和元数据管理,元数据表如__all_core_table和__all_root_table存储系统和用户表信息。4.x版本引入meta租户和日志流优化,同花顺 涨跌停 源码减少系统负载。
大赛涉及的模块源码解析中,如Bootstrap流程,涉及创建1号日志流和执行Bootstrap操作。Create tenant流程涉及状态机和核心函数执行顺序。
Bootstrap流程包括发起创建日志流和执行execute_bootstrap,create_all_schema函数是关键步骤。而数据分区的迁移在4.x版本通过动态绑定日志流实现自动化。
理解这些概念和流程对于参赛者来说至关重要,涉及到的模块源码如集群初始化、模式服务、DDL操作等都是比赛深入理解的基石。记住,对系统表如__all_core_table和简单模式的理解也是参赛者必须掌握的。企业如何实践开源协同
企业实践开源协同的关键在于共享工作流,确保所有贡献者基于同一核心流程工作。对于企业内部项目开放源代码,若不考虑共享工作流,则外部贡献者难以有效参与。以OceanBase项目为例,其在GitHub和Gitee平台同时托管,却缺乏统一工作流,导致外部贡献者只能处理简单的补丁问题,无法更深入参与。这种情况下,企业内部活动与开源平台活动分离,形成内外两套工作流,难以形成真正的开源共同体。
而以Apache InLong项目为参考,其在明确开源协同目标后,对工作流进行融合,将问题报告、补丁提交和版本发布流程统一,内部需求也基于共享工作流构建。这样不仅减少了内部与开源平台之间的沟通损耗,还提高了软件工程效率。
TiDB项目展示了开源协同中设计文档的重要性。项目早期设计文档的缺失导致了功能设计的内部封闭讨论,而缺乏公开讨论。在成立公司后,虽然设计文档有所恢复,但依然存在内部决策直接在开源平台上线的情况,缺乏与社区成员的同步。通过改进工作流,明确设计文档的公开讨论,以及关注持续集成的改进,TiDB项目逐渐增强了与开源社区的互动。
Taichi项目则提供了开源协同在不同背景参与者中的实践案例。随着项目发展,虽然缺乏背景信息的情况有所改善,但仍需关注保持开源协同的核心价值,即公开讨论与贡献。通过招募不同背景的参与者,鼓励在GitHub平台上的开放交流,Taichi项目能够吸引并整合来自全球的贡献者。
寻找不同背景的参与者是企业实践开源协同的另一个关键。用户群体并不总是能提供大规模的核心贡献者,企业应更积极地寻找具备技术深度的开发者,同时寻找能够与开源项目整合形成用户解决方案的开发者。项目的核心逻辑与扩展机制是吸引这些参与者的关键,通过设计丰富的扩展点和策略替换机制,企业可以吸引到关注生态互连的贡献者。
总之,企业实践开源协同需要关注共享工作流的建立、设计文档的公开讨论、不同背景参与者招募以及项目核心逻辑的开放性。通过这些策略,企业可以有效参与到开源共同体中,促进项目的可持续发展和创新。
深入探秘高性能并发:C++如何在Linux巧妙应用Futex实现线程锁同步(ob_latch.cpp篇)大篇幅(3万字)
通过实例学习C++的Futex应用,理解线程锁同步在OceanBase 4.0源码中的巧妙使用
这篇文章详细介绍了如何在Linux环境下,利用C++的Futex实现线程锁同步,以开源项目ob_latch.cpp为例,探讨了自旋锁、互斥锁和等待队列的实现和优缺点。 1. 自旋锁分析:通过low_try_lockA,自旋次数由max_spin_cnt控制,避免CPU资源浪费。 2. 互斥锁-ObLatchMutex:提供try_lock, lock, wait三种加锁方式,分别对应不同的场景和策略。 3. ObLatchWaitQueue:管理等待队列,确保公平调度,如wait阻塞锁的使用和唤醒机制。 4. 锁的解锁逻辑:如ObLatchMutex的unlock,通过原子操作移除或减少锁的持有计数,必要时唤醒等待队列。 5. 高级锁封装:如ObLatchWGuard等RAII类,自动管理锁的生命周期,确保资源安全。 通过以上组件的组合,开发者可以灵活设计线程同步机制,保证多线程环境下资源访问的正确性和效率。 如果你在项目中设计线程锁,可以根据这些原理和实例进行调整和优化。MySQL 核心模块揭秘 | 期 | 回滚到 savepoint
深入理解 MySQL,了解如何实现部分回滚操作。本文由技术专家操盛春撰写,他在公众号『一树一溪』分享 MySQL 和 OceanBase 源码研究。本文基于 MySQL 8.0.,InnoDB 存储引擎,探讨核心模块的工作原理。
首先,我们创建测试表并插入数据。关键操作分为四个阶段,编号为 SQL 1 至 SQL 4,其中 SQL 4 是讨论焦点。SQL 2 和 SQL 3 分别产生 undo 日志 0 和 1。
当执行事务时,产生的 binlog 日志在 trx cache 中。回滚整个事务时,需要清除这些日志。然而,实际操作中,binlog 回滚步骤看似简单,却并未执行真正清除,只是为后续的 InnoDB 回滚做准备。
InnoDB 回滚是关键环节,它会根据 undo 日志执行反向操作,恢复事务影响的数据。以 SQL 为例,会从最新的 undo 日志开始回滚,逐条执行反向操作,包括记录的删除。
回滚后,事务的执行状态需要通过提交事务来更新。这不同于 commit 语句,因为回滚操作已经改变了数据,即使从逻辑上看恢复了原样,也需要将 InnoDB 中的修改正式提交。
trx cache 中的 binlog 日志会在 InnoDB 回滚完成后进行清除,这个过程涉及内存 buffer 和磁盘临时文件。binlog 回滚步骤延迟到这个阶段,是因为在事务提交前,binlog 日志并不需要写入持久化存储。
总结起来,MySQL 的部分回滚包括:无实际动作的 binlog 回滚,执行 InnoDB 回滚恢复数据,然后提交 InnoDB 事务,最后清理 trx cache 中的临时 binlog。如果你对文中内容有疑问,欢迎留言交流。
对于 SQL 质量管理,如需更多工具支持,可以了解 SQLE,一个覆盖开发到生产环境的 SQL 管理平台,提供流程自动化和数据质量管理功能。
实战教程第一章:OceanBase 数据库概述
OceanBase 是由阿里巴巴和蚂蚁集团自主研发的一款分布式关系型数据库,它基于通用服务器集群,使用Paxos协议和分布式架构,具有高可用、线性扩展、高性能和低成本等核心技术优势。
OceanBase 集群支持跨机房跨城市的部署,并在故障时,内部多副本自动切换,不丢失数据,天然适合异地容灾和多活建设。
在 OceanBase 社区版中,您可以免费复制和使用源代码,但需遵守 MulanPubL - 2.0 许可证。 OceanBase 社区版官方网站为 open.oceanbase.com,支持的操作系统包括但不限于 Linux、macOS 和 Windows。
相比于 MySQL,OceanBase 社区版在存储空间压缩效果上更出色,甚至可以达到 MySQL 空间大小的四分之一。OceanBase 提供了多租户支持,每个租户可按需分配资源,具有高可用能力,易于维护。
OceanBase 提供了强大的 SQL 引擎能力,支持 SQL 解析和执行计划缓存,复杂 SQL 运算,大纲技术干预 SQL 执行计划等,同时一套 SQL 引擎可以同时支持 OLTP 和 ROLAP 类型的混合场景需求。OceanBase 集群支持水平拆分技术,无需分库分表,SQL 和事务对业务完全透明,功能上没有限制。
在 OceanBase 社区版中,包含 OceanBase 企业版的所有核心功能,例如多租户、高可用和强一致能力,以及自动化运维平台,可以解决 MySQL 在高可用和强一致问题上的痛点。
对于业务访问压力大、数据量增长和查询性能下降等问题,OceanBase MySQL 租户提供分区表的水平拆分方案,提供原生的 SQL 和事务能力,对业务透明,同时支持在线扩容和缩容,内部数据迁移异步进行,具备高可用能力。
在 OceanBase 数据库上进行复杂查询时,可以减少不必要的数据同步,同时提供不同程度的读写分离技术来控制复杂查询对交易场景的影响。
OceanBase 社区版适合业务规模大、自动化运维需求高、数据量增长和查询性能下降以及需要原生 SQL 和事务能力的场景。
如果您在使用 OceanBase 时遇到任何问题,欢迎与我们联系,我们将为您提供支持。
深入探索C++模板元编程:理论基础、特化与重载、编译机制及OceanBase实战应用
本文深入解析C++模板元编程的核心理论,详细讲述模板的特化与重载机制,并探讨模板在编译阶段的行为。我们将通过OceanBase数据库的源码剖析,展现模板元编程在大型项目中的高效应用。1. 模板元编程的理论知识
模板元编程在C++中是一种强大的技术,允许在编译时进行计算、生成代码、检查类型等操作。模板的基本概念包括模板、模板参数、模板特化和模板重载。 模板的主要优点在于提高代码的可重用性、减少代码量和提高程序的性能。然而,其缺点也包括学习曲线较陡峭、复杂性提高以及可能的编译时错误。 模板在大型项目中的应用广泛,可以实现类型安全的动态行为、高效的数据结构实现以及复杂的算法优化。2. 在编译时计算《斐波那契数列》
斐波那契数列是一个经典的递归序列,每项是前两项之和。在编译时计算斐波那契数列可以利用模板元编程实现。 数学上,斐波那契数列可以通过递归关系定义。通过模板元编程,可以在编译时计算斐波那契数列的任意项,无需运行时计算,提高效率。 例如,计算Fibonacci<5>::value时,编译器会在编译阶段计算出斐波那契数列的第5项为5,无需运行时执行计算。3. 类型萃取 - 检查是否是指针类型
类型萃取是模板元编程中的一个重要应用,可以用于检查类型是否为指针类型。通过特化和模板参数,编译器可以自动选择合适的版本来处理指针和非指针类型。 例如,使用模板元编程可以实现一个判断类型是否为指针的函数,通过类型萃取选择正确的实现版本。4. 编译时条件 - 启用或禁用函数重载
模板元编程还允许在编译时启用或禁用函数重载。通过条件编译机制,可以根据类型参数选择不同的函数实现。 例如,针对整数和非整数类型提供不同的getValue函数实现,编译器会根据实际参数类型选择正确的重载版本。5. 模板特化实现重载的使用方法(参考OceanBase代码)
模板特化是实现函数重载的一种方式,允许根据特定的模板参数提供特定的函数实现。OceanBase的源代码中就大量运用了这种技术。 通过使用模板特化,可以在编译时针对不同的类型参数提供优化的实现,实现类型安全和性能优化。 总结,模板元编程在C++中具有强大的功能,通过特化、重载和类型萃取等技术,可以实现高效的代码生成和类型安全的运行时行为。OceanBase的源代码展示了这些技术在实际大型项目中的应用价值。2024-12-24 09:251191人浏览
2024-12-24 09:071403人浏览
2024-12-24 08:4966人浏览
2024-12-24 07:56841人浏览
2024-12-24 07:531899人浏览
2024-12-24 06:542496人浏览
韓國科技大廠三星電子在技術上不斷追趕台積電腳步,最新宣布接獲第一份2奈米代工訂單,將為日本獨角獸AI新創Preferred NetworksPFN)代工生產2奈米晶片,搶下台積電的訂單。對此,專家表示
據香港電台報道,日本財務省公布的數據顯示,日本3月出口按年增長7.3%,連續4個月錄得按年增長,升幅高過市場預期的7%,但較2月的7.8%有所放緩。期內,進口按年轉跌4.9%,跌幅多過預期的4.7%;
中国消费者报哈尔滨讯记者万晓东)日前,黑龙江省大庆市市场监管局组织召开了全市风险分级较高的50家集体聚餐餐饮企业暨年夜饭承办单位食品安全约谈会,对其企业法定代表人进行集体警示性约谈,提前打&ldquo