备用数据库启动并运行时,Oracle Veritas集群会故障回复到主节点

时间:2018-04-11 11:40:17

标签: oracle jboss cluster-computing

已经搜索了很多我的问题,但似乎不是常用的东西。这里的问题是Oracle DB Veritas集群,它基于2个节点,主节点和备用节点。 这种情况与客户有关,我们并没有在感觉良好的情况下接触它。所有这些东西都在 JBoss6.4 上运行,并且打算遵循以下逻辑:

  1. 应用程序已连接到主节点(node1)
  2. node1关闭,应用程序连接到备用节点(node2)。
  3. node2处于只读模式,按设计node1重新启动,并在2分钟内可以访问。
  4. 虽然此次中断,但应用程序在开始发送心跳消息之前已超时。
  5. 一旦node1启动并运行,群集应该从node2故障回复到node1,因为node2仍在运行。
  6. 这里的问题是即使node2正在运行,也要将集群故障回复到node1。 使用的连接字符串:

      

    jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST =   (load_balance = off)(failover = on)(ADDRESS =(PROTOCOL = TCP)(Host =   node1)(Port = 49005))(ADDRESS =(PROTOCOL = TCP)(Host = node2)   (Port = 49005)))(CONNECT_DATA =(SERVICE_NAME = app_service)))

    如果应用程序无法将心跳事件写入数据库3次,则JVM将被关闭。是否有任何方法可以配置数据源连接,以便在考虑到node2已启动并以RO模式运行时,如果它可用,则它会故障回到主节点(node1)?

    提前致谢!

1 个答案:

答案 0 :(得分:0)

您可以使用特殊服务名称定义用于连接客户端的数据库。例如,在数据库启动时系统触发器的主模式下。 您可以通过运行命令

动态重新定义服务名称
alter system set service_names='app_service_primary' scope=memory;

当数据库以主模式启动时,触发器会创建服务。客户端通过服务名称连接,该服务名称在数据库开头的触发器中创建,而不是由默认数据库名称或服务创建。

CREATE OR REPLACE TRIGGER sys.set_svc_name
 AFTER
  STARTUP
 ON DATABASE
DECLARE role VARCHAR(30);
BEGIN

SELECT Database_Role
INTO Role
FROM V$database;
IF Role = 'PRIMARY' THEN
EXECUTE IMMEDIATE 'alter system set service_names=''app_service_primary'' scope=memory'; END IF;

END;

需要更改连接字符串

  jdbc:oracle:thin:@(DESCRIPTION = (ADDRESS_LIST = (load_balance=off)
(failover=on) (ADDRESS = (PROTOCOL = TCP) (Host = node1) (Port = 49005)) (ADDRESS = (PROTOCOL = TCP) (Host = node2) (Port = 49005)) ) 
(CONNECT_DATA = (SERVICE_NAME = app_service_primary)))