云原生时代需要什么样的数据库?如何构建数据库服务?腾讯云数据库技术负责人程彬认为,云数据库未来趋势会从以托管为核心升级到以极致效率为核心,助力业务降本增效。从数据库管理和应用角度来看,云厂商、资源、客户三角关系背后包含了三个维度的效率:系统效率、运营效率、业务效率,当这些效率都做到极致,成本会大幅下降。腾讯云数据库是如何围绕这三个纬度,打造极致效率来赋能业务的呢?
本期带来腾讯云数据库技术负责人程彬在第四届云原生产业大会主论坛的分享实录:
视频完整版:《云原生时代的数据库技术沿革》
大家好,我是腾讯云数据库工程师程彬,代表团队和大家谈谈对云原生时代数据库技术的思考和腾讯云在云原生数据库领域的落地实践。

我们观察到,在IT架构领域,云原生已经取代云计算,迎来了一个新阶段。在腾讯内部,每个业务系统会去看自己系统的云原生成熟度得分,不断地去优化和提升。云原生相比云计算,有三个变化。应用场景上,从泛互联网行业进入到了一个全行业数字化,进而带来了数据规模的进一步的增大。基础设施上,也发生了变化。云上IaaS PaaS变得更加成熟,创业公司、独角兽、头部上市公司乃至关乎民生的应用,他们的IT架构都构建在云上。
这些变化引起了我们团队的思考,云原生时代需要什么样的数据库呢?我们怎么去构建数据库服务?
我们认为,云数据库应该从以托管为核心升级到以极致效率为核心。

在讲极致效率之前,我们先看看云数据库背后的一个三角关系。这个三角关系就是云厂商利用和管理硬件资源,为客户提供服务,客户使用服务背后的资源来开展业务活动。它背后有三个效率,系统效率、运营效率和业务效率。
第一个系统效率,系统效率说的是两个层面的事情,一个层面就是把CPU内存、硬盘这些资源全部用出去,不要闲置;另外一个层面是,用相同的资源能处理更多的请求。
第二个运营效率是说云厂商线上规模化运营效率,比较常见的就是数据库调优,1w个实例1个DBA可以搞定,10w个实例或是100w个实例时,DBA人数就需要10个、100个吗?
第三个业务效率是指怎么帮助业务提升开发效率。举个例子,游戏出海需要全球同服,之前非常考验业务架构师的水平,如果数据库能提供低延时全球化部署能力,是不是能大大简化业务架构呢?
大家仔细想想,这三个效率背后又指向了同一个词“成本”。
接下来,我就和大家分享,腾讯云数据库怎么打造极致效率来帮助业务降本增效。

传统数据库架构都是基于资源一体化来进行设计的,这种设计在延时上带来好处,但失去了灵活性和弹性,严重影响到了系统的效率。
我们设计了计算存储分离的云原生架构,将存储池化,计算无状态化,大幅提升系统资源利用率。架构的变化当然会引入很多新的问题,比如计算存储分离的网路延时问题。除了引入RDMA网络降低网络延时之外。我们还创新性地引入了多层存储:在计算节点中加入了二级缓存,把热数据缓存在本地,减少远程IO。存储上,除了多副本机制,我们还实现了纠删码+压缩功能,在不降低数据可靠性的前提下,提供了低于1副本的低成本存储能力。
做好系统效率一定先要保证架构效率。什么是架构效率呢?举个例子,同样是计算存储分离架构,插入一条1KB记录,需要传输多少数据到后端存储呢?很多产品要传输16KB,放大了15倍,而我们架构设计只需要1KB加几个字节就可以了。
很多时候,架构上带来的量级gap,很难靠软件工程去弥补。所以,我们特别追求架构上的极致效率,因为产品需要有一个优秀基因。

关于运营效率,主要和大家分享两个点,业务连续性和自治。
针对业务连续性,我们提出了全景化的业务连续性方案,引入了故障预测机制来提前主动处理潜在隐患。在故障切换时,我们通过缓存预热来做到对业务的无损切换。
在故障诊断能力上,结合客户负载变化和多级检测信息,生成全链路诊断报告和根因分析,提升运维效率并持续发现优化更多异常场景。
相比传统数据库架构,我们把业务连续故障场景切换耗时降低了74%。

