性能优化程序员分布式

不妥协:分布式事务的一致性,可用性和性能

2016-11-17  本文已影响457人  小聪明李良才

本文是论文No compromises: distributed transactions with consistency, availability, and performance的读书笔记,水平有限,未能很好的读懂,惭愧。

本文是mit 6.824 Schedule: Spring 2016的第1课,前面课程内容可以在分布式找到,更多详细资料可以到:distributed-system查看。

概述

如果事务具有强一致、高可用的特性,将大大的简化我们构建分布式应用的难度,但是在之前人们的认知中,分布式事务的设计一直表现的很糟糕,这就迫使在构建分布式系统的时候或者彻底不使用分布式事务,或者使用弱一致性,或者只使用单机事务,应用方通过数据分区来保证事务中的数据都落在一台机器上。

我想我们可以对上面的窘境说88了,在现代数据中心中,我们完全可以同时满足强一致、高可用、高性能。

本文会介绍FaRM(fast remote memory)系统,一个内存分布式计算平台。FaRM提供了如下的事务特性:

在90台机器4.9TB数据的情况下,在高峰时FaRM能达到1.4亿每秒的吞吐量(FaRM achieves a peak throughput of 140 million TATP transactions per second on 90 machines with a 4.9 TB database),并且能够在50ms内进行故障恢复。

而能达到如此性能的关键点是:

基于以上两个硬件上的改变,设计了全新的事务、数据复制和恢复协议。

介绍

我们希望分布式事务能达到的一个理想状态是:事务“在一台永不故障的机器上,事务的执行都是严格串行的”一样的效果。

但是之前的一些设计都存在缺陷,Dynamomemcached为了提高性能要么是不支持事务,要么放弃了强一致,只提供弱一致的保证。另外一些设计则只能保证单机事务,跨机器的则无能为力。

本文提出的FaRM平台,通过使用

解决了网络和存储的瓶颈,此时CPU的瓶颈出现了,FaRM在设计上遵循下面3条原则:

FaRM允许数据分布在不同机器上,同时允许跨机器的分布式事务。FaRM通过使用vertical Paxos,而不是通过Paxos协议进行coordinators和数据的复制,此时副本是主-备,然后协调者是单个,不进行复制。FaRM使用4阶段的乐观提交协议(lock, validation, commit backup, and com- mit primary)。

FaRM通过使用RDMA来进一步减少CPU的负载,具体是:

因为使用RDMA不需要CPU参与,因此有效的减少了CPU的使用。

由于servers处理请求时不再需要CPU参与,因此传统的故障恢复(failure-recovery)协议不再适合FaRM,因为传统的租约模式需要server在收到请求后进行判断是否拒绝请求,但是现在请求直接通过网卡处理了,CPU无法干预了。

一个可能的解决方案是:precise membership,保证所有机器都在当前membership configuration上达成一致了,然后只会发送请求给组员。

另一个问题是FaRM不能再依赖于传统的2阶段提交中,prepare阶段需要participants对资源进行锁定,然后在commit阶段进行提交,因为此时servers写logs的时候不再经过CPU了。一个解决方案是:reservations,我们确保在提交之前,我们又足够的空间来存储commit的日志。

在FaRM中故障恢复策略快是因为有效的利用了并行。具体是FaRM将恢复的每个数据都均匀的分布上集群上,然后并行的对每台机器进行恢复。

另外,FaRM通过两点优化使得恢复过程中事务可以并行的执行:

  1. 只需等到几十毫秒的lock recovery阶段结束,就可以获取故障中的数据了,而无需花费几秒去等待lock recovery之后的恢复阶段
  2. 没有收到失败影响的事务无需等待直接执行

FaRM利用高速网络进行高频的心跳机制,实现了快速的失败探测,同时利用priorities 和 pre-allocation防止误判。

硬件趋势

编程模型和架构

Progamming Model

FaRM提供了如上图的一个抽象地址空间,在我们看来所有的数据都在一个全局的地址空间中,通过FaRM提供的API让我们能够透明的访问本地和远端的数据。

FaRM的编程模型总结起来,如下:

  1. 应用线程开启一个事务,同时变为协调者(coordinator)
  2. 在事务中,可以执行任何的逻辑:如read, write, allocate, and free objects
  3. 事务最后,告诉FaRM进行提交

FaRM架构

FaRM Architecture

如何对地址进行寻址

前面提到FaRM将所有内存放到一起进行管理,那具体怎么操作呢?

如何申请内存

如何进行RAMD写

在读取上,每个机器都有一个ring buffer,实现了FIFO队列,在写的时候,sender通过RDMA直接写到尾部,然后NIC(网卡)直接给ACK,receiver周期性的从头部读取数据处理。

分布式事务和复制

前面的一篇论文Efficient Optimistic Concurrency Control提出的2PC提交会有一个问题,coordinate如果挂了或者participants挂了,会影响整个进程,因此一个想法就是进行primary-backup备份,保证高可用,于是就有下面的图:

2PC

这种主备的模式每次消息都需要和Primary和Backup同时交互,并且需要消耗CPU。

而FaRM在提交上使用:

Lock

Validate

Commit backups

commit primaries

Truncate

故障恢复

TODO

实验

这是6.824: Distributed Systems的第11课,你的鼓励是我继续写下去的动力,期待我们共同进步。

上一篇下一篇

猜你喜欢

热点阅读