Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rac

1,733 views

Published on

  • Be the first to comment

  • Be the first to like this

Rac

  1. 1. Отказоустойчивость приложений в Oracle RAC<br />Игорь Мельников, Геннадий Сигалаев<br />Oracle Corp.<br />
  2. 2. План<br /><ul><li> Transparent Application Failover [TAF]
  3. 3. Демонстрация
  4. 4. TAF – API для разработчиков
  5. 5. Демонстрация
  6. 6. Fast Application Notification [FAN]
  7. 7. FAN – API для разработчиков
  8. 8. Демонстрация</li></li></ul><li>Transparent Application Failover<br />
  9. 9. Узел A отказал, пользователи <br />переключаются<br />Node<br />A<br />Node<br />A<br />Node<br />B<br />Node<br />B<br /><ul><li>Transparent Application Failover (TAF) обеспечивает защиту от сбоя:
  10. 10. Oracle Client автоматически и прозрачно переключает на другой узел</li></li></ul><li>Нормальная ситуация<br />
  11. 11. TAF<br />Потеря текущего узла<br />
  12. 12. OLTP =<br /> (DESCRIPTION=<br /> (FAILOVER=ON|TRUE|YES)<br /> (ADDRESS=<br /> (PROTOCOL=tcp)(HOST=rac1-vip) PORT=1521)) <br /> (PROTOCOL=tcp)(HOST=rac2-vip) PORT=1521))<br /> (LOAD_BALANCE=yes) <br /> (CONNECT_DATA=<br /> (SERVICE_NAME=oltp) <br /> (FAILOVER_MODE=<br /> (TYPE=session) <br /> (METHOD=basic)<br />(RETRIES=20)<br /> (DELAY=3))))<br />Oracle Net ожидает 3 сек. перед попыткой нового соединения.<br />Oracle Net делает 20 попыток соединения.<br />
  13. 13. <ul><li>TAF сохраняет или восстанавливает:
  14. 14. Соединение между клиентом и сервером
  15. 15. Подготовленные SQL команды
  16. 16. Активные курсоры (команда select), начавшие возвращать результат выполнения
  17. 17. TAF не сохраняет и не защищает:
  18. 18. Активные транзакции
  19. 19. Серверные переменные PL/SQL пакетов
  20. 20. Приложения не использующие OCI8
  21. 21. Состояние сессии пользователя (команды alter session)</li></li></ul><li><ul><li>Для всех незафиксированных транзакций, командыinsert, update и delete
  22. 22. Возникает исключение ORA-25402: transaction must roll back
  23. 23. Приложение должно явно сделать откат (rollback)
  24. 24. Приложение должно повторить транзакцию
  25. 25. FAILOVER_TYPE = SELECT
  26. 26. Если были только операторы SELECT
  27. 27. Для больших запросов, пользователь не заметит сбоя в работе</li></li></ul><li>Д е м о н с т р а ц и я<br />Transparent Application Failover<br />(тип SELECT)<br />
  28. 28. rac1<br />rac2<br />Oracle RAC on OVM<br />Oracle VM Server (XEN)<br />Oracle Real Application Clusters 11.1.0.7<br />Oracle Database 11.1.0.7<br />Oracle Clusterware 11.1.0.7<br />Enterprise Linux Release 5 Update 4 x86<br />Oracle Real Application Clusters 11.1.0.7<br />Oracle Database 11.1.0.7<br />Oracle Clusterware 11.1.0.7<br />Enterprise Linux Release 5 Update 4 x86<br />Public Network<br />Physical NIC with<br />VM bridged protocol<br />Interconnect<br />Physical Intel<br />Dual Core 2 Gz<br />OpenFiler<br />Voting<br />OCR<br />PhysicalRAM <br />4096Mb<br />Database<br />
  29. 29. SQL&gt; SELECT * FROM emp where dep_no = :x;<br />empno name<br />------- -------<br />7369 Smith<br />7499 Allen<br />7521 Ward<br />7566 Jones<br />7654 Martin<br />7698 Blake<br />Экземпляр 1<br /><ul><li> Oracle Client хранит: переменные привязки число прочитанных строк
  30. 30. контрольную сумму прочитанных строк
  31. 31. SCN начала запроса !</li></ul>Oracle Client :<br /><ul><li> посылает запрос на старый SCN
  32. 32. “тихо”fetch-ит 3 записи
  33. 33. считает контрольную сумму прочитанных строк
  34. 34. сравнивает с старой !</li></ul>Экземпляр2<br />Разрыв соединения<br />
  35. 35. Transparent Application Failover<br />API для разработчиков<br />
  36. 36. Java TAF Callback<br />Создаем экземпляробр. вызова<br />CallBackfcbk= new CallBack();<br /> ::<br />((OracleConnection)conn).registerTAFCallback(fcbk, msg);<br /> ::<br />class CallBack implements OracleOCIFailover { <br /> public intcallbackFn (Connection conn, Object ctxt, int type, int event) {<br /> ::<br /> switch (event) {<br /> case FO_BEGIN:<br />Регистрируем его<br />Реализуем обратный вызов<br />Реагируем на сбой<br />
  37. 37. Пример на C# (для .NET-приложений)<br />public static FailoverReturnCodeOnFailover(object sender,<br />OracleFailoverEventArgseventArgs) {<br /> switch (eventArgs.FailoverEvent) {<br /> case FailoverEvent.Begin :<br /> ::<br />case FailoverEvent.End :<br /> ::<br /> … … … …<br />con.Failover += new OracleFailoverEventHandler(OnFailover);<br />
  38. 38. Д е м о н с т р а ц и я<br />TAF-Callback для обеспечения непрерывности работы приложения<br />
  39. 39. Procedure TTAFDemo.makeTransaction1;<br />Begin<br />FStepNo := 1;<br /> FSession.ExecSQLEx(&apos;begin :v_xCDR_Id := tafdemo.saveCDR …<br />… … … … …<br />FSession.Commit;<br />End;<br />Procedure TTAFDemo.makeTransaction2;<br />Begin<br />FStepNo := 2;<br /> FSession.ExecSQLEx(&apos;begin tafdemo.billCall(:v_xCDR_Id ) …<br />… … … … …<br />FSession.Commit;<br />End;<br />
  40. 40. Обработчик исключения восстанавливает контекст сессии и повторяет сбойную транзакцию<br />case FailoverState of<br />… … … … …<br /> fsEnd : Begin<br /> v_gConsole.WriteLine(&apos;Failover End’);<br /> Raise ETAFException.Create(&apos;TAF&apos;);<br /> End;<br /> … … … … …<br /> else<br /> v_gConsole.WriteLine(&apos;Bad Failover’);<br /> end;<br /> End;<br />
  41. 41. Восстанавливаем контекст сессии<br />Procedure TTAFDemo.ProcessFailover;<br />Begin<br />FSession.Rollback;<br /> FSession.ExecSQLEx(&apos;alter session set nls_date_format=&apos;&apos;dd.mm.yyyy hh24:mi:ss&apos;&apos;&apos;,[]);<br /> FSession.ExecSQLEx(&apos;begin tafdemo.init; end;&apos;,[]);<br /> Case FStepNo Of<br />1 : Begin<br /> makeTransaction1;<br /> makeTransaction2;<br /> End;<br /> 2 : makeTransaction2;<br />End;<br />End;<br />Повторяем потерянные транзакции<br />
  42. 42. Fast Application Notification<br />
  43. 43. Что такое FAN<br /><ul><li>Технология для посылки сообщений о состоянии компонентов RAC:
  44. 44. Изменение статуса: узла, сервиса, экземпляра, СУБД
  45. 45. Событие FAN включает в себя информацию о событии: что изменилось, где и когда
  46. 46. Возможность определения FAN-callback на стороне клиента
  47. 47. Подписчики получают сообщения FAN через AQ или ONS
  48. 48. FAN интегрирован в JDBC, OCI, ODP.Net, Listeners</li></li></ul><li>FAN-callback (C# - для .NET-приложений)<br />public static void OnFANEventHandler(OracleHAEventArgs eventArgs)<br />{<br /> lock(typeof(FANCallBackSample))<br /> {<br /> if (eventArgs.Status == OracleHAEventStatus.Down)<br /> ... ... ... <br /> }<br />}<br />... ... ...<br />OracleDependency.Port = 2009;<br />v_xConn.HAEvent += newOracleHAEventHandler(OnFANEventHandler);<br />
  49. 49. Д е м о н с т р а ц и я<br />Получение FAN-сообщений в .NET<br />
  50. 50. Презентация и исходные тексты демо-примеров:<br />http://dsvolk.blogspot.com<br />
  51. 51. Игорь Мельников, Геннадий Сигалаев <br />Oracle Сorp.<br />Email: <br />Igor.Melnikov@oracle.com<br />Gennady.Sigalaev@oracle.com<br />
  52. 52. 26<br />

×