做数据库迁移的最好方法是什么?
这是一个具有挑战性的问题。没有任何一种方法是最适合于每一个使用案例的。然而,在最近的网络研讨会上与LaunchDarkly高级分布式系统工程师Justin Caballero交谈后,我们认为LaunchDarkly从Postgres和MongoDB迁移到CockroachDB的过程提出了一些伟大的数据库迁移最佳实践。
让我们仔细看看LaunchDarkly和他们的数据库迁移方法。
什么是LaunchDarkly?
LaunchDarkly是一个功能管理平台,它使开发和运营团队更容易使用功能标志来控制整个功能生命周期。
在最基本的层面上,功能标志是一些代码,使开发人员能够通过对配置文件的小改动来开启和关闭产品功能。这使得轻松管理功能成为可能,而不需要不断地重新部署代码,并通过 "黑暗启动"(这就是LaunchDarkly这个名字的由来)对一部分用户的功能进行实验。
LaunchDarkly的平台远远超出了简单地启用功能的开/关标志。它为用户提供了一个端到端的功能管理解决方案,包括从直观的用户界面到先进的分析,使功能实验易于控制和理解。
提示1:彻底评估和测试你的选项
LaunchDarkly的内部数据库需求最初主要由MongoDB提供服务,其他一些工作负载由Postgres提供。但是,随着大量交易用例的出现,客户群的不断扩大,以及在保证一致性的同时需要平稳的扩展,他们开始担心MongoDB可能无法应对挑战,并开始寻找替代方案。
高级分布式系统工程师Justin Caballero很早就知道分布式SQL方法,他读过谷歌最初的Spanner论文。但Spanner只是为愿意完全与GCP绑定的公司提供的解决方案。因此,当一位同事提到CockroachDB时,Caballero很感兴趣,这个数据库将Spanner的平滑扩展的云原生分布式SQL与先进的多区域功能和对多云和混合云部署的支持相结合。
"我们希望能够讲述一个零RTO/RPO的故事,"Caballero说。"当我们把Cockroach与我们正在关注的其他多区域的东西(如AWS Aurora或类似产品)进行评估时,我们只是觉得这个[CockroachDB]是最好的。"
具体来说,Caballero说,LaunchDarkly正在寻找一个数据库系统,使他们能够告诉客户 "我们可以失去东海岸,你不会注意到"。
他们还想要一个首先为云原生多区域架构设计的系统。Caballero说,最初为单区域设计的系统 "很难管理",后来才支持多区域,所以LaunchDarkly想要一个从头开始就考虑到多区域和多云的系统。
在与基于SQL的竞争对手和NoSQL数据库MongoDB和Cassandra进行测试后,CockroachDB成为赢家。
这是从LaunchDarkly中学到的第一课:花时间评估你的需求,并彻底测试你的选项即使是最顺利的数据库迁移也需要时间和金钱,当你大规模运作时--这不是一个你想在一年后再次经历的过程,因为你发现你做了错误的决定。
提示2:分阶段迁移是数据库迁移的最佳实践
作为一家让开发者采取可控的、渐进的方式推出功能的公司,LaunchDarkly对他们的数据库迁移采取类似的渐进方式并不奇怪。
这一点很关键,因为即使你知道你已经为你的需求选择了正确的数据库技术,实际将你的工作负载转移到它上面的过程通常至少会有一些意外。
为了启动他们的迁移过程,Caballero说:"我们选择了我们认为最简单和最不容易暴露的[工作负载],如果出了问题的话。"他们在Postgres中有一些数据,所以他们从Postgres开始,因为Postgres和CockroachDB都是基于SQL和关系的。理论上,这比从转移MongoDB的工作负载开始要容易。
"Caballero说:"事实证明,我们选择开始的工作负载最终是更复杂的工作负载之一,""只是因为我们的SQL查询使用了一些有趣的Postgres功能,而且它们是非常复杂的查询,做了很多繁重的工作。
这种困难有点让人吃惊。但是因为LaunchDarkly选择了从小处开始,这不是一个问题。"我认为这实际上是一个很好的举措,"Caballero说,"因为它帮助我们真正挖掘了Cockroach的功能,而这个功能并不像核心标记信息那样关键。"
LaunchDarkly对其数据库迁移的理念最终与他们倡导的软件开发理念相同。"小而可逆的步骤"。
分阶段迁移方法的另一个好处是,它给了LaunchDarkly时间来学习如何与新系统一起工作。尽管CockroachDB使用的SQL语法对任何开发人员来说都非常熟悉,但从传统系统转换到分布式、多区域的数据库确实需要一些调整。
这是因为分布式系统存储数据和处理查询的方式不同。"我们一直在学习如何使我们的查询具有性能,以及当你处理一个更多的分布式数据库时,要避免哪些类型的事情,而不是像Postgres那样,你要处理一个单一的主节点[......]这只是一组不同的关注。"
一个例子是改用UUID作为主键--这是分布式系统的一个重要的最佳实践,有利于在整个集群中分配密钥。这是LaunchDarkly "一开始就做对了 "的事情。
另一个例子是LaunchDarkly遇到的关于级联删除的问题。在他们原来的数据库中,他们有一个工作负载,一个API调用就会导致 "数万行被删除"。但是在CockroachDB的分布式系统上,将这个单一的命令分解成更小的块状,最终使它变得更有性能,因为它促进了节点之间更快的信息传输。
简而言之:转移到一个新的数据库系统可能需要一些思维上的转变,尤其是当你从一个传统的、单节点的系统转移到一个现代的、多云的、多区域的分布式系统。你必须给你的团队足够的时间和空间来进行实验和转变--而这也只有在你采取分阶段迁移的方法,并且从不太关键的工作负载开始,让你有一点出错的余地时才有可能。
提示4:使用功能标志
LaunchDarkly对CockroachDB的推广也利用了他们自己的功能标记技术,使他们能够逐步迁移并进行实验,这一点应该不奇怪。
"对于我们的每个工作负载,我们都有一个存储库接口,本质上是'这些是我们用来访问数据的功能'。我们提供两个实现,一个是Cockroach,一个是我们以前的存储,然后我们用功能标志来控制哪一个被运行,哪一个被连接到终端用户,"Caballero说。
这使他们能够逐步推出新的CockroachDB数据库,从一小部分用户开始。由于这两个数据库是平行运行的,他们监控这两个数据库的一致性。如果他们发现了新数据库的问题,功能标志使他们能够快速关闭它,而不需要部署任何新的代码。然后,他们可以修复这个问题,并以他们开放的速度重新启动实验,对用户体验没有负面影响。
LaunchDarkly的下一步是什么?
在这一点上,LaunchDarkly已经超越了他们最初的Postgres迁移,并且正在将他们所有的MongoDB工作负载过渡到CockroachDB的过程中。想了解更多关于他们的迁移过程,请查看网络研讨会的完整记录。
完整的网络研讨会记录
查看本次网络研讨会的页面,或者查看我们的其他技术讲座。
Jim Walker(00:00)。好的。下午好。早晨好。晚上好。现在是午餐时间,所以这是LaunchDarkly的午餐,建立扩展的全球应用程序是我们今天蟑螂时间的名字。但首先,我想感谢大家加入我们,在你们繁忙的一天中抽出时间来。
吉姆-沃克(00:16):我希望今天的会议将是一场精彩的会议。我个人喜欢与客户交谈,喜欢与那些在战壕里的人交谈,使事情发生。分布式系统专家,采访他们,与他们交谈,我学到了很多东西,但希望这对在座的各位非常有价值,谈论LaunchDarkly和他们如何使用Cockroach来实际扩展他们的应用,以及那里发生了什么。但在我们开始之前,先说一下内部管理。当然,我们每次都会被问到,"活动结束后会有录音吗?"
吉姆-沃克(00:51)。当然可以。我们会给每个注册的人发送一份后续资料。然后我们通常在活动当天将所有内容发布到我们的YouTube频道。我不想给出一个SLA,但它应该在今天晚些时候出现在我们的YouTube频道上。请在QA小组中提出问题。同样,这也是对一个实践者的采访。所以,让我们都互相学习,我们将一路监控QA,然后也参与聊天,如果你喜欢这样更好。有时,我们会得到这些疯狂的聊天对话,它是来回的,有很多事情要做,所以我们鼓励上述任何和所有的事情。我和克里斯马上就会加入我们的行列,我们会监控并倾听对话,确保我们能得到问题。
吉姆-沃克(01:35)。所以,如果你有任何问题,请沿途在该表格中提出。这将是伟大的。这将是非常棒的。那么,今天的课程,我们经常被问到,"这是什么水平?"这是一个中级课程。我们将讨论一些相当复杂的事情。这不会只是商业价值或这些高层次的东西。实际上,从技术角度来看,它应该是很有希望的。我们有一堆的话题,就像我说的,我们喜欢提问。但我们要谈的是LaunchDarkly和他们使用CockroachDB的一些事情,但更重要的是,业务也是如此。
吉姆-沃克(02:08)。因此,今天我想邀请我的犯罪伙伴来这里。那么,贾斯汀和克里斯,你想把镜头带到那里吗?真棒。好的。因此,感谢你们两位的加入。我将首先介绍贾斯汀。Justin Caballero是LaunchDarkly的高级分布式系统工程师。贾斯汀,我有一大堆关于你的标题的问题,首先。所以只是问候,首先。我会请你解释你自己,但是嗨,你好吗?
贾斯汀-卡瓦列罗(02:40)。你好,下午好。
吉姆-沃克(02:41)。好的,很好。好的。量的工作,大家都很好。然后是我的朋友,克里斯。克里斯-卡萨诺,他是我们的领导和销售工程师之一,他也花了一大堆时间与客户在一起。你想打个招呼吗,克里斯?
克里斯-卡萨诺(02:53)。嘿,伙计们。嘿,吉姆。嘿,贾斯汀。很高兴和你们一起参加这个小组。是的,我很乐意帮助大家解决今天可能遇到的任何技术问题。就像吉姆提到的,在聊天中会有问答。欢迎在那里发表你的问题,我将尽可能快地回答他们。
吉姆-沃克(03:06)。真棒。谢谢你。好的。好吧,那么贾斯汀,首先感谢你做这个。更重要的是,感谢你成为Cockroach Labs的客户。我们非常高兴,像你这样的公司,我认为是一个快速发展的新兴创业公司,有......天啊,我真的很喜欢的技术加入我们。那么,贾斯汀,只是为了开始,你在LaunchDarkly的角色是什么?
贾斯汀-卡瓦列罗(03:35)。是的,所以我在我们的后端服务队之一,如果你愿意的话。我的团队特别被称为 "旗帜交付团队"。因此,我们基本上负责向客户提供特征标记信息的服务和基础设施。SDK是我们工作的核心内容。
Justin Caballero (03:58):因此,这是基础设施的一部分,将功能标记下放到终端用户设备或服务器,以及世界各地的数据中心。从技术上讲,我们并不像一个为公司其他部门提供基础设施的平台团队,但Cockroach的工作在我们这里落地。所以我们是一个双重目的的团队,在这个程度上。
吉姆-沃克(04:22)。嗯,这很酷。而你是一个分布式系统工程师,我很抱歉。但我现在是所有分布式事物的大粉丝。我认为这是个大问题。你做分布式系统有多久了,贾斯汀?
贾斯汀-卡瓦列罗(04:35)。所以,是的,我在网络服务方面做了很多工作,我想说,我不知道,有20年了。所以要回到SOAP的东西,我很高兴已经把它抛在后面。所以,是的。应用程序之间的对话基本上就是我一直在做的事情。
吉姆-沃克(04:56)。这就是它,对吗?好吧,我再往前走一点。我是BEA Tuxedo的一个早期客户,后来成为WebLogic。那是那个疯狂的开始。当我第一次看到它时,我想,"哇,这太酷了"。我们当时正试图建立Tuxedo的方式。这很疯狂。是的。但它是真棒。我们喜欢它。
贾斯汀-卡瓦列罗(05:17)。在这个空间里,从某种程度上说,感觉太阳下没有什么新东西。就像,你会看到一些新的东西出来,它就像,"哦,实际上这是15年前的东西。"
吉姆-沃克(05:29)。你是说像命名空间和Kubernetes?还有像...
Justin Caballero (05:37):当然,因为Cockroach是一个很好的例子,它确实感觉很新。但我注意到,有一些趋势往往是循环的。现在像RPC这样的东西非常流行,在过去的10年里,有多少IDL被创造出来用于规划模式和消息传递?这要追溯到以前。
Jim Walker (06:04):很久以前。好吧,有趣的是,我在市场营销部门,所以我没有机会再玩技术了。我通常告诉营销团队的人,"有人已经说过这个了。所以,去找它,因为像......"而通常,巨大的公司已经做了我们所做的一半的事情。因此,我认为这是在所有的板块。但是贾斯汀,什么是特征标记?
吉姆-沃克(06:26)。如果这里有人不知道什么是特征标记,可以去看看。看看LaunchDarkly,因为对我来说,当我第一次看到它时,我想,"哦,是的,那是未来,肯定的。"
贾斯汀-卡瓦列罗(06:36)。是的。是的,我也有同样的印象。基本上,公司的使命是让团队有能力交付和控制他们的软件,所以这对我们来说意味着一个基本概念,即首先能够将部署软件的行为与发布功能分开。
Justin Caballero (06:56):所以,你可以把一个软件投入生产,但你可以控制某些功能何时提供给哪些类型的用户。这是非常强大的,因为它将这两件事脱钩,给了你很大的灵活性和控制力,可以立即对你的软件工作方式进行运行时修改。而这可能是在某人的设备上,或在某人的汽车上。很多用例,我们不只是在谈论服务器群。到处都有软件。所以LaunchDarkly可以实现所有这些用例。
Justin Caballero (07:29):然后另一部分是控制和能力,从这一点来看,我们可以修改你的软件在运行时的工作方式,我们也可以跟踪......在此基础上进行分析,所以我们可以看到哪些用户得到了哪些功能,你可以将其与实验挂钩。如果你想做自己的分析,我们可以为你提供与之相关的所有数据。我们可以把它与APM结合起来,所以你可以有自动化的......比如说,如果我启用了这个功能,性能就会下降,我可以自动把它关掉。这里面有很多不同的用例。所以,这真的是关于给开发人员的控制。一旦你开始使用功能标志,你就不能没有它们了。这就像...
吉姆-沃克(08:12)。这是那些东西中的一个,一旦你看到它,你就无法不看到它。就像一旦你去过那里,你就不能再回来了。
贾斯汀-卡瓦列罗(08:18)。是的,是的。这就像,"没有这个我是怎么过的?这似乎是你的工具包的一个必要部分。"
吉姆-沃克(08:24)。而这是其中的一件事,我想就像你刚才说的,数据库是新的。这对我来说是新的。我的意思是,我曾经在半夜里做文件和构建,哦,我的上帝,真是一场噩梦。这简直就是天堂。就在这里,把这个功能,并把它放在那里给我,请。真棒。是的,所以这很了不起。所以,这很好。就像我说的,如果有人,你还没有看到LaunchDarkly,你是一个开发者,去看看吧。它是相当糟糕的。
吉姆-沃克(08:49)。那么,让我们来谈一谈LaunchDarkly和Cockroach,以及你们都在那里做什么。但让我们先说说你是如何第一次接触到Cockroach的?你在这个数据库中看到了什么有趣的东西,贾斯汀?
贾斯汀-卡瓦列罗(09:04)。是的,我想这样说是一种欺骗,但我想我第一次接触是在十年前读Spanner Paper的时候。
Jim Walker (09:11):公平。公平。那是完全公平的。顺便说一句,我也是。
贾斯汀-卡瓦列罗(09:15)。是的。当时,每个人都对它感到超级兴奋,但它似乎是一些,"哦,这对谷歌来说是伟大的。我不能这样做。"现在,它可以作为GCP的一部分,但是,你仍然不是在GCP上运行。所以我实际上没有直接听说过Cockroach,直到一年或一年半前通过一个同事才知道。我们正在寻找可以改善我们的多区域故事的数据库。
贾斯汀-卡瓦列罗(09:41)。我只是开始在网上看视频,你们关于它的视频,然后去参加一个聚会,就像,"哦,哇,这太酷了。这是在斯班纳的这个血统中,它给每个人带来了这个。"这就像,"这很好"。我们希望能够讲述一个零RTO/RPO的故事。因此,当我们将Cockroach与我们正在关注的其他东西进行评估时,非常多区域,比如说AWS Aurora或类似产品,就像......我不知道。我们只是觉得这是最适合的。
吉姆-沃克(10:19)。嗯,我很高兴你觉得我们是最好的。我有点像荷马,所以我认为我们是最好的。但那是另一个故事。但顺便说一下,我也是通过Spanner白皮书第一次接触到这个问题,当时我在Hortonworks。你可以想象,我们当时想,"哦,我的上帝,这是分布式交易。这很好。"我们当时正在研究Hive,我们有Hive......那是什么,克里斯?LLAP?那个东西叫什么?
克里斯-卡萨诺(10:40)。是的,LLAP,是的。
吉姆-沃克(10:41)。是的,[crosstalk 00:10:41]我们刚开始建立这个。我当时只是想,"哇,这太酷了。"但它是,我认为一旦你进入这些概念,我认为它真的很有趣。这就是为什么我喜欢你的标题,贾斯汀,是分布式系统,一旦你进入这些东西如何工作的思维,理解它的功能是一回事,但在现实中,当你是一个使用这些东西的实践者时,它是完全不同的事情。
吉姆-沃克(11:05)。但我喜欢这个弹性的故事,这又回到了我们的名字,蟑螂。不能杀死它。所以RTO/RPO的事情。那么,LaunchDarkly今天是如何使用Cockroach的?
贾斯汀-卡瓦列罗(11:17)。所以现在,我们正在迁移我们所有的现有......我们称之为核心数据。所以那些不在非常专业的存储系统中的东西,我们正在迁移到Cockroach。目前,我们有一个单一地区的部署,但我们希望在短期内扩大。所以,是的。我们已经有了基本上所有的客户、用户、组织的账户数据,所有的功能标记信息,所有这些东西都将进入Cockroach,以及围绕整合的东西。我们有许多与其他产品的整合。
贾斯汀-卡瓦列罗(11:59)。所以有关于这个的信息或者有一些授权类型的东西。所以,是的。我们正处于这个迁移的中间阶段。我想说我们也许已经完成了一半,类似这样的事情。因此,希望我们的目标是很快就能完全摆脱我们的旧系统。
吉姆-沃克(12:23)。是的,我的意思是,分阶段迁移的风险太大,不能一次完成所有的事情。我的意思是,你是功能标识公司。所以当然有减轻风险的事情。你们从什么地方迁移?你知道为什么吗?主要是复原力的问题,还是?
贾斯汀-卡瓦列罗(12:38)。这确实是弹性的事情。是的,想去多地区,并有一个首先为之设计的系统,而不是作为一个附加的东西。所以我见过一些解决方案,它就像,"是的,这在单一地区的设置中很好用。"但当我们去扩展它时,它就像,"哦,我们已经添加了这个功能"。这是很难管理的。而且你必须处理更多的东西。
贾斯汀-卡瓦列罗(13:05)。所以是的,首先设计云原生多区域架构是我们想要的。然后是高弹性,能够告诉客户这样一个故事:我们可以失去东海岸,而你不会注意到。这对我们的一些客户来说是很有吸引力的,所以。
吉姆-沃克(13:25)。嗯,是的。我的意思是,开发人员失去了他们的代码,他们吓坏了。我们昨天才看到,大家都是这样。整个Fastly的事情,人们都吓坏了。就像,"哦,我的上帝。"是的。所以他们有点挑剔,我想,这个观众。所以,昨天看这个是个有趣的日子。
吉姆-沃克(13:45)。是的。那很好。所以你正在做一个较慢的迁移。是否可以说,你从风险较小的工作负载开始,贾斯汀?然后再往上引导?
贾斯汀-卡瓦列罗(13:58)。是的,是的。我们选择了我们认为最容易和最不容易出错的工作来开始。所以我们从Postgres迁移了一些数据,我们认为,"哦,这将是一个很好的选择,因为至少它是SQL。"我们其他的东西是一个文件故事。这也很有趣。我们可以谈论这个问题,但我们确实是从这个开始的。事实证明,我们选择的工作负载最终是更复杂的一个,因为我们的SQL查询使用了一些有趣的Postgres功能。他们是非常复杂的查询,做了很多繁重的工作,你可能认为有时你只需要做一个应用程序代码。所以他们是非常强大的查询。
Justin Caballero (14:45):所以我认为这实际上是一个很好的举措,因为它帮助我们真正深入了解了Cockroach,而且也是一个不像核心标记信息那样关键的功能。所以,是的,我们确实学到了不少这方面的知识,现在这已经成为过去。所以我们一直在学习如何使我们的查询得到执行,以及当你使用一个比Postgres这样的分布式数据库时要避免哪些类型的事情,在那里你只需要处理一个主节点。所有的东西都在这个节点上,而且速度超快。这只是一组不同的问题。所以,是的。
Justin Caballero (15:33):我们还没有转移到我们的核心标志的东西,但我们正在做边缘的事情,简单的事情,像我们所说的仪表盘,这基本上是一个保存的视图,为用户的UI,也许过滤器。这是很简单的东西。这些都很好,因为它们更容易,而且我们得到个位数的延迟,因为查询是如此简单。所以我们非常高兴地看到,我们可以从Cockroach中获得良好的性能,尽管[串讲 00:16:06]。
吉姆-沃克(16:06)。这就是所有的单区,对吗?在这一点上,贾斯汀?
贾斯汀-卡瓦列罗(16:08)。是的,它是单区域的。所以你期望当我们去多,因为我们正在看我们的多区域架构,我们将开始优化,使权利尽可能快。因此,我们将有另一个区域作为权利伙伴,这是与我们今天的主要区域尽可能接近的。
贾斯汀-卡瓦列罗(16:26)。然后随着我们的基础设施的扩展,我们可能会努力保持这一点。我们如何才能最大限度地减少正确的延迟,然后能够提供多区域的[串扰 00:16:41]?
吉姆-沃克(16:41)。迁移到多区域是围绕着弹性方面的,对吗?我的意思是,那是核心驱动力,对吗?我的意思是,[crosstalk 00:16:47] 延迟的事情最终会有帮助,对吗?我的意思是,我认为。但我认为这更像是一个弹性的事情,对吗?
贾斯汀-卡瓦列罗(16:54)。主要是这样,是的。也许有一天我们会开始更多地关注GO分区的事情,但它现在与我们的系统工作方式并不那么自然。
吉姆-沃克(17:05)。当然。
Justin Caballero (17:06):所以我有兴趣看看在某些时候我们是否可以使用......我想它被称为重复索引拓扑结构,用于我们的一些非常低频的数据或静态数据,只是为了让我们可以权衡一些延迟......使读取更快,速率更慢。所以当我看到这种拓扑结构时,我真的很兴奋。它看起来非常酷。
吉姆-沃克(17:30)。嗯,这只是来自像你这样的客户的直接要求。老实说,有趣的是,当你在这样的公司工作,人们开始大规模使用你的数据库时,我们从客户那里学到了很多。这就是那些不断出现的模式之一,我们不得不弄清楚,比如,"好吧,看,在Spanner的论文中,他们没有谈到这些东西。"
吉姆-沃克(17:49)。因为这对他们来说不是一个问题。是谷歌,那真的可以控制。但在现实中,哇。有这么多不同的奇怪案例出现。我认为通过这些是很有趣的。我迫不及待地想看看那些没有投票权的副本。是的,重复的索引。一些非常酷的东西,但这是一个更高级的东西。你刚开始的时候并不了解这些东西。对吗,贾斯汀?我的意思是,那是一个小小的学习曲线,对吗?
贾斯汀-卡瓦列罗(18:17)。当然有。我的意思是,我们做了一个评估,玩了其中的一些东西,但我们在实际实施时学到的东西与我们在评估中发现的东西不同。所以,是的,这是一个非常深入的产品,蟑螂。我很高兴这些文件是如此彻底。它真的给了我们很大的帮助,帮助我们甚至知道如果我们需要去找支持,应该问什么。
吉姆-沃克(18:43)。嗯,对我们的文档团队来说,阿门。有谁见过我在这些事情上,在我做的每一次公开演讲中,我都会说一些关于我们文档团队的好话,因为我认为他们的工作非常出色。实际上,杰西是个诗人。领导我们所有文档的人实际上是一个诗人。所以,我认为这实际上是在说,但整个团队的工作是非常出色的。
吉姆-沃克(19:08)。我想回到一些问题上。你谈到了从Postgres到Cockroach的迁移,你不得不重构查询。你重构查询是因为Cockroach的分布式性质,还是因为语法的不同?因为有些事情我们在Cockroach中没有做,而在Postgres中却有。因为它也是分布式的,我想这两者都有一点。但是你能和我说说这个重构吗?这实际上是非常有趣的。
Justin Caballero (19:35):是的。两者都有。我的意思是,我们所做的事情之一是当我们创建Cockroach模式时,我们确保使用UID作为我们的主键。
吉姆-沃克(19:44)。是的,这是一个关键的最佳实践,是的。
Justin Caballero (19:46):这是一个非常明显的问题,我们一开始就得到了。所以我们没有一个序列,我们的主键的单调序列。但另一件事,因为有一些方言的差异,只是......在Postgres中有一个类似于Cockroach的函数,但它只是有一个不同的名字。所以我们需要把这些弄清楚,这还不算太糟糕。
Justin Caballero (20:11):其他的一些事情是什么?我们遇到的问题之一是关于级联删除。所以,我们有这样的工作量,我们可能对我们的API进行一次调用,导致数据库中数万条记录被删除。在Cockroach的一个旧版本中,我想后来已经有了修复,但是我们会得到两个大的错误命令,因为它只是试图用这些级联删除来建立一个太大的东西。
贾斯汀-卡瓦列罗(20:43)。所以,我们确实做了一些工作,使用了一个功能标志,能够控制,我们是想级联删除,还是想以批处理的方式进行?因此,我们可以在飞行中决定我们要做哪种方式。因此,我们采纳了你的建议。在文档的最后,支持部门试图将这些命令分解,使其更小,所以它们会运行得更快一些,并适合于在节点之间传递信息的大小。这就是 [crosstalk 00:21:13]。
吉姆-沃克(21:13)。这就是分布式系统的有趣之处。你必须真正考虑到这些事情。我认为这真的很有趣。让我回到这个问题上,但克里斯,我知道你经常与客户打交道。你能解释一下UID问题,以及为什么你需要使用这个吗?我知道,克里斯,你在外面和很多人谈论这些东西,对吗?为什么你需要在每张桌子上使用这个?
克里斯-卡萨诺(21:35)。是的,所以这是个好问题。因此,蟑螂喜欢的一件事是分发。我们都希望你能进入有一个热点范围的陷阱,你所有的流量都流向数据库中的一个碎片或一个范围。因此,像UID这样的东西,它们允许你实际上在整个集群中获得更多的密钥分布。因此,这样一来,所有的范围和所有的节点都在为你执行平行的任务,而不仅仅是,"嘿,所有的东西都被弄到了一个热点"。
克里斯-卡萨诺(22:03)。所以你越能利用它们,通常你就越好。也只是在这里补充一下,所以我已经和贾斯汀合作了一段时间,但我认为LaunchDarkly在这里采取的方法只是一种教科书式的方法。他们只是没有直接跳进池子的深处,说,"我们要做多区域,我们要做所有这些疯狂的事情。我们走吧。"
克里斯-卡萨诺(22:28)。他们已经走进了浅滩,对于如何以正确的方式使用Cockroach,他们真的很有耐心和方法。贾斯汀和团队在使用过程中发现了一些值得学习的东西,但我们已经尽了最大的努力来教育、帮助和支持他们的旅程。所以我只想说,我真的很感激......我已经和LaunchDarkly合作了一段时间,只是他们的方法和方法论在这里使用。
吉姆-沃克(22:57)。是的。我们一次又一次地看到这一点。这就是为什么我想问这个问题,贾斯汀。你从哪里开始的?因为我认为这是其中的一件事,你可以理解所有这些概念,但如果你只是先跳入它的脚或头,它太多了,伙计。你将会遇到这些奇怪的事情,对吗?
贾斯汀-卡瓦列罗(23:12)。是的,是的。当然。你想采取小的东西。哲学基本上是,小的、可逆转的步骤,就像[串讲 00:23:19]单独的。你总是想要一条出路,你不想影响你目前的SLO,当然。所以,是的,找到你认为最容易开始的事情,如果你弄错了,影响最小。
贾斯汀-卡瓦列罗(23:37)。做这种事情的天真方法可能是,你宣布一个停工窗口,你从一个数据库导入到另一个,然后你再回来。但这对现在的很多公司来说是行不通的。你不能接受停工期。因此,我们采取了一种方法,我想这是一种非常普遍的方法。你可以找到谈论它的视频,但基本上,两个数据库一起运行,向每个数据库发送相同的查询。所以这对我们来说也是一个重要的风险缓解方法,因为我们不能突然就开始使用Cockroach。
贾斯汀-卡瓦列罗(24:20)。我们想看看它在生产中的工作情况,而不需要实际与用户连接。因此,让它在我们的原始数据存储旁边运行,并能够观察它,监测它,检查性能和正确性,我们比较两个数据库的结果,如果我们发现差异,就记录指标。所以我们是相当保守的。
吉姆-沃克(24:42)。继续说,对不起。是的。然后贾斯汀,如果我错了,请纠正我,但你是用LaunchDarkly来做这个的,对吗?
贾斯汀-卡瓦列罗(24:51)。是的,没错。这是肯定的。所以,对于我们的每个工作负载,我们有一个你可以认为是存储库的接口,是它的一个通用名称,本质上,这些是我们用来访问数据的功能,并提供两个实现,一个是Cockroach,一个是与我们以前的存储。
Justin Caballero(25:10)。然后我们用功能标志来控制哪一个是连接的,哪一个是运行的,哪一个是连接到终端用户的,这是真理的来源。因此,我们可以在百分比的基础上逐步推出Cockroach。我们可以说,"我们要为10%的客户做这个。我们将观察它,看看它看起来像什么。如果它看起来不好,我们会把它转回来,做一些修复,然后再开始。"因此,功能标志使所有这些成为可能。我们可以在瞬间做到这一点,而不需要进行部署。所以是的,这肯定是一个开始。
吉姆-沃克(25:46)。这真是太棒了。每隔一段时间,有人会说一句话,涉及到蟑螂这个词,我这个14岁的孩子就会笑。就像,我很抱歉,伙计们,但我已经在这里......我不知道,差不多三年了吧?这就像,"是的,我们把蟑螂部署给我们的客户,"它只是有时听起来很有趣。我也不知道。而且十有八九,每次我们收到黑客新闻的帖子,有人就会说,"是啊,但是这个名字,我不知道。"
贾斯汀-卡瓦列罗(26:10)。我喜欢这个名字。当我听到它时,我就想,"哦,是的。这对这个产品来说是完全完美的名字。"
吉姆-沃克(26:18)。不管是爱还是恨,你都不会忘记它。那是肯定的。那么有多少人在接触Cockroach?我的意思是,在开发人员之外,我的意思是,因为开发人员正在与这些东西打交道,但从运营的角度来看,支持它,处理它,现在有多少人在管理这个系统,贾斯汀?
贾斯汀-卡瓦列罗(26:37)。现在,它只有我们两个人。所以,我们已经开始让其他团队使用它,所以他们正在迁移数据集或在它上面建立新的数据集,但实际上,基础设施部分,只有我们两个人。所以,是的,我们采取了一个相当简单的方法。我想我在之前的直播中听到DoorDash的描述,他们只是使用更多的普通计算节点。这是一个适合两个人管理的东西。
Justin Caballero(27:15)。所以,是的。是的,我认为这可能会随着时间的推移而转变。它可能会从我现在所在的团队毕业,变成一个更加面向平台的团队来管理它。
吉姆-沃克(27:28)。很好。
克里斯-卡萨诺(27:28)。在聊天中,有一个很好的问题,我想我们应该很快地提出来。我知道我们之前讨论过这个问题,但是Justin,当你从Postgres迁移到Cockroach的时候,你在迁移的过程中有没有发现其他反模式?我知道我们之前谈到了UID,但是还有什么其他的问题是在这个过程中出现的?
Justin Caballero (27:49):所以我们不得不看一下Cockroach的查询计划。这是一个逐案处理的事情。我们确实不得不重写一些查询,以使它们......只是为了确保它们能够执行。我不知道除了看一下查询计划,看看是否有问题之外,还有什么一般性的收获。
Justin Caballero (28:14):我想说的另一件事是尽量保持你的SQL简单。这有很大的好处。你可以得到你想要的事务边界,或者很明显,你不想做很多的往返。因此,有时你需要做一个更复杂的语句,但如果你能保持你的SQL小,就很容易使其快速。除此以外,对于我们其他不太复杂的工作负载,它的转换非常容易。所以,其中一件事,我们使用了一些扩展的大小写和敏感性,这在Postgres中是可用的。因此,我们不得不在Cockroach方面使用collate语句做一些额外的语法,以确保区分大小写的搜索工作。所以有一些奇怪的事情,但它们都是可以解决的。
吉姆-沃克(29:13)。很好。克里斯,你想问彼得的这个问题吗?我想这是一个非常好的问题,关于批量插入和尺寸。我来问吧。我想...
克里斯-卡萨诺(29:25)。[crosstalk 00:29:25] 需要我,吉姆。你能行。
吉姆-沃克(29:26)。有一个很好的问题,实际上,这个问题在DoorDash的采访中也出现了,贾斯汀,当他在谈论插页时。当你在做批量插入的时候,你如何计算出每个东西的大小和行数,以获得最佳性能?我想肖恩曾说过,"是的,我们有这个插入的10,000条记录。我们把它做成1000条记录,每条记录有10条语句,来分配这个。"
吉姆-沃克(29:52)。你们经历过这种情况吗?你们是如何计算出性能与体积大小的权衡的?
贾斯汀-卡瓦列罗(29:59)。是的,我不认为我们在插入方面做了这个。我们确实在删除方面做了,同样,我们使用了带有整数值的特征标志来拨动批量的大小。因此,我们只是尝试了一些数字,看看哪一个看起来对这种情况最有效。我不能说我们已经想出了一个一般的......我不认为我们已经看到了足够多的情况,可以有一般的建议。我不知道。克里斯可能有一个更好的答案。
克里斯-卡萨诺(30:29)。我的意思是,通常情况下,我们会发现,很多小的交易都很好用。所以,我的意思是,我们刚刚与另一个客户测试了一些东西,我们需要在20分钟内加载我认为大约一亿条记录。所以我们发现,只要有真正的小批量,但大量的小批量才是正确的做法。
克里斯-卡萨诺(30:46)。所以这取决于。有时,你的批次,他们可能必须击中多个范围。也许你的批次只打一个范围,这对你来说会更快。因此,这是一个有点试验和错误的过程,但我想说的是,在你的脑海中,很多小的交易通常会帮助你扩大规模,以获得正确的性能。
Jim Walker (31:05):保持你的SQLs简单,KISS。保持你的SQL简单。我打算开始使用这个。我喜欢它。我将会有保险杠贴纸,但我认为这很好。这个问题很难回答,因为如果它只是简单的插入,是的,很好。如果是跨多个表的级联插入,那么你就会陷入......所以这真的取决于你想做什么。我认为我们也一再看到这种情况,贾斯汀,我认为这就是肖恩所说的。这需要一点点的实验,你会习惯于它。你会进入这种不同的心态,对吗?
贾斯汀-卡瓦列罗(31:40)。是的。当然,是的。是的。有一件事我想提一下,我忘了,关于迁移,对我们有好处的是,我们现在开始迁移文档存储数据,JSON数据。很高兴看到Cockroach可以很好地处理这些数据。
Justin Caballero (31:57):所以我们可以把JSON文档放到数据库中,然后写出针对这些文档的查询。而且他们表现得很好。所以我想对大家说,如果你来自非SQL数据库,并关注Cockroach,它可以发挥作用。
吉姆-沃克(32:15)。那么,贾斯汀,从部署的角度来看,你们是否只是在虚拟机上运行原始容器?你们是在Kubernetes中的pod中吗?
贾斯汀-卡瓦列罗(32:23)。哦,是的。所以没有Kubernetes。所以我们基本上只是使用EC2实例和传统管理的基础设施作为代码,像Terraform类型的东西。是的,就是这样。我们可能会再看看Kubernetes,但直到我们觉得我们想投资更多的人能够操作它,因为它是一个复杂的层次。
吉姆-沃克(32:48)。是的,没错。那是肯定的。那真的是这个决定吗?我的意思是,这就是你们落脚于此的原因吗?我的意思是,你们在那个时候有没有考虑过其他的东西,或者?
贾斯汀-卡瓦列罗(32:59)。是的,我的意思是,有Cockroach云,对我们来说,我们觉得我们想要控制数据库的运行。然后是Kubernetes,如果我们以前经常使用Kubernetes,只是看起来我们不想做两件新的事情。所以,我们有一种方法,我们正在部署我们所有的其他基础设施,我们只是要做这个。我认为Kubernetes的方法看起来不错,从我所读到的内容来看。我喜欢滚动更新和这些类型的功能,所以我有兴趣玩它。
吉姆-沃克(33:39)。是的,对我们来说,我的意思是,这是一个没有头脑的问题。我的意思是,我们只是在管理这么多的集群。从纯粹的操作成本来看,相对于在裸机上或任何我们想做的事情,这对我们来说是非常有意义的。是的,Cockroach云在Kubernetes上运行,因为是的,我们有一个SRE团队,它是为这个而建立的。
吉姆-沃克(34:03)。就像Spanner之于Borg,我喜欢Kelsey Hightower的推文,Spanner之于Borg就像Cockroach之于Kubernetes。是的。你们懂的,你们知道我的意思。所以,同样的一种范式,所以。
贾斯汀-卡瓦列罗(34:15)。是的。我们正在运行的节点的数量并没有接近......我们仍然可以用传统的方法来管理。是的。
Jim Walker (34:24):所以克里斯,有一个问题。有一个Cockroach Kubernetes运营商吗?
克里斯-卡萨诺(34:29)。有的。我只是回应一下发出这个问题的迈克。是的。所以有一个Kubernetes操作员。如果你去看我们的文档,它就在那里,支持GK,而且它在红帽市场上得到了认证。所以你当然可以利用它。我们有一个完整的工程团队围绕着它,就给它所有需要的爱。
吉姆-沃克(34:55)。当我第一次来到Cockroach的时候,我记得我在内部对我们是否需要一个运营商有争论,因为我们和Kubernetes是如此一致。有很大的争论,这有点像,这是第二天的事情。这是滚动升级,一些更手动的东西,但只是纯粹地将我们部署在有状态集之上,在Kubernetes上建立Cockroach是相当简单的。当然,是的,我们也有一个操作员。还有什么问题吗,克里斯?还有其他问题吗?还有人吗?对不起,贾斯汀,你是否...
贾斯汀-卡瓦列罗(35:24)。我想说的是,是的,运行Cockroach非常容易,这非常好。我只是想说,这就像传递一些参数,得到你的执行线,然后你就开始了,所以。
吉姆-沃克(35:36)。好的,谢谢,克里斯。我是说,谢谢你,贾斯汀。我看着克里斯,我说,"贾斯汀"。我到底在这里做什么?谢谢你,贾斯汀。是的,我认为工程团队已经做了很好的工作,试图使其尽可能的简单。我们在Cockroach的很多重点是,我们如何使这些更复杂的操作变得更简单?
吉姆-沃克(35:57)。我们想把它放在每个开发者的手中。所以,我想让开发人员考虑索引和键吗?我想这就是我们的方向。当我们考虑我们的路线图时,我们如何简化它?我不希望开发人员不得不考虑数据库的问题。
Jim Walker (36:14):我只想在云端有一个SQL API,我想这是最终的愿景。然后把这些东西作为服务来运行,并对东西进行功能标记。我们生活在一个不同的世界,与天哪,25年前我开始从事这整个事情的时候相比。所以这很有趣。
贾斯汀-卡瓦列罗(36:29)。这倒是真的。
吉姆-沃克(36:30)。所以,很酷。如果没有其他问题,再次,贾斯汀,非常感谢你做这个。这意味着很多。我希望它对每个人都是有价值的。克里斯,感谢你跳到这里来,也是对话的一部分。是否有任何临别谈话或任何临别赠言给大家?有谁?克里斯,贾斯汀?把你放在现场。
克里斯-卡萨诺(36:54)。我的意思是,它是爬、走、跑。我想这是我在LaunchDarkly学到的教训,是他们的方法。他们只是一步一步来,而不是直接跳进去,打破一切,造成各种破坏。Cockroach在很大程度上是一个关系型数据库,你想这样对待它,但它也是一个分布式系统。所以你必须把这两件事放在一起考虑。
克里斯-卡萨诺(37:23)。是的,这是我在这里学到的最大教训。我不知道贾斯汀,你是否有什么要补充的?
贾斯汀-卡瓦列罗(37:29)。是的,不,我也是。我认为这句话击中了要害,谢谢你们。感谢你们的支持,帮助我们完成这个旅程。
吉姆-沃克(37:35)。是的。嗯,你们是一个伟大的客户,说实话,我们也都生活在同一个地方,同一个空间。我的收获是KISS。保持你的SQL简单。对吗?我现在要在公司内部携带保险杠贴纸。那么,好吧。好吧,感谢你们做这个,非常感谢。也感谢大家的加入。同样,录音将在今天下午在我们的YouTube频道上播出,我很确定。我非常确定。
吉姆-沃克(38:02)。但我希望这对大家是有用的。活动结束后,这里会有一个调查。所以天哪,请你在调查中给我们反馈。对我们来说,把这些事情做好真的很重要。我们试图保持技术和商业的正确水平,并试图让它沿途具有娱乐性。所以,克里斯,再次感谢你,伙计。我以后会看到你。贾斯汀,再次感谢你所做的一切。并感谢你成为这样一个伟大的客户。我代表整个公司,谢谢你,伙计。