随着业务规模快速增长,客户多样化,不合理使用数据库的案例越来越多,数据库问题分析和调优工作给我们带来了极大挑战。
怎么解决这个问题呢?我们走上了AI for system这条路。通过DB结合AI,用AI替代人工调优、诊断、优化。
我们先从数据库调参开始,通过深度强化学习等AI算法实现调参无需人为介入。在此基础上,通过沉淀内部专家经验和结合多种Al算法,做到了调优速度可以通过增加并发度实现准线性的降低。
目前我们支持数千种调参场景、线上应用性能最高提升235%,调优时效从原来人工花费几个小时缩短到几分钟,节省人力的同时,也大大降低了调优时长。
以上智能调参成果也被数据库顶会SIGMOD两次录用,点击延伸阅读《三篇论文入选国际顶会SIGMOD,厉害了腾讯云数据库》。

业务效率上,我们首先想到了云原生最初的核心:极致弹性,按需付费,不使用不付费。举个例子,在公有云的实例中,有相当一部分中小规格的长尾业务,比如周期性开发测试、个人博客、低频资料查找等,他们对数据库的使用负载并不高,对使用成本更敏感。
针对这类用户,打破传统固定规格的产品形态,打造根据业务的负载对计算资源进行自动伸缩,按照实际使用计费,不使用不计费的serverless形态。为了实现计算资源的自动伸缩,数据库在启停方面做了很多优化,保证系统能在几秒内完成停机和重启恢复,提升极致业务体验。
目前我们数据库serverless产品仅在微信生态上就为超过50W小程序开发者提供数据库底座,点击延伸阅读《腾讯云数据库协同微信云托管,助力业务降本增效》。

我们发现以社交、游戏、广告为代表的跨国企业在使用数据库时存在一大痛点,业务通常会在全球多地部署应用,例如,游戏出海,玩家在世界各地登陆账号。为了保证登陆体验,会在世界各地部署多个账号数据库,并实现彼此间的数据库同步,这需要大量人力和精力维护。客户亟需一个可以实现全球同步和就近访问的数据库,以此简化应用架构。
针对这个问题,我们即将推出全球数据库功能,提供跨Region部署能力,并在各地提供访问点,方便客户就近读写。通过物理日志复制技术,解决了跨地域复制的延时问题。

光为用户提供一个好的数据库引擎还远远不够,要提升业务效率,还需要为用户提供方便好用的各类SaaS工具。
腾讯云原生数据库提供了多种SaaS化工具,例如,数据库代理帮助业务高性能应对流量洪峰,数据库自治工具智能调优帮助客户提高整个系统级的SQL性能,数据库加密、备份回档、审计全链路帮助企业数据更安全、更合规。

在混合负载处理场景上,我们也进行了一体化的设计,通过一套系统,对业务透明的方式提供OLTP和OLAP两种数据查询能力,目前灰度中,很快会上线。

