Square:Vitess如何为Cash App提供“近乎无限的规模”
公司:Square Cash App
地点:加州旧金山
工业:金融服务
挑战
自2009年以来,Square为小企业提供了快捷方便的信用卡支付服务。四年前,该公司通过其Cash App扩展到p2p交易领域。在经历了一些稳步增长之后,该应用在2016年人气飙升,短短几个月就拥有了数百万用户,并登上了应用商店下载量的榜首。问题?“我们有一个很大的单体的几十万行代码,这是建立在单一的MySQL数据库的假设上;它从一开始就没有被设计成可伸缩的。”工程经理Jon Tirsen说。随着用户的不断增加,公司不得不为数据库投入越来越昂贵的硬件;同时,Tirsen的三人团队需要替Cash App的可伸缩性问题想出一个长期解决方案。“因为我们有增长轨迹,我们真的需要很快很快的解决它,接受我们产品方面的挑战。”他说。
解决方案
团队首先开始尝试将数据提取到基于MySQL构建的键值存储中。他表示:“这是一个天生可伸缩的存储平台,但功能不那么丰富。”此外,这个解决方案需要重写数十万行代码,“我们根本没有时间去做。”他说。所以团队提出自己解决切分MySQL。当时,解决Square规模问题的默认方式是在应用程序中解决问题,而不是在基础设施层,在Facebook或Pinterest等许多其他公司也是如此。然后Square有人提出了Vitess,一个用于MySQL水平扩展的开源数据库集群系统。项目仍然相对较新,但是Tirsen开始挖掘代码之后,他意识到这将可用于Cash App。“好处是,如果我们解决了一次,我们其它类似的基础设施可以使用相同的方式扩展。”Tirsen说:“这令人兴奋,意味着我们不需要完全重建我们的系统。我们只要让Vitess工作,系统就会工作。也许我们需要改变系统的是5%,而不是95%。”Tirsen的团队花了大约一年的时间进行改变,并让Vitess适应Square的基础设施。
影响
第一个Vitess的切分在2017年11月美国东部时间凌晨5点进行,“宕机时间不到一秒,所以用户看不到。”Tirsen说:“这非常令人兴奋。如今,他补充道:“这完全是例行公事。上周我们做了十次切分。”Tirsen说他最自豪的这一事实:“我们不需要完全改变开发者构建应用程序的方式,因此,尽管我们做这个很急剧的变化,让我们的体系结构可伸缩时,特性团队正在Cash App平台上构建不可思议的功能应用。我们就像在飞机还在空中飞行的时候换引擎一样。”事实上,在工作的一年里,公司推出了像Cash card这样引人注目的功能。展望Cash App的持续增长,Tirsen说:“你必须继续努力,但Vitess确实为你提供了近乎无限的规模。”
“你必须继续努力,但Vitess确实为你提供了近乎无限的规模。” - Jon Tirsen,Square工程经理
自2010年Square推出读卡器和移动应用以来,对数百万人来说,从出租车司机、市场销售商到大型企业,通过信用卡支付变得容易得多。
四年前,该公司通过其Cash App扩展到p2p交易领域。在经历了一些稳步增长之后,该应用在2016年人气飙升,短短几个月就拥有了数百万用户,并在应用商店最受欢迎的下载榜上登顶。
问题?“我们有一个很大的单体的几十万行代码,这是建立在单一的MySQL数据库的假设上;它从一开始就没有被设计成可伸缩的。”工程经理Jon Tirsen说。随着用户的不断增加,公司不得不为数据库投入越来越昂贵的硬件;同时,Tirsen的三人团队需要替Cash App的可伸缩性问题想出一个长期解决方案。“因为我们有增长轨迹,我们真的需要很快很快的解决它,接受我们产品方面的挑战。”他说。
团队首先开始尝试将数据提取到基于MySQL构建的键值存储中。他表示:“这是一个天生可伸缩的存储平台,但功能不那么丰富。”此外,这个解决方案需要重写数十万行代码,“我们根本没有时间去做。”他说。
“当我们做这个很急剧的变化,让我们的体系结构可伸缩时,特性团队正在Cash App之上构建不可思议的功能应用。” - Jon Tirsen,Square工程经理
所以团队提出自己解决切分MySQL。当时,解决Square规模问题的默认方式是在应用程序中解决问题,而不是在基础设施层,在Facebook或Pinterest等许多其他公司也是如此。然后Square有人提出了Vitess,一个用于MySQL水平扩展的开源数据库集群系统。
这个项目还是一个相对较新的项目,但在Tirsen开始深入研究代码之后,他意识到它将适用于Cash App。Vitess满足了团队的两个关键需求:基础设施或平台层查询路由,将查询发送到正确的数据库,和在线切分无需停机。
此外,“好处是,如果我们解决了一次,我们其它类似的基础设施可以使用相同的方式扩展。”Tirsen说:“这令人兴奋,意味着我们不需要完全重建我们的系统。我们只要让Vitess工作,系统就会工作。也许我们需要改变系统的是5%,而不是95%。”
“这是一个令人惊讶的意外收获,我们可以跨不同公司之间合作解决问题,而这通常没有正式的合作方式。” - Jon Tirsen,Square工程经理
Tirsen的团队花了大约一年的时间来改变,以及让Vitess适应整个Square基础设施。为了使外部数据库能够与Vitess工作,团队重新构建了许多切分工作流。
“我们所做的最大的事情是改变了切分的工作方式。”Tirsen说:“以前,Vitess通过停止复制来进行碎片分割,但由于我们无法控制外部数据库,所以我们将其改为使用MySQL内置支持的一致快照,你可以在固定的时间点查看数据库,即使数据库仍在更新。然后你就可以根据这个一致快照复制数据库了。”
这项工作成果已经贡献到上游,现在在Vitess社区中普遍使用。Tirsen说:“这是一个令人惊讶的意外收获,我们可以跨不同公司之间合作解决问题,而这通常没有正式的合作方式。”
接下来,团队在登台和测试环境中大量地实践了切分。“除了最后一次查询重新路由之外,你可以练习整个分片拆分,在那里你基本上开始写入新的分片,而不会影响任何生产流量。”Tirsen说。
"Vitess将成为基础设施的重要组成部分,确保我们构建的所有东西在默认情况下都是可伸缩的。" - Jon Tirsen,Square工程经理
第一个Vitess的切分在2017年11月美国东部时间凌晨5点进行,“宕机时间不到一秒,所以用户看不到。”Tirsen说:“这非常令人兴奋。如今,他补充道:“这完全是例行公事。上周我们做了十次切分。”
总的来说,Tirsen说他最自豪的这一事实:“我们不需要完全改变开发者构建应用程序的方式,因此,尽管我们做这个很急剧的变化,让我们的体系结构可伸缩时,特性团队正在Cash App平台上构建不可思议的功能应用。我们就像在飞机还在空中飞行的时候换引擎一样。”事实上,在工作的一年里,公司推出了像Cash card这样引人注目的功能。
展望Cash App的持续增长,Tirsen认识到解决可伸缩性问题将永远是他的团队进行的工作。他们目前正在构建一个基于Kubernetes、Prometheus、Envoy、Jaeger和其他CNCF技术的开发平台,Tirsen认为该平台可以支持潜在的数千名开发者。他表示:“Vitess将成为这一必不可少的基础设施的一部分,以确保我们构建的所有东西在默认情况下都是可伸缩的。”他说:“你必须继续努力,但Vitess确实为你提供了近乎无限的规模。”