Oracle NoSQL Database
一、数据模型
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包。
六、小结与评价
可以看到Oracle NoSQL毕竟是大厂出品,比普通的Key-Value存储要强大许多,突出的主要有三点。
一、数据模型和操作强大。通过由多个key component来构成key并且设计操作时加以支持,Oracle NoSQL实际上不再是纯平面的Key-Value模型,而经常呈现为一种树形模型。多一个key component后缀的记录可以看作是子节点。系统提供了许多批量操作一个子树的功能,对比关系模式可以看出这解决了一部分JOIN问题,提高了开发效率。
二、数据一致性灵活精细。读取和更新都提供了很多一致性选项,可以实现不同的性能和一致性折衷。此外通过版本号,可以支持Compare-and-Swap、Read-your-own-write等语义,为实现并发正确性提供了便利。
三、支持多记录原子性操作。
当前版本最主要的问题是不能加存储节点,不过相信这个问题不久后会被解决。
建议继续学习:
- hbase运维 (阅读:13681)
- 我对技术方向的一些反思 (阅读:9877)
- Key-Value小数据库tmdb发布:原理和实现 (阅读:7318)
- SQL vs NoSQL:数据库并发写入性能比拼 (阅读:6635)
- 让Redis使用TCMalloc,实现高性能NOSql服务器 (阅读:6104)
- Using MySQL as a NoSQL (阅读:5673)
- SQL到NOSQL的思维转变 (阅读:5650)
- nosql数据库选型 (阅读:4823)
- 分享会-高性能nosql数据库redis (阅读:4447)
- MySQL vs NoSQL 效率与成本之争 (阅读:3811)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:风轻扬 来源: 风轻扬
- 标签: NoSQL
- 发布时间:2011-11-21 00:17:40
- [55] IOS安全–浅谈关于IOS加固的几种方法
- [53] Oracle MTS模式下 进程地址与会话信
- [53] 如何拿下简短的域名
- [51] 图书馆的世界纪录
- [51] android 开发入门
- [50] 【社会化设计】自我(self)部分――欢迎区
- [47] Go Reflect 性能
- [46] 读书笔记-壹百度:百度十年千倍的29条法则
- [42] 视觉调整-设计师 vs. 逻辑
- [39] 界面设计速成