今早Amazon发布了DynamoDB,作为AWS服务的新成员,提升了AWS管理结构化数据的能力。总体来说,DynamoDB是基于Amazon Dynamo技术实现的可伸缩性和可用性优异的NoSQL数据库托管服务。
我们知道,Amazon搞了一个很牛的KV数据库Dynamo,可伸缩性、可用性和性能稳定性非常好。但Dynamo推出后并没有在Amazon内部被广泛接纳,主要原因是Dynamo是作为软件系统提供给开发者,要用得部署各自的Dynamo集群,安装管理成本很高。后来Amazon推出了SimpleDB托管服务(Managed Service),没有部署和管理开销,很受欢迎。用户也很欢迎SimpleDB灵活的数据模型。
但是SimpleDB也存在几个主要问题:
1、可伸缩性有限。因为批量操作只有Domain数据在一个节点上才能有效完成,导致单个Domain大只能支持到10G;
2、性能不可预期。SimpleDB为了方便使用,所有属性都建索引,都可以搜索,这导致更新性能不可控,如果属性一多或数据量一大更新就很慢;
3、终一致性难以使用。一开始SimpleDB只提供终一致性读,开发者觉得开发应用时很麻烦,几年后SimpleDB才提供了一致性读选项;
4、Machine Hours计费很难用;
根据这些经验,Amazon重新设计了DynamoDB。采纳了SimpleDB中成功的托管服务形式及灵活的数据模型,并从一开始提供了一致性读功能。限制了系统的功能,只能通过主键去操作记录,不能进行批量更新,这使得系统可以保证可伸缩性及任何时候的高性能。另外,全面的使用SSD来提升系统性能。
下面来详细说说DynamoDB的各项特性。
一、数据模型
二、操作
DynamoDB提供如下操作:
1、putItem:插入或更新一条记录,支持条件更新,支持在更新时返回属性旧值
2、getItem:获取一条完整的记录或某些属性, 允许指定用终一致性读还是严格一致性读
3、batchGetItem:获取一个或多个表中的多条记录或某些属性,只能用终一致性读。一次多返回100个属性及小于1MB数据,如果没有返回所有记录,会返回还没有处理的键值以便应用再次去获取
4、updateItem:插入/删除/更新一条记录中的某些属性, 支持条件更新,支持更新时返回所有属性旧/新值、被更新属性旧/新值
5、deleteItem:删除一条记录,支持条件删除,支持删除时返回被删除记录
6、query:使用组合主键时查询同一Hash Key的多条记录或某些属性,可指定Range Key范围条件及读一致性要求,可指定返回条数限制。操作保证按主键顺序返回记录,因此可通过在下一条查询时指定上次返回的大主键作为起始点来实现分页
Query时可指定range key的范围条件(EQ, NE, BETWEEN, BEGINS_WITH)来缩小返回记录数。
DynamoDB中的数据是以 primary key索引, 在同一个primary key下的多条记录以RANGE key排序存储。
7、scan:表扫描,可指定多个过滤条件,可指定返回条数限制。实现分页的方法同query
可以看到DynamoDB不但提供了单记录的CRUD操作,还提供了条件更新、多记录读、范围扫描、全表扫描等功能,还算比较灵活。
此外,还 可以用MapReduce来分析DynamoDB中的数据。特别的,因为DynamoDB已经是表结构,可以很方便的用Hive来分析。
三、其它
DynamoDB的数据至少都会同步复制到在同一Region的3个以上的数据中心,因此可用性和数据可靠性非常好。
DynamoDB的计费模式中显著的特点是按读写操作的能力收费,用户要指定每张表第秒能提供多少次读写操作。费用价格为0.01$/小时.10 Write Capacity+0.01$/小时.50 Read Capacity,终一致性读操作半价。另外存储费用为存储1$/GB.月,操作超过1KB的对象还要另收费。可以看到DynamoDB的存储费用是S3的7-18倍,估计是因为用了SSD带来的成本提高。
四、读后感
数据库,简单的莫过KV,复杂多能的莫过传统关系数据库。现在一般认为KV太过简单,关系数据库太过复杂,怎么才是好的中庸之道,是大家都在探索的问题。时至今日,各项技术都明了,难做的是怎么取舍。DynamoDB是Amazon基于多年经验给出的答案,其特点是类似于关系表但Schemaless的灵活数据模型、组合主键、条件更新、可选的一致性读、受限的范围扫描、全表扫描等,没有多记录原子操作。以Amazon的经验,这些取舍当然值得重视。但并非,如在数据库领域更富有经验的Oracle做的NoSQL数据库则包含多记录原子操作功能。