1. 简介
Oracle NoSQL数据库是一款基于Berkeley DB Java Edition构建的,分布式的,跨数据中心的Key-Value数据库。它是一款高性能,和极短的响应时间(毫秒级)的云数据库方案。Oracle NoSQL数据库使客户能够轻松地管理大量的,动态模式 (dynamic schemas) 的数据,如Web日志数据,传感器和智能仪表的数据,用户个性化数据,和社交网络的数据。 Oracle NoSQL DB是采用Oracle Berkeley DB Java Edition做底层存储引擎,但我们在其之上添加了更多的基础架构层的功能,如: 数据分布 动态分区 负载平衡 监控和管理 可预见的延迟 多节点备份 举例来说,Oracle NoSQL DB是汽车的话,Oracle BDB则算汽车引擎。 Oracle NoSQL数据库会有商业版和社区版两个版本。当前发行的第一个版本中(v1.1.100),两者没有功能上的区别(商业版有Oracle的支持服务)。目前商业版本已经开放下载:http://t.cn/SvbsUm 它包括数据库产品本身的Java类库,第三方类库,示例代码,文档,启动脚本和基于Google GWT实现的管理功能。
2. Oracle NoSQL数据库在企业部署的示例图
如下图所示,在当今的企业部署中,Oracle NoSQL数据库可以和传统的关系型数据库混合搭配提供服务。比如,NoSQL数据库可以运行有实时要求的、非结构化的应用;关系型数据库可以用来执行查 询分析、交易结算等功能。举个在线电子商务的应用来说,和用户相关的注册信息、个人头像、评论、爱好、购物车、网站的静态图片、商品等信息可以存在 Oracle NoSQL数据库;而当用户选定进行结算时,则可以通过Oracle关系型数据库进行支付等操作。
Oracle NoSQL数据库分客户端和服务端2个部分。客户端提供给应用程序的API调用(如Put,Get,Delete,Multi Put/Get/Delete,Iterator等),以及服务端的一些状态和统计信息(如数据分区、机器负载等)。目前客户端仅提供Java接口,暂时不支持其他语言。
而服务端则具体用来管理数据,提供数据库操作、并发控制、一致性和扩展性、管理功能等。在下图中,每个Storage Node代表着数据中心中的一台物理或者虚拟的机器(VM),这些机器可以是跨数据中心的。而针对整个NoSQL数据库的管理进程可以部署在某个Storage Node上。我们提供命令行和web两种管理接口。
3. 在多个节点上部署NoSQL数据库
目前Oracle NoSQL数据库只支持在Linux或者Solaris (10及以上)机器上进行部署,这是由于部署及管理的脚本是bash的。如果你要在Windows上进行部署,你可以有2种办法:使用 Cygwin,MingGW等类Linux工具;或者将NoSQL部署脚本转换成Windows的bat脚本 (可参考 https://forums.oracle.com/forums/thread.jspa?threadID=2307203&tstart=0 )。你也可以尝试在类Linux的系统(如Unix)上实验部署Oracle NoSQL数据库。为了性能考虑,我们不推荐你使用虚拟机。
3.1 前期准备
- JDK 1.6.0 u25或以上。
- 一台或者多台Linux或者Solaris (10及以上)机器。
- 保证机器之间时间同步。你可以使用ntp等工具。
- Oracle NoSQL数据库发布包,如kv-1.1.100.zip。
3.2 安装步骤
a. 创建启动配置参数文件
b. 启动管理进程和存储节点代理进程(Storage Node Agent, 简称SNA)
c. 通过Oracle NoSQL数据库管理(命令行或者web方式)配置一个NoSQL库,步骤如下:
1) 创建一个数据中心
2) 部署一台Storage Node,用来运行该NoSQL库的管理模块
3) 将管理模块部署到Storage Node上 (该步骤在步骤b的基础上增加了对NoSQL数据库级别的管理功能,因此管理节点和端口必须一致)
4) 创建一个Storage Node池
5) 将步骤2)创建的Storage Node加到存储节点池
6) 将剩余节点(Storage Node) 轮流部署并加入到存储节点池
7) 在指定的存储节点池上部署NoSQL库,指定复制因子和数据分区数。
d. 在客户端运行HelloBigDataWorld示例程序,验证数据库是否部署成功。
3.3 实际部署示范
对照3.2的过程,简单起见我们在3个节点上部署一个NoSQL数据库实例,并运行HelloBigDataWorld例子。
1. 下载Oracle NoSQL数据库发布包(如kv-1.1.100.zip),并解压释放。释放文件的文件夹约定为KVHOME。(注意:如果是多机环境,你要将发布包释放或者映射到每台机器的对应目录。)
2. 创建存放数据文件的目录,约定为KVROOT。多机的话,每台机器一样要创建数据文件目录。
3. 在管理节点上,创建启动配置参数文件
> KVHOME/bin/kvctl makebootconfig -root KVROOT \ -port 5000 \ -admin 5001 \ -harange 5010,5020
4. 启动管理进程和存储节点代理进程
> KVHOME/bin/kvctl start -root KVROOT
5. 在管理节点上: 验证管理进程和存储节点代理进程是否顺利启动
> jps -m 29400 ManagedService -root /tmp -class Admin -service BootstrapAdmin.13250 -config config.xml 29394 StorageNodeAgentImpl -root /tmp -config config.xml # 如果顺利启动则会出现上面所示的2个进程
6. 在客户端: 验证客户端是否可以顺利“联系”存储节点代理进程
> KVHOME/bin/kvctl ping -port 5000 -host node01 # 如果成功则出现如下所示的信息: SNA at hostname: node01, registry port: 5000 is not registered. No further information is available # 否则,不成功的话,会出现如下错误: Could not connect to registry at node01:5000 Connection refused to host: node01; nested exception is: java.net.ConnectException: Connection refused
7. 通过命令行配置一个NoSQL数据库实例
7.1 使用命令行单步执行
1) 启动管理功能的命令行
> KVHOME/bin/kvctl runadmin -port 5000 -host node01 2) 指定数据库名字 kv-> configure mystore 3) 创建一个数据中心 kv-> plan -execute -name "Deploy DC" deploy-datacenter "Boston" "Savvis" 1 kv-> 4) 部署一台Storage Node,用来运行该NoSQL库的管理模块 kv-> plan -execute -name "Deploy n01" deploy-sn 1 node01 5000 "comment" 2 kv-> 5) 将管理模块部署到Storage Node上 (该步骤在步骤b的基础上增加了对NoSQL数据库级别的管理功能,因此管理节点和端口必须一致) kv-> plan -execute -name "Deploy admin" deploy-admin 1 5001 3 kv-> 6) 创建一个Storage Node池 kv-> addpool BostonPool kv-> show topology dc=[dc1] name=Boston sn=[sn1] dc=dc1 node1:5000 status=UNREPORTED 7) 将步骤2)创建的Storage Node加到存储节点池 kv-> joinpool BostonPool 1 AllStorageNodes: sn1 BostonPool: sn1 kv-> 8 ) 将剩余节点(Storage Node) 轮流部署并加入到存储节点池 kv-> plan -execute -name "Deploy n02" deploy-sn 1 node02 5000 4 kv-> joinpool BostonPool 2 AllStorageNodes: sn1 sn2 BostonPool: sn1 sn2 kv-> plan -execute -name "Deploy n03" deploy-sn 1 node03 5000 5 kv-> joinpool BostonPool 3 AllStorageNodes: sn1 sn2 sn3 BostonPool: sn1 sn2 sn3 kv-> .... 9) 在指定的存储节点池上部署NoSQL库,指定复制因子和数据分区数 kv-> plan -execute -name "Deploy the store" deploy-store BostonPool 3 300 10) 查询所有以上步骤的结果 kv-> show plans 1 Deploy Boston DC SUCCEEDED 2 Deploy n01 SUCCEEDED 3 Deploy admin SUCCEEDED 4 Deploy n02 SUCCEEDED 5 Deploy n03 SUCCEEDED 6 Deploy the store SUCCEEDED 11) 退出命令行 kv-> quit
7.2 使用脚本
1) 启动管理功能的命令行,并指定运行的脚本
> KVHOME/bin/kvctl runadmin -port 5000 -host node01 -script scrpt.txt kv-> 执行脚本(scrpt.txt)内容如下: ### Begin Script ### configure mystore plan -execute -name "Deploy Boston DC" deploy-datacenter "Boston" "Savvis" plan -execute -name "Deploy n01" deploy-sn 1 node01 5000 plan -execute -name "Deploy admin" deploy-admin 1 5001 addpool BostonPool joinpool BostonPool 1 plan -execute -name "Deploy n02" deploy-sn 1 node02 5000 joinpool BostonPool 2 plan -execute -name "Deploy n03" deploy-sn 1 node03 5000 joinpool BostonPool 3 plan -execute -name "Deploy the store" deploy-store BostonPool 3 300 ### End Script ### 2) 查询所有以上步骤的结果 kv-> show plans 1 Deploy Boston DC SUCCEEDED 2 Deploy n01 SUCCEEDED 3 Deploy admin SUCCEEDED 4 Deploy n02 SUCCEEDED 5 Deploy n03 SUCCEEDED 6 Deploy the store SUCCEEDED 3) 退出命令行 kv-> quit
8. 在客户端运行HelloBigDataWorld示例程序,验证数据库是否部署成功。
在客户端编译示例程序: javac -g -cp lib/kvclient-M.N.O.jar:examples examples/hello/*.java 运行该示例程序: java -cp KVHOME/lib/kvclient-M.N.O.jar:KVHOME/examples \ hello.HelloBigDataWorld \ -host <hostname> -port <hostport> -store <kvstore name> 如果输出结果为 "Hello Big Data World!",那么恭喜你,你的第一个Oracle NoSQL数据库已经配置成功了。
4. 卸载NoSQL数据库
卸载的过程比较直观,有2种办法:
1. 在每个Storage Node节点上: 通过kvctl停止数据库,然后移除KVROOT目录。
a) kvctl stop -root KVROOT/
b) rm KVROOT/
2. 在每个节点上kill掉所有NoSQL数据库的Java进程 (通过jps -m定位进程号),然后移除KVROOT目录。 备注:这里基于的假设是Oracle NoSQL数据库是7*24的不间断应用,因此目前的办法是逐个Storage Node来停止服务,并删除数据。
5. 后续
当你的NoSQL成功部署以后,你可能会去读一下Oracle NoSQL数据库的FAQ和Getting Started Guide来编写你的第一个NoSQL应用。你也可能会要去查询对应的Javadoc以及示例代码。
如果是数据库管理员的话,你可能会去读一下Oracle NoSQL数据库的FAQ和Administrator’s Guide。
以上所有这些文档在你下载的Oracle NoSQL发布包中,或者你也可以访问 http://docs.oracle.com/cd/NOSQL/html/index.html 如果有更多问题,欢迎通过邮件和我联系: chao.huang[at]oracle[dot]com;或者通过新浪微博和我们互动: weibo.com/bdbchina。 转载请注明出处,谢谢。