在Windows平台运行JE-HA示例
Oracle Berkeley DB Java Edition (简称JE)从4.0开始推出了高可用(又称集群、HA)功能,从而让用户能够更容易的编写高可靠的、7×24在线的应用程序。随版本一起还发布了很多HA的示例代码。本文的主要目的是示范如何在windows平台上运行这些示例,从而帮助用户更好的理解和使用HA。
1.下载JE
用户可以到官方网址http://www.oracle.com/technology/software/products/berkeley-db/je/index.html下载最新的JE版本,本文使用的是JE 4.0.71. 同时,您也可以到http://www.oracle.com/technology/documentation/berkeley-db/je/examples/je/rep/quote/package-summary.html参考示例的详细英文文档。
2.编译示例
请确认您在编译示例之前已经安装好JDK,如果您的机器上没有安装,请到http://java.sun.com下载JDK。
用户下载示例后,解压缩到当前目录,你会发现一个je-4.0.71的目录,进入该目录,您会在lib目录下发现JE的jar包,HA的示例代码存放在examples/je/rep/quote目录下。将lib下的je-4.0.71.jar拷贝到examples/je/rep/quote下,打开命令行,进入到当前目录,输入如下命令:javac -cp .;je-4.0.71.jar *.java,该目录下的所有java文件都会被编译成class文件。
3.示例代码概述
JE-HA的示例代码分为三种:
- StockQuotes:该示例代码是一个最基本的使用JE-HA应用程序的展示,其主要目的是让您对JE-HA的基本概念有一个了解,并演示了如何使用JE-HA的API创建一个ReplicatedEnvironment和处理读写事务。
- RouterDrivenStockQuotes和HARouter:RouterDriverStockQuotes以StockQuotes为基础,展示了如何使用JE Monitor(HARouter)根据应用程序请求的类别(读或写)和结点的状态(Master或Replica),指引请求到正确的结点。该示例的目的是演示如何将负载平衡器与JE-HA结合起来,在该示例中,HARouter扮演负载平衡器的角色。
- UpdateForwardingStockQuote和SimpleRouter:UpdateForwardingStockQuote以RouterDrivenStockQuotes为基础,与HARouter不同,SimpleRouter并不关心应用程序的请求类别和结点的状态,只是简单的将请求转发给它所知道的结点,而UpdateForwardingStockQuote使用了StateChangeListener来跟踪当前的Master结点,并将写请求转发给Master,自己处理读请求。这个示例的目的是演示如何将一个负载平衡器嵌入到JE-HA的框架中。
本文主要演示如何运行前两个示例,第三个示例的运行方法与第二个基本类似,在这里就不做详细介绍了。
4.创建运行环境
为了演示的方便(截图的原因),我在同一台机器上运行三个HA结点。在开始运行示例代码之前,需要创建每个结点的environment home目录。这里,我在examples目录下创建三个目录,分别为:rep1,rep2,rep3。
因为JE-HA示例代码的包是je.rep.quote,所以命令行需要在examples目录下运行。
5.运行StockQuotes示例
(1).启动三个结点,如下图所示:
(2).在Master上写数据,在Replica上读取数据,如下图所示:
(3). 如果在Replica上写数据。由于JE-HA只允许在Master上写数据,因此该操作是非法的,控制台会打印出提示信息,如下图红框内所示:
(4).将Master关闭,JE-HA会在当前集群中重新选举出一个新的Master,只有现存的Replica的数目符合选举策略,如下图红框内所示,node3被选举成为新的Master:
(5).将剩下的Replica也关掉,只剩下Master,这种情况下,应用程序还可以在Master上正常读取数据,如果进行写数据操作,写操作可以提交,但是会抛出InsufficientReplicasException异常。这是因为示例的默认事务提交策略是要得到超过半数的Replica的回应的,但是当前没有任何活跃的Replica,所以虽然写操作提交成功,但同时会抛出异常信息。如下两图所示:
6.运行RouterDrivenStockQuotes和HARouter示例
运行RouterDrivenStockQuotes和HARouter示例与运行StockQuotes示例基本类似,唯一的不同是需要在启动三个RouterDrivenStockQuotes之外再启动一个HARouter。
(1).启动整个HA组,如下图所示:
(2).HARouter指引写请求到Master,如下图所示:
(3).HARouter将读请求指引到目前空闲的结点,如下图所示:
(4).关闭当前的Master,HARouter会自动找到新选出来的Master,如下图所示:
(5).当所有Replica都关闭,只剩下Master还活跃的时候,HARouter会提示写请求是非法的(原因在StockQuotes演示第六步已经介绍了),如下图所示:
7.总结
JE-HA是对JE功能的一个巨大提升。希望本文能够让你更好的了解并使用JE-HA。如果您对本文有什么意见或对JE-HA有什么建议,请您站内留言。











你好,我最近在MyEclipse下使用BDB JE时碰到这个错误:
javax.servlet.ServletException: java.lang.UnsatisfiedLinkError: no libdb_java46 in java.library.path
搞了好几天,查了很多地方都解决不了,请问可能是什么问题??谢谢了
@colo
本文讲的是BDB-JE。你的错误信息显示你用的是BDB C语言版(又称BDB)的Java API。BDB和BDB-JE两者是不同的产品,不可混为一谈。
你好,可否对beb je的远程访问提供一些建议。
使用ha构建集群,但是数据和应用是分开的,不在一台机器,因此,如何使得bdb je提供服务呢,之前的办法是编写servlet提供crud服务。请问有更好的办法吗
@forchenyun
BDB-JE的一个性能优势就是嵌入到应用程序去,避免了传统的关系型数据库的网络开销(JDBC, O/R mapping等以及SQL解析等开销。
基于现代典型的J2EE的Model-View-Controller的模式,你可以将JE嵌入到Model层。前面可以通过servlet或者RMI等调用。
@chaohuang
非常感谢您的回复!
使用je而不选择关系型数据库主要还是性能上的考虑,从目前的性能测试来看bdb-je的确具有几乎完美的性能,但是由于并发以及replication等多种原因,很难做到嵌入到应用程序中去,那么在这种情况您有什么建议呢?
另外,Carbonado在je上层做了一些封装,以提供更多的查询支持,但是我很困惑是否需要一个key-value数据库做这么多东西,不知道您对这个怎么看?
@forchenyun
我不是很明白你的问题。具体可以发邮件给我讨论。邮件地址见“招纳贤士”文章的讨论区。
(5).将剩下的Replica也关掉,只剩下Master,这种情况下,应用程序还可以在Master上读取数据,但是已经不能写数据了。这是因为示例的默认事务提交策略是要得到超过半数的Replica的回应的,但是当前没有任何活跃的Replica,所以提交会失败并打印出异常信息。如下两图所示:
经试验虽然是打印出了异常信息,但提交没有失败,数据仍然写进去了,这里说的应该只是一个提交策略的异常
@幻冰
是的。虽然仅剩下一个Master,写数据操作还是可以提交的,但是会抛出InsufficientReplicasException异常。
非常感谢您对我们文章提出的宝贵意见。我们已经就文章里面的错误作出了修改。