在GAE上使用 High Replication Datastore

今天Google App Engine团队公布了High Replication Datastore这个新的特性。

和之前使用的Master/Slave方式相比,High Replication提供了更快的响应速度和可用率,但在存储和访问开销上要多于前者,具体差异如下:

  • Master/Slave:
    采用主从复制系统。写数据时是写入主数据中心,然后再异步复制到从数据中心。读数据时可以选择使用强一致性,但这可能会遇到主数据中心暂时不可用和维护的情况。
    不过Google也提供了最终一致性方式来读取,当主数据中心不可用时,可以从从数据中心读取数据。但写数据以及使用事务是不能用最终一致性方式的。
  • High Replication:
    采用Paxos算法,数据会被同时写入多个数据中心。读写时会有最快的速度,只有当所有数据中心都不可用时才会失败,但不能保证强一致性。
    相应的,Google也允许使用实体组来保证强一致性查询,但这需要使用祖先查询。而且如果使用实体组的话,由于实体组不能短时间内被多次更改,因此是无法高效地插入数据的。

Paxos这个算法之前我也研究过,大致上就是一个决策系统,当大多数数据中心认可一个读或写操作后,就认为它有效,因此不会遇到某个数据中心暂时无法访问而失败的情况。(印象中暂时不可用的出现概率是万分之三,懒得去确认了。)
至于开销和速度方面,Google提供了一个比较文档,大多数操作都要花3倍的开销(暂定,7月份可能会更改),而响应时间似乎没有明显提高(不过网络延迟应该会降低)。

此外,现有的应用都只能使用Master/Slave方式,只有创建新的应用时才能选择High Replication方式。因此Google也提供了一个复制数据的功能,以便你移植到新应用上。

顺带一提,Python SDK 1.4.1也发布了,只是把offline URL Fetch API的时间增加到10分钟而已,这个估计是计划任务或任务队列中的请求时间吧,正常的请求仍然有10秒限制。


更新性能测试:

以2个6字节长的应用来做对比测试,方法是创建、查询、获取和删除500个Test类型无属性的实体,代码如下:

from time import time
from google.appengine.ext import db

class Test(db.Model):
    pass

keys = [db.Key.from_path('Test', i) for i in xrange(1, 501)]
tests = [Test(key=key) for key in keys]
t = time()
db.put(tests)
print time() - t

t = time()
Test.all().fetch(500)
print time() - t

t = time()
db.get(keys)
print time() - t

t = time()
db.delete(keys)
print time() - t

测试结果:

Master/Slave:

1.52360796928
0.141813993454
0.147518157959
1.14946293831

ms=3060 cpu_ms=44519 api_cpu_ms=43446 cpm_usd=1.236788

High Replication:

4.77071118355
0.235147953033
3.09301185608
5.15948295593

ms=13304 cpu_ms=114004 api_cpu_ms=112812 cpm_usd=3.166840

由此可见,High Replication在各方面都比Master/Slave慢(特别是db.get(),慢了20倍),而且消耗的资源更多,因此绝大多数应用不建议使用它。

原文

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。