软件开发是一项极其复杂的工作,而外界往往对其缺乏最基本的认知,以至于经常有人找几个程序员就想做一个“百度”,做一个“淘宝”……这样对待投资最后往往都打了水漂。Coinbase交易所区块链基础设施团队的目标是让公司的任何工程师都能够快速安全地访问和部署复杂的区块链基础设施。这项工作始于我们的安全部署流水线(deployment pipeline)Codeflow,由我们的编码工具GeoEngineer扩展,被用在我们的区块链基础设施项目Snapchain上。殊不知,这些公司大而不倒都是因为有强大的基础设施。好的基础设施可谓是前人栽树,后人乘凉;而一份垃圾的祖传代码可能是所有程序员的噩梦,以致于有亚马逊的程序员亲切的将之称为:“屎山”。
区块链软件是一个独特的存在,由于去中心化的架构,这些基础设施部署后很难更改,而且代码涉及的都是上亿的真金白银。作为加密世界中最成功和最重要的交易所,Coinbase的区块链基础设施又有什么不同呢?在他们的强大软件服务能力背后,又有哪些不一样的技术诀窍呢?
让我们一起来看看Coinbase技术大牛Jack Kearney对此的深度解析:
最近在亚马逊云服务年度盛会:“re:Invent 2018”上,我们分享了如何使用Snapchain构建区块链基础设施,在这篇文章中,我们将介绍为什么需要以及该如何构建Snapchain。
作为加密货币交易所的领头羊,Coinbase有一些独特的安全性和基础设施要求。其中一个要求是我们基础设施中的每台服务器都是临时(ephemeral)的(<30天)和不可变的。大多数应用程序的部署过程相当简单:12要素应用(Twelve-Factor App,满足微服务应用十二个要素的应用)在网络负载均衡器后进行蓝绿部署(Blue/Green Deployment,指在部署时不暂停老版本,部署新版本然后进行测试,确认无误后,将流量切到新版本,然后老版本同时也升级到新版本的部署方法)。考虑到应用部署在区块链节点时,这个过程变得十分具有挑战性。
在整个区块链网络中,节点检测,验证信息并使用这些信息进行状态更新,可以说节点是我们在各个加密货币网络中的眼睛和耳朵。当有用户向Coinbase交易所转移资金时,通过监听一个节点我们就能检测到该交易,当有用户从Coinbase交易所转出资金时,我们通过其中一个节点广播该交易。因此,高效地管理区块链节点对Coinbase交易所核心业务的运营至关重要。
从宏观来看,区块链部署的基础结构如下:
部署过程从启动一个亚马逊云服务器(EC2)实例开始。一旦实例启动并准备就绪,我们就可以启动区块链节点的二进制文件。
亚马逊云服务器上的空(新)区块链节点。
区块链节点启动后,它会连接到网络上的其他节点。
新节点与区块链网络建立联系并找到与之对等的其他区块链节点。
区块链网络上的其他节点存有完整的区块数据,并开始向新节点发送这些区块数据。
这些节点上有区块数据的副本,假设它们存有完整的数据并开始向新节点发送这些数据。
首先传输第一个区块,新节点验证该区块。
新节点获取一个区块并验证它。
紧接着下一个区块被发送到新节点。
新节点再次获得一个区块,以此类推。
逐渐的,所有区块都被传输,被验证,各节点的区块数据完全同步。
重复这样的操作直到所有区块都已被传输,被验证并在各节点间完全同步。
通常完整节点的磁盘上会存有区块链数据的完整副本。这意味着区块链网络中的新节点需要同步数百GB的数据。虽说不同区块链网络,不同区块链协议可能会有所差异,但往往新节点完全同步区块链数据可能需要数周!考虑到加密货币生态系统的发展速度,基础设施的安全性和可靠性限制,以及节点升级引发的偶然紧急状态,在每次部署区块链网络时完全同步数据对我们来说并不是一个可行的解决方案,因为这样严重阻碍了我们快速安全地推进工作。因此,我们设计了一个名为Snapchain的新区块链节点备份和部署系统。
亚马逊云服务器上以太坊客户端geth节点上的磁盘使用情况,显示数据量已达到952GB。
Snapchain共有两种类型的区块链节点:快照节点(snapshot )完全同步区块链数据并以亚马逊弹性可持续存储(EBS)的形式生成副本,长寿命节点(long-lived)使用这些EBS存储卷在几分钟内完成部署,而不再需要几天的时间。Snapchain让我们能够灵活地按照自己喜欢的方式快速部署区块链节点,以满足版本升级,网络中的事件或针对新类型的配置上进行开发等需求。如果您对这两种节点如何工作的一些细节感兴趣,您可以观看前面的演讲视频(时间在22:08)。
将Snapchain部署在亚马逊云服务上使得我们能够扩容系统以满足工程师使用网络负载均衡器(Network Load Balancers ,NLB)的需求。这些网络负载均衡器让我们能够拥有静态IP地址,满足需求的可拓展性,并执行蓝绿部署。
从一个版本升级到另一个版本(示例显示:从版本1.0.0升级到版本1.1.0)的工作原理如下。
在网络负载均衡器后面,节点包含区块链的二进制数据,我们用于与节点交互的API,以及一个同步了区块链数据的存储卷。
网络负载均衡器后面当下已完成部署的一个节点。
实际上,由于节点放置在多个亚马逊可用区(Availability Zones,AZ)中,节点中的数据有很多冗余。
网络负载均衡器后面当下已完成部署的多个节点。
启动新实例并按照先前描述的流程,一步一步进行部署过程。
新实例已启动,正在同步区块数据。
一旦新实例准备好并正常运行,它就会被添加到网络负载均衡器中。
新实例现在在网络负载均衡器后面。
一旦一系列的检查通过,就可以切换到新版本,这个过程可以由网络负载均衡器轻松实现。
检查通过,网络负载均衡器被切换到新版本。
部署的最终状态与实例最开始时一样,都在网络负载均衡器后面。
部署的最终状态显示新的版本。
此外,Snapchain是跨区块链的基础设施,其主要设计目标之一是最小化区块链所需的代码和基础设施。这样做可以让我们更快地添加新的区块链节点。上图显示比特币客户端bitcoind在13分钟内完成部署。
当下我们所做的一切都还只是加密货币的皮毛。我们期待与您携手,共同建立一个开放的金融体系。
本文来源:区块链大本营
作者:Jack Kearney
翻译:Guoxi
原文链接:https://blog.coinbase.com/blockchain-infrastructure-at-coinbase-366c09dbcef4