草庐IT

TD退出,国产数仓的风来了

韩锋 2023-03-28 原文

近期,就在2月15日,国内IT界有搞出个大瓜,Teradata以对中国当前及未来商业环境的不确定性,慎重考虑后决定退出中国运营,后续将进入中国公司关闭程序。Teradata是一家有着40多年历史的数据仓库企业,被业界专业人事称为“数仓人才的黄埔军校”, 在大数据领域一直保持全球领先的地位。它在1997年正式进入中国,并率先在金融、电信领域推出自己的数仓产品,由于当时国内软硬件基础不太好,信息化行业又面临着迅速数据膨胀等因素,使Tearadata很快在中国铺开市场,直到近期的退出,在国内还保留着众多的使用单位及市场。下面谈谈对这一事件的看法及国产数据仓库产品的机会。

1、Teradata 退出,个中缘由

卖的好好的,为啥退?笔者不是啥国际局势专家,感觉无外乎几个原因:一是国家间的国际关系影响;二是某些国家的做法令人不爽,如监听门事件等;三是国内众多替代产品慢慢趋向成熟稳定并蚕食Teradata的市场。个人感觉最大的原因还是第三点国产数据库的崛起萎缩了海外厂商的市场,国内数仓产品很多,与Teradata等同的有南大通用的GBase 8a、华为的GaussDB 200、阿里的ADB等等。此外,Teradata是以一体机的形式多外销售,最大的特点就是昂贵,但不缺钱的企业多了去了,仍在中国赚得盆满钵满。但随着持续发展,国内的客户发现Teradata也存在很多的问题,就算没有国际局势、没有监听门事件也萌发换掉它的想法。试探着找出可以替代Teradata架构、使用相似的产品,下文也将从几个方面对比国内数仓产品与Teradata的异同。

2、Teradata 退出,如何填补

(1)Teradata 技术架构

Teradata是Shared Nothing的MPP架构,主要包括解析引擎、BYNET和访问控制处理器(AMP),Teradata以节点为系统的基本单元,一体机中每台服务器都称为节点,高级架构图如下:

(2)主流数仓架构

当前主流国产数仓产品主要有三种架构。

有Master

第一种有Master的架构,主要产品是PG系的产品,比如GreenPlum等通过PostgreSQL改过来的产品,其典型架构图如下


无Master

第二种是无Master的计算、存储、管理一体化的架构,其架构图如下


多Master

第三种架构是联邦架构,也可叫多Master。跟第一种非常相似,唯一差别的放就是原来的Master-Slave模式变成了集群模式,架构图如下


该架构使集群对外服务能力更强,因其连接应用的管理节点是集群模式,可实现多管理节点的高可用、不像Master-Slave模式,在掉了Master后,到Slave切换的RTO过大及数据丢失的风险。目前这个架构国内唯一家数据库支持,就是GBase 8a MPP V9,国外有HDP 2.0。

(3)数仓全球概况

Gartner作为全球最具权威的IT市场研究与顾问咨询公司,定期会推出IT行业的各种报告以及著名的Gartner魔力象限。Gartner魔力象限通常从两个方面来评价供应商:前瞻性和执行能力。涵盖的公司包括:领导者、挑战者、有远见者、细分领域主导者。前者考量该厂商提供产品底层技术基础的能力、市场领导能力、创新能力、外部投资等, 后者考量产品的易用程度和价格、服务的完善程度和技 术支持能力、管理团队的经验和能力等。象限图的横轴表示发前瞻性,纵轴表示执行能力。国产数仓也在Gartner中进行过评估,过去几年中曾经出现两个国内厂家进入了该魔力象限,比如2017年,共有22家厂商被选入魔力象限。其中,亚太地区入围的三家全部来自中国,包括GBase、阿里云和华为,这也是该象限首次有三家中国厂商进入。除了Micro Focus和SAP两家欧洲公司外,其余17家均为美国公司。


华为的GaussDB产品与南大通用的GBase产品在全球排上了名,与Oracle、Teradata知名数据库同时出现在一幅图中。虽然不在同一象限,但也代表了这些厂商在全球的认可度。从这一角度来看,Teradata退出后原有市场填补及新市场空间可从上述受到权威认可的厂商中选择,如上面的南大的GBase 8a和华为的GaussDB为主。

(4)国内典型产品

GBase 8a

