9 сент. 2012 г.

SQL*Net and Infiniband SDP for highspeed network

В среде RAC, в некоторых случаях, может потребоваться иметь отдельную выделенную подсеть для подключения клиентов. Например: помимо обычных GUI-приложений, через которые пользователи подключаются к СУБД напрямую, есть мощный кластер серверов приложений, работающий на отдельном выделенном оборудовании, и порождающий интенсивный SQL*Net-трафик. В этом случае, будет хорошей идеей сделать выделенную высокоскоростную подсеть для связи СУБД и сервера приложений.

Подробно процедура настройки сети описана в документе Multiple Public Networks in Private Database Clouds. При попытке претворить эту идею в жизнь вдруг выясняется (раздел 8.2 вышеприведенного документа), что scan-листенер поддерживает перенаправление запросов на соединение только внутри публичной сети по умолчанию (public default network).

Поэтому, для подключения к СУБД через дополнительную подсеть, требуется использовать старый синтаксис (до RAC 11.2) в дескрипторе соединения, с указанием всех узлов кластера.

В качестве примера, рассмотрим настройку SQL*Net-соединения программно-аппаратного комплекса Oracle Exalogic Elastic Cloud подключенного по протоколу Infiniband к SPARC SuperCluster. На фотографии показана вся система в целом, в центре - Exadata Storage Expansion Rack

Первый вопрос который возникает: поддерживается ли протокол SDP в случае когда сервер СУБД работает на SPARC Solaris (узла внутри Sun Super Cluster), а клиент на платформе Linux x64 (узлы внутри Exalogic)?
Документация утверждает, что SDP поддерживается, но при этом ни слова не говорится о платформе (работает на всех платформах ?). Документ MOS "Sqlnet support for the Infiniband SDP protocol [ID 1352737.1]", корректирует информацию, говоря о том, что поддержка Infiniband SDP для SQL*Net есть только для Linux. Позже выяснилось, что документ этот уже устарел, и его еще не успели поправить: поддержка Infiniband SDP для SQL*Net есть также и для Sun Solaris!

По инструкции, описанной в документе "Multiple Public Networks in Private Database Clouds" в Grid Infrastructure была зарегистрирована новая подсеть для SDP и на каждом узле был создан соответствующий листенер.
Настройки листенера выглядят следующим образом (пример с 4-ого узла Super Cluster):
oracle@ssca04:~$ lsnrctl status listener_ib

LSNRCTL for Solaris: Version 11.2.0.3.0 - Production on 09-SEP-2012 21:10:56

Copyright (c) 1991, 2011, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_IB)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER_IB
Version                   TNSLSNR for Solaris: Version 11.2.0.3.0 - Production
Start Date                08-SEP-2012 20:15:19
Uptime                    1 days 0 hr. 55 min. 37 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/11.2.0.3/grid/network/admin/listener.ora
Listener Log File         /u01/app/11.2.0.3/grid/log/diag/tnslsnr/ssca04/listener_ib/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER_IB)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=sdp)(HOST=192.168.11.27)(PORT=1522)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.11.27)(PORT=1522)))
The listener supports no services
The command completed successfully
Для регистрации экземпляра в scan и локальных листенерах применяются параметры LOCAL_LISTENER и REMOTE_LISTENER. В случае, когда регистрация экземпляра необходима в нескольктих листенерах работающих в разных подсетях, нужно применять другой параметр - LISTENER_NETWORKS.

Предварительно, в файле tnsnames.ora на каждом узла кластера, были определены следующих четыре дескриптора (пример для 4-ого узла):
LISTENER_IPLOCAL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca04-vip)(PORT = 1521
))
  )

#LISTENER_IPREMOTE =
#  (DESCRIPTION =
#    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca-scan.osc.uk.oracle.com)(PORT = 1521
))
#  )

LISTENER_IPREMOTE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 138.3.16.87)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 138.3.16.88)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 138.3.16.89)(PORT = 1521))
  )

LISTENER_IBREMOTE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca01-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca02-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca03-ibvip)(PORT = 1522))
  )

LISTENER_IBLOCAL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ssca04-ibvip)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = ssca04-ibvip)(PORT = 1522))
  )
Алиасы LISTENER_IPREMOTE и LISTENER_IPLOCAL предназначены для регистрации экземпляров в обычной сети Gigabit-Ethernet. Обратите внимание, что в алиасе LISTENER_IPREMOTE указано не scan-имя кластера, а все три IP-адреса скан-листенеров!
Проблема связана с тем, что PMON НЕ производил разыименование имени в три адреса, а регистрировал экземпляр только в одном скан-листенере. Скорее всего это баг, с которым к сожалению не было времени разбираться.

Алиасы LISTENER_IBREMOTE и LISTENER_IBLOCAL предназначены для регистрации экземпляров в Infiniband SDP-сети.

Рис. 1 Infiniband-кабели подключенные к Exalogic (оранжевые провода - оптические кабели 10Gb Ethernet)

Определяем параметр LISTENER_NETWORKS, предварительно выключая параметры LOCAL_LISTENER и REMOTE_LISTENER:

SQL> alter system reset local_listener scope=both sid='*';

System altered.

SQL> alter system reset remote_listener scope=both sid='*';

System altered.
 
SQL> alter system set 
listener_networks='((NAME=network2)(LOCAL_LISTENER=LISTENER_IBLOCAL)(REMOTE_LISTENER=LISTENER_IBREMOTE))', 
                  '((NAME=network1)(LOCAL_LISTENER=LISTENER_IPLOCAL)(REMOTE_LISTENER=LISTENER_IPREMOTE))' scope=spfile sid='*';

System altered.

SQL> 

Параметр LISTENER_NETWORKS не динамический - после его изменения требуется перезагрузка всех экземпляров кластера.


Рис. 2 Exadata Storage Expansion Rack (суммарная "сырая" емкость 128Тб !)

Как уже было отмечено ранее, на узлах Exalogic, для подключения к СУБД по протоколу SDP, нужно использовать синтаксис с перечислением всех узлов (перенаправление через скан-листенер в Infiniband-сети не работает):
mydb =
  (DESCRIPTION =
    (LOAD_BALANCE=YES)
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.24)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.25)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.26)(PORT = 1522))
    (ADDRESS = (PROTOCOL = SDP)(HOST = 192.168.11.27)(PORT = 1522))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

Использование протокола Infiniband SDP позволяет обеспечить очень высокую пропускную способность сети между сервером приложений и СУБД. Это дает возможность еще больше увеличить скорость работы приложений в среде программно-аппаратных комплексов Oracle.

В следующей серии: распараллеливание создания резервной копии с помощью RMAN по протоколу SDP, с всех узлов кластера.