Возврат кластера oracle veritas к основному узлу во время работы резервного

Я много искал свой вопрос, но похоже, что это не то, что обычно используется. Речь идет о кластере Oracle DB Veritas, который основан на 2 узлах, основном и резервном. Сценарий связан с клиентом, и мы не трогаем его в случае здравого смысла. Все это работает на JBoss6.4 и должно следовать следующей логике:

  1. Приложение подключено к основному узлу (node1)
  2. node1 отключается, и приложение подключается к резервному узлу (node2).
  3. node2 находится в режиме только для чтения, и согласно проекту node1 перезапускается и становится доступным через 2 минуты.
  4. Во время этого сбоя у приложения есть тайм-аут, прежде чем оно начнет отправлять контрольные сообщения.
  5. После того, как node1 будет запущен и запущен, кластер должен переключиться с node2 на node1, если node2 все еще работает.

Вопрос здесь в том, чтобы вернуть кластер обратно к node1, даже если node2 работает. Используемая строка подключения:

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 отключается. Есть ли какие-либо способы настроить соединение с источником данных, чтобы оно не возвращалось к основному узлу (node1), если оно доступно, учитывая, что node2 запущен и работает в режиме RO?

Заранее спасибо!

0
0
78
1

Ответы 1

Вы можете определить базу данных для подключения клиента, используя специальное имя службы. Например, в основном режиме в системном триггере при запуске базы данных. Вы можете динамически переопределить имя службы, выполнив команду

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)))

Другие вопросы по теме