GBase 8a是南大通用公司自主研发的一款分析型数据库,而南大通用本身也是一家专注做数据库的公司,其产品覆盖分析型、事务型、另一维度,分集中式和分布式,有8a分析型数据,8s集中式事务库,8c分布式多模数据库。而对应Teradata数仓产品的则是南大通用8a产品,产品名字GBase 8a MPP Cluster,最新版本是V953,据说性能在OLAP场景下非常强劲,且该产品在2010年就研发并投入市场,在国内的OLAP领域可以说资格最老、最稳定、市场占有最大的一家公司产品。

GaussDB DWS

GaussDB是华为旗下的一系列数据库产品,包括100、200、300,其中GaussDB 100现在已经开源叫openGauss,是偏事务的一款产品,GaussDB 200现在叫DWS,是可以对标Teradata的一款分析型数仓产品,GaussDB300是HTAP产品,并未正式上市。

(5)关注迁移能力

作为产品替代的一个重要考量因素,是否具备完备的迁移能力至关重要。上面谈到的两款产品都有对应的从Teradata到本产品的迁移工具,包括DDL、视图、SQL、数据的迁移。

 GaussDB

GaussDB的迁移工具从官网可以查到其语法,命令以.sh结尾,本人猜测很可能是用shell脚本编写的SQL转换迁移程序,但该工具不能迁移数据。


GBase 8a

GBase 8a MPP也有迁移工具,网上查叫GBase MTK,可以实现从Oracle、SQL Server、PostgreSQL、Teradata到GBase 8a的数据迁移,但好像只能实现DDL的自动转换并进行数据的倒换迁移。


而对于Teradata的SQL迁移,目前在网上没有查到其对应的工具,咨询过南大通用公司的前同事,好像GBase也有Teradata SQL转换工具,且据说转换效率非常高,准确率也不错。使用Python语言编写,根据客户实际SQL风格灵活定制化。从工具的语言上感觉南大通用的工具会更强大点,毕竟Python比Shell脚本的Coding灵活度要大的多。

3、Teradata 退出,引发思考

Teradata 公司的退出,为我们敲响了警钟。单纯依赖国外产品的路线是不长久的,只有立足国内,保持充分技术自由度才是最佳选择。至于TD数仓在国内的替换、以及未来市场,相信以GBase 8a、华为GaussDB DWS为代表的国产厂商产品,应可担当大任;也更希望并期待有更多国产数据库不断涌现,壮大国内的数据库生态。

作者介绍

韩锋,51CTO社区编辑,CCIA(中国计算机协会)常务理事,前Oracle ACE,腾讯TVP,阿里云MVP,dbaplus等多家社群创始人或专家团成员。有着丰富的一线数据库架构、软件研发、产品设计、团队管理经验。曾担任多家公司首席DBA、数据库架构师等职。在云、电商、金融、互联网等行业均有涉猎,精通多种关系型数据库,对NoSQL及大数据相关技术也有涉足,实践经验丰富。曾著有数据库相关著作《SQL优化最佳实践》、《数据库高效优化》。

