П.А. Булкатов
МосБизнесБанк, тел. 924-48-94
Стремительный рост локальной сети организации, закупка различных аппаратных платформ и системного программного обеспечения, пакетов различных фирм для автоматизации отдельных операций привели к накоплению большого количества вычислительной техники. По мере усложнения и появления новых задач, отказу от ранее использовавшихся приложений назрела необходимость повторно использовать имеющееся оборудованме с новым программным обеспечением в рамках развивающейся локальной сети организации. Исторически сложилось так, что основными операционными системами у нас стали UNIX и Novell Netware. Поэтому естественно, что далее речь пойдет о сетевых протоколах TCP/IP и SPX/IPX.
Одним из средств для создания приложений, работающих в различных средах, в том числе и в указанных выше, является СУБД ORACLE.
С появлением в организации серверов баз данных ORACLE, работающих в среде UNIX и Netware, возник соблазн распределить данные между серверами так, чтобы пользователь воспринимал их как единую базу данных (distributed database). Для успешной работы такой схемы организации данных необходимо обеспечить прозрачное соединение и обмен данными между клиентами и серверами, а также напрямую между серверами независимо от используемого протокола и операционной системы. Такое соединение призван обеспечить компонент ORACLE SQL*Net. SQL*Net - это сетевой интерфейс, который позволяет общаться клиентским приложениям Oracle с ядром Oracle на сервере базы данных. SQL*Net поддерживает множество сетевых протоколов и операционных систем.
Это делает возможным для клиентского приложения получение данных от различных серверов баз данных в гетерогенной сети.
SQL*Net является частью сетевого программного обеспечения, установленного на сервере и на клиенте и покрывает, в терминах семиуровневой OSI модели, уровни сессии(5), представления(6) и проложения(7). SQL*Net на клиенте и на сервере включает в себя драйвер, соответствующий используемому сетевому протоколу, а для того, чтобы клиент и сервер могли "общаться" между собой, на них должен быть загружен один и тот же драйвер SQL*Net.
Поэтому очевидно, что имевшиеся в момент постановки задачи создания распределенной базы данных драйверы SQL*Net TCP/IP v1 для ОС UNIX и SQL*Net SPX v1 для Novell Netware непосредственно проблему не решали. Итак, задача состоит в обеспечении DOS-клиенту возможности доступа к базе данных ORACLE независимо от того, расположена ли она на UNIX-сервере или на сервере Netware. Кроме того, в ряде случаев оказывается полезным прямой обмен сервер-сервер.
Данная статья основана на опыте двухлетней практической работы, выполнявшейся на двухсерверном распределенном комплексе вначале с использованием только ORACLE v.6 и SQL*NET v.1. Результаты этого этапа работы докладывались на семинаре Российской Ассоциации пользователей ORACLE и, как показали отклики, вызвали интерес аудитории. После появления в нашем распоряжении ORACLE7 и SQL*NET v.2, а также после выполнения дополнительных работ по развитию и настройке других сетевых компонентов были получены новые и более удовлетворительные результаты. Однако автору кажется полезным изложить всю совокупность результатов, так как многие продолжают работать с ORACLE v.6, а на платформе MS DOS именно эта версия продолжает работать и будет жить достаточно длительное время.
Изложим результаты в виде последовательности вариантов решения задачи по объединению серверов и клиентов, располагающихся на разных платформах.
В общем случае задача состоит в необходимости обеспечить DOS-клиенту доступ к базе данных ORACLE независимо от того, расположена ли она на UNIX-сервере или на NetWare-сервере. Кроме того, в ряде случаев оказывается полезным прямой обмен сервер-сервер. Рассмотрим возможные пути решения с использованием SQL*NET v.1 и SQL*NET v.2.
Использование ORACLE v.6 и SQL*NET v.1 для протоколов TCP/IP и SPX/IPX
Рассматрим расположение полной базы данных предприятия на двух серверах: UNIX-сервере или на NetWare-сервере. В конфигурации кроме серверов присутствуют только клиентские машины или станции, которые могут физически находиться на различном расстоянии от серверов и быть отделенными от них различным числом репитеров и Т-коннекторов. Машины-клиенты работают под управлением MS-DOS.
В такой конфигурации SQL*NET v.1 предоставляет два возможных пути решения задачи. Первое решение заключается в одновременном использовании протоколов TCP/IP и IPX/SPX на машине-клиенте. При этом DOS-клиент получает возможность подсоединяться либо к базе данных ORACLE/UNIX используя SQL*NET с адаптером TCP/IP, либо к базе данных ORACLE/ Netware используя SQL*NET-адаптер SPX. Обмен информацией между серверами c использованием оператора DATABASE LINK в данной ситуации невозможен. Недостатком также является неэффективное использование оперативной памяти на машине-клиенте вследствие загрузки дополнительного адаптера в стек протоколов.
Рисунок 1.
ORACLE v.6, загрузка двухпротокольного стека на машине-клиенте.
Получить одновременный доступ к данным клиент может только запустив RDBMS для DOS. Передача данных через локальную базу данных клиента оказывается при этом весьма длительной и неэффективной процедурой.
Второе решение заключается в установке на сервере Netware адаптера протокола TCP/IP и пакета SQL*NET TCP/IP для Netware. Пакет включает в себя сервер SQL*NET TCPSRV.NLM и драйвер SQL*NET SQLTCP.NLM для NetWare. Создав в БД ORACLE/Netware SQL*NET TCP/IP LINK к базе ORACLE/UNIX, DOS-клиент, будучи подсоединенным к базе данных Netware по протоколу SPX или TCP/IP, получит возможность читать данные из базы ORACLE/UNIX. Аналогично, будучи подсоединенным к БД ORACLE/UNIX, клиент получает доступ на чтение к БД ORACLE/NetWare. Возможен прямой обмен данными между серверами UNIX и NetWare при работе с консоли или с клиента. Клиент имеет возможность использовать SQL*NET TCP/IP DATABASE LINK между NetWare и Unix серверами, даже если клиент подсоединен к БД ORACLE/NetWare по протоколу SPX. Таким образом, появляется реальная возможность распределять объекты базы данных между серверами Unix и NetWare и включать в функционирующий комплекс на ORACLE NetWare готовые прикладные компоненты, которые поставляются на рынок программных средств оформленными чаще всего для среды UNIX.
Рисунок 2.
ORACLE v.6, загрузка двухпротокольного стека на сервере NetWare.
Вместе с тем, у этого решения есть два недостатка. Это решение требует дополнительных затрат на приобретение продукта SQL*NET TCP/IP для Netware, который не входит в стандартную поставку ORACLE для UNIX и ORACLE для Netware. Другим недостатком является необходимость загрузки дополнительного стека протоколов на сервере. Однако в процессе эксплуатации не удалось полностью отказаться от протокола SPX, хотя, как показано выше, для работы в сети протокола TCP/IP оказывается достаточно как для работы с NetWare-сервером, так и для работы с UNIX-сервером. Причины этого изложены ниже.
Рисунок 3.
ORACLE v.7, использование двух протоколов в простом соединении.
Проблемы использования SQL*NET v.1 для протоколов TCP/IP и SPX/IPX.
Основной причиной невозможности ограничиться SQL*NET TCP/IP стала ошибка ORA-6108 . В документации фирмы ORACLE она трактуется как невозможность установить связь SQL*NET TCP/IP с хост-компьютером из-за того , что на хост-компьютере не запущен процесс ORASRV или поврежден кабель Ethernet. Ошибка возникает особенно часто на наиболее удаленных от хост-машины рабочих станциях (но удовлетворяющих при этом ограничениям на длину сегмента кабеля Thin Ethernet, число репиторов и т.д.), при этом другие сетевые клиенты продолжают успешно работать, что говорит о том, что процесс ORASRV запущен. На клиентской машине, на которой возникла ошибка, продолжают нормально работать такие программы,как ftp (программа передачи файлов), tnvt и др., использующие протокол TCP/IP. Ошибка пропадает на некоторое время при перезагрузке процесса ORASRV. Использование протокола SPX на этих клиентских машинах при работе с сервером Netware сняло эту проблему.
Вообще, эксплуатация программного комплекса в сети с магистральным кабелем Thin Ethernet показала высокую аварийность и сложность локализации неисправностей в ней, а также большую по сравнению с TCP/IP устойчивость протокола SPX к неприятностям типа "плохой контакт в Т-коннекторе". Витая пара представляется в этом смысле более приемлемым решением.
Другой проблемой при работе с ORACLE-сервером по протоколу TCP/IP совместно с пакетом PC TCP для DOS является зависание машины-клиента при запуске с нее из среды SQL*PLUS программного блока, написанного на языке PL/SQL и содержащего более 300 строк программного кода. Если же этот код оформить в виде процедуры в SQL*FORMS, то зависания машины-клиента не происходит.
Надо отметить, что зависания машины-клиента не происходит при работе с пакетом Excelan LAN WorkPlace для MS-DOS, а также при работе по протоколу SPX. Вместе с тем, в процессе работы с сервером NetWare по протоколу SPX было выявлено, что многократное подряд нажатие комбинации CTRL+BREAK на клавиатуре клиента при попытке прервать выполнение какой либо операции с базой данных может привести к краху операционной системы сервера с ошибкой "Получен неверный пакет".
Использование ORACLE7 и SQL*NET v.2
Корпорация Oracle в настоящее время прекратилила сопровождать SQL*NET v.1 и переключилась на продукт SQL*NET v.2 , обладающий более широкими функциональными возможностями. SQL*NET v.2 совместно с продуктом Oracle MPI (MultiProtocol Interchange) может быть использован для организации связи между компьютерами с разными сетевыми протоколами.
Конфигурация компонента SQL*NET Listener (которая поддерживает протоколы Appletalk, Async, Banyan, DECnet, LU6.2, Named Pipes, NetBIOS, OSI, SPX/IPX, TCP/IP и др.) позволяет значительно уменьшить загрузку оперативной памяти машины и минимизирует дублирование кода при добавлении нового протокола. Продукт SQL*NET v.1 загружает новый компонент SQL*NET Listener для каждого поддерживаемого протокола. SQL*NET v.2 обеспечивает независимую от имени сетевого протокола и имени машины схему адресации. В результате команда установления соединения с сервером упрощается: если для SQL*NET v.1 соединение задается командой
CON-NECT SCOTT/TIGER@T: TEST:ORACLE
то для SQL*NET v.2 команда соединения выглядит проще:
CONNECT SCOTT/TIGER@ORACLE
При использовании SQL*NET v.2 и Oracle MPI с машины-клиента, использующей протокол SPX/IPX, можно получить доступ к серверу, использующему протокол TCP/IP, не устанавливая на клиенте двухпротокольный стек.
Необходимо отметить, что Oracle MPI является самостоятельным продуктом и продается отдельно от SQL*NET v.2. SQL*NET v.2 и Oracle MPI конфигурируются с помощью Oracle Network Manager. Oracle Network Manager, работающий только с SQL*NET v.2, предназначенный для администратора сети, дает возможность создавать и модифицировать все конфигурационные файлы, необходимые для работы SQL*NET. Oracle Network Manager поставляется вместе с сервером ORACLE7.
Использование ORACLE v.6 и SQL*NET v.1 в одной сети с ORACLE7 и SQL*NET v.2
Следует также отдельно остановиться на работе в сети, где присутствуют серверы и с ORACLE RDBMS v.6, и с ORACLE7 Server, а также используются сетевые компоненты как SQL*NET v.1, так и SQL*NET v.2. Приведенная на предыдущей странице таблица демонстрирует возможные комбинации SQL*NET v.1 и SQL*NET v.2.
Как видно из таблицы, продукты SQL*NET v.1 и v.2 могут быть установлены на клиенте и на сервере одновременнно.
Практически важным достоинством SQL*NET v.2 является возможность обнаруживать и выгружать возникшие вследствие аварийного завершения клиентского приложения "подвисшие" соединения с базой. Соответствующий компонент SQL*NET анализирует все соединения с базой данных на предмет их активности и при обнаружении "мертвых" соединений автоматически освобождает все соотвествующие им блокировки в базе данных и оперативную память, позволяя другим клиентам выполнять их транзакции без конфликтов.
Заключение
Практика, заставившая опробовать достаточно большое число вариантов организации гетерогенной сетевой среды с ORACLE NetWare-сервером и TCP/IP-сервером позволила выбрать следующие предпочтительные, на наш взгляд, решения:
- перейти от кабеля "тонкий" Ethernet к витой паре как существенно более надежной среде;
- отладить совместное использование ORACLE v.6 и SQL*NET v.1 в одной сети с ORACLE7 и SQL*NET v.2;
использовать сетевые компоненты двух версий не только на серверах, но и на клиентских машинах для сохранения полной совместимости со сделанными раньше прикладными программами.