近日Oracle提供了不久前公布的NoSQL数据库的下载,目前只有企业版,开源的社区版还没提供,也就是说还看不到源码。不过根据文档也能大致了解这个NoSQL数据库怎么样。快速看了看,总结如下。
key包含一到多个major key component和零到多个minor key component,组合起来唯一标准一条记录。key component为Java String,按对应encoding排序。value则是字节流。key和value的大小都没有严格限制。
记录还有版本号,每次更新都产生唯一的新版本号。在put/delete/get操作时,都可以指定要版本号,其中get时用于指定要读的版本,而 put/delete指定版本号是指当记录的最新版本还是指定版本时才更新,用于实现原子Compare-and-Swap语义。版本号应该至少是在一个 partition内部是全局唯一的。
两层架构,客户端直接到存储节点。核心架构是Replication Node和Replication Group,一个Replication Group包含一个可写的Master Replication Node和多个只读的replica。master失败时会failover到某replica。现在发布的版本暂时还不能动态调整存储节点个数,以后会加。
数据按major key hash分区到partition。这样拥有相同的major key仅仅minor key不同的多条记录一定在同一partition,可以提供高效的多记录操作,且系统还支持原子性的操作这样的多条记录。一个Replication Group一般负责多个partition,一个存储节点一般负责一个Replication Node,如果调整存储节点个数,则以partition为单位来移动数据。为方便以后scale-out,应该一开始就多一些partition。
系统底层用的是Berkeley DB Java Edition,用Btree数据结构。缓存包含Berkeley DB的缓存和文件系统缓存,不用DIRECT_IO,文档建议Berkeley DB缓存用于容纳Btree的内部节点,叶节点用文件系统缓存。另外也提供单机版称为KVLite。
Oracle NoSQL提供的操作比较丰富,主要包括:
1、用于插入或更新记录的put类操作,包括put/putIfAbsent/putIfPresent/putIfVersion,都要指定一个完整的Key。用途顾名思义就不说了,稍提一点是putIfVersion功能提供了Compare-and-Swap,在处理并发时很有用
2、用于删除记录的delete类操作,包括delete/deleteIfVersion/multiDelete。前两者要指定完整Key,用途顾名思义。说一下multiDelete,这个操作最多可以指定三个参数,一是必须指定完整的major key,二是可以指定一个由第一个minor key的上下限构成的KeyRange,三是可以指定是删除子节点/子孙节点/父节点和子节点/父节点和子孙节点等多种Depth模式。
3、用于读取记录的get类操作,包括get/multiGet/multiGetIterator/storeIterator。multiGet和 multiDelete一样可以指定KeyRange和Depth。multiGetIterator用于批量取一个完整major key下的大量记录,防止占内存过多,可以指定遍历方向,不保证数据是某时刻的一致视图。storeIterator用于遍历不完整major key下的大量记录,甚至遍历所有记录。
4、用于批量原子更新多条记录的execute操作。系统保证这批操作的原子性,限制是操作的记录必须都拥有相同的major key,且同一条记录不能操作多次。
Oracle NoSQL的数据一致性比较灵活精细。就读取而言,可以指定只从master读、不管replica是否落后都可以从replica读、只在 replica落后master时间在某阈值之内时才能从replica读、只在replica的版本号不小于某指定版本号时才读。指定版本号的读一致性可以用于实现read-your-own-write形式的一致性,即保证自己能读到自己刚写的数据。
就更新而言,可以指定两方面的策略。一是master要不要等各个replica的应答,这里可以选要所有replica应答、要大多数replica应答和不等replica应答等3 种。二是数据要不要持久化到磁盘,这里可以选不要(更新到内存就可以了)、写磁盘但不SYNC、写磁盘且要SYNC等3种。持久化策略可以指定 master和replica分别指定。根据文档看似乎没有用到2PC。
系统提供命令行或WEB界面的管理工具,管理比较方便。可以创建snapshot,snapshot只在partition内部一致,不保证全局一致。可以从snapshot恢复。提供将NoSQL Database数据导入到Hadoop功能。客户端驱动是jar包。
优点:
1、数据模型和操作强大。通过由多个key component来构成key并且设计操作时加以支持,Oracle NoSQL实际上不再是纯平面的Key-Value模型,而经常呈现为一种树形模型。多一个key component后缀的记录可以看作是子节点。系统提供了许多批量操作一个子树的功能,对比关系模式可以看出这解决了一部分JOIN问题,提高了开发效率。
2、数据一致性灵活精细。读取和更新都提供了很多一致性选项,可以实现不同的性能和一致性折衷。此外通过版本号,可以支持Compare-and-Swap、Read-your-own-write等语义,为实现并发正确性提供了便利。
3、支持多记录原子性操作。
当前版本最主要的问题是不能加存储节点,不过相信这个问题不久后会被解决。
原文出处:http://wangyuanzju.blog.163.com/blog/static/130292011919114541710/