H2数据库攻略之四-集群

来源:互联网 发布:用jq优化页面加载速度 编辑:程序博客网 时间:2024/05/16 07:19

H2数据库在集群方面也有不错的表现,下面介绍一下如何利用H2的集群/高可用性机制。

集群 / 高可用性

数据库支持简单的集群/高可用性机制。
架构是:两个数据库服务运行在两台不同的计算机上,两台计算机有同样数据库的副本,如果两个服务器都处于运行状态,每个数据库操作都被在两台计算机上执行,如果一台服务器宕机(断电、硬件故障、网络故障等),另外一台计算机仍能提供服务,从这一刻开始,数据库操作仅在一台服务器上执行,直到另外一台服务器恢复运行。

集群仅能用于服务器模式(内嵌模式并不支持集群)。可以在数据库运行状态下恢复集群,但是要求在第二个数据库恢复期间没有应用在改变第一个数据库的数据,因此恢复集群是一个手工的过程。

初始化集群,使用下面的步骤:

  1. 创建数据库。
  2. 使用CreateCluster工具创建一个数据库福分到另外的地方,并且初始化集群,这样就得到了同样数据的两个数据库。
  3. 启动两个数据库服务(每个数据库的副本)。
  4. 现在可以通过应用客户端连接到数据库。

H2支持两台服务器运行两个数据库成为集群,两个数据库互为备份,如果一个服务器失效,另一个服务器仍然可以工作。另外只有服务模式支持集群配置。

H2可以通过CreateCluster工具创建集群,示例步骤如下(在在一台服务器上模拟两个数据库组成集群):

1、创建目录
创建两个服务器工作的目录

# mkdir server1# mkdir server2

2、启动tcp服务
执行如下命令分别在9101、9102端口启动两个使用tcp服务模式的数据库

java org.h2.tools.Server-tcp -tcpPort 9101-baseDir server1java org.h2.tools.Server-tcp -tcpPort 9102 -baseDir server2

3、使用CreateCluster工具创建集群

java org.h2.tools.CreateCluster-urlSource jdbc:h2:tcp://localhost:9101/~/test-urlTarget jdbc:h2:tcp://localhost:9102/~/test-user sa-serverList localhost:9101,localhost:9102

如果两个数据库不存在,该命令将会自动创建数据库。如果一个数据库失效,可以先删除坏的数据库文件,重新启动数据库,然后重新运行CreateCluster工具。

举个例子,让我们进一步了解集群是如何工作的。
在这个例子里,两个数据库驻留在同一台计算机上,但通常,两个数据库在不同的计算机上。

· 创建两个目录:server1,server2。每个目录将模拟一台计算机

· 在第一个目录启动TCP服务,你可以运行下面的命令:

java org.h2.tools.Server-tcp-tcpPort 9101-baseDirserver1

在第二个目录启动TCP服务,模拟第二个服务器(冗余运行),你能使用下面的命令:

java org.h2.tools.Server -tcp-tcpPort 9102-baseDirserver2

使用 CreateCluster 工具初始化集群,如果数据库不存在,将创建一个新的空数据库,运行下面命令行:

java org.h2.tools.CreateCluster-urlSourcejdbc:h2:tcp://localhost:9101/~/test-urlTargetjdbc:h2:tcp://localhost:9102/~/test-user sa-serverList localhost:9101,localhost:9102

应用或者是H2控制台可以通过下面的JDBC的URL连接数据库:jdbc:h2:tcp://localhost:9101,localhost:9102/~/test

如果你停止一个服务(通过杀进程),你注意到另一个机器继续工作,数据库仍能提供访问。

恢复集群,你需要先删掉宕机的数据库,然后重启宕机的数据库的服务,再重新运行CreateCluster集群工具。

4、连接数据库
现在可以使用如下连接字符串连接集群数据库

jdbc:h2:tcp://localhost:9101,localhost:9102/~/test

5、监控集群运行状态
可以使用如下命令查看配置的集群服务器是否都在运行

SELECT VALUE FROM INFORMATION_SCHEMA.SETTINGS WHERE NAME='CLUSTER'

该命令也可以用于查找哪些节点当前正在运行。

结果返回为 ” (两个单引号),说明集群模式被屏蔽,否则,集群服务器列表将被单引号包括着返回,如’server1:9191,server2:9191’。

6、限制
H2的集群并不支持针对事务的负载均衡,所以很多操作会使两个数据库产生不一致的结果,执行如下操作时请小心:

RANDOM_UUID(), SECURE_RAND(), SESSION_ID(), MEMORY_FREE(), MEMORY_USED(), CSVREAD(), CSVWRITE(), RAND()

自动增长列和标识列不支持集群,当插入数据时,序列值需要手动创建

不支持SET AUTOCOMMIT FALSE语句,如果需要设置成为不自动提交,可以执行方法Connection.setAutoCommit(false)

0 0
原创粉丝点击