草庐IT

国产数据库与开源代码

白鳝 2023-03-28 原文
​很多朋友觉得国产数据库应该是完全自研的数据库产品,不应该基于开源代码去做开发。不过如果我换一个问题,一个只有三五年历史的完全国产自研的数据库产品与一个十分成熟的开源数据库产品供他选择,并且必须选择其中之一,那么大概率情况下他会去选择开源数据库。这是一个十分现实的问题,数据库是十分重要的IT基础设施,其成熟度与稳定性是十分关键的。

在自研比例较高的国产数据库厂商中,达梦是十分典型的一家,其数据库产品已经有是超过20年历史了。从达梦6开始在国家电网电力调度等核心系统中获得了应用,也经受了磨练。从客户用得战战兢兢到获得了客户的信任,这是花了至少五年时间的磨合的。从DM7开始,代码进行了全面的重构,代码自主率已经达到了较高的程度,目前的主流版本已经是DM8了,其稳定性已经经过了大量客户的实际应用考验。

国内像达梦一样具有超过20年历史的数据库产品并不多,不过很多国产数据库产品历史虽然不是很长,但是都是基于相对比较成熟的开源项目的基础上研发的。作为DBA或者用户来说,我们对这些产品也是比较信任的,因为这些开源数据库产品有社区里上百万的用户在使用。

而如果有人告诉我,他们的数据库产品是一行行代码自己开发出来的,没有采用任何开源代码,而这个产品的历史不过三五年,那么恕我直言,我宁愿你是基于开源代码开发的。三五年时间码出的一个数据库产品,没有经过数万个用户去验证过的,我是不敢完全信任它的。一个通用关系型数据库产品是几百万行代码起步的,哪怕只有两百万行代码,那也是至少300-400个人年的全流程开发工作量。哪怕你的整个研发队伍有100人,也需要3-4年的时间才能完成beta测试,交付给客户试用。而这些产品必须能够在企业核心业务场景中获得使用的机会,才有可能从不够成熟变得相对成熟。但是在目前的国产数据库产品如此内卷的市场环境中,是很难找到当年达梦与电力调度这样的磨练机会的。

国产数据库产品真的不是必须是一行行代码都是自己写的,这样会导致重复的去创造轮子,浪费有限的而研发费用与时间。实际上哪怕Oracle数据库里也大量使用了开源代码,用开源代码没有什么大不了的事情。我实际上是十分赞成在符合开源协议的基础上,合理的使用开源代码来开发国产数据库产品的。

俄乌战争后,Oracle,IBM等都中断了俄罗斯的业务,俄罗斯本土企业PostgresqlPro成为了Oracle的重要替代品。这家Postgresql开源社区下游的数据库厂商,其核心完全使用PG开源代码,整合进自己的原创代码,发布了自主的企业版PG版本。美国的技术遏制并没有对PostgresqlPro的数据库业务造成影响,也证明了PG开源社区的安全性。使用开源代码并不像某些领导想象的那样,会不够安全。

实际上,在通用关系型数据库领域,最近几年在技术上贡献比较大的是亚马逊,Aurora是近些年来数据库领域最具影响力的创新技术。2022年谷歌推出的AlloyDB也是对Aurora的一种致敬。不管是Aurora还是AlloyDB都是完全基于开源数据库基础上的技术创新,其数据库的最为核心的代码都是开源代码,随着开源社区的发展,Aurora和AlloyDB都可以升级其数据库核心代码。从我个人的观点来看,亚马逊Aurora在数据库技术上的创新和贡献远远高于号称代码自主率超过90%的任何一家国产数据库厂商。

使用开源代码并不丢人,而是一种快速发展国产数据库产业的有效模式。但是在数据库产品中一定要有自己的原创,有自己的创新。PostgresqlPro让人尊敬的原因也是如此,在PG社区还没有解决XID64的时候,他们的企业版数据库产品已经支持XID64了。日本的自主数据库产业也是基于开源数据库项目的,日本的PG数据库应用规模十分庞大,并且也有大量的原创技术。从NTT的项目中孵化出了著名的PGXC/PGXL两个开源项目,这两个开源项目目前也被大量的国产数据库厂商所使用。

令人欣慰的是国产数据库基于开源项目的创新也已经起步。openGauss的起点是PG 9.2.4核心,不过整个代码已经进行了重构,在开发语言上用C++替代了C语言,为了更好的适应NUMA架构,openGauss采用了单进程多线程架构替代了传统PG的多进程架构。openGauss的核心代码已经完全脱离PG社区,不过从openGauss 3.x的性能上来看,基本上是追上开源社区的最新版本了,在某些方面甚至还实现了对PG社区最新稳定版本的超越。虽然openGauss目前的SQL引擎的核心还在大量使用PG社区版的代码,但是已经融入了大量的创新技术。特别是openGauss在USTOR替换ASTOR的方面进展十分迅速,我想4.0时openGauss会给我们更多的惊喜。目前已经有大量的国产数据库厂商加入了openGauss开源生态,在中国广大的用户群体的磨练下,openGauss的前途十分光明。

瀚高旗下的ivorySQL走的是另外一条路线,其核心代码完全兼容PG,并且能够随着PG版本升级,而ivorySQL的创新点集中在与Oracle的兼容性方面。我想完全兼容最新的PG核心和与Oracle高度兼容这个特性必然会满足一部分准备把数据库从Oracle迁移到开源或者国产数据库的中小型用户的需求,这个创新点虽然在技术上并不高大上,但是也十分有价值。

我十分赞同国产数据库产品使用成熟的开源代码,但是我们不能只做开源社区的吸血鬼,而应该为开源数据库做出中国贡献。前阵子我写过一篇关于在PG数据库中消除DOUBLE BUFFERING,引入AIO的文章,实际上对于一些开源数据库中的老大难问题,我们的使用开源数据库代码的数据库厂商完全是可以组织攻关的,把成果提交给开源社区或者在自己的企业版中自用都是没有问题的。一旦创新进入深水区,那么解决核心问题也并不是不可能的事情。

实际上目前国产数据库在自己的开源社区发展方面也十分成功,PINGCAP的TiDB,蚂蚁的Oceanbase都已经发展成为有一定国际影响力的开源数据库产品。阿里的Polardb-PG从架构上充分学习了Aurora的日志即数据库的思想,充分利用开源数据库PG的核心能力,打造出能够支撑核心关键业务的自主数据库产品,并把代码保持开源。依托这些我国企业主导的开源数据库产品,也必将能够涌现出一批以这些开源项目为基础的国产商用数据库产品。

对于我国的数据库产业而言,是否基于开源数据库代码构建商用数据库产品并不重要,基于哪种开源社区代码,PG还是MYSQL也不重要。只要企业能够符合开源社区的版权要求,那么封装商用数据库产品都是合理的。我们的行业管理部门也不应该以是否使用了开源代码来衡量是否符合信创的要求。只要代码本身是安全的,并且符合我国的等保要求,比如支持SM3国密等,就可以了。

我们的行业监管部门应该把评测重点放在数据库产品本身的能力上,其评测结果能够给数据库用户提供更好的参考性,这样的评测也才更有价值。比如我们可以基于某个国内企业使用较广的ERP产品,财务软件,MES系统,OA系统等,与我们的国产数据库进行适配,形成适配兼容性报告与核心模块性能报告。这些评测报告可能对于企业来说,比代码自主率评测报告有价值的多。​

有关国产数据库与开源代码的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  6. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  7. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  10. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

随机推荐