Rac

1,655 views
1,550 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,655
On SlideShare
0
From Embeds
0
Number of Embeds
868
Actions
Shares
0
Downloads
21
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

×