时间是极其重要的
在网络上,时间是极其重要的。没错,当运行一项大型网络服务时,你需要事情迅速地发生。但你还需要一种精确追踪许多电脑的时间的方法,这些电脑为你的服务提供支持。你必须同步在每台服务器上运行的许多进程,而且还必须对服务器本身进行同比,这样一来它们才能协同运作。而想要做到这一点可谓“知易行难”。
通常情况下,数据中心运营商会使用所谓的“网络时间协议”(Network Time Protocol,NTP)来保持服务器的的同步,这从本质上来说是一种将电脑与官方原子钟联系到一起的在线服务,从而让全世界各地组织的时间保持一致。但是,由于在一个网络中传输信息需要时间的缘故,这种方法从来都无法做到完全精确,而且有些时候还会完全失效。在今年7月份,几家主要的网络公司——包括Reddit、Gawker和Mozilla等——就遭遇了问题,原因是其软件没有做好应对“闰秒”(为保持协调世界时接近于世界时时刻,由国际计量局统一规定在年底或年中对协调世界时增加或减少1秒的调整)的准备。
但在Spanner数据库中,谷歌摒弃了“网络时间协议”,转而使用自己的时间协调机制,这个机制被称为“TrueTime API”。“我们想要一种能让自己信得过的东西。”菲克斯说道。“那就是谷歌自己拥有的时间基准。”
谷歌没有依靠外部时钟,而是在其Spanner数据中心里配备了自己的原子钟和GPS(全球定位系统)接收器,这与你iPhone中的应用是不一样的。通过环绕地球进行轨道运行的卫星所构成的网络,GPS接收器不仅可以精确找到你所在的位置,而且还能精确报时。
这些时间协调装置会连接到特定数量的主服务器,然后再由主服务器向整个谷歌网络中运行的其他电脑传输时间读数。基本上来说,谷歌网络中的每台电脑都会运行一个后台程序,这个程序会不断地与同一个数据中心及其他谷歌数据中心的主服务器进行联系,试图达成协调一致的时间。通过这种方式,整个谷歌网络中的电脑都会相当接近于运行一个通用时钟。
系统做出回应,而非人类
这种方法是如何引导一个全球数据库的呢?这要感谢TrueTime服务,这种服务让谷歌得以将许多电脑保持同步——即使这些电脑是分布在多个数据中心里的——这意味着它们能迅速存储和检索数据,而不会互相踩到对方的“脚趾”。
“我们能在两个不同的地方交付数据——比如说美国西海岸和欧洲——而这两个地方之间仍旧存在某种商定的定序。”菲克斯说道。“因此,如果美国西海岸地区首先交付数据,然后欧洲地区再交付,那么整个系统都会知道这个顺序——然后就不会出现数据以截然不同的顺序被查看的可能。”
根据安迪·格罗斯(Andy Gross)——他是数据存储和管理软件创业企业Basho的主架构师,该公司开发了一个名为Riak的开源数据库,目的是在数千个服务器之间运行——的说法,数据库设计人员通常都会寻求让计算机彼此之间进行“对话”,从而实现信息的同步化。“你必须进行一大堆的通信,来判定所有信息处理的正确顺序。”他在今天秋天接受《连线》杂志采访时说道,当时谷歌刚刚对外发布了Spanner的细节。
问题在于,这种通信能让整个网络都陷入停顿状态——数据库也是如此。正如麦克斯希雷森(Max Schireson)——他是大数据公司10gen的总裁,这家公司开发了NoSQL数据库MongoDB——对我们所说的那样:“如果有大量用户同时接入大量分布在全球的系统,那么这些系统之间的通信延迟时间会是相当长的,让所有事情都同步起来就会变得非常困难。如果这些要素的数值提高,那么就会变得更加困难。”
因此,谷歌就采取了一种完全不同的道路。谷歌没有竭力试图改善服务器之间的通信方式,而是给它们带来了一种新的报时方法。“这可能是(谷歌研究)报告的最酷的一件事情:使用原子钟和GPS来提供一个时间API(应用程序接口)。”Facebook的默蒂说道。
在控制时间的问题上,谷歌不仅能构建一个同时具有全球性和时间一致性的数据库,同时还能让其服务在网络延迟、数据中心宕机及其他软件和硬件故障的面前变得更加具有抵抗力。从基本上来说,谷歌是利用Spanner来精确复制多个数据中心之间的数据,然后迅速地在各个数据副本之间“穿梭”。换而言之,这些数据副本也同样具有一致性。
当一个数据副本不可用时,Spanner能迅速转向另一个副本。但是,Spanner也会在不同副本中“穿梭”,目的只是为了改善其表现。“如果你拥有一个数据副本,而这个副本变得忙碌,那么网络延迟就会变得很高;但如果你还拥有其他四个副本,那么就能选择转到另一个副本,从而减少延迟。”菲克斯说道。
菲克斯表示,这样做的结果之一是,谷歌花在管理自身系统上的费用有所减少。“从某种程度上来说,当一个服务器宕机时,我们只需要转到系统中其他服务器的客户端电脑即可。”他说道。“这是一种简单得多的服务……做出回应的是系统本身,而不是人类。”