Отказоустойчивость приложений в Oracle RAC Игорь Мельников, Геннадий Сигалаев Oracle Corp.
Отказоустойчивость приложений в Oracle RAC
Игорь Мельников, Геннадий СигалаевOracle Corp.
План• Transparent Application Failover [TAF]
• Демонстрация• TAF – API для разработчиков
• Демонстрация• Fast Application Notification [FAN]• FAN – API для разработчиков
• Демонстрация
Transparent Application Failover
• Transparent Application Failover (TAF) обеспечивает защиту от сбоя:– Oracle Client автоматически и прозрачно
переключает на другой узел
Node
A
Node
B
Node
A
Node
B
Узел A отказал, пользователи
переключаются
Нормальная ситуация
TAF
Потеря текущего узла
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 попыток соединения.
• TAF сохраняет или восстанавливает: – Соединение между клиентом и сервером– Подготовленные SQL команды – Активные курсоры (команда select), начавшие возвращать
результат выполнения
• TAF не сохраняет и не защищает: – Активные транзакции– Серверные переменные PL/SQL пакетов
– Приложения не использующие OCI8 – Состояние сессии пользователя (команды alter session)
• Для всех незафиксированных транзакций, команды insert, update и delete
• Возникает исключение ORA-25402: transaction must roll back
• Приложение должно явно сделать откат (rollback)• Приложение должно повторить транзакцию
• FAILOVER_TYPE = SELECT
– Если были только операторы SELECT– Для больших запросов, пользователь не заметит сбоя в
работе
Д е м о н с т р а ц и я
Transparent Application Failover(тип SELECT)
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
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 записи• считает контрольную
сумму прочитанных строк
• сравнивает с старой !
Transparent Application Failover
API для разработчиков
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:
Создаем экземпляр обр. вызова
Регистрируем его
Реализуем обратный вызов
Реагируем на сбой
Пример на C# (для .NET-приложений) public static FailoverReturnCode OnFailover(object sender, OracleFailoverEventArgs eventArgs) { switch (eventArgs.FailoverEvent) { case FailoverEvent.Begin : :: case FailoverEvent.End : ::
… … … …con.Failover += new OracleFailoverEventHandler(OnFailover);
Д е м о н с т р а ц и я
TAF-Callback для обеспечения непрерывности работы приложения
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;
case FailoverState of … … … … … fsEnd : Begin v_gConsole.WriteLine('Failover End’); Raise ETAFException.Create('TAF'); End;
… … … … … else v_gConsole.WriteLine('Bad Failover’); end; End;
Обработчик исключения восстанавливает контекст сессии и повторяет сбойную транзакцию
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;
Восстанавливаем контекст сессии
Повторяем потерянные транзакции
Fast Application Notification
• Технология для посылки сообщений о состоянии компонентов RAC:– Изменение статуса: узла, сервиса, экземпляра, СУБД
• Событие FAN включает в себя информацию о событии: что изменилось, где и когда
• Возможность определения FAN-callback на стороне клиента
• Подписчики получают сообщения FAN через AQ или ONS• FAN интегрирован в JDBC, OCI, ODP.Net, Listeners
Что такое FAN
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-приложений)
Д е м о н с т р а ц и я
Получение FAN-сообщений в .NET
http://dsvolk.blogspot.com
Презентация и исходные тексты демо-примеров:
Игорь Мельников, Геннадий Сигалаев Oracle Сorp.
Email: [email protected]@oracle.com
26