-
作者:饶珑辉 华为云数据库内核专家 近期,华为云数据库团队推出了专家技术解读系列,该系列基于GaussDB产品,每期围绕1个核心技术点进行深度剖析。上期由华为瑞典研究所数据库Lab首席科学家吕漫漪女士解读《GaussDB(for MySQL)云栈垂直集成的力量有多大?》,本期将由华为云数据库内核专家饶珑辉针对吕漫漪文章中介绍的GaussDB(for MySQL)关键特性之“并行查询”(PQ: Parallel Query)进行详细解读。 一般来讲,数据库有两个非常广泛的应用场景,分别是“事务处理”和“查询分析”。开源MySQL作为国内使用最多的关系型数据库之一,很早在5.1版本就开始支持事务处理的场景。随着技术演进,开源MySQL在版本更新迭代过程中不但持续增强事务处理能力,并且最新的MySQL 8.0版本已经开始支持许多查询分析型的特性,比如Window function、CTE、Hash Join、列直方图、并行COUNT计算等等。 华为云GaussDB(for MySQL) 作为华为最新一代高性能企业级分布式关系型数据库,根植MySQL开源社区,不但继承了开源的所有查询分析特性,还面向企业级应用查询负载开发了许多增强特性,如并行查询、查询计算下推(NDP: Near Data Processing)等等。 在传统数据解决方案中,“事务处理”和“查询分析”分别放在不同类型的库上完成,这是因为事务处理以数据增、删、改,以及小数据查询为主,更加注重实时响应、高吞吐和事务性要求。而“查询分析”以大数据量复杂计算为主,更加注重数据容量扩展性、复杂计算能力等。下图展示的是传统数据解决方案:OLTP数据库满足在线事务处理需求,OLAP数据仓库满足分析型查询需求。 客户需要什么样的数据库? 当前业界对数据库的普遍需求是:实时响应、高吞吐、满足事务性、良好的扩展性以及支持复杂查询。这对于使用者而言有很多好处:首先是降低部署成本,用户只需要部署一套数据库集群即可;其次是解决了数据迁移时延的问题,更新和查询运行在同一套集群中;还有就是支持事务性查询,满足一致性、原则性、隔离性和持久性要求,查询结果会更加准确。 针对用户需求,华为云原生数据库GaussDB(for MySQL)通过技术创新,具备了同时满足事务处理和查询分析的能力。GaussDB(for MySQL)是一款100%兼容MySQL语法的OLTP事务关系型数据库,架构上采用了计算和存储分离的设计,计算资源和存储资源可以分别进行独立在线扩展。存储层使用了华为自研分布式存储系统DFV(数据功能虚拟化: Data Function Virtualisation),最大可以扩展到128TB容量,单个计算节点最大规格可支持64核CPU,512G的内存容量,最多可以支持1个写节点和15个只读节点。 除了强大的资源扩展能力,GaussDB(for MySQL)针对事务处理和查询分析分别作了优化,极大增强了事务读写和查询分析的能力。本文将重点介绍增强的查询分析能力之一:并行查询。 查询分析提升之道:释放CPU多核计算资源 众所周知,软件计算能力的提升一方面得益于CPU硬件能力的增强,另一方面也得益于软件设计层面能够充分利用CPU的计算资源。当前处理器普遍采用多核设计,如GaussDB(for MySQL)单个节点最多可以支持64核的CPU。单线程查询的方式至多能用满一个核的CPU资源,性能提升程度有限,远远无法满足企业大数据量查询场景下对降低时延的要求。因此,复杂的查询分析型计算过程必须考虑充分利用CPU的多核计算资源,让多个核参与到并行计算任务中才能大幅度提升查询计算的处理效率。 下图是使用CPU多核资源并行计算一个表的count(*)过程的例子:表数据进行切块后分发给多个核进行并行计算,每个核计算部分数据得到一个中间count(*)结果,并在最后阶段将所有中间结果进行聚合得到最终结果。 GaussDB(for MySQL)查询分析提升秘笈:并行查询 GaussDB(for MySQL)支持并行执行的查询方式,用于降低分析型查询场景的处理时间,满足企业级应用对查询低时延的要求。如前面所述,并行查询的基本实现原理是将查询任务进行切分并分发到多个CPU核上进行计算,充分利用CPU的多核计算资源来缩短查询时间。并行查询的性能提升倍数,理论上与CPU的核数正相关,就是说并行度越高能够使用的CPU核数就越多,性能提升的倍数也就越高。 下图展示的是:在GaussDB(for MySQL)的64U实例上查询100G数据量的COUNT(*)查询耗时,不同的查询并发度分别对应不同耗时,并发度越高对应的查询耗时越短。 GaussDB(for MySQL)支持多种类型的并行查询算子,以满足客户各种不同复杂查询场景。当前最新版本(2021-9)已经支持的并行查询场景包括:主键查询、二级索引查询主键扫描、索引扫描、范围扫描、索引等值查询,索引逆向查询并行条件过滤(where/having)、投影计算并行多表JOIN(包括HashJoin、NestLoopJoin、SemiJoin等)查询并行聚合函数运算,包括SUM/AVG/COUNT/BIT_AND/BIT_OR/BIT_XOR等并行表达式运算,包括算术运算、逻辑运算、一般函数运算及混合运算等并行分组group by、排序order by、limit/offset、distinct运算并行UNION、子查询、视图查询并行分区表查询并行查询支持的数据类型包括:整型、字符型、时间类型、浮点型等等其他查询 下图是GaussDB(for MySQL)并行查询针对TPC-H的22条查询场景所做的性能测试结果,测试数据量为100G,并发线程数据是32。下图展示了并行查询相比传统MySQL单线程查询的性能提升情况:32并行执行下,单表复杂查询最高提升26倍性能,普遍提升20+倍性能。多表JOIN复杂查询最高提升近27倍性能,普遍提升10+倍性能。子查询性能也有较大提升。 总而言之,GaussDB(for MySQL)并行查询充分调用了CPU的多核计算资源,极大降低了分析型查询场景的处理时间,大幅度提升了数据库性能,可以很好的满足客户多种复杂查询场景的低时延要求。目前,GaussDB(for MySQL)并行查询功能已经全网上线,更多并行查询场景正在不断解锁中,欢迎大家前往华为云官网体验: https://www.huaweicloud.com/product/gaussdb_mysql.html Ps:看完觉得还不过瘾?下期将由我们另一位专家为大家带来GaussDB(for MySQL) “并行DDL” 技术解读,更多精彩,敬请期待! 华为将于2021年9月23-25日在上海世博中心&世博展览馆举办华为全联接2021,以“深耕数字化”为主题,汇聚业界思想领袖、商业精英、技术大咖、先锋企业、生态伙伴、应用服务商以及开发者等各方,探讨如何深入行业场景,把数字技术与行业知识深度结合,真正融入政企的主业务流程,解决核心业务问题,催生体验提升、效率提升以及模式创新;并发布场景化的产品与解决方案,分享客户伙伴的最新成果与实践,构筑开放共赢的健康生态。 了解更多信息,请访问官网www.huawei.com/hc2021
-
活动时间:2021年8月16日~10月20日活动背景:大家知道,在我国近20年的“数据库原理及应用”的教学活动中,其教学实验环节,几乎没有国产数据库的身影。近年来,国产数据库软件日渐成熟,尤其是华为公司自主研发的国产云数据库,GaussDB(for MySQL) 和GaussDB for open Gauss的出现,给我们带来了新的气息,新的希望、新的前景。本课程是由东北师范大学博士生导师李雁翎老师团队和华为云数据库技术专家团队共同打造的新课,帮助大家掌握数据库操作技能,进而有能力数字化一切可以数字化的事物。课程简介:本课程由华为云数据库GaussDB国产数据库支撑,共有3个教学模块:数据库基础理论、数据库技术和数据库系统控制。每周开放一章节内容,循序渐进,掌握数据库操作技能,“零”基础也能学,学习请点击:https://www.icourse163.org/course/NENU-1464035185活动参与入口:【第1期 有奖竞答】跟专家学《数据库原理▪GaussDB云数据库》MOOC,更有书籍、玻璃杯、GaussDB字母笔等你哦!【第2期 开学见面礼】博导带你学MOOC,盖楼就享4000元代金券服务,还有8种好礼拿!【第3期 华为“云”赏月】分享数据库MOOC,价值199元华为云背包等你来拿!【第4期 国庆最嗨免费区】华为云数据库:MOOC免费学、沙箱免费玩,229元移动电源送不停!//*本帖为MOOC系列活动总帖,具体的活动参与方式和活动奖励以每一个具体的活动为准,有问题请添加小助手微信:1820232786
-
目前,第七届中国国际“互联网+”大学生创新创业大赛火热报名中,为了帮助参赛者更好了解赛题设计思路和命题方向,华为云产业命题赛道举行了线上直播解读,华为云数据库资深架构师苏斌在直播间详细解读了GaussDB命题赛道攻略,通过剖析数据库关键技术和赛题考点,助力参赛选手轻松拿高分。数据库是什么?谈及数据库,可能有很多小伙伴不太了解,简单来说,数据库是存取和管理数据的软件(在生活中可以形象的类比为“大仓库”、“电子文件柜”等等)。当今世界是一个信息爆炸的时代,充斥着大量数据,我们的衣食住行,生活的方方面面都与数据有了不可分割的关系。为了满足各种类型的数据特点与爆炸式的数据增长与存储管理压力,社会催生了多种类型数据库的蓬勃发展,很多关键的数据库新技术,例如分布式、云原生等也应运而生。这类数据库相比传统数据库性能更强,可靠性更强,扩展性更强,容量更大,有了这类数据库,数据读取/存储速度更快了,时延更低了,应对故障场景更从容了,面对大流量洪峰再也不怕了……说到云原生分布式数据库的典型代表,华为云GaussDB(for MySQL)必须榜上有名。作为华为云GaussDB数据库的当家花旦,GaussDB(for MySQL) 100%兼容MySQL语法,是华为最新一代高性能企业级分布式关系型数据库。它基于华为最新一代DFV分布式存储,采用计算存储分离架构,最高支持128TB的海量存储,可实现超百万级QPS吞吐,支持跨AZ部署,数据0丢失,既拥有商业数据库的性能和可靠性,又具备开源数据库的灵活性。为了让开发者深入了解数据库技术,并用相关技术解决企业实际业务问题,本届“互联网+”大赛的产业命题赛道·华为云GaussDB命题推出了相关题目:基于GaussDB(for MySQL)实现高性能、高扩展性的bufferpool(缓冲池)。赛题解读:抢先掌握bufferpool(缓冲池)原理及技术,应战更从容数据库系统一般都会有一个Buffer Pool(缓冲池),用于将一些频繁访问的热点数据从磁盘读到缓存中,避免我们在数据库中读取或者写入数据时对慢速磁盘设备进行频繁访问,从而加快数据的访问速度,提升数据库的性能。本赛道赛题就是希望选手能借鉴并参考GaussDB(for MySQL)的设计理念和思路,实现一个高性能、高扩展性的Buffer Pool。比赛分为三个阶段,1)实现一个基本功能的Buffer Pool, 能够缓存固定大小(16K)的一些热点数据,需要保证从缓存中读取和写入数据的正确性。2)在保证正确性的前提下,使用LRU、LFU和LRU-K等淘汰算法及其变种,提升Buffer Pool 的命中率,从而提高热点数据访问速度。3)在云化场景下,为了提高资源利用率,会多种数据库共用同一存储资源池,每种数据库有不同的page size(页面大小), Buffer Pool需要有高扩展性,能够支持同时缓存各种page size(page size 固定为8KB、16KB、32KB和2MB)的数据。这里科普下赛题中的相关概念:Page:Page是数据库中磁盘和内存交换的基本单位,也是数据库管理磁盘空间的基本单位。比如MySQL中默认的page大小为16K,PostgreSQL page为8K。Data manager:数据管理器,用于管理数据的读取和写入。Meta manager:元数据管理器,用于管理page在内存中的信息。答题指南8月31日报名结束后(在互联网+大赛官网和华为云平台均需报名),提交作品入口正式对外开放,请参考赛事组提供的DEMO,该DEMO包含评测程序及简单Buffer Pool实现,请在此基础上完成Buffer Pool的代码编写与编译,并在平台上传参赛作品,获取评测分数与结果。赛题组针对C++语言提供了log4cxx日志组件,详情参见赛题组DEMO,Java/Python等语言请使用常用的日志组件。作品运行反馈界面同时也提供日志下载,同时请避免打印过多的日志。为了充分保证比赛的公平性,参赛选手不得使用第三方存储引擎库(如RocksDB、LevelDB、LMDB等),在其之上封装接口用来参赛;不得依赖第三方动态库,以免导致程序在评测环境不能运行;参赛程序初始化需在3分钟内完成,关闭需在10分钟内完成,测试需在30分钟内完成。 什么样的作品容易拿高分?如果想完成高质量作品在大赛中“一骑绝尘”,那么你可能还需要了解比赛的评分逻辑,每个作品的测评分为两个阶段,包括正确性评测和性能评测。正确性评测阶段,评测程序会进行纯读和读写混合测试。测试系统会随机对所有数据页面进行访问,访问包括读和写。对读取的页面,会对该页面进行正确性验证,页面验证不通过测试将结束,且测试不得分。对写入的页面,该页面可能在后续被再次访问,并进行正确性验证;同时当评测程序完成运行测试后,将发送信号关闭参赛程序,参赛程序需持久化尚未持久化的页面数据,评测程序将进行页面正确性验证。如果验证不通过,测试将结束,且测试不得分。只有通过正确性评测阶段,才会进入性能评测阶段。性能评测的评测模型会有多种,评测参数参考如下:在正确性验证通过的情况下,对每个不同评测模型的测试阶段整体计时,如果该阶段的正确检测全部通过,则成绩有效,根据总用时从低到高进行排名(用时越短排名越靠前)。评测程序将根据评测模型对参赛程序进行测试,计时从发送第一个请求开始,最后一个请求完成结束,最终计时为各项测试模型的测试阶段耗时之和。最后再次提醒大家,本次“互联网+”大赛GaussDB赛道的时间安排:报名和时间截止到8月31日,初/复赛截止9月30日,预计10月中下旬举行全国总决赛。点击链接进入大赛页面报名:戳它报名。想要了解更多赛题详解,欢迎观看GaussDB命题解读直播回顾:回顾链接。
-
作者:吕漫漪 华为瑞典研究所数据库Lab首席科学家如今云计算越来越普及,云堆栈作为云计算的重要服务模式,其关键组件之一是事务数据库服务。在实际业务场景中,应用程序依赖于可扩展、高性能的托管数据库服务,以充分受益于云平台。而云数据库也需要高效利用底层云基础架构,以释放云规模运营的潜力。华为云GaussDB(for MySQL)是华为基于新一代DFV(全称Data Function Virtualisation,数据功能虚拟化)分布式存储,采用计算存储分离架构,完全兼容MySQL的高性能企业级云原生分布式数据库,以全托管服务形式为互联网和企业客户提供专业服务。在本文中,我将解释常见的客户工作负载,以及我们如何利用华为云计算堆栈的独特能力来处理这种工作负载。谁是云上的客户?他们的工作负载是什么?在国内,人们通常认为只有互联网初创企业才会使用云平台,而MySQL由于在互联网公司中广受欢迎,得到众多国内企业的青睐。但实际上,企业多年前就已经开始拥抱云概念,并在不断深入发展中,这也是中国当前的趋势。MySQL作为世界上最流行的开源数据库,在所有行业和互联网公司中都被广泛采用。那么,云数据库客户的典型工作负载是什么?我们观察到的两个特点是:1)数据量越来越大。从一开始就有几TB到几十TB的数据量,而且随着时间的推移,数据量会越来越大。2)简单的插入/删除/更新/点查和复杂的分析查询的混合。此外,偶尔也会有DDL操作。目前客户面临一个很大挑战,即如何在数据量大的情况下提升数据库性能。客户希望在复杂查询的同时,保持核心事务工作负载的吞吐量。因为企业的业务逻辑性质,查询通常会比较复杂。幸运的是,MySQL 8.0添加了期待已久的分析行SQL支持,例如windowing function和递归CTE。对于非结构化数据,MySQL的JSON支持已经非常受欢迎。GaussDB(for MySQL)架构概述GaussDB(for MySQL)的架构构建在多租户共享的分布式存储系统之上,目前一个数据库的最大数据量为128TB,一个主节点用于读写负载,最多15个只读节点用于读负载。SQL引擎是一个经过深度修改的MySQL 8.0,因此在语法和语义方面与MySQL 100% 兼容。计算节点和存储之间用RDMA网络。GaussDB(for MySQL)服务使用的存储系统是一种高可靠的跨AZ云存储。在公有云上,存储系统可以是一个有几十或数百个节点的大型群集,横向扩展能力比单租户线下方案高很多倍。SQL节点将redo log写到存储层,页面在存储层materialize,此设计显著减少了更新密集型工作负载的网络通信。属于单个数据库的页面以slice形式组织,slices分布在多个存储节点上,这个数据分布是就是分布式查询的基础。华为云GaussDB(for MySQL)架构图华为独特优势:垂直集成与传统的线下数据库不同,云数据库有垂直集成云栈中所有层的能力。华为作为在云栈各层领先的提供商,在云领域中有着独特的地位,有能力成为行业的领导者。云栈中最接近数据库的是存储,线下纯软数据库需要与通用型存储以及标准文件系统配合使用,在垂直集成方面,几乎没有优化空间。但在云上,存储和数据库的集成能发挥更大的作用,因为云存储在存储节点方面的可扩展性很强,并允许客户根据数据量和负载动态扩展。由于云存储是多租户之间共享,而且并非所有租户都会每时每刻有大型扫描,因此我们可以将部分查询处理卸载到存储层,以实现更高的资源利用率。通过并行提高性能(并行查询:PQ)提高性能的一个通用方法是并行,并行可以在多层上实现。MySQL 8.0的社区版本仅支持单线程查询执行,无法充分利用硬件提供的所有核来执行复杂查询。我们修改了MySQL执行器,允许使用多个线程并行执行单个查询。与线下解决方案不同的是,云基础架构允许我们在计算节点上利用它的垂直扩展的能力。最大的计算节点目前有64个核,这也代表了我们通过并行查询可以实现的最大并行力度。当大部分热数据可以放在buffer pool里时,此优化效果最好。并行查询将在另一篇文章中详细解释。客户工作负载不仅包含DML,还包含DDL,例如索引创建、更改列的数据类型。虽然大多数DDL在MySQL中都是在线处理的,但有些操作可能会被阻塞,而且使用逻辑复制会扩大堵塞。GaussDB(for MySQL)使用物理复制,避免了这个问题。当表很大时,DDL操作可能需要数小时才能完成。为了支持我们在云上常见的数据量,优化DDL的必要性是显而易见的。我们已经有一种创新的方法来处理DDL,这种创新将在后面的文章中探讨。另一个允许更高并行力度的层是存储层,因为存储系统可能有数百个节点和数千个核心。GaussDB(for MySQL)使用的这种云规模的分布式存储是我们提高查询性能的一个关键基础,结合并行查询,有可能实现查询性能提高100倍以上。利用云存储提高查询性能 (算子下推:NDP)GaussDB(for MySQL)中的数据以slice形式组织,分布在多个存储节点上。我们利用这个数据分布,把算子卸载到数据所在的存储节点上,利用当地可用的计算资源执行,无需将数据读到计算节点中。用数据库术语,我们将其称为近数据处理(NDP)或算子下推。其基本原理是:将查询处理的部分工作下推到数据所在的存储节点上,所下推的查询是数据密集型查询,例如全表扫描和索引扫描,投影和某些WHERE条件的过滤,以及聚合在存储层执行,仅将匹配行和列返回到计算节点,而不是完整的页。除了并行执行之外,因为提取到计算节点的数据量显著减少,这种方法还减少了网络IO。此外,NDP算子下推还允许充分利用缓存和存储介质的本地带宽,当查询需要扫描大量数据,且数据不在Innodb缓冲池中时,卸载到存储的效果最好。例如,下图显示了NDP算子下推和并行查询将TCP-H Q12的执行时间优化了34倍。另一篇文章会单独介绍NDP的技术细节,并提供全面的性能分析。未来方向GaussDB(for MySQL)的设计是为云而生,此架构具有极其强大和灵活的垂直集成能力,计算和存储资源解耦并且可以独立扩展,同时在功能上紧密集成,数据库操作可以在多层中执行。未来,数据库功能也可以卸载到网卡和其他云组件,而不限于计算节点和存储。我们相信,云栈的深度集成是释放云数据库力量的关键,华为在实现这一目标方面处于独特的地位,正如GaussDB(for MySQL)所展示的那样,未来将引领云领域方向。 综上所述,华为云GaussDB(for MySQL)基于存算分离架构,通过并行查询PQ和算子下推NDP等先进技术,极大提升了数据库性能,实现了云栈垂直集成力量的最大化,让算力更快更猛。文章所述功能均已上线,欢迎大家前去华为云官网体验:https://www.huaweicloud.com/product/gaussdb_mysql.html,也请继续关注我们,后续还有更多技术信息与大家分享!华为将于2021年9月23-25日在上海世博中心&世博展览馆举办华为全联接2021,以“深耕数字化”为主题,汇聚业界思想领袖、商业精英、技术大咖、先锋企业、生态伙伴、应用服务商以及开发者等各方,探讨如何深入行业场景,把数字技术与行业知识深度结合,真正融入政企的主业务流程,解决核心业务问题,催生体验提升、效率提升以及模式创新;并发布场景化的产品与解决方案,分享客户伙伴的最新成果与实践,构筑开放共赢的健康生态。了解更多信息,请访问官网www.huawei.com/hc2021
-
中奖用户公示:本次活动在截止日期内共有效盖楼26层,属于【有效盖楼数量50层以内】,奖品为:openGauss书籍1本,并给获奖者加赠HDC纪念章1枚;恭喜用户【蜡笔不辣】获得以上奖品,如需更换请在问卷中进行备注或私信我进行沟通。问卷链接已发送,请在3个工作日内填写问卷,10月27日零点以后未填写的中奖用户视为放弃!【活动主题】《数据库原理*GaussDB云数据库》系列课程——数据库理论基础 第一期:有奖竞答【活动时间】2020年8月16日 - 10月10日【奖品展示】【参与方式】Step1. MOOC报名&学习:https://www.icourse163.org/course/NENU-1464035185Step2. 完成下方6道“有奖竞答”题:【回复方式】1. 华为云账号+MOOC报名学习截图;2.有奖竞答题:序号+答案;【奖励规则】所有参与盖楼的用户,均可参与抽奖!1.有效盖楼数量50层以内,奖品为:openGauss书籍1本,并给获奖者加赠HDC纪念章1枚;2.有效盖楼数量50≤X≤100层,奖品为:openGauss书籍1本,高硼玻璃杯2个,雨伞3把,并给获奖者加赠HDC纪念章各一枚;3.有效盖楼数量X>100层以上,奖品为:openGauss书籍1本,GaussDB字母笔2盒,高硼玻璃杯3个,雨伞(X-100)/20个,中奖名额根据有效盖楼层数而定,并给获奖者加赠HDC纪念章各一枚;注:每个用户盖楼总数不能超过5层,禁止连续盖楼;【推荐考证 ▪ 选做】《数据库原理▪GaussDB云数据库》MOOC中涉及到GaussDB(for MySQL),巩固知识,顺便考个证!HCIA-GaussDB 华为认证数据库工程师 培养与认证具备华为GaussDB数据库应用开发及管理能力的工程师适合人群:希望从事数据库开发或管理岗位的人员;售前/售后工程师/技术支持人员HCIP-GaussDB-OLTP 华为认证数据库高级工程师 培养与认证具备华为GaussDB(for MySQL)数据库二次开发及管理能力的高级工程师适合人群:希望成为GaussDB(for MySQL)数据库管理员的人员;希望成为数据库二次开发高级工程师考证权益:【倾情推荐】云数据库2.4折起,助力千行百业加速上云【注意事项】1.获奖结果将在活动结束后7个工作日内进行公示,请报名和留言的伙伴关注社区内容,所有奖品将在活动结束后15个工作日内发放。2.活动奖品颜色随机,且部分奖品数量有限发完将用等值奖品代替;3.活动参与需遵守《华为社区常规活动规则》;4.为保证活动的公平公正,华为云有权对恶意刷活动资源(“恶意”是指为获取资源而异常注册账号等破坏活动公平性的行为),利用资源从事违法违规行为的用户收回抽奖及奖励资格。5.本次活动一个实名认证账号只能对应一个获奖人,如同一账号填写多个不同获奖人,不予发放奖励;6.本活动最终解释权归华为云所有。【往期活动】【第2期 开学见面礼】博导带你学MOOC,盖楼就享4000元代金券服务,还有8种好礼拿!【第3期 华为“云”赏月】分享数据库MOOC,价值199元华为云背包等你来拿! 【第4期 国庆最嗨免费区】华为云数据库:MOOC免费学、沙箱免费玩,229元移动电源送不停!
-
6月20日,在ACM SIGMOD国际学术会议“中国数据库高峰论坛”,华为云数据库产品部总经理苏光牛发表了《云数据库的创新与发展》主题演讲,分享了华为云GaussDB数据库5大创新技术,坚持生态开放理念,加速千行百业数字化转型。数字化时代下,企业对云数据库提出了更高要求,既希望云数据库能满足海量业务场景下的复杂需求,又希望可以降低使用成本,提升业务效率,保障数据安全。云数据库也成为了产业升级转型和重塑产业格局的关键抓手。苏光牛提到,华为很早就开始重视数据库的投入和发展,从2007年开始研究数据库,到2020年统一数据库品牌GaussDB,华为持续战略投入数据库,并布局全球7大研究所,汇聚了一批海内外数据库领域专业人才,同时布局前沿技术,积极打造行业领先的技术竞争力。华为云数据库产品部总经理苏光牛发表演讲华为云GaussDB聚焦业务新场景,打造了以下5大核心技术竞争力:金融级高可用:华为云GaussDB提供了多种高可用方案,包括AZ内高可用、跨AZ多活、异地跨Region容灾的两地三中心容灾方案,满足金融级监管要求,并且历经银行核心关键业务严苛考验。软硬协同全栈能力:依托华为全产业链优势,垂直整合华为软硬件全栈资源,不断提升竞争力。企业级混合负载:分布式+全并行架构设计,提供事务处理与复杂查询高性能,支持1000+超大分布式集群能力,可以轻松应对海量高并发数据处理和复杂查询场景的考验。全密态数据库安全:华为云GaussDB实现从密钥处理、查询、内存、存储等全方位的安全合规和隐私保护,包括链路安全、存储安全、访问安全,同时对应用实现尽可能的透明,保证客户隐私安全。智能运维与调优:结合AI技术,实现数据库自动优化与调优等功能,让数据库管理变得更加智能高效。数据库呼唤开放的生态,华为也始终坚持开源开放理念,积极构建良好的数据库生态关系。华为云GaussDB目前已支持华为自有openGauss生态与主流开源数据库生态(如MySQL、MongoDB、Redis、InfluxDB、Cassandra等)。华为还将GaussDB部分核心能力开源到openGauss社区,鼓励合作伙伴基于开源openGauss发行属于自己的商业版本。此外,华为持续和高校联合开课,致力于培养数据库人才,繁荣数据库生态。目前,华为云GaussDB已在1000+大客户规模商用,遍布金融、政府、电信、能源、交通、电商等。另外还在SIGMOD、ICDE、VLDB等国际知名学术会议发表累计50+篇创新成果论文,内容涵盖系统架构、事务处理、AI自治、安全等。面向未来,华为云GaussDB将持续打造领先技术和服务,与更多合作伙伴一起共创时代新价值,共赢未来新机遇!
-
删除联盟帖子测试----060101
-
4月24-26日,华为开发者大会2021(HDC·Cloud)在深圳隆重举办。在名师大讲堂分会场,华为云数据库多位技术专家分享了GaussDB系列数据库全新5大黑科技,包括支持亿级时间线、千万级tpmC突破、两地三中心、AI自治等,通过技术创新不断为企业数字化转型注入新动力。黑科技1:GaussDB(for Influx)支持亿级时间线随着云计算规模越来越大,物联网(IoT)和运维监控(AIOps)领域的时序数据呈爆炸式增长,海量时序数据的存储和管理也成为一大难题。为了应对数据膨胀带来的管理、监控等挑战,华为云时序数据库GaussDB(for Influx)对内存分配、回收、单查询等功能做了大量优化,同时通过对数据分区分级、专用存储引擎、自适应压缩算法、高性能多维聚合查询、存储分析告警统一架构等技术的提升,实现亿级时间线下系统写入性能的稳定,大幅超出开源InfluxDB写入能力。华为云创新lab数据库专家现场分享黑科技2:GaussDB性能突破1500万tpmC 华为云企业级分布式数据库GaussDB基于计算存储分离架构,着重构筑传统数据库的企业级能力和互联网分布式数据库的高扩展和高可用能力。作为主打政企核心业务负载的金融级分布式数据库旗舰产品,它通过GTM-Lite技术和分布式优化器提供极致的分布式扩展能力,保证事务全局强一致,性能突破传统数据库瓶颈,实现 32节点1500万tpmC,在银行业务实测中,性能大幅度领先其他云厂商。华为云数据库首席产品经理现场分享黑科技3:GaussDB(for MySQL) 极致备份恢复能力作为华为云新一代高性能企业级分布式数据库,GaussDB(for MySQL) 通过定制的分布式存储系统,支持数据库秒级快照备份;并行高速复制下,实现数据快速备份和恢复;通过冷热数据分离,实现TB级数据最快20分钟内恢复可用,而且支持任意时间点恢复,为数据的安全可靠提供了强有力的保障。黑科技4:GaussDB与AI结合,让数据库运维更加高效、极简华为云GaussDB通过将AI技术植入到数据库内核的架构和算法中,让数据库管理更加智能与高效。如GaussDB通过利用AI 技术实现数据库自调优、自诊断、自安全、自运维、自愈等能力。典型场景如慢SQL 发现、索引推荐、基于性能指标的时序预测与异常发现、参数智能调优等,借助 AI 技术能更好地优化数据库的性能,协助DBA 降低运维难度,提升运维效率,自动调度平衡资源池。黑科技5:GaussDB支持跨 AZ/Region 部署,让数据底座更加稳定可靠在政企客户最为关注的高可用方面,华为云GaussDB提供了多种高可用方案,包括同城AZ内高可用、跨AZ高可用、异地跨Region的两地三中心容灾方案,提供跨AZ的读一致性访问,多AZ节点必须读到一致的数据,满足金融级监管要求。比如GaussDB通过独有的Switch Turbo技术,保障了同城AZ内单点故障能够快速切换,实现RPO=0,RT0小于10秒。这5大黑科技是华为云GaussDB前进路上的重大新路标,也是华为云GaussDB匠心打造领先数据库服务的重要体现。华为云GaussDB深知,在数字化时代下,企业的业务场景会更加复杂,对云数据库的要求会水涨船高,谁能抓住新一轮发展机遇,更快更好提升技术和服务,就可以在未来发展中获得更大的主动权。华为云GaussDB会不断积蓄力量,持续打造更与时俱进、更贴合企业场景的数据库服务,进一步加速企业数字化转型。详情内容可戳:cid:link_0
-
### 引言 熟悉MySQL的朋友应该都知道,MySQL集群主从间数据同步机制十分完善。令人惊喜的是,ClickHouse作为近年来炙手可热的大数据分析引擎也可以挂载为MySQL的从库,作为MySQL的 "协处理器" 面向OLAP场景提供高效数据分析能力。早先的方案比较直截了当,通过第三方插件将所有MySQL上执行的操作进行转化,然后在ClickHouse端逐一回放达到数据同步。终于在2020年下半年,Yandex 公司在 ClickHouse 社区发布了MaterializeMySQL引擎,支持从MySQL全量及增量实时数据同步。MaterializeMySQL引擎目前支持 MySQL 5.6/5.7/8.0 版本,兼容 Delete/Update 语句,及大部分常用的 DDL 操作。 ### 基础概念 - **MySQL & ClickHouse** MySQL一般特指完整的MySQL RDBMS,是开源的关系型数据库管理系统,目前属于Oracle公司。MySQL凭借不断完善的功能以及活跃的开源社区,吸引了越来越多的企业和个人用户。 ClickHouse是由Yandex公司开源的面向OLAP场景的分布式列式数据库。ClickHouse具有实时查询,完整的DBMS及高效数据压缩,支持批量更新及高可用。此外,ClickHouse还较好地兼容SQL语法并拥有开箱即用等诸多优点。 - **Row Store & Column Store** MySQL存储采用的是Row Store,表中数据按照 Row 为逻辑存储单元在存储介质中连续存储。这种存储方式适合随机的增删改查操作,对于按行查询较为友好。但如果选择查询的目标只涉及一行中少数几个属性,Row 存储方式也不得不将所有行全部遍历再筛选出目标属性,当表属性较多时查询效率通常较低。尽管索引以及缓存等优化方案在 OLTP 场景中能够提升一定的效率,但在面对海量数据背景的 OLAP 场景就显得有些力不从心了。 ClickHouse 则采用的是 Column Store,表中数据按照Column为逻辑存储单元在存储介质中连续存储。这种存储方式适合采用 SIMD (Single Instruction Multiple Data) 并发处理数据,尤其在表属性较多时查询效率明显提升。由于列存方式中物理相邻的数据类型通常相同,因此天然适合数据压缩,从而达到极致的数据压缩比。  ### 使用方法 - 部署Master-MySQL 开启BinLog功能:ROW模式 开启GTID模式:解决位点同步时MySQL主从切换问题(BinLog reset导致位点失效) ```shell # my.cnf关键配置 gtid_mode=ON enforce_gtid_consistency=1 binlog_format=ROW ``` - 部署Slave-ClickHouse 获取 [ClickHouse/Master](https://github.com/ClickHouse/ClickHouse) 代码编译安装 推荐使用`GCC-10.2.0`,`CMake 3.15`,`ninja1.9.0`及以上 - 创建Master-MySQL中database及table ```mysql creat databases master_db; use master_db; CREATE TABLE IF NOT EXISTS `runoob_tbl`( `runoob_id` INT UNSIGNED AUTO_INCREMENT, `runoob_` VARCHAR(100) NOT NULL, `runoob_author` VARCHAR(40) NOT NULL, `submission_date` DATE, PRIMARY KEY ( `runoob_id` ) )ENGINE=InnoDB DEFAULT CHARSET=utf8; # 插入几条数据 INSERT INTO runoob_tbl (runoob_, runoob_author, submission_date) VALUES ("MySQL-learning", "Bob", NOW()); INSERT INTO runoob_tbl (runoob_, runoob_author, submission_date) VALUES ("MySQL-learning", "Tim", NOW()); ``` - 创建 Slave-ClickHouse 中 MaterializeMySQL database ```sql # 开启materialize同步功能 SET allow_experimental_database_materialize_mysql=1; # 创建slave库,参数分别是("mysqld服务地址", "待同步库名", "授权账户", "密码") CREATE DATABASE slave_db ENGINE = MaterializeMySQL('192.168.6.39:3306', 'master_db', 'root', '3306123456'); ``` 此时可以看到ClickHouse中已经有从MySQL中同步的数据了: ```mysql DESKTOP:) select * from runoob_tbl; SELECT * FROM runoob_tbl Query id: 6e2b5f3b-0910-4d29-9192-1b985484d7e3 ┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┐ │ 1 │ MySQL-learning │ Bob │ 2021-01-06 │ └───────────┴────────────────┴───────────────┴─────────────────┘ ┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┐ │ 2 │ MySQL-learning │ Tim │ 2021-01-06 │ └───────────┴────────────────┴───────────────┴─────────────────┘ 2 rows in set. Elapsed: 0.056 sec. ``` ### 工作原理 - BinLog Event MySQL中BinLog Event主要包含以下几类: ```mysql 1. MYSQL_QUERY_EVENT -- DDL 2. MYSQL_WRITE_ROWS_EVENT -- insert 3. MYSQL_UPDATE_ROWS_EVENT -- update 4. MYSQL_DELETE_ROWS_EVENT -- delete ``` 事务提交后,MySQL 将执行过的 SQL 处理 BinLog Event,并持久化到 BinLog 文件 ClickHouse通过消费BinLog达到数据同步,过程中主要考虑3个方面问题: 1、DDL兼容:由于ClickHouse和MySQL的数据类型定义有区别,DDL语句需要做相应转换 2、Delete/Update 支持:引入`_version`字段,控制版本信息 3、Query 过滤:引入`_sign`字段,标记数据有效性 - DDL操作 对比一下MySQL的DDL语句以及在ClickHouse端执行的DDL语句: ```mysql mysql> show create table runoob_tbl\G; *************************** 1. row *************************** Table: runoob_tbl Create Table: CREATE TABLE `runoob_tbl` ( `runoob_id` int unsigned NOT NULL AUTO_INCREMENT, `runoob_` varchar(100) NOT NULL, `runoob_author` varchar(40) NOT NULL, `submission_date` date DEFAULT NULL, PRIMARY KEY (`runoob_id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 1 row in set (0.00 sec) --------------------------------------------------------------- cat /metadata/slave_db/runoob_tbl.sql ATTACH TABLE _ UUID '14dbff59-930e-4aa8-9f20-ccfddaf78077' ( `runoob_id` UInt32, `runoob_` String, `runoob_author` String, `submission_date` Nullable(Date), `_sign` Int8 MATERIALIZED 1, `_version` UInt64 MATERIALIZED 1 ) ENGINE = ReplacingMergeTree(_version) PARTITION BY intDiv(runoob_id, 4294967) ORDER BY tuple(runoob_id) SETTINGS index_granularity = 8192 ``` 可以看到: 1、在DDL转化时默认增加了2个隐藏字段:_sign(-1删除, 1写入) 和 _version(数据版本) 2、默认将表引擎设置为 ReplacingMergeTree,以 _version 作为 column version 3、原DDL主键字段 runoob_id 作为ClickHouse排序键和分区键 此外还有许多DDL处理,比如增加列、索引等,相应代码在`Parsers/MySQL` 目录下。 - Delete/Update操作 Update: ```mysql # Mysql端: UPDATE runoob_tbl set runoob_author='Mike' where runoob_id=2; mysql> select * from runoob_tbl; +-----------+----------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+----------------+---------------+-----------------+ | 1 | MySQL-learning | Bob | 2021-01-06 | | 2 | MySQL-learning | Mike | 2021-01-06 | +-----------+----------------+---------------+-----------------+ 2 rows in set (0.00 sec) ---------------------------------------------------------------- # ClickHouse端: DESKTOP:) select *, _sign, _version from runoob_tbl order by runoob_id; SELECT *, _sign, _version FROM runoob_tbl ORDER BY runoob_id ASC Query id: c5f4db0a-eff6-4b49-a429-b55230c26301 ┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐ │ 1 │ MySQL-learning │ Bob │ 2021-01-06 │ 1 │ 2 │ │ 2 │ MySQL-learning │ Mike │ 2021-01-06 │ 1 │ 4 │ │ 2 │ MySQL-learning │ Tim │ 2021-01-06 │ 1 │ 3 │ └───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘ 3 rows in set. Elapsed: 0.003 sec. ``` 可以看到,ClickHouse数据也实时同步了更新操作。 Delete: ```mysql # Mysql端 mysql> DELETE from runoob_tbl where runoob_id=2; mysql> select * from runoob_tbl; +-----------+----------------+---------------+-----------------+ | runoob_id | runoob_title | runoob_author | submission_date | +-----------+----------------+---------------+-----------------+ | 1 | MySQL-learning | Bob | 2021-01-06 | +-----------+----------------+---------------+-----------------+ 1 row in set (0.00 sec) ---------------------------------------------------------------- # ClickHouse端 DESKTOP:) select *, _sign, _version from runoob_tbl order by runoob_id; SELECT *, _sign, _version FROM runoob_tbl ORDER BY runoob_id ASC Query id: e9cb0574-fcd5-4336-afa3-05f0eb035d97 ┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐ │ 1 │ MySQL-learning │ Bob │ 2021-01-06 │ 1 │ 2 │ └───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘ ┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐ │ 2 │ MySQL-learning │ Mike │ 2021-01-06 │ -1 │ 5 │ └───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘ ┌─runoob_id─┬─runoob_title───┬─runoob_author─┬─submission_date─┬─_sign─┬─_version─┐ │ 2 │ MySQL-learning │ Mike │ 2021-01-06 │ 1 │ 4 │ │ 2 │ MySQL-learning │ Tim │ 2021-01-06 │ 1 │ 3 │ └───────────┴────────────────┴───────────────┴─────────────────┴───────┴──────────┘ 4 rows in set. Elapsed: 0.002 sec. ``` 可以看到,删除id为2的行只是额外插入了`_sign == -1`的一行记录,并没有真正删掉。 - 日志回放 MySQL 主从间数据同步时Slave节点将 BinLog Event 转换成相应的SQL语句,Slave 模拟 Master 写入。类似地,传统第三方插件沿用了MySQL主从模式的BinLog消费方案,即将 Event 解析后转换成 ClickHouse 兼容的 SQL 语句,然后在 ClickHouse 上执行(回放),但整个执行链路较长,通常性能损耗较大。不同的是,MaterializeMySQL 引擎提供的内部数据解析以及回写方案隐去了三方插件的复杂链路。回放时将 BinLog Event 转换成底层 Block 结构,然后直接写入底层存储引擎,接近于物理复制。此方案可以类比于将 BinLog Event 直接回放到 InnoDB 的 Page 中。 ### **同步策略** - 位点同步 v20.9.1版本前是基于位点同步的,ClickHouse每消费完一批 BinLog Event,就会记录 Event 的位点信息到 `.metadata` 文件: ```mysql [FavonianKong@Wsl[20:42:37]slave_db] $ cat ./.metadata Version: 2 Binlog File: mysql-bin.000003 Binlog Position:355005999 Data Version: 5 ``` 这样当 ClickHouse 再次启动时,它会把 {‘mysql-bin.000003’, 355005999} 二元组通过协议告知 MySQL Server,MySQL 从这个位点开始发送数据: ``` s1> ClickHouse 发送 {‘mysql-bin.000003’, 355005999} 位点信息给 MySQL s2> MySQL 找到本地 mysql-bin.000003 文件并定位到 355005999 偏移位置,读取下一个 Event 发送给 ClickHouse s3> ClickHouse 接收 binlog event 并完成同步操作 s4> ClickHouse 更新 .metadata位点 ``` **存在问题:** 如果MySQL Server是一个集群,通过VIP对外服务,MaterializeMySQL创建 database 时 host 指向的是VIP,当集群主从发生切换后,`{Binlog File, Binlog Position}` 二元组不一定是准确的,因为BinLog可以做reset操作。 ``` s1> ClickHouse 发送 {'mysql-bin.000003’, 355005999} 给集群新主 MySQL s2> 新主 MySQL 发现本地没有 mysql-bin.000003 文件,因为它做过 reset master 操作,binlog 文件是 mysql-bin.000001 s3> 产生错误复制 ``` 为了解决这个问题,v20.9.1版本后上线了 GTID 同步模式,废弃了不安全的位点同步模式。 - GTID同步 GTID模式为每个 event 分配一个全局唯一ID和序号,直接告知 MySQL 这个 GTID 即可,于是`.metadata`变为: ```mysql [FavonianKong@Wsl[21:30:19]slave_db] Version: 2 Binlog File: mysql-bin.000003 Executed GTID: 0857c24e-4755-11eb-888c-00155dfbdec7:1-783 Binlog Position:355005999 Data Version: 5 ``` 其中 `0857c24e-4755-11eb-888c-00155dfbdec7` 是生成 Event的主机`UUID`,`1-783`是已经同步的event区间 于是流程变为: ``` s1> ClickHouse 发送 GTID:0857c24e-4755-11eb-888c-00155dfbdec7:1-783 给 MySQL s2> MySQL 根据 GTID 找到本地位点,读取下一个 Event 发送给 ClickHouse s3> ClickHouse 接收 BinLog Event 并完成同步操作 s4> ClickHouse 更新 .metadata GTID信息 ``` ### 源码分析 - 概述 在最新源码 (v20.13.1.1) 中,ClickHouse 官方对 DatabaseMaterializeMySQL 引擎的相关源码进行了重构,并适配了 GTID 同步模式。ClickHouse 整个项目的入口 `main` 函数在 `/ClickHouse/programs/main.cpp` 文件中,主程序会根据接收指令将任务分发到 `ClickHouse/programs` 目录下的子程序中处理。本次分析主要关注 Server 端 `MaterializeMySQL` 引擎的工作流程。 - 源码目录 与 MaterializeMySQL 相关的主要源码路径: ```c++ ClickHouse/src/databases/MySQL //MaterializeMySQL存储引擎实现 ClickHouse/src/Storages/ //表引擎实现 ClickHouse/src/core/MySQL* //复制相关代码 ClickHouse/src/Interpreters/ //Interpreters实现,SQL的rewrite也在这里处理 ClickHouse/src/Parsers/MySQL //解析部分实现,DDL解析等相关处理在这里 ``` - 服务端主要流程 ClickHouse 使用 POCO 网络库处理网络请求,Client连接的处理逻辑在 ClickHouse/src/Server/*Handler.cpp 的 hander方法里。以TCP为例,除去握手,初始化上下文以及异常处理等相关代码,主要逻辑可以抽象成: ```c++ // ClickHouse/src/Server/TCPHandler.cpp TCPHandler.runImpl() { ... while(true) { ... if (!receivePacket()) //line 184 continue /// Processing Query //line 260 state.io = executeQuery(state.query, *query_context, ...); ... } ``` - 数据同步预处理 Client发送的SQL在executeQuery函数处理,主要逻辑简化如下: ```c++ // ClickHouse/src/Interpreters/executeQuery.cpp static std::tuple executeQueryImpl(...) { ... // line 354,解析器可配置 ast = parseQuery(...); ... // line 503, 根据语法树生成interpreter auto interpreter = InterpreterFactory::get(ast, context, ...); ... // line 525, 执行器interpreter执行后返回结果 res = interpreter->execute(); ... } ``` 主要有三点: 1、解析SQL语句并生成语法树 AST 2、InterpreterFactory 工厂类根据 AST 生成执行器 3、interpreter->execute() 跟进第三点,看看 InterpreterCreateQuery 的 excute() 做了什么: ```c++ // ClickHouse/src/Interpreters/InterpreterCreateQuery.cpp BlockIO InterpreterCreateQuery::execute() { ... // CREATE | ATTACH DATABASE if (!create.database.empty() && create.table.empty()) // line 1133, 当使用MaterializeMySQL时,会走到这里建库 return createDatabase(create); } ``` 这里注释很明显,主要执行 CREATE 或 ATTACH DATABASE,继续跟进 createDatabase() 函数: ```c++ // ClickHouse/src/Interpreters/InterpreterCreateQuery.cpp BlockIO InterpreterCreateQuery::createDatabase(ASTCreateQuery & create) { ... // line 208, 这里会根据 ASTCreateQuery 参数,从 DatabaseFactory 工厂获取数据库对象 // 具体可以参考 DatabasePtr DatabaseFactory::getImpl() 函数 DatabasePtr database = DatabaseFactory::get(create, metadata_path, ...); ... // line 253, 多态调用,在使用MaterializeMySQL时 // 上方get函数返回的是 DatabaseMaterializeMySQL database->loadStoredObjects(context, ...); } ``` 到这里,相当于将任务分发给DatabaseMaterializeMySQL处理,接着跟踪 loadStoredObjects 函数: ```c++ //ClickHouse/src/Databases/MySQL/DatabaseMaterializeMySQL.cpp template void DatabaseMaterializeMySQL::loadStoredObjects(Context & context, ...) { Base::loadStoredObjects(context, has_force_restore_data_flag, force_attach); try { // line87, 这里启动了materialize的同步线程 materialize_thread.startSynchronization(); started_up = true; } catch (...) ... } ``` 跟进startSynchronization() 绑定的执行函数: ```c++ // ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp void MaterializeMySQLSyncThread::synchronization() { ... // 全量同步在 repareSynchronized() 进行 if (std::optional metadata = prepareSynchronized()) { while (!isCancelled()) { UInt64 max_flush_time = settings->max_flush_data_time; BinlogEventPtr binlog_event = client.readOneBinlogEvent(...); { //增量同步侦听binlog_envent if (binlog_event) onEvent(buffers, binlog_event, *metadata); } } } ... } ``` - 全量同步 MaterializeMySQLSyncThread::prepareSynchronized 负责DDL和全量同步,主要流程简化如下: ```c++ // ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp std::optional MaterializeMySQLSyncThread::prepareSynchronized() { while (!isCancelled()) { ... try { //构造函数内会获取MySQL的状态、MySQL端的建表语句, MaterializeMetadata metadata(connection, ...); // line345, DDL相关转换 metadata.transaction(position, [&]() { cleanOutdatedTables(database_name, global_context); dumpDataForTables(connection, metadata, global_context, ...); }); return metadata; } ... } } ``` ClickHouse作为MySQL从节点,在MaterializeMetadata构造函数中对MySQL端进行了一系列预处理: 1、将打开的表关闭,同时对表加上读锁并启动事务 2、TablesCreateQuery通过SHOW CREATE TABLE 语句获取MySQL端的建表语句 3、获取到建表语句后释放表锁 继续往下走,执行到 metadata.transaction() 函数,该调用传入了匿名函数作为参数,一直跟进该函数会发现最终会执行匿名函数,也就是cleanOutdatedTables以及dumpDataForTables函数,主要看一下 dumpDataForTables 函数: ```c++ // ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp static inline void dumpDataForTables(...) { ... //line293, 这里执行建表语句 tryToExecuteQuery(..., query_context, database_name, comment); } ``` 继续跟踪 tryToExecuteQuery 函数,会调用到 executeQueryImpl() 函数,上文提到过这个函数,但这次我们的上下文信息变了,生成的执行器发生变化,此时会进行 DDL 转化以及 dump table 等操作: ```c++ // ClickHouse/src/Interpreters/executeQuery.cpp static std::tuple executeQueryImpl(...) { ... // line 354,解析器可配置 ast = parseQuery(...); ... // line 503,这里跟之前上下文信息不同,生成interpreter也不同 auto interpreter = InterpreterFactory::get(ast,context, ...); ... // line 525, 执行器interpreter执行后返回结果 res = interpreter->execute(); ... } ``` 此时 InterpreterFactory 返回 InterpreterExternalDDLQuery,跟进去看 execute 函数做了什么: ```c++ // ClickHouse/src/Interpreters/InterpreterExternalDDLQuery.cpp BlockIO InterpreterExternalDDLQuery::execute() { ... if (external_ddl_query.from->name == "MySQL") { #ifdef USE_MYSQL ... // line61, 当全量复制执行DDL时,会执行到这里 else if (...->as()) return MySQLInterpreter::InterpreterMySQLCreateQuery( external_ddl_query.external_ddl, cogetIdentifierName(arguments[0]), getIdentifierName(arguments[1])).execute(); #endif } ... return BlockIO(); } ``` 继续跟进去发现 getIdentifierName(arguments[1])).execute() 会rewrite DDL: ```c++ // ClickHouse/src/Interpreters/MySQL/InterpretersMySQLDDLQuery.cpp ASTs InterpreterCreateImpl::getRewrittenQueries(...) { ... // 检查是否存在primary_key, 没有直接报错 if (primary_keys.empty()) throw Exception("cannot be materialized, no primary keys.", ...); ... // 添加 _sign 和 _version 列. auto sign_column_name = getUniqueColumnName(columns_name_and_type, "_sign"); auto version_column_name = getUniqueColumnName(columns_name_and_type, "_version"); // 这里悄悄把建表引擎修改成了ReplacingMergeTree storage->set(storage->engine, makeASTFunction("ReplacingMergeTree", ...)); ... return ASTs{rewritten_query}; } ``` 完成DDL转换之后就会去执行新的DDL语句,完成建表操作,再回到 dumpDataForTables: ```c++ // ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp static inline void dumpDataForTables(...) { ... //line293, 这里执行建表语句 tryToExecuteQuery(..., query_context, database_name, comment); ... // line29, 这里开始 dump 数据并存放到MySQLBlockInputStream MySQLBlockInputStream input(connection, ...) } ``` - 增量同步 还记得startSynchronization() 绑定的执行函数吗?全量同步分析都是在 prepareSynchronized()进行的,那增量更新呢? ```c++ // ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp void MaterializeMySQLSyncThread::synchronization() { ... // 全量同步在 repareSynchronized() 进行 if (std::optional metadata = prepareSynchronized()) { while (!isCancelled()) { UInt64 max_flush_time = settings->max_flush_data_time; BinlogEventPtr binlog_event = client.readOneBinlogEvent(...); { //增量同步侦听binlog_envent if (binlog_event) onEvent(buffers, binlog_event, *metadata); } } } ... } ``` 可以看到,while 语句里有一个 binlog_event 的侦听函数,用来侦听 MySQL 端 BinLog 日志变化,一旦 MySQL 端执行相关操作,其 BinLog 日志会更新并触发 binlog_event,增量更新主要在这里进行。 ```c++ // ClickHouse/src/Databases/MySQL/MaterializeMySQLSyncThread.cpp void MaterializeMySQLSyncThread::onEvent(Buffers & buffers, const BinlogEventPtr & receive_event, MaterializeMetadata & metadata) { // 增量同步通过监听binlog event实现,目前支持四种event:MYSQL_WRITE_ROWS_EVENT、 // MYSQL_UPDATE_ROWS_EVENT、MYSQL_DELETE_ROWS_EVENT 和 MYSQL_QUERY_EVENT // 具体的流程可以查找对应的 onHandle 函数, 不在此详细分析 if (receive_event->type() == MYSQL_WRITE_ROWS_EVENT){...} else if (receive_event->type() == MYSQL_UPDATE_ROWS_EVENT){...} else if (receive_event->type() == MYSQL_DELETE_ROWS_EVENT){...} else if (receive_event->type() == MYSQL_QUERY_EVENT){...} else {/* MYSQL_UNHANDLED_EVENT*/} } ``` ### 小结 MaterializeMySQL 引擎是 ClickHouse 官方2020年主推的特性,由于该特性在生产环境中属于刚需且目前刚上线不久,整个模块处于高速迭代的状态,因此有许多待完善的功能。例如复制过程状态查看以及数据的一致性校验等。感兴趣的话可参考Github上的2021-Roadmap,里面会更新一些社区最近得计划。以上内容如有理解错误还请指正。 ### 引用 - ClickHouse社区文档 - ClickHouse社区源码 - MySQL实时复制与实现 - MaterializeMySQL引擎分析
-
云、AI、5G等技术驱动,数据库行业迎来新的需求,云数据库也在不断演进升级。依托华为云与华为云Stack,通过全栈软硬件优化,华为云GaussDB进行了进阶与革新,以统一的架构,支持关系型与非关系型的数据库引擎。 近日,在第十一届中国数据库技术大会上,笔者有幸采访到了华为云数据库产品总监张昆,张昆向我们详细解读了GaussDB如何做到架构革新,做到支持全场景全业务,并从解决方案与案例的维度分享了华为云数据库的优秀实践。华为云数据库产品总监 张昆 华为云GaussDB打造全场景数据库服务 目前,华为云数据库产品覆盖开源和华为云GaussDB服务两大生态。开源生态服务主要在超越开源的前提下,为客户打造极致性价比的产品和服务;华为云GaussDB系列主要是面向金融政企客户打造的企业级商用数据库,满足客户对数据库高可靠、高性能的极致要求。 华为云数据库产品总监张昆介绍了数据库服务的系列新品: 华为云GaussDB适用于企业核心交易系统和海量事务型场景,支持集中式与分布式两种部署形态。华为云GaussDB(for MySQL)支持主备部署和分布式部署两种形式,提供优于原生MySQL7倍性能。 面向企业新型应用的云原生多模GaussDB NoSQL系列服务提供3倍读写性能,自动弹性伸缩,具备企业级可靠性。GaussDB NoSQL基于GaussDB的计算存储分离架构创新,对于性能、成本、HA、扩容性、备份恢复等多种指标都有质的飞跃。 华为云GaussDB(DWS)为各企业用户提供最佳性能、按需扩展、稳定可靠的全场景企业级数据仓库,满足客户超大规模数据的高性能查询分析诉求。值得一提的是,华为云GaussDB(DWS)数据仓库以单集群2048节点的超大规模,满分通过测试认证,是迄今为止信通院认证的最大规模分布式数据库集群,树立了业界新标杆。 在谈到云数据库安全问题上,张昆表示,华为云数据库可提供密态数据库与防篡改数据库等技术新品,帮助客户构建安全可信、法律合规的应用全密态数据库业务全景,防止数据篡改与作弊,实现多方认同。 据了解,目前,华为云数据库服务已在500+大客户中规模商用,遍布金融、政府、电信、能源、交通、物流、电商等行业。未来,华为云数据库将持续构建技术硬实力和优秀解决方案,使能行业数字化转型。 华为云GaussDB让数据库迁移变得简单 数据库迁移指的是从源库迁移到目标库。张昆把数据库迁移形象的比喻成从“旧家”搬到“新家”的过程,其中涉及到各种数据的搬迁,数量巨大,情况复杂,而且通常需要停机迁移,对业务影响极大,每个数据库迁移者都会经历客户如下亲切的问候。 迁移前:源库的运行状态如何,容量和复杂度如何,库表之间关系如何?如何选择合适的目标库及其规格,改造风险和工作量有多大?从源库迁移到目标库,有哪些对象不兼容,在目标库是否有替代方案? 迁移中:如何保证结构迁移和数据迁移时,不影响源库/目标库正常运行的业务?源端按业务模块迁移时,源库和目标库如何进行持续的增量数据同步?源库对象较多,如何保障源库对象顺利迁移到目标库? 迁移后:迁移完成时,如何保障迁移结果正确,包括结构的准确性与数据的准确性?迁移完成后,如何保障云上数据库的开发运维与性能的持续优化?……等等等等。 针对上述数据库迁移面临的众多问题,华为云推出了数据库迁移管理云化解决方案,帮助企业轻松上云,极简运维。那么,具体是如何帮助客户实现数据库迁移的呢?张昆从金融、消费者、泛互联网三大行业客户实践为我们带来了分享。 在金融行业,国有某大行核心业务已商用GaussDB,该银行把贵金属交易系统迁移上云,在这个业务场景下,通过数据库并行、渠道开关、应急回切、数据核对和监控等策略,采用灰度发布机制,按流量比例逐步切换,在保障生产稳定运行前提下验证整体迁移方案。 为客户带来了三大核心价值:(1)高可用。实现了同城单Region多AZ互联支持同城双活,金融级支持三层组网的管控高可用部署方案;(2)性能线性扩展。支持集群水平扩展,基本联机性能与0持平;(3)弹性部署。部署实例及应用要快速响应业务需求,数据库支持容器化部署。 在面向TO C的消费者领域,华为消费者业务为全球200多个国家和地区的6.7亿+用户、180万+开发者提供强大资源获取和弹性伸缩能力。张昆表示,“自己的狗粮自己吃”,因为只有自身实践过硬才能获得客户的信赖,目前,华为消费者业务数据库已全面切换上云,实现3AZ数据0丢失。 在泛互联网行业,张昆以游戏行业举例,开天创世在选择数据库过程中要求极高,快速部署和高性能低延时是其对数据库的基本要求。在游戏开服场景中,开天创世6小时内需要多次扩容,并且还要做到表级时间点恢复,支持游戏快速回档,扩容期间性能稳定,不影响游戏体验。 针对这个需求,客户采用了华为云多模GaussDB NoSQL系列服务,解决了玩家访问量突增的压力,实现了分钟级扩容和游戏快速回档。 写在最后,随着企业对云服务诉求的增加,越来越多的企业正在通过上“云”实现数字化升级。在Cloud 2.0时代,数据库是企业上云的一个重要竞争战场,未来,华为云数据库会以更开放的姿态,将积累多年的技术沉淀、运营经验分享出来,更好地满足各行业企业的多元化需求,为企业提供强有力的技术支持,让客户更专注于自身业务的创新与运营,加速企业数字变革。
-
123455
-
今天的话题要从一个朋友的咨询开始 所以准备写一篇短文谈谈我对“存算分离”架构的理解,不一定全面,欢迎在评论区探讨。 其实这个朋友是误解了“存算分离”这个概念。他认为普通MySQL云数据库用evs做存储,计算资源和存储资源是分开的,比如可以单独扩容计算资源或单独扩容存储资源,所以就是存算分离的架构,其实这么理解是片面的。要理解“存算分离”架构,还得追根溯源,从传统MySQL主备架构说起。 这张图熟悉MySQL的人应该都见过,我们知道,MySQL的master端有数据变更时,备机是通过读取和回放binlog,涉及到三个线程,一个运行在主节点(log dump thread),其余两个(I/O thread, SQL thread)运行在备节点,三个线程配合完成数据复制的工作。但是,不难发现,这个架构在某些场景会有明显的缺陷:主库写入压力大时。当主库的写入压力比较大的时候,主备复制的时延会变大,因为需要回放完所有binlog的事务才会完全达到数据同步。增加只读节点时。增加备机/只读节点的速度很慢,因为我们需要将数据全量的复制到从节点,如果主节点此时存量的数据已经很多,那么扩展一个备机节点速度就会很慢高。使用多个只读节点时。存储的成本线性增长,如果数据库磁盘空间比较大,那么相应的所有只读节点挂载的磁盘空间都需要和主节点一样大,成本将会随着只读库数量增加进行线性增加。 这些问题通过存算分离架构就能得到很好的解决,以华为云GaussDB(for MySQL)为例,作为华为自研的最新一代高性能企业级分布式数据库,基于华为最新一代DFV分布式存储,采用计算存储分离架构,最高支持128TB的海量存储,可实现超百万级QPS吞吐。 首先,GaussDB(for MySQL)采用计算与存储解耦的技术架构,让所有的节点都共享一个存储,也就是说,增加计算节点时,无需调整存储资源,真正做到计算与存储分离,并且可支持 15 个只读节点的扩展,主节点和只读节点之间是 Active-Active 的 Failover 方式,计算节点资源得到充分利用,由于使用共享存储,降低了用户使用成本。完美契合了企业级数据库系统对高可用性、性能和扩展性、云服务托管的需求。GaussDB(for MySQL)将MySQL存储层变为独立的存储节点,在GaussDB(for MySQL)中认为日志即数据,将日志彻底从MySQL计算节点中抽离出来,都由存储节点进行保存,与传统 RDS for MySQL 相比,不再需要刷 page,所有更新操作都记录日志,不再需要 double write,从而大大减少了网络通信。 小结一下,以“存算分离”架构来答复一下上面的3个问题: 1. 当主库的写入压力比较大的时候,由于不再有double write入,主节点和只读节点之间的复制时延基本得以消除。 2. 增加只读节点的速度非常快,因为不再需要将数据全量的复制到只读节点,无论多大数据量,只需 5 分钟左右即可完成增加只读节点。 3. 使用多个只读节点时,因为只有一份存储,所以存储的成本不会有变化,存储空间越大,只读节点越多,节省成本越明显。
-
在日常工作中,很多数据一旦录入,轻易不会修改,但却常常会被调用。在对数据库有少量写请求,但有大量读请求的应用场景下,单个实例可能无法抵抗读取压力,甚至对主业务产生影响。遇到这种问题该怎么办?别担心,云数据库 TaurusDB只读节点帮您完美解决这个问题,让您轻松应对各种应用场景。为了实现读取能力的弹性扩展,分担数据库压力,您可以在某个区域中创建一个或多个只读节点,利用只读节点满足大量的数据库读取需求,以此增加应用的吞吐量。云数据库 TaurusDB是华为自研的最新一代企业级高扩展海量存储分布式数据库,完全兼容MySQL。基于华为最新一代DFV存储,采用计算存储分离架构,128TB的海量存储,无需分库分表,数据0丢失,既拥有商业数据库的高可用和性能,又具备开源低成本效益。 创建只读节点:只读节点用于增强实例主节点的读能力,减轻主节点负载。一个实例中,最多支持15个只读节点。操作步骤:登录管理控制台。单击管理控制台左上角的,选择区域和项目。选择“数据库 > 云数据库 TaurusDB”。进入云数据库TaurusDB信息页面。在“实例管理”页面,选择指定的实例,单击操作列的“更多 > 创建只读”,进入“创建只读”页面。您也可在实例的“基本信息”页面,单击拓扑图中的,创建只读节点。在“创建只读”页面,选择“故障倒换优先级”和“购买数量”,包周期单击“立即购买”,按需计费单击“立即创建”。 只读节点升主节点TaurusDB是一个多节点的实例,其中一个节点是主节点(Master),其他节点为只读节点。除了因系统故障自动切换主备外,对于用于高可用演练,或者需指定某个节点为主节点的场景,您也可以手动切换主备,指定一个只读节点为新的主节点。手动切换:登录管理控制台。单击管理控制台左上角的,选择区域和项目。选择“数据库 > 云数据库 TaurusDB”。进入云数据库TaurusDB信息页面。在“实例管理”页面的实例列表中,选择对应实例,单击实例名称进入“基本信息”页面。在“基本信息”页面底部,选择目标只读节点,在“操作”列单击“只读升主”。 在弹出框中单击“是”下发请求。a) 切换时可能会出现30秒左右的闪断,请确保应用具备重连机制。b) 切换过程中节点运行状态为“只读升主中”,此过程大概需要几秒或几分钟。c) 切换完成后,节点运行状态变为“正常”,您可查看到原先的只读节点和主节点的角色已经互换。 自动切换:TaurusDB采用双活(Active-Active)的高可用实例架构,可读写的主节点和只读节点之间自动进行故障倒换(Failover),系统自动选取新的主节点。TaurusDB每个节点都有一个故障倒换优先级,决定了故障倒换时被选取为主节点的概率高低。故障倒换优先级的取值范围为1~16,数字越小,优先级越高,即故障倒换时,主节点会优先倒换到优先级高的只读节点上。当多个节点的优先级相同时,这些节点具有相同的概率被选取为主节点。TaurusDB按以下步骤自动选取主节点:系统找出当前可以被选取的所有只读节点。选择优先级最高的一个或多个只读节点。如果由于网络原因、复制状态异常等,第一个节点切换失败,则会尝试切换下一个,直至成功。 删除只读节点对于“按需计费”模式的只读节点,您可根据业务需要,在TaurusDB数据库“基本信息”页面手动删除来释放资源。只读节点删除后,不可恢复,请谨慎操作。操作步骤:登录管理控制台。单击管理控制台左上角的,选择区域和项目。选择“数据库 > 云数据库 TaurusDB”。进入云数据库TaurusDB信息页面。在“实例管理”页面的实例列表中,选择对应实例,单击实例名称进入“基本信息”页面。在“基本信息”页面底部,选择目标只读节点,在“操作”列单击“删除”。为保证高可用,系统会保留一个正常只读节点不可被单独删除,只有删除实例时,才会被删除。在弹出框中单击“是”下发请求,稍后刷新“实例管理”页面,查看删除结果。 赶紧戳这里,了解详情吧~~
-
https://support.huaweicloud.com/prtg-apache-kunpengbds/kunpenghbase_02_0001.html
-
上滑加载中
推荐直播
-
HDC深度解读系列 - Serverless与MCP融合创新,构建AI应用全新智能中枢2025/08/20 周三 16:30-18:00
张昆鹏 HCDG北京核心组代表
HDC2025期间,华为云展示了Serverless与MCP融合创新的解决方案,本期访谈直播,由华为云开发者专家(HCDE)兼华为云开发者社区组织HCDG北京核心组代表张鹏先生主持,华为云PaaS服务产品部 Serverless总监Ewen为大家深度解读华为云Serverless与MCP如何融合构建AI应用全新智能中枢
回顾中 -
关于RISC-V生态发展的思考2025/09/02 周二 17:00-18:00
中国科学院计算技术研究所副所长包云岗教授
中科院包云岗老师将在本次直播中,探讨处理器生态的关键要素及其联系,分享过去几年推动RISC-V生态建设实践过程中的经验与教训。
回顾中 -
一键搞定华为云万级资源,3步轻松管理企业成本2025/09/09 周二 15:00-16:00
阿言 华为云交易产品经理
本直播重点介绍如何一键续费万级资源,3步轻松管理成本,帮助提升日常管理效率!
回顾中
热门标签