DynamoDB 是Amazon最新发布的NoSQL产品,那什么是DynamoDB呢?
DynamoDB 是一个性能好、可靠高且具有可扩展性的NoSQL云数据库服务,DynamoDB集15年分布式非关系性数据库开发之精粹,又通过内部使用考验,是AWS团队精心打造的产品。
DynamoDB 是一个共享型的数据库云服务
共享型的数据库云服务,是指一台机器上的CPU、内存及磁盘资源会给多用户使用。
共享型服务最大的问题在于资源的公平性,如何保证一个用户对资源的使用不会影响到其他用户?例如,用户A在DynamoDB上保存了10GB的数据,假设这10GB数据全部保存在同一台机器上,而且这台机器的读性能只有1GB/秒。此时,如果用户每秒要读1GB数据,必然会影响到其他用户对同台机器上的数据访问,因为一台机器的吞吐量是固定的。这样就没有办法做到每个用户每个请求都有稳定的性能保证。正如各种MySQL共享服务会根据用户预购买的数据空间来限定每秒的请求数来解决资源公平性一样,DynamoDB利用Provisioned Throughput来解决资源公平性。如果用户的读/写请求量变大,就得提高读/写请求的带宽上限,付更多的钱,DynamoDB同时会根据用户购买的带宽将数据分散到更多的机器上。
目前,单表最多支持10000个1KB读/写(相当于10MB/s的读写),单用户最多20000个1KB读/写(相当于20MB/s的读写)。如果需求增加,则需要填表单独申请。同时还有更多详细的规定,具体详见用户手册(其实所有的规定都是受到资源公平性以及后台具体实现的约束)。
DynamoDB 特性:
1)稳定的性能保证(固态硬盘SSD进行存储,十毫秒内完成,处理请求速度不会随着数据量的增加而减慢)
2) 读/写流量限制预设Provisioned Throughput(用户必须指定对数据库的读/写带宽,Amazon会按用户设置的读/写带宽收费)
3) 自动扩容
4) 强一致性(设置读流量上限时需要设置成实际读流量的两倍)
5) 完全分布式,无中心化架构(一个表上的数据可以分布到几百台机器上)
6) Schema free(NoSQL,Schema必须free)
7) 和Amazon Elastic MapReduce深度整合(在EMR上可以调用DynamoDB的数据进行MapReduce,并将计算结果保存到S3,同时也可以用EMR对DynamoDB做备份)
8) 容灾(容错、完善的监控、安全、物美价廉、管理方便,这些都是云服务应该做到的)
DynamoDB 数据库有表(tables),数据项(items)和属性(attributes)构成
一个数据库有若干张tables,一张表有若干items,每个数据项有若干attributes。
在关系型数据库中,一张tables有columns组成。每个records都有相同的属性。然而DynamoDB是NoSQL数据库。也就是除了主键外,每个item都是可以任意自定义的,没有columns的概念,也不受其束缚。唯一的要求就是不要每个item不要超过64 KB大小。这就是所有item name和item value加起来的大小不要超过64 KB。
每个item的attribute都是key-value的结构。每个attribute的value部分既可以使单值(single-valued)也可以是个组合(multi-value)。如果是组合的话,这个集合(set)中值是不允许有重复的。
DynamoDB 各项特性
1、数据模型
DynamoDB的数据模型可以说是SimpleDB/BigTable与Oracle NoSQL的融合。系统首先分成多张表(Table)。表中的记录拥有单属性简单哈希主键或两属性Hash Key+Range Key组合主键。记录内容可包含任意多个属性,属性分单值或多值两种。属性值可以是字符串或数值类型。表没有统一的模式,建表时只需要指定主键的定义,其余各记录都可以拥有自己不同的属性集合。记录由主键和多个属性组成这一点类似于SimpleDB与BigTable,这比简单的KV模型更易用。主键可以由Hash Key+Range Key组合而成则类似于Oracle NoSQL,这主要为了提供相同Hash Key的记录集合操作。
2、操作
DynamoDB提供如下操作:
1、putItem:插入或更新一条记录,支持条件更新,支持在更新时返回属性旧值
2、getItem:获取一条完整的记录或某些属性,允许指定用最终一致性读还是严格一致性读
3、batchGetItem:获取一个或多个表中的多条记录或某些属性,只能用最终一致性读。一次最多返回100个属性及小于1MB数据,如果没有返回所有记录,会返回还没有处理的键值以便应用再次去获取
4、updateItem:插入/删除/更新一条记录中的某些属性,支持条件更新,支持更新时返回所有属性旧/新值、被更新属性旧/新值
5、deleteItem:删除一条记录,支持条件删除,支持删除时返回被删除记录
6、query:使用组合主键时查询同一Hash Key的多条记录或某些属性,可指定Range Key范围条件及读一致性要求,可指定返回条数限制。操作保证按主键顺序返回记录,因此可通过在下一条查询时指定上次返回的最大主键作为起始点来实现分页
7、scan:表扫描,可指定多个过滤条件,可指定返回条数限制。实现分页的方法同query
可以看到DynamoDB不但提供了单记录的CRUD操作,还提供了条件更新、多记录读、范围扫描、全表扫描等功能,还算比较灵活。
此外,还可以用MapReduce来分析DynamoDB中的数据。特别的,因为DynamoDB已经是表结构,可以很方便的用Hive来分析。
3、其它
DynamoDB的数据至少都会同步复制到在同一Region的3个以上的数据中心,因此可用性和数据可靠性非常好。
DynamoDB的计费模式中最显著的特点是按读写操作的能力收费,用户要指定每张表第秒能提供多少次读写操作。费用价格为0.01$/小时.10 Write Capacity+0.01$/小时.50 Read Capacity,最终一致性读操作半价。另外存储费用为存储1$/GB.月,操作超过1KB的对象还要另收费。可以看到DynamoDB的存储费用是S3的7-18倍,估计是因为用了SSD带来的成本提高。
SimpleDB 缺点:
1、可伸缩性有限。因为批量操作只有Domain数据在一个节点上才能有效完成,导致单个Domain最大只能支持到10G;
2、性能不可预期。SimpleDB为了方便使用,所有属性都建索引,都可以搜索,这导致更新性能不可控,如果属性一多或数据量一大更新就很慢;
3、最终一致性难以使用。一开始SimpleDB只提供最终一致性读,开发者觉得开发应用时很麻烦,几年后SimpleDB才提供了一致性读选项;
4、Machine Hours计费很难用;
根据这些经验,Amazon重新设计了DynamoDB。采纳了SimpleDB中成功的托管服务形式及灵活的数据模型,并从一开始提供了一致性读功能。限制了系统的功能,只能通过主键去操作记录,不能进行批量更新,这使得系统可以保证可伸缩性及任何时候的高性能。另外,全面的使用SSD来提升系统性能。
参考推荐: