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 ↗