未来我们继续探索架构的先进性、极致的软件工程能力。与此同时,我们会深刻理解客户业务场景,把架构能力、软件工程能力覆盖到更多的业务场景中。比如,探索数据模型的融合,一库多用、利用统一框架支撑更多的混合负载处理,来帮助业务降低数据库架构的复杂度,从而提升应用效率。
同样,我们继续践行AI for system,从外挂智能到内嵌智能,让数据库实现最高级别的自治能力。我们继续在最优效率的数据库道路上踏步前进。
今天我的分享就到这里了,再次感谢大家和云原生产业大会,谢谢。
我正在尝试在Rails上安装ruby,到目前为止一切都已安装,但是当我尝试使用rakedb:create创建数据库时,我收到一个奇怪的错误:dyld:lazysymbolbindingfailed:Symbolnotfound:_mysql_get_client_infoReferencedfrom:/Library/Ruby/Gems/1.8/gems/mysql2-0.3.11/lib/mysql2/mysql2.bundleExpectedin:flatnamespacedyld:Symbolnotfound:_mysql_get_client_infoReferencedf
因此,当我遵循MichaelHartl的RubyonRails教程时,我注意到在用户表中,我们为:email属性添加了一个唯一索引,以提高find的效率方法,因此它不会逐行搜索。到目前为止,我们一直在根据情况使用find_by_email和find_by_id进行搜索。然而,我们从未为:id属性设置索引。:id是否自动索引,因为它在默认情况下是唯一的并且本质上是顺序的?或者情况并非如此,我应该为:id搜索添加索引吗? 最佳答案 大多数数据库(包括sqlite,这是RoR中的默认数据库)会自动索引主键,对于RailsMigration
我已经找到了几个使用datamapper的示例,并且能够让它们正常工作。不过,所有这些示例都是针对sqlite数据库的。我正在尝试将数据映射器与postgresql一起使用。我将datamapper中的调用从sqlite3更改为postgres,并且我已经安装了dm-postgres-adapter。但它仍然不起作用。我还需要做什么? 最佳答案 与SQLite不同,PostgreSQL不将数据库存储在单个文件中。在你拥有createdyourdatabase之后,尝试这样的事情:DataMapper.setup:default,{:
我这样做(在我看来):#myUserisaUserinActiveRecordwith:has_many:postsmyUser.posts.eachdo|post|end如果用户有10个帖子,这会调用10次数据库吗?这些循环应该像(不那么漂亮)吗?:myPosts=myUser.postsmyPosts.eachdo|post|endHere是我测试的ruby文件的粘贴箱。编辑修改了粘贴箱。这让我想起了Java中的代码for(inti=0;i应该是(除非数组被修改)for(inti=0,len=someExpensiveFunction();i我错过了什么吗?我看到一堆Rails
我使用的是遗留数据库,所以我无法控制数据模型。他们使用了很多多态链接/连接表,就像这样createtableperson(per_ident,name,...)createtableperson_links(per_ident,obj_name,obj_r_ident)createtablereport(rep_ident,name,...)其中obj_name是表名,obj_r_ident是标识符。因此链接的报告将按如下方式插入:insertintoperson(1,...)insertintoreport(1,...)insertintoreport(2,...)insertint
我正在创建一个新的Rails3.1应用程序。我希望这个新应用程序重用现有数据库(由以前的Rails2应用程序创建)。我创建了新的应用程序定义模型,它重用了数据库中的一些现有数据。在开发和测试阶段,一切正常,因为它在干净的表数据库上运行,但是当尝试部署到生产环境时,我收到如下消息:PGError:ERROR:column"email"ofrelation"users"alreadyexists***[err::localhost]:ALTERTABLE"users"ADDCOLUMN"email"charactervarying(255)DEFAULT''NOTNULL但是我在迁移中有这
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果
我正在尝试将一个数组的数组保存到我在Rails中的SQLite数据库中。现在,我有一个可以容纳这样一个数组的对象,并且实例似乎可以毫无问题地保存。但是,它显然没有保存到数据库中——当我在与创建数组的View不同的View中调用My_Object.array上的函数时,结果为nil并且不起作用。例如:classMy_Object当我调用My_Object.new(:array=>[[1,2,3],[4,5,6]])时,一切似乎都正常工作,但我不能在其他任何地方访问:array属性,结果都是nil。有什么想法吗? 最佳答案 首先在您的表
catch在Ruby中是为了跳出深度嵌套的代码。在Java中,例如Java用于处理异常的try-catch可以实现同样的效果,但它被认为是糟糕的解决方案,而且效率也很低。在用于处理异常的Ruby中,我们有begin-raise-rescue,我认为将它用于其他任务也很昂贵。Ruby的catch-throw真的是比begin-raise-rescue更有效的解决方案吗?或者还有其他原因可以使用它来打破嵌套block而不是begin-raise-rescue? 最佳答案 除了是摆脱控制结构的“正确”方式之外,catch-throw也明显
我的意思是之前建立的那个DB=Sequel.sqlite('my_blog.db')或DB=Sequel.connect('postgres://user:password@localhost/my_db')或DB=Sequel.postgres('my_db',:user=>'user',:password=>'password',:host=>'localhost')等等。Sequel::Database类没有名为“disconnect”的公共(public)实例方法,尽管它有一个“connect”。也许有人已经遇到过这个问题。我将不胜感激。 最佳答案