Top Banner
Отказоустойчивость приложений в Oracle RAC Игорь Мельников, Геннадий Сигалаев Oracle Corp.
26

Rac

Jun 16, 2015

Download

Documents

HighLoad2009
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Rac

Отказоустойчивость приложений в Oracle RAC

Игорь Мельников, Геннадий СигалаевOracle Corp.

Page 2: Rac

План• Transparent Application Failover [TAF]

• Демонстрация• TAF – API для разработчиков

• Демонстрация• Fast Application Notification [FAN]• FAN – API для разработчиков

• Демонстрация

Page 3: Rac

Transparent Application Failover

Page 4: Rac

• Transparent Application Failover (TAF) обеспечивает защиту от сбоя:– Oracle Client автоматически и прозрачно

переключает на другой узел

Node

A

Node

B

Node

A

Node

B

Узел A отказал, пользователи

переключаются

Page 5: Rac

Нормальная ситуация

Page 6: Rac

TAF

Потеря текущего узла

Page 7: Rac

OLTP = (DESCRIPTION= (FAILOVER=ON|TRUE|YES) (ADDRESS= (PROTOCOL=tcp)(HOST=rac1-vip) PORT=1521)) (PROTOCOL=tcp)(HOST=rac2-vip) PORT=1521)) (LOAD_BALANCE=yes) (CONNECT_DATA= (SERVICE_NAME=oltp) (FAILOVER_MODE= (TYPE=session) (METHOD=basic) (RETRIES=20) (DELAY=3))))

Oracle Net ожидает 3 сек. перед попыткой нового соединения.

Oracle Net делает 20 попыток соединения.

Page 8: Rac

• TAF сохраняет или восстанавливает: – Соединение между клиентом и сервером– Подготовленные SQL команды – Активные курсоры (команда select), начавшие возвращать

результат выполнения

• TAF не сохраняет и не защищает: – Активные транзакции– Серверные переменные PL/SQL пакетов

– Приложения не использующие OCI8 – Состояние сессии пользователя (команды alter session)

Page 9: Rac

• Для всех незафиксированных транзакций, команды insert, update и delete

• Возникает исключение ORA-25402: transaction must roll back

• Приложение должно явно сделать откат (rollback)• Приложение должно повторить транзакцию

• FAILOVER_TYPE = SELECT

– Если были только операторы SELECT– Для больших запросов, пользователь не заметит сбоя в

работе

Page 10: Rac

Д е м о н с т р а ц и я

Transparent Application Failover(тип SELECT)

Page 11: Rac

Oracle VM Server (XEN)

Oracle RAC on OVM

rac1 rac2Interconnect

Public Network

Physical NIC withVM bridged protocol

Physical IntelDual Core 2 Gz

Physical RAM 4096Mb

OpenFiler

Oracle Real Application Clusters 11.1.0.7Oracle Database 11.1.0.7Oracle Clusterware 11.1.0.7Enterprise Linux Release 5 Update 4 x86

Oracle Real Application Clusters 11.1.0.7Oracle Database 11.1.0.7Oracle Clusterware 11.1.0.7Enterprise Linux Release 5 Update 4 x86

Voting

OCR

Database

Page 12: Rac

SQL> SELECT * FROM emp where dep_no = :x;

empno name------- -------7369 Smith7499 Allen7521 Ward7566 Jones7654 Martin7698 Blake

Разрыв соединения

Экземпляр 1

Экземпляр 2

• Oracle Client хранит: переменные привязки число прочитанных строк

• контрольную сумму прочитанных строк

• SCN начала запроса !

Oracle Client :• посылает запрос на

старый SCN• “тихо” fetch-ит 3 записи• считает контрольную

сумму прочитанных строк

• сравнивает с старой !

Page 13: Rac

Transparent Application Failover

API для разработчиков

Page 14: Rac

Java TAF CallbackCallBack fcbk= new CallBack(); ::((OracleConnection)conn).registerTAFCallback(fcbk,

msg); ::class CallBack implements OracleOCIFailover { public int callbackFn (Connection conn, Object

ctxt, int type, int event) { :: switch (event) { case FO_BEGIN:

Создаем экземпляр обр. вызова

Регистрируем его

Реализуем обратный вызов

Реагируем на сбой

Page 15: Rac

Пример на C# (для .NET-приложений) public static FailoverReturnCode OnFailover(object sender, OracleFailoverEventArgs eventArgs) { switch (eventArgs.FailoverEvent) { case FailoverEvent.Begin : :: case FailoverEvent.End : ::

… … … …con.Failover += new OracleFailoverEventHandler(OnFailover);

Page 16: Rac

Д е м о н с т р а ц и я

TAF-Callback для обеспечения непрерывности работы приложения

Page 17: Rac

Procedure TTAFDemo.makeTransaction1;Begin FStepNo := 1; FSession.ExecSQLEx('begin :v_xCDR_Id := tafdemo.saveCDR …

… … … … … FSession.Commit;End;

Procedure TTAFDemo.makeTransaction2;Begin FStepNo := 2; FSession.ExecSQLEx('begin tafdemo.billCall(:v_xCDR_Id ) …

… … … … … FSession.Commit;End;

Page 18: Rac

case FailoverState of … … … … … fsEnd : Begin v_gConsole.WriteLine('Failover End’); Raise ETAFException.Create('TAF'); End;

… … … … … else v_gConsole.WriteLine('Bad Failover’); end; End;

Обработчик исключения восстанавливает контекст сессии и повторяет сбойную транзакцию

Page 19: Rac

Procedure TTAFDemo.ProcessFailover;Begin FSession.Rollback; FSession.ExecSQLEx('alter session set

nls_date_format=''dd.mm.yyyy hh24:mi:ss''',[]);

FSession.ExecSQLEx('begin tafdemo.init; end;',[]);

Case FStepNo Of 1 : Begin makeTransaction1; makeTransaction2; End; 2 : makeTransaction2; End;End;

Восстанавливаем контекст сессии

Повторяем потерянные транзакции

Page 20: Rac

Fast Application Notification

Page 21: Rac

• Технология для посылки сообщений о состоянии компонентов RAC:– Изменение статуса: узла, сервиса, экземпляра, СУБД

• Событие FAN включает в себя информацию о событии: что изменилось, где и когда

• Возможность определения FAN-callback на стороне клиента

• Подписчики получают сообщения FAN через AQ или ONS• FAN интегрирован в JDBC, OCI, ODP.Net, Listeners

Что такое FAN

Page 22: Rac

public static void OnFANEventHandler(OracleHAEventArgs eventArgs)

{ lock(typeof(FANCallBackSample)) { if (eventArgs.Status == OracleHAEventStatus.Down) ... ... ... }}... ... ...OracleDependency.Port = 2009;v_xConn.HAEvent += new OracleHAEventHandler(OnFANEventHandler);

FAN-callback (C# - для .NET-приложений)

Page 23: Rac

Д е м о н с т р а ц и я

Получение FAN-сообщений в .NET

Page 24: Rac

http://dsvolk.blogspot.com

Презентация и исходные тексты демо-примеров:

Page 25: Rac

Игорь Мельников, Геннадий Сигалаев Oracle Сorp.

Email: [email protected]@oracle.com

Page 26: Rac

26