臧秀涛,现就职于 InfoQ,任 QCon 大会主编,负责 QCon 大会的策划和组织。2010 年毕业于中国科学院计算技术研究所。曾先后在完美世界等公司从事软件开发工作。2014 年加入 InfoQ。业余喜爱读书和翻译,曾翻译出版过《C++ API 设计》、《Groovy 程序设计》和《Java 性能权威指南》等技术图书。业余也维护了一个微信公众号“开发资讯(dev-news)”,欢迎关注。
对 QCon 大会有任何建议或想法,欢迎通过微博 @臧秀涛 与我联系。
Google Maglev 网络负载平衡系统设计与实现,Uber 如何使用一致性协议实现数据复制。
Maglev 是谷歌研发的网络负载平衡系统。该系统被部署在谷歌位于全球各地的数据中心内,负责转发绝大多数谷歌原生服务及云服务的前端流量。Maglev 本质上是一个运行在普通商用 Linux 服务器上的分布式软件系统。相比于传统的硬件实现,Maglev 拥有高吞吐量,高容错性,易扩展,易部署,易修改等优势。同时 Maglev 中使用的 consistent hashing 和 kernal bypass 等技术很好地弥补了软件实现上的不足。实践证明 Maglev 系统能够提供卓越的性能、稳定性及可靠性,并且可以满足不同服务的需要。
冗余是分布式系统的关键,它可以让我们有弹性的应对机器故障和横向扩展。实现冗余的一种方法是引入多个备份,这带来了一个新的挑战,就是如何保持多个备份之间的一致性。
这个问题有多种解决方案,我们需要考虑各种取舍。先来明确我们需要的属性。
这里指的是读和写。底层的宕机产生的干扰很可能会传递到上层并产生更大的干扰。我们要不顾一切的减少这种干扰。
系统还必须一直保持它的读写语义。理想的情况是,即使在有以上的干扰的情况下,强一致的读写的语义还能得到保持。
当集群数量变大,人工来响应各种失败情况是很难扩展的,在这种情况下,我们必须不能依赖人工干预。这样不仅可以很好的扩展系统而且还可以避免人为失误。理想情况是,系统可以自动应对严重性不是很高的失败;而用人工来应对灾难性的失败。
我们的业务需要强一致的处理请求。具体来说我们需要线性化,就是说,如果对一个键的写入是成功的,那么后续的对同样的键的读取必须返回前面写入的值或者更新的写入的值。同时,如果对一个键的读取返回了某个值,那么后续的读取必须返回这个值或者更新的写入的值。
我们最终选取了一个种方法,叫做状态机复制, 我们想共享这一想法。我们并没有构建一个新的存储系统而是应用这个方法在已有的系统中去解决容错性问题,我们认为这种方法可以被推广和应用到其它地方。