EPISODE · 2026-05-22
· via interview.network
Simon Eskildsen on scaling Shopify, building turbopuffer, and the future of databases
I
Interviewer
on interview.network
SUMMARY
访谈讨论了从2010年到2020年Shopify在MySQL数据库方面面临的扩展挑战,特别是与之相关的。一个有趣的事件涉及每小时运行的意外PHP cron作业作为Percona工具的一部分,由于其对PHP的依赖性,导致软锁定状态,因为它持续跟踪打开的文件和会话。团队花费了大量时间通过减少连接数量和使用各种技巧来优化Memcached、Redis和MySQL系统,因为在当时没有可用的开源代理。 基础设施团队从专注于传统运营结构转变为能够处理闪销期间的多个严重事件(SEVs)。闪销发生在知名影响者在Instagram或Facebook等平台上推广新产品时,导致流量突然激增和库存竞争,可能使系统不堪重负。Shopify必须通过确保有强大的库存预留流程并准备应对数百万用户同时购买有限库存的需求来管理这些情况。
ready · neural tts
0:00/0:00
⚠ The Chinese audio is an AI-generated dub (speech synthesis / voice conversion), not a real recording and may contain errors. Based on the original English interview; all rights remain with the original creator.
original lang
EN
dubbed into
中文 (ZH)
pipeline
neural TTS
voice model
neural tts
001
所以从2010年到2020年,你经历了很多增长。
002
Shopify历史上有哪些伟大的里程碑?
003
其中一个有趣的例子是我们遇到了一个问题,每小时大约30秒,主MySQL集群或写入者会停滞不前。
004
我们无法找出原因。
005
我们无休止地调试,就是想不出发生了什么。
006
有人发现当这个问题发生时,这些机器上正在运行lsof。
007
我问,"为什么会有这个lsof在运行?"
008
有人回答说,他们正在追踪内核,找出,"这就是导致内核软锁定的原因。"
009
lsof来自哪里?"
010
原来Percona工具中的一些Perl脚本用于管理MySQL,作为PHP的依赖项。
011
PHP作为一个依赖项有一些标准的cron作业,每小时会运行一次lsof来找出哪些文件正在打开,然后移除不再由PHP进程主动打开的会话。
012
这个作业每小时在所有MySQL实例上运行。
013
Shopify在哪个规模级别上运行了一些以前无人问津的伟大系统?
014
我认为Facebook可能在MySQL的使用方面达到了前所未有的高度,但在2010年代,许多公司都在通过MySQL集群扩展。
015
GitHub也处于类似的情况。
016
我们只是花费大量时间在MySQL上的所有层进行扩展。
017
其中一个大问题是,无论是Ruby、Python还是其他语言编写的SaaS应用,在每台机器上运行的进程数量太多,每个进程的QPS可能只有几十个,如果幸运的话,可能是几百个。
018
所有这些进程都需要单独连接到MySQL或Postgres。
019
相比之下,Postgres在默认情况下处理这种情况更差。
020
我们有30,000至40,000个连接打开。
021
所以你必须花很多时间通过所有这些连接进行epolling,找出哪些连接可以在任何给定的时间点操作。
022
我们遇到了Memcached、Redis和MySQL的问题。
023
现在有很多开源的代理在这些系统前面,但在当时并没有,所以我们必须想出很多技巧来减少连接数量。
024
基础设施团队是如何构建的,以处理一次又一次的事件?随着你规模的增长,是什么人聚集在一起使这一切成为可能?
025
当我于2013年加入时,仍然是一种非常传统的结构,即纯运营团队。
026
那些非常擅长操作Linux系统并使用SSH连接到所有系统的人员。
027
我们遇到的事件不仅仅是系统崩溃。
028
很多事件都是由于大规模闪购,驱动了Shopify巨大的流量。
029
最糟糕的闪购是什么?
030
我可能没有经历过系统崩溃最严重的一次,但记得Kylie Jenner的闪购特别具有挑战性。
031
她甚至在试用账户上也吸引了大量流量,就像只是出现在那里销售商品一样。
032
正常的闪购是什么样的?
033
当闪购发生时,系统会发生什么?
034
闪购通常是有人拥有大量追随者,并且在2010年代我们看到了这种情况。
035
他们发布了一个新产品。
036
然后你就会知道,成千上万或数十万人同时尝试购买同一SKU。
037
这导致了MySQL上的大量库存锁定竞争。
038
这就是导致了很多停机事件的原因。
039
所以我们必须做很多事情来确保库存预留和一切都能正常工作,因为通常有成千上万的人在争夺可能只有10,000个SKU。
040
基本上就是这些事件,对吧?
041
然后他们会推动销售,并且会持续这样做,就像Kanye会在Shopify上发布新球鞋并驱动大量流量一样。
042
就像,"哇,你要让开发者编写Chef来配置基础设施吗?"
043
嗯,这就是我们当时在考虑的。
044
所以那些团队合并了,我们最终称之为生产工程团队。
045
我认为Facebook在这方面做得很好。
046
然后它就开始在不同的团队中分化开来。
047
所以这实际上很有趣。
048
我了解到的其中一件事是,其实不仅仅是2010年有大量公司正在规模化发展。
049
就像早期Stripe、早期GitHub、早期Shopify等等,有很多不同的公司,并且它们之间相互合作。
050
团队如何在组织间协作构建工具?像有哪些伟大的工具是从基础设施战争中产生的呢?
051
现在有哪些开源库被人们广泛使用,它们有2010年代基础设施战的故事吗?
052
我刚刚和我们可能都认识的Sam Lambert谈过,他运营着Planet Scale。
053
我们在谈论这个,在2010年代,这些教训,而且现在仍然如此,并没有被写下来。
054
它们在电话会议上分享。
055
就像你和我在Cursor早期的那些电话会议一样。
056
就像是,"你是怎么做的?"
057
等等。
058
而且大部分智慧其实无法通过模型训练获得,因为这些知识大多存在于人们的脑海中。
059
在2010年代,公司之间存在一点协作智能。
060
能给我介绍一下你交谈过的人吗?
061
所以我们谈到了Zendesk。
062
我们也在规模化Ruby和MySQL。
063
Intercom也使用了我们构建的缓存库,以及Rails和MySQL。
064
当然有GitHub。
065
GitHub构建了一些开源库,比如名为Ghost的东西,它使用MySQL bin日志来运行模式迁移。
066
SoundCloud构建了名为LHMS的东西,这是一种用于在MySQL中使用触发器进行模式迁移的方法。
067
在Shopify我们写了一个叫Toxiproxy的项目。
068
你听说过这个项目吗?
069
是的。
070
我开始做这个项目,因为所有不同的服务都开始失败,我们需要一个代理,我们可以在其中保证如果关闭了所有这些不同服务,事情不会失败。
071
例如,我们有一个管理会话和购物车的数据库,我们需要确保如果该数据库失败,Shopify仍然可以运行,因此我们可以对其进行测试,并且我认为这些公司都使用过这个项目。
072
我和Sam以及在GitHub和Shopify的人们一起打电话讨论,"哦,你如何用Ruby和MySQL进行扩展?这个代理是否足够好?关于连接你做了什么?"
073
我们会一起发送补丁文件来让Redis更好地扩展,并且有很多这种集体智慧的分享,很多这些Ruby on Rails MySQL商店在2010年代。
074
Logrus的故事是什么?Logrus是你最受欢迎的库吗?
075
是的。
076
Logrus是一个Go库,我创建它是因为我在很多事件中对自己6周前没有更故意地思考我希望在特定时间点从系统中看到的信息感到非常生气。
077
所以我想要一个API来强迫我坐下来并思考我需要的详细信息。
078
所以Logrus API就像logrus.withfields,然后你需要输入它们。
079
现在这就是Logrus设计得很好的唯一事情。它进行了太多分配,并且我没有花很多时间积极维护它,但它很受欢迎。
080
是的,它很受欢迎。
081
当一个库开始流行时是什么样子?
082
我认为它有25000颗星,并且我一直在找到人们告诉我,"我在使用Logrus。"
083
我很喜欢它。
084
所以这就是人们对结构化日志记录的理解,这在OpenTelemetry等之前并不流行。
085
我认为这正是人们的理解方式。
086
所以Logrus故事中一个非常有趣的部分是,你想要有意识地编写东西,在真正需要时要非常小心和仔细思考。
087
还有其他伟大的工程原则吗?像西蒙的工程原则是什么?
088
写在agent.md中的西蒙工程原则是......
089
我认为软件随着时间的推移,必须老化得当。
090
随着时间的推移,软件会受到时间、模式变化、语言变化、规模和许多人共同工作的压力。
091
我始终回到的一件事,也是Turbo Buffer的主要灵感来源,就是尽可能地简化它。
092
我在Shopify工作了近十年,现在很少有人能在同一个代码库和公司工作这么长时间。
093
这教会我软件老化的知识,因为我看到很多人花很长时间编写RFC并进行大项目,但这并不是预测软件老化良好的指标。
094
有时在基础设施团队中,我们只是用唾液和泡泡糖把东西粘在一起,就像我的老板常说的那样,它会以惊人的速度老化。
095
比如那点唾液和泡泡糖会在五年后完美地保持水分。
096
我认为最大的教训就是让你保持让简单性给你惊喜,并且复杂性必须是值得的。这就是基本原理。
097
很多东西都遵循这个原则。
098
我花了很多时间思考如果将规模扩大10倍或100倍,不同的事情会如何失败。
099
比如如果你进行任何基础设施更改,它必须能够扩展100倍。否则就没有理由这样做。
100
你只是在玩音乐椅游戏。
101
但是让软件老化良好并让简单性开始并且复杂性是值得的这一点非常重要,这是设计Turbo Buffer的基础。
102
另一件事是在一个软件中作为最后救援警报器上值机,世界上有真实人在失去数百万美元每分钟的停机时间,这是一种巨大的责任。
103
我们可能只有六到八个人在那个警报器上,如果你被叫醒,你知道你需要把网站带回来。
104
我认为这教会了我以更好的或更差的方式编写软件的方法,对吧?
105
因此,例如对于Turbo Buffer来说,就是说有哪些软件是我愿意为此值机的呢?
106
它必须极其简单并且非常容易调试。
107
回到Logrus,对吧?
108
如何使这尽可能容易调试,因为不可能每行代码我写的都是在凌晨3点有人需要值机的负债。
109
嗯,这非常有趣。
110
以某种方式构建问题的方式是,你知道,作为所有模型,你正在制定一个宪法,让模型遵循这个宪法,因为它们不仅试图通过一组测试集来变得更好和更好,而且我们还希望它们编写高质量的代码。
111
就像人类有一个宪法,非常简单,不那么复杂,但是它是非常通用的。
112
我们应该使用什么样的软件工程宪法,让所有模型都遵循这个宪法,以便生成的质量良好的代码能够经受时间考验。
113
很多人通常担心模型产生的垃圾。
114
我们希望训练它们不要产生垃圾。
115
什么宪法可以防止他们产生垃圾?
116
当我与模型讨论设计软件时,感觉就像他们在像一个读了太多Hacker News的急切大学生一样设计模型。
117
我会问你如何用RL来编码这样的原则,即简单性胜过一切,因为这是一组权衡。
118
比如在Turbo Puffer中,我们只使用对象存储。
119
没有其他状态。
120
就像,如果你想要低延迟的权利,那么你必须去别处,因为我不愿意接受这种权衡。我没有办法让模型在处理这些类型的压力时设计出非常简单并将老化得很好的系统。
121
但是你怎么用RL来做到这一点?
122
我认为可以提出各种想法,对吧?
123
就像默认情况下尝试尽可能简单地编写东西。
124
当你在两个正确解决方案之间进行判断时,更倾向于选择那个简单的方案。
125
你知道,另一个你可以编码的点是确保它很短。
126
嗯。
127
如果你强迫模型产生较短的东西,除了代码高尔夫方面之外,实际上较短的东西通常更简单。
128
不要写100行的代码,你可以用10行来写。
129
但我不认为总是关于代码行数,对吧?
130
就像有时像Turbo Puffer这样的东西可能会接受其所有权利进入Kafka之类的系统。
131
但现在你正在操作整个其他系统。
132
这可能更少代码行,但系统复杂性要高得多。
133
你给模型宪法吗?
134
我们确实写下我们认为伟大的代码的东西。
135
这很重要,因为如果不写这样的东西,模型会写出各种不可思议的、无法置信的内容。
136
是的。
137
我认为还应该思考所有优雅的失败模式,对吧?
138
而且软件老化时,保持系统中我关心的一些不变量也很重要,对吧?
139
我们俩都做过竞赛编程,对吧?
140
你总是在思考系统在任何情况下必须遵守的不变量是什么,否则你知道它会在某个点失败。
141
嗯,你写了一篇著名的博客。
142
稍微有点出名的博客。
143
那么,你开始写博客的故事是怎样的?
144
在几年前读到它时,这对我很有启发性。你知道,这个博客基本上通过费米估算来解决看似复杂工程问题的方法,并且实际上可以得到系统在非常规情况下的性能估计,即通常很难预估的情况。
145
我完全不知道你看过那篇文章。
146
是的。
147
你在我们认识之前读过这篇文章吗?
148
嗯哼。
149
你所说的是一种纸上的数学计算吗?
150
阿维特,是的。
151
阿维特介绍我读的。
152
纸上的数学计算源于我在Shopify的角色,我是首席工程师,作为首席工程师,你需要审查很多设计。
153
比如我想构建这个产品,并以这种方式使用数据库。
154
我经常遇到有人来找我提供基准测试,并说这就是他们预期数据库的性能。
155
然后他们会基于这些基准做出决定。
156
我对基准测试完全不信任。
157
特别是当你试图进行技术论证时,因为基准测试只是一瞬间的事情,并不会告诉我系统的基本属性。
158
所以我认为在这些审查中我一直在强调,好吧,这可能是基准测试的结果,但系统的根本属性是,在尝试执行搜索查询时,你可以做一些数学计算来估算需要移动多少千兆字节的数据来服务查询。
159
你看到DRAM,为了服务这个查询,我需要在内存中移动大约一个GB的内存。
160
DRAM每秒可以处理10到100GB,所以这应该在110ms之间。
161
你会得到基准测试,并说,"嗯,它需要5秒,所以我们不能使用这个数据库。"
162
对我来说这是一个不可接受的解释,因为我的第一原则理解与系统实际表现之间的差距太大了。
163
除非有人能填补这个差距,否则你无法得出结论。
164
这个差距要么是我的愚蠢,比如数学是错的,或者这个系统没有表现出应有的性能。
165
但至少我们中有一个是错误的。除非有人能填补这个差距,否则你的论点不具有说服力。
166
基准测试只能告诉你与理论最低值的距离。
167
所以我开始写博客来解释这个问题,并给自己一个节奏,比如"你正在尝试进行连接。"
168
这可能会花费多长时间?"然后做一堆数学计算,运行实际测试,看看两者之间的差异,然后试图解决这个差距。
169
你最喜欢你在写的一系列博客文章中的哪一篇?
170
我真的很喜欢关于TCP窗口的那一篇。
171
你读过那篇文章吗?
172
是的。
173
这篇文章对每一个扩展系统都是一种侵蚀。
174
是的。
175
它确实如此,并且在某个时候,这篇博客文章对于赢得Turbo Encabulator的一个非常重要的交易变得非常重要。
176
所以这篇博客文章基本上是我在Shopify遇到的一个问题,有人问我为什么在澳大利亚加载页面需要3秒的时间,对吧?
177
你从澳大利亚到美国东部。
178
我猜测往返时间大概是250毫秒,对吧?
179
就像太平洋上有一条很好的海底电缆,然后在跨大陆运行60毫秒。
180
大约在250到200毫秒之间,对吧?
181
但是页面加载需要3秒钟在一个原始的Shopify商店上。
182
你只是启动它,我知道Ruby和其他东西需要10毫秒的时间。
183
这没有道理。
184
然后我访问了网站并刷新页面,但这不是缓存击中。
185
我会跳过缓存,然后只需要260毫秒。
186
我就像,“哦,这里发生了什么?”,理解。
187
有3秒钟与260毫秒的差距。
188
这之间有什么区别吗?
189
这是我的愚蠢还是没有在这里工作?"
190
所以我深入研究了它,并在Wireshark中花费了很多时间。
191
我就像,“为什么要在太平洋上如此频繁地来回发送呢?”
192
然后我发现,在TCP中,当你建立连接时,所以你知道,悉尼拨打美国东部,美国东部只会第一次发送10个包,因为他们试图协商两个之间的链接大小,并且它有一个非常保守的默认值。
193
所以,会发送10个包。
194
每个包大约有1500字节。
195
因此一个网站如果比16千字节小,那么在大多数机器上加载得更快。
196
我只是从Wireshark中推断出这一点。
197
所以这个网站有几百个千字节。
198
因此,它加载15千字节,然后TCP说,“哦,好吧。”
199
我猜链接足够大了。让我们尝试下一次的30千字节。
200
所以现在你传输到45个,并且会不断翻倍。
201
但现在你在来回协商链接大小时做了很多次往返。
202
因此,我意识到,“好吧,如果你调整Linux内核的TCP设置,在两端发送100个包的第一个往返,这将快得多。”
203
但是如果有非常非常差的上行链路,你可能会丢失很多包丢失,但在一般情况下这是一个更好的设置。
204
然后这个方法在Turbo Puffer等某些点上也适用,是的。
205
这带我们到了我最喜欢的另一个问题。
206
所以有一个数据库问题的两部分。
207
所以,第一,历史上有哪些伟大的数据库?
208
你知道你发现非常鼓舞人心的系统吗?
209
你从它们那里学到了什么?
210
让我们通过数据库进化的理解来走一遍。
211
所以,我认为有几种方式来看待这个问题。
212
以我的观点来说,大约每15年,构建新的数据库的原料就在空气中。
213
很多数据库出现,对吧?
214
就像我知道有成千上万的生产中的数据库。
215
但从大的角度来看,这需要一个新的平台,对吧?
216
例如Oracle和MySQL和Postgres在90年代被构建。
217
我们有网络,并且有很多像SaaS公司这样的公司正在建立并产生大量数据进入数据库。
218
这是第一个大规模生产数据库的浪潮。
219
80年代也有一些,但那是我出生之前很久的事情了,所以我对那里的理解并不好,但显然那里有数据库,通常在主框架上等等。
220
但是90年代是第一个像网站这样的工作负载开始存储数据和应用程序开始存储数据的浪潮。
221
然后你有了Snowflake和Databricks等公司被构建,围绕这个新的工作负载。
222
我认为大型数据库公司基本上是地球上每个国家都有数据在那个数据库中直接或间接使用的产品。
223
你知道,一个传统的纺织制造商在德国的巴伐利亚州,不会直接购买Snowflake,但几乎肯定他们正在使用一些使用Snowflake或Databricks的产品,对吧?
224
或者说数十次。
225
所以,他们的数据可能在那个数据库中重复数十次。
226
嗯,这就是最大的数据库公司是如何构建的,以及最大的数据库公司是这样构建的。
227
我认为现在有一个时刻,或者说在过去的一个时刻,那就是AI工作负载正试图与数据连接起来,但这是我认为的一种观点。
228
在灵感型数据库方面,我首先想到的是SQLite。
229
我喜欢SQLite的一点是他们在做每件事时都秉持着一种强硬的极简主义哲学。
230
最好的例子就是,我的软件代理MD宪法试图尽可能多地在每一个代码路径上施加压力,而不是拥有单独的路径。
231
在SQLite中,他们有一个非常典型的例子。
232
通常,在执行联接时,你可能会做一些类似于嵌套循环或哈希联接的操作。
233
你会将这些实现为特定的路径。
234
SQLite基本上会构建一个在内存中的自定义B树来执行联接,这与你实际在磁盘上建立索引时构建的B树索引代码路径相同。
235
所以他们在单个代码路径上施加更多的压力,更多优化导致了更多的查询计划。
236
我认为这是非常棒的。
237
当然,另一个我钦佩的数据库就是Google Cloud Storage和S3等大型对象存储,它们拥有非常有限的API,但这些API具有几乎无限的延迟直方图、极高可扩展性和可靠性。
238
我喜欢系统中拥有的非常少的基础原理,并且你知道它们可以工作,并且知道即使在长时间使用的情况下,它们也会遵守自己的直方图边界,无论是可靠性的方面还是可扩展性方面。
239
所以我确实从这一点上获得了很多灵感。
240
对我来说,还有一点怀旧感,就像在过去的FTP和PHP my admin以及MySQL盒子中进行操作。
241
我真的很喜欢这一点。
242
并且我希望将这种感觉带入我们正在构建的数据库中。
243
接下来是关于数据库问题的第二部分。
244
这是我不太理解的一个行业现象,这听起来可能很天真。
245
大多数系统在成熟后都有一个特性,即有一个赢家,并且这个赢家会一直保持胜利。
246
以操作系统为例,有很多竞争。
247
然后Linux赢得了一些方面。
248
或者对于消费者来说,Mac OS获胜并一直保持不变。
249
虚拟化也是如此,有一个赢家并且这个胜利者会持续稳定。
250
几乎所有系统都有这种特性,无论是操作系统还是你使用的东西的API,在现实世界中,就像云一样,基本上是AWS和两个副本,这就是标准,永远如此。
251
没有像每隔15年就有一个新的挑战者来颠覆一个标准这样的情况。
252
但是数据库是一个例外,在过去半个世纪里,每十年就会有新公司出现,他们希望成为下一个被广泛使用的主要数据库,并且这种持续的创新在一段时间内是存在的。
253
你知道,基础设施公司一旦开始并获胜后就不会稳定下来,每隔五年就有一个新的类别中的挑战者。
254
我认为这个模式的原因在于,我们需要新的工作负载来区分新软件的基础设施。
255
我们对操作系统的期望并没有改变到需要重新编写的地步,对吗?
256
我们现在期望从操作系统中获得非常好的虚拟化和隔离原则。
257
Solaris比Linux更早做到这一点,对吧?
258
就像Linux直到几年前才真正擅长这个领域一样,对吧?
259
他们在2010年代一直在努力。
260
但并没有足够强大到颠覆整个系统。
261
我认为在数据库方面,我们确实看到了每十年甚至每十五年出现新的工作负载,但是真正重要的新工作负载数量并不像人们想象的那么多。
262
现在有很多小众的工作负载,对吧?
263
例如图数据库就是一个相当小众的工作负载。
264
这是一个相对小众的工作负载,但最大的数据库公司是从开始时处理一些看似小众工作负载构建起来的,并且从那里扩展。
265
我认为MongoDB是一个很好的例子,对吧?
266
他们最初专注于非常web-like的操作,可以迅速上手,然后他们就扩展了,他们做时间序列,他们做图,他们做所有的事情。
267
我认为这有两个特性:工作负载,但工作负载本身是不够的。
268
为什么现有的公司不能变得非常擅长这个工作负载呢?
269
所以Oracle可以一直变得更好,并且永远不会有新的数据库公司吗?
270
看起来他们一次又一次地被颠覆。
271
这引出了我的第二个观点。
272
所以,你需要新的工作负载,因为每个地球上的公司都需要在这个新数据库中有一些数据,否则它就不会变得那么大。
273
你需要的第二件事是需要一个全新的、根本上不同的存储架构,这个架构对于那个工作负载来说是有优势的,而现有供应商无法做到这一点。
274
举个例子吧?
275
比如,像Snowflake和Databricks这样的公司都是直接在对象存储上使用普通的HDD,或者你知道的,直接在对象存储上,而Oracle无法做到这一点。
276
它没有计算机和存储分离。
277
因此,即使理论上可以作为设计的一个扩展来执行,也无法进行这些大规模OLAP工作负载。
278
到那时,Oracle有什么?
279
30年历史的假设紧密耦合、计算机和存储不分离。
280
现在呢?
281
我们可以构建利用NVMe SSDs的数据库,Snowflake和Databricks没有这样做,因为直到大约8年前,云中还没有NVMe SSDs。
282
而且NVMe SSDs要求你必须以完全不同的方式构建数据库来充分利用它。
283
你需要大量的突出IOPs和非常少的往返次数。
284
这也是你在对象存储上实现超低延迟所需做的。
285
另外一件事是元数据。
286
第一代在对象存储上构建的数据库将不得不将所有元数据放在一个单独的数据库中,这会带来其他问题,比如运行别人的云和操作像运行区域一样。
287
直到大约一年半前,你才能构建可以在对象存储中同时拥有元数据的数据库。
288
所以,当有这两种条件时,在90年代,就像你知道的,电脑、互联网和15年前是OLAP与分析,而今天则是将大量尤其是非结构化数据连接到AI。这就是新的工作负载。你需要这个。
289
第二件事是你需要一个全新的存储架构不能复制,对吧?
290
在Turbo Buffer之前,搜索引擎无法复制它,因为它们将计算机和存储紧密耦合在一起,而Oracle也无法轻松复制Snowflake和Databricks所做的分离计算机和存储的事情。
291
西蒙成为数据库粉丝的故事是什么?
292
你显然非常热衷于数据库。
293
我喜欢数据库。
294
我认为竞争编程有很多与数据库相关的主题。
295
所以,你会开始思考渐进时间复杂度和事物的执行方式。
296
当我加入Shopify时,我只是被那些从事数据库工作的人所吸引。
297
当网站出现问题时,通常是数据库的问题。
298
所以,我们总是要确保它不会在今晚的闪电销售中崩溃,在一年后闪电销售规模扩大10倍时也不会崩溃。
299
因此,它是扩展的基本瓶颈。
300
这吸引了我。
301
就像为什么这些事情这么难以扩展?
302
所以我们必须不断工作、工作和工作。
303
在某个点上,我的模型开始从思考执行SQL的事务转向思考磁盘上的位和字节布局。
304
它们有如此多引人入胜的权衡,对吧?
305
就像我们刚刚讨论过的存储架构对于不同的查询工作负载是不同的。
306
数据库中有很多权衡。
307
我喜欢思考这些,比如如果我们这样做,它在这一点上会更好,但在另一点上不会那么好。
308
尤其是在搜索领域,将计算机科学和工程的许多部分应用于特定领域。
309
就像有无尽的有趣问题一样。
310
我记得我们第一次见面时,Cursor正在遇到一些Postgres瓶颈。
311
最令人着迷的事情之一是你解释了,好吧,这是Postgres是如何架构的。
312
我可以构建一个简单的心理模型,了解在Postgres中发生的事情与MySQL中的事情以这种方式发生的方式,并且在当时,尽管我读过关于Postgres并理解了一些架构,但我没有将它们映射到所有的小块上,如何相互作用。
313
你是怎么学习的?
314
一个人是如何了解像Postgres这样的数据库的怪异细节的呢?比如,这里是如何设计的所有小部分和组件以及查询参数可以找到的东西?
315
简短的答案是我不行。
316
我并不认为我很聪明,所以我花了很多时间试图将它简化到我可以理解并告诉其他人的方式。
317
我花了大量时间在小笔记本上尝试确切地了解块是如何移动的?
318
所以我想花了大约10年的时间,才对MySQL的工作原理有了非常深入的理解。
319
然后当我离开Shopify时,我正在帮助我的朋友的公司扩展业务。
320
我开始遇到PostgreSQL。
321
我想,这很酷,我对PostgreSQL一无所知。
322
所以有一天我就坐下来,花了8个小时阅读了整个手册。
323
并且总是比较和对比MySQL和PostgreSQL之间的相似点和不同点。
324
因此,这更容易是因为我已经有了一个可以承载知识的框架。
325
所以这种妥协就变得很明显了,对吧?
326
在PostgreSQL中,索引的工作方式与MySQL中的工作方式非常不同,对吧?
327
在MySQL中,数据在磁盘上的布局由主索引决定。
328
所以在Shopify我们利用这一点,将所有商店的数据一起集中存储。
329
这在PostgreSQL中非常复杂。
330
PostgreSQL处理权限的方式与其他方式不同,这需要用户进行大量的调整,而MySQL不需要。
331
这就是我们见面时遇到的问题。
332
你是如何与AI一起编码的?
333
或者更一般地说,在AI之外,代理和模型是否帮助你完成编码工作?
334
当然可以。
335
就编码而言,我通常在网站上打开一个游标窗口。
336
我所做的大多是文档或小的更改。
337
我只是让游标运行。
338
我使用同步代理,然后根据需要选择模型。
339
如果我只需要回答有关代码库的问题,我会使用作曲家模型,因为它非常快并进行大量搜索。
340
然后,根据我正在执行的任务的不同,我使用不同的模型。
341
但通常我管理着游标内的几个代理。
342
而且,尤其是由于它使我很容易审查代码。
343
我认为我的反传统观点是,在今年结束之前,我们仍然会审核数据库中每行代码的输入,因为这似乎对于数据库来说仍然是至关重要的。
344
我们有几只Turbo Puffer,它们的工作就是将代码库的整个上下文放在他们的湿载神经网络中,并且工作得很好,因为他们有自己的宣言和MD中的代理嵌入在湿载中,并做出良好的局部最优决策,而代理帮助他们。
345
我过去几个月一直很兴奋的一件事是让云代理变得越来越好。
346
那么,Turbo Puffer的50%代码由云代理编写需要什么条件?
347
我想你认为在所有各种模糊条件下验证事情是非常重要的。
348
你知道,在模型应该运行12、24或48小时的情况下,50%的Turbo Puffer代码完全由云代理编写需要什么条件?
349
我认为我们应该让代理一直运行,试图在我们或客户之前打破产品,并使用云代理。
350
我确信有些工程师已经在这样做。
351
一般来说,在像核心Rust和数据库这样的事情上使用模型时,它仍然不会做出全球最优决策。
352
所以我觉得在仪表板或网站上的时候,它可以进行如此宽松的讨论并做得非常好。
353
但在数据库中,有太多其他因素需要考虑,比如API会如何老化,对吧?
354
数据将如何布局?
355
并且有所有这些战争教训,对吧?
356
这并不是模型没有学到如何操作这一点。
357
那么必须是什么?
358
我认为模型只需要变得更好。
359
我不认为我有更多的智慧。
360
我认为我希望模型能更多地讨论某样东西会如何老化,存储方式以及它在存储架构上做出的不可逆决策,显然是不可逆的决策。
361
所以有两个或三个Turbo Buffer问题。
362
第一个是,Turbo Buffer要达到Google规模需要什么?
363
要索引整个互联网吗?
364
可以。
365
全网进行索引并提供Google能提供的QPS。
366
我喜欢的是实际上可以被Google使用。
367
所以我的意思是,我不太了解Google的具体情况,但我确信他们有上千个服务来实现这个目标,但我们有一些客户已经将整个网络索引到Turbo Buffer中,并且它工作得很好,它可以处理成千上万的QPS。
368
现在,我相信Google拥有的不仅仅是我们在数据集中采购的百万亿或更多文档,可能进入万亿级别,但这当然是可以做到的。
369
没有理由不继续扩展,我们已经使用P99为200毫秒、P50为40毫秒的速度处理了百万亿。
370
现在,要达到像Google那样的相关性,你可能需要做更多的工作,并且这将是好几轮迭代周期,但你可以使用Turbo Buffer架构用不多的服务器索引整个网络。
371
能否不依赖S3来构建?
372
是否S3是过去十年工程壮举之一,提供超强一致性?
373
我认为是的。
374
回到最初的问题上,为什么每隔10年就会有新的数据库公司出现呢?我们需要NVMe SSDs,这在云中直到2010年代末才可用。
375
我们还需要S3的一致性,这直到2020年12月才实现,这是令人难以置信的晚。
376
然后我们需要比较和交换。
377
为什么S3很难保持强一致性?
378
我不知道。
379
[笑声]
380
我知道在Google Cloud Storage中,我认为可能是Spanner之类的东西在前面。
381
所以这对我来说更容易理解。
382
S3的元数据层几乎没有细节。
383
这个元数据层显然很难操作。
384
我知道S3的API表面很小,但我知道他们投入大量资源进行形式验证和所有这些不同的事情,可能是因为他们有小错误,人们依赖它们,并且必须确保即使他们改变最细微的事情,也不会破坏其他许多人。
385
所以我不知道是什么让它如此困难。
386
我认为最难的是系统在没有这一功能的情况下存在了15年甚至20年。
387
从我见过的系统来看,这是系统的一个基本假设,并且你会在接下来的15年里为这个假设进行工程设计。
388
是的,这可能花了他们大约5年时间来做。
389
我猜测Google Cloud Storage因为它们由Spanner等提供支持,并且可能会在早期就具有强一致性,如果不是从第一天开始的话。
390
但我也知道他们认为S3的一个巨大错误是从一开始就不是一致的。
391
你对S3还有什么喜欢的地方吗?
392
当我提到S3时,我指的是对象存储。
393
是的。
394
我觉得只是简单性,就像在非常有限的事情上设置严格的延迟边界。
395
我认为这是一个非常可预测的系统。
396
它自动分片并且是无限的。
397
没有S3,Turbo Buffer就不存在了,对吧?
398
如果这是15年前的情况,我们会有人全职处理硬盘,并且尝试与尽可能多的硬盘达成交易,我们可能会遇到你可能在GPU上遇到的问题,但只是用HDD。
399
我很高兴没有这个问题。
400
我不会Turbo Buffer,可能也不会开始这家公司,因为我不想为需要处理硬盘并每周飞往阿什本添加更多硬盘的产品提供支持。
showing first 400 segments · view full transcript ↗