有关TD退出,国产数仓的风来了的更多相关文章

  1. ruby - 在 ruby​​ 中生成一个进程,捕获 stdout,stderr,获取退出状态 - 2

    我想从ruby​​rake脚本运行一个可执行文件,比如foo.exe我希望将foo.exe的STDOUT和STDERR输出直接写入我正在运行rake任务的控制台.当进程完成时,我想将退出代码捕获到一个变量中。我如何实现这一目标?我一直在玩backticks、process.spawn、system但我无法获得我想要的所有行为,只有部分更新:我在Windows上,在标准命令提示符下,而不是cygwin 最佳答案 system获取您想要的STDOUT行为。它还返回true作为零退出代码,这可能很有用。$?填充了有关最后一次system调

  2. ruby-on-rails - 如何在不退出 IRB session 的情况下退出调试器? - 2

    这是一个长期存在的挫败感来源,但也许我遗漏了什么。如果我正在调试,并且我想退出调试器并返回到IRB或Rails控制台,“退出”将不起作用,因为它将退出IRB。“完成”似乎也与继续具有相同的效果。使用“删除”删除断点然后尝试“继续”或“完成”不起作用。有什么想法吗? 最佳答案 至少在byebug中,你可以这样做:evalreturn它具有计算当前函数的return语句的净效果。这有时会奏效,具体取决于调用堆栈的外观。现在虽然这不会删除当前断点....如果您只是想收回控制权,在大多数情况下这会做到这一点,具体取决于您的代码结构。在您的代

  3. ruby - Thin::Server#daemonize 立即退出 - 2

    我试图制作一个可执行文件,它通过Thin作为守护进程启动Sinatra应用程序。我正在使用此代码通过Sinatra应用程序调用Thin:#!/usr/bin/envrubyrequire'thin'require'app.rb'server=::Thin::Server.new('127.0.0.1',9999,App)server.log_file='tmp/thin.log'server.pid_file='tmp/thin.pid'server.daemonize这是我执行脚本时得到的日志输出:>>WritingPIDtotmp/thin.pid>>Exiting!服务器正常启动

  4. ruby - 当 shelled-out 命令返回非零退出代码时,如何让 Ruby 脚本失败? - 2

    在Ruby脚本中,有variousways调用系统命令/命令行反引号:`commandarg1arg2`分隔形式,例如%x(commandarg1arg2)(可用其他分隔符)Kernel#system方法:system('commandarg1arg2')Kernel#exec方法:exec('commandarg1arg2')如果我希望Ruby脚本在调用的命令失败时失败(有异常)(具有非零退出代码),我可以检查特殊变量中的退出代码$?对于前两个变体:`commandarg1arg2`failunless$?==0或%x,commandarg1arg2,failunless$?==0如

  5. ruby - 为什么退出 Ruby 线程会杀死我的整个程序? - 2

    我有这段代码:puts"Start"loopdoThread.startdoputs"Hellofromthread"exitendtext=getsputs"#{text}"endputs"Done"我希望看到“Start”后跟“Hellofromthread”,然后我可以输入会得到回显的输入。相反,我得到“Start”和“Hellofromthread”,然后程序退出。来自关于exit的文档:Terminatesthrandschedulesanotherthreadtoberun.Ifthisthreadisalreadymarkedtobekilled,exitreturnst

  6. ruby-on-rails - 在不使用 `at_exit` 的情况下,如何确保操作在 Rails 退出之前运行? - 2

    我有一个操作需要在我的Rails应用程序终止之前在我的Rails应用程序中执行。我可以在Rails中为此使用一个钩子(Hook)吗?我猜类似于at_exit的东西。 最佳答案 Ruby本身支持两个钩子(Hook),BEGIN和END,它们在脚本开始时运行,并在解释器停止运行时运行。有关详细信息,请参阅“WhatdoesRuby'sBEGINdo?”。BEGIN文档说:Designates,viacodeblock,codetobeexecutedunconditionallybeforesequentialexecutionofth

  7. ruby - 如果超过 5 秒,如何退出使用 Ruby 运行的进程? - 2

    我正在用Ruby实现一个检查系统。它运行具有不同测试的可执行文件。如果解决方案不正确,则可能需要很长时间才能完成某些严格的测试。这就是为什么我想将执行时间限制为5秒。我正在使用system()函数来运行可执行文件:system("./solution");.NET有一个很棒的WaitForExit()方法,那么Ruby呢?有没有办法将外部进程的执行时间限制为5秒?谢谢 最佳答案 您可以使用标准超时库,如下所示:require'timeout'Timeout::timeout(5){system("./solution")}这样您就不

  8. 出现错误时的 Ruby/Thor 退出状态 - 2

    我是Thor(和Ruby)的新手,我正在考虑在构建脚本中使用它,因为据说它可以替代Rake(从而替代Make)。然而,经过短暂的试用,我对它返回的错误状态感到困惑。我快速浏览了wiki,但没有看到任何提及。只有第一个“简单示例”,test.thor:classTest版本号:eruve>thorversionThor0.18.1我尝试了以下,故意错误的命令:eruve>ruby--version;thortest:examplebadarg;echoexitstatus:$?ruby2.0.0p195(2013-05-14revision40734)[x86_64-darwin10.8

  9. ruby-on-rails - 为什么 `rake db:drop` 失败时退出状态为 0,并且不引发错误? - 2

    我惊讶地发现,当rakedb:drop(假设是Rails的其他内置raketasks)失败时,bash状态代码为0。$rakedb:dropcouldnotconnecttoserver:ConnectionrefusedIstheserverrunningonhost"localhost"(::1)andacceptingTCP/IPconnectionsonport5432?...$echo$?0也许更令人惊讶的是,当从Rails中调用任务时,它甚至不会引发错误。2.3.0:001>begin2.3.0:002>Rake::Task["db:drop"].invoke2.3.0:0

  10. ruby - 如何获取使用 IO.popen 调用的命令的退出状态? - 2

    我正在使用IO.popen执行命令并像这样捕获输出:process=IO.popen("sudo-uservice_user-istart_service.sh")do|io|whileline=io.getsline.chomp!process_log_line(line)endend如何捕获*start_service.sh*的退出状态? 最佳答案 您可以通过引用$?捕获通过IO.open()调用的命令的退出状态,只要您关闭了block末尾的管道即可。在上面的例子中,你会这样做:process=IO.popen("sudo-us

随机推荐