Перейти к содержимому

23.04.2012

17

Настройка Ораклового двух-нодового кластера базы данных Oracle RAC 11gR2.

В этой статье, или серии статей, я расскажу, как поднять оракловый кластер 11gR2 из двух нод, и затем поднять на этом кластере базу данных и настроить отказоустойчивый сервис. В качестве основной ОС будем использовать Linux CentOS 5 x86_64.
Вся процедура состоит из нескольких последовательных этапов:

  1. Настройка окружения: настройка dns-сервера, выделение ip-адресов.
  2. Подготовка железа: серверы, массивы/хранилища. /* Опустим этот этап, ибо он будет специфичен в каждом случае */
  3. Подготовка операционной системы: установка необходимых пакетов, создание необходимых юзверей и структуры каталогов.
  4. Подготовка и конфигурирование ASM.
  5. Установка Oracle Grid Infrastructure 11gR2.
  6. Установка сервера базы данных Oracle RDBMS Server 11gR2.
  7. Создание cluster-based сервиса базы данных с TAF (Transparent-Application-Failover) и FAN (Fast Application Notification).
  8. Радость по поводу успешной настройки 🙂

Совсем немного теории.

Можно много и долго говорить о том, как строится оракловый кластер, на какие технологии и компоненты он опирается, но я не буду этого делать. Про это написано не одна тысяча страниц оракловой документации. Так что кому интересно поглубже вникнуть — предлагаю почитать на досуге 🙂 А я попробую рассказать это в двух словах.

Оракловый кластер (впрочем как и любой другой) состоит из нескольких нод/узлов. Каждый узел — это отдельный сервер. На каждом сервере должно быть не менее двух сетевых интерфейсов: один публичный и один интерфейс для интерконнекта. Так же необходимо хранилище данных, которое доступно всем нодам, и выделенное пространство является разделяемым (shared) между всеми нодами кластера. В качестве хранилища можно использовать разные варианты: nfs; общие диски, если вы настраиваете кластер на виртуальных машинах; iSCSI; ну и наверное самый очевидный для продакшн вариант — реальное хранилище, каким либо способом подключенное ко всем нодам, например оптикой.

С точки зрения софта, кластер функционирует следующим образом:
Все ноды в кластере с точки зрения ОС должны быть одинаковыми, то есть, например, если вы используете linux, значит на всех нодах должна стоять ось одной и то же битности, не допускается одновременное использование 32-х и 64-х битных узлов, и, конечно, крайне желательно одной и той же версии (странно, если кто-то делает по-другому). Далее, для корректного функционирования кластера, необходима конфигурация dns-сервера. Смысл конфигурации в том, что начиная с версии 11gR2, оракловый кластер использует механизм SCAN (Single Client Access Name). Смысле этой фичи в том, что все клиенты один раз настраиваются на обращение к одному hostname, который средствами dns сервера может резолвиться в несколько ip-адресов, на каждом из которых висит публичный LISTENER. Это так называемые виртуальные адреса кластера. Все listener’ы на публичных адресах перенаправляют запросы на локальные listener’ы, запущенные на частных адресах конкретных нод. Оракловое ПО clusterware, установленное на всех нодах кластера, умеет общаться между собой, используя для этого interconnect и public сеть и поэтому всегда есть актуальная информация о том, какие ноды сейчас доступы, и в случае падения например одной ноды, виртуальных listener, который физически был запущен на упавшей ноде автоматически поднимается на доступном узле, и соответственно все запросы уже перекидываются на честные listener’ы на доступных нодах. Так же можно настроить TAF (Transparent Application Failover), чтобы открытое соединение к базе данных автоматически средствами сервера перекидывалось на доступную ноду, даже без потери данных.

Такс, вернемся к узлам. На каждой ноде устанавливается Oracle Clusterware, начиная с 11-й версии это отдельный софт, и его желательно ставить из-под отдельного пользователя. Для функционирования Clusterware необходим так называемый voting disk, который должен быть доступен одновременно всем нодам. Лучше всего использовать ASM, и инициализировать ASM диски на расшаренном хранилище. Тогда и все данные БД можно будет так же расположить на ASM. Далее, на каждый узел ставится Oracle RDBMS Server.

Небольшое дополнение: я говорю, что весь софт ставится на каждую ноду, и многие могут подумать, что это означает ручную установку всего ПО на каждой ноде. Нет, это не так. Вы просто заводите на каждом сервере/ноде одинаковых пользователей, даете всем одинаковые пароли или публикуете публичные ключи, и запускаете установку софта только на одной ноде, а оракл уже сам поставит все и на другие ноды в кластере тоже.

Пожалуй, хватит теории, перейдем к практике!

Настройка dns.

Не буду расписывать как настроить сам dns-сервер. По этому поводу в инете полно материалов, а может быть даже в вашей мегакомпании есть отдельные сетевики/админы, которые вам все сделают 🙂 Поговорим про настройку dns в контексте кластера. Вот скрин того, что написано в документации оракл.

На каждую ноду надо по 3 адреса: собственный публичный адрес ноды, виртуальный адрес ноды, приватный адрес ноды для интерконнекта + минимум 3 адреса SCAN для кластера. Если хочется, можно приватные адреса нод прописать в /etc/hosts на каждом узле. Но имейте в виду, что если вы потом добавите еще ноды, то эту операцию придется снова повторить на каждой ноде. Так что лучше ве прописать в dns, тогда при необходимости все правки надо будет вносить всего лишь в одном месте. Вот примеры конфига named и djbdns.

# Кусок зоны для named

vmracnode1      IN      A       192.168.24.64
vmracnode2      IN      A       192.168.24.65
vmracnode1-vip  IN      A       192.168.24.34
vmracnode2-vip  IN      A       192.168.24.45
vmrac-scan      IN      A       192.168.24.69
vmrac-scan      IN      A       192.168.24.70
vmrac-scan      IN      A       192.168.24.71
vmracnode1-priv IN      A       10.0.0.2
vmracnode2-priv IN      A       10.0.0.3


# Кусок зоны для djbdns
=n1.rac:192.168.204.11:86400
=n2.rac:192.168.204.12:86400
=n1-vip.rac:192.168.204.13:86400
=n2-vip.rac:192.168.204.14:86400
=rac-scan.rac:192.168.204.15:86400
+rac-scan.rac:192.168.204.16:86400
+rac-scan.rac:192.168.204.17:86400
=n1-priv.rac:10.0.0.1:86400
=n2-priv.rac:10.0.0.2:86400

Идем дальше.

Подготовка операционной системы.

Первым делом надо установить необходимые пакеты, прописать/изменить необходимые параметры ядра и все такое прочее. С недавних пор у Оракл есть замечательный пакет oracle-validated, который упрощает всю эту процедуру и берет часть работы на себя. Крайне рекомендую им воспользоваться. Этот пакет доступен на oss.oracle.com/el5/oracle-validated/. Я скачал этот пакет и сразу положил его в свой локальный yum-репозиторий, чтобы он всегда был под рукой, да и при установке через yum автоматически удовлетворятся все зависимости. Итак, ставим oracle-validated на каждой ноде. Он доставит необходимые пакеты, добавит необходимые опции ядра в /etc/sysctl.conf, и даже добавит пользователя oracle, который нам в дальнейшем пригодится.

[13:47] cmd#:140
root@racnode1: ~# yum install --nogpgcheck oracle-validated
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package oracle-validated.x86_64 0:1.0.0-24.el5 set to be updated
falcon-repo/filelists                                                                                                                                                                                                                                  | 3.5 MB     00:00    
--> Processing Dependency: /usr/lib64/libodbccr.so for package: oracle-validated
--> Processing Dependency: libXp.so.6 for package: oracle-validated
--> Processing Dependency: /usr/lib/libXtst.so.6 for package: oracle-validated
--> Processing Dependency: sysstat for package: oracle-validated
--> Processing Dependency: xorg-x11-utils for package: oracle-validated
--> Processing Dependency: /usr/lib/libaio.so for package: oracle-validated
--> Processing Dependency: compat-gcc-34-c++ for package: oracle-validated
--> Processing Dependency: libstdc++.so.5 for package: oracle-validated
--> Processing Dependency: libaio-devel for package: oracle-validated
--> Processing Dependency: /usr/lib/libodbccr.so for package: oracle-validated
--> Processing Dependency: compat-gcc-34 for package: oracle-validated
--> Processing Dependency: unixODBC-devel for package: oracle-validated
--> Processing Dependency: /usr/lib64/libaio.so for package: oracle-validated
--> Processing Dependency: libdb-4.2.so()(64bit) for package: oracle-validated
--> Processing Dependency: libstdc++.so.5()(64bit) for package: oracle-validated
--> Running transaction check
---> Package compat-db.x86_64 0:4.2.52-5.1 set to be updated
---> Package compat-gcc-34.x86_64 0:3.4.6-4 set to be updated
---> Package compat-gcc-34-c++.x86_64 0:3.4.6-4 set to be updated
---> Package compat-libstdc++-33.i386 0:3.2.3-61 set to be updated
---> Package compat-libstdc++-33.x86_64 0:3.2.3-61 set to be updated
---> Package libXp.i386 0:1.0.0-8.1.el5 set to be updated
---> Package libXtst.i386 0:1.0.1-3.1 set to be updated
---> Package libaio-devel.i386 0:0.3.106-5 set to be updated
---> Package libaio-devel.x86_64 0:0.3.106-5 set to be updated
---> Package sysstat.x86_64 0:7.0.2-3.el5 set to be updated
---> Package unixODBC-devel.i386 0:2.2.11-7.1 set to be updated
---> Package unixODBC-devel.x86_64 0:2.2.11-7.1 set to be updated
---> Package xorg-x11-utils.x86_64 0:7.1-2.fc6 set to be updated
--> Processing Dependency: libXv.so.1()(64bit) for package: xorg-x11-utils
--> Processing Dependency: libdmx.so.1()(64bit) for package: xorg-x11-utils
--> Processing Dependency: libXxf86dga.so.1()(64bit) for package: xorg-x11-utils
--> Running transaction check
---> Package libXv.x86_64 0:1.0.1-4.1 set to be updated
---> Package libXxf86dga.x86_64 0:1.0.1-3.1 set to be updated
---> Package libdmx.x86_64 0:1.0.2-3.1 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================================================
Package                              Arch             Version                      Repository                Size
===========================================================================================================================
Installing:
 oracle-validated                    x86_64            1.0.0-24.el5                 falcon-repo               22 k
Installing for dependencies:
 compat-db                           x86_64            4.2.52-5.1                   falcon-repo               1.6 M
 compat-gcc-34                       x86_64            3.4.6-4                      falcon-repo               4.4 M
 compat-gcc-34-c++                   x86_64            3.4.6-4                      falcon-repo               13 M
 compat-libstdc++-33                 i386              3.2.3-61                     falcon-repo               232 k
 compat-libstdc++-33                 x86_64            3.2.3-61                     falcon-repo               227 k
 libXp                               i386              1.0.0-8.1.el5                falcon-repo               23 k
 libXtst                             i386              1.0.1-3.1                    falcon-repo               15 k
 libXv                               x86_64            1.0.1-4.1                    falcon-repo               14 k
 libXxf86dga                         x86_64            1.0.1-3.1                    falcon-repo               16 k
 libaio-devel                        i386              0.3.106-5                    falcon-repo               12 k
 libaio-devel                        x86_64            0.3.106-5                    falcon-repo               11 k
 libdmx                              x86_64            1.0.2-3.1                    falcon-repo               13 k
 sysstat                             x86_64            7.0.2-3.el5                  falcon-repo               173 k
 unixODBC-devel                      i386              2.2.11-7.1                   falcon-repo               739 k
 unixODBC-devel                      x86_64            2.2.11-7.1                   falcon-repo               796 k
 xorg-x11-utils                      x86_64            7.1-2.fc6                    falcon-repo               123 k

Transaction Summary
============================================================================================================================
Install      17 Package(s)
Upgrade       0 Package(s)

Total download size: 21 M
Is this ok [y/N]: y
Downloading Packages:
(1/17): libaio-devel-0.3.106-5.x86_64.rpm                                                                |  11 kB     00:00    
(2/17): libaio-devel-0.3.106-5.i386.rpm                                                                  |  12 kB     00:00    
(3/17): libdmx-1.0.2-3.1.x86_64.rpm                                                                      |  13 kB     00:00    
(4/17): libXv-1.0.1-4.1.x86_64.rpm                                                                       |  14 kB     00:00    
(5/17): libXtst-1.0.1-3.1.i386.rpm                                                                       |  15 kB     00:00    
(6/17): libXxf86dga-1.0.1-3.1.x86_64.rpm                                                                 |  16 kB     00:00    
(7/17): oracle-validated-1.0.0-24.el5.x86_64.rpm                                                         |  22 kB     00:00    
(8/17): libXp-1.0.0-8.1.el5.i386.rpm                                                                     |  23 kB     00:00    
(9/17): xorg-x11-utils-7.1-2.fc6.x86_64.rpm                                                              | 123 kB     00:00    
(10/17): sysstat-7.0.2-3.el5.x86_64.rpm                                                                  | 173 kB     00:00    
(11/17): compat-libstdc++-33-3.2.3-61.x86_64.rpm                                                         | 227 kB     00:00    
(12/17): compat-libstdc++-33-3.2.3-61.i386.rpm                                                           | 232 kB     00:00    
(13/17): unixODBC-devel-2.2.11-7.1.i386.rpm                                                              | 739 kB     00:00    
(14/17): unixODBC-devel-2.2.11-7.1.x86_64.rpm                                                            | 796 kB     00:00    
(15/17): compat-db-4.2.52-5.1.x86_64.rpm                                                                 | 1.6 MB     00:00    
(16/17): compat-gcc-34-3.4.6-4.x86_64.rpm                                                                | 4.4 MB     00:00    
(17/17): compat-gcc-34-c++-3.4.6-4.x86_64.rpm                                                            |  13 MB     00:00    
-----------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                                                                                          14 MB/s |  21 MB     00:01    
Running rpm_check_debug
Running Transaction Test
Finished Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : compat-gcc-34                                                                       1/17
  Installing     : libXxf86dga                                                                         2/17
  Installing     : compat-libstdc++-33                                                                 3/17
  Installing     : sysstat                                                                             4/17
  Installing     : libXv                                                                               5/17
  Installing     : libdmx                                                                              6/17
  Installing     : xorg-x11-utils                                                                      7/17
  Installing     : compat-db                                                                           8/17
  Installing     : libaio-devel                                                                        9/17
  Installing     : libaio-devel                                                                        10/17
  Installing     : unixODBC-devel                                                                      11/17
  Installing     : unixODBC-devel                                                                      12/17
  Installing     : libXtst                                                                             13/17
  Installing     : libXp                                                                               14/17
  Installing     : compat-libstdc++-33                                                                 15/17
  Installing     : compat-gcc-34-c++                                                                   16/17
  Installing     : oracle-validated                                                                    17/17

Installed:
  oracle-validated.x86_64 0:1.0.0-24.el5

Dependency Installed:
  compat-db.x86_64 0:4.2.52-5.1          compat-gcc-34.x86_64 0:3.4.6-4        compat-gcc-34-c++.x86_64 0:3.4.6-4    
  compat-libstdc++-33.i386 0:3.2.3-61     compat-libstdc++-33.x86_64 0:3.2.3-61     libXp.i386 0:1.0.0-8.1.el5      
  libXtst.i386 0:1.0.1-3.1              libXv.x86_64 0:1.0.1-4.1               libXxf86dga.x86_64 0:1.0.1-3.1       
  libaio-devel.i386 0:0.3.106-5          libaio-devel.x86_64 0:0.3.106-5         libdmx.x86_64 0:1.0.2-3.1                
  sysstat.x86_64 0:7.0.2-3.el5     unixODBC-devel.i386 0:2.2.11-7.1   
  unixODBC-devel.x86_64 0:2.2.11-7.1     xorg-x11-utils.x86_64 0:7.1-2.fc6   

Complete!

Однако этого нам мало. Из-под пользователя oracle будет работать база данных. По рекомендациям Оракла, кластерное ПО лучше запускать из-под отдельного пользователя, обычно это grid. Создадим его на каждой ноде.

root@n1: ~# /usr/sbin/useradd -u 1100 -g oinstall -G dba grid

root@n1: ~# passwd grid
Changing password for user grid.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

# Повторим тоже самое на всех нодах.

# Проверка
root@n1: ~# id grid
uid=1100(grid) gid=54321(oinstall) groups=54321(oinstall),54322(dba)

root@n2: ~# id grid
uid=1100(grid) gid=54321(oinstall) groups=54321(oinstall),54322(dba)

Далее необходимо создать структуру каталогов, в которой будет размещаться софт оракла. Следуя схеме OFA (ну или частично следуя 🙂 сделаем /u01/app/grid /u01/app/oracle и так далее. Опять же, делаем это на всех узлах кластера.

root@n1: ~# mkdir -p /u01/app/grid
root@n1: ~# mkdir -p /u01/app/oracle
root@n1: ~# chown grid:oinstall /u01/app/grid
root@n1: ~# chown oracle:oinstall /u01/app/oracle
root@n1: ~# mkdir -p /u01/app/11.2.0/grid
root@n1: ~# chown grid:oinstall /u01/app/11.2.0/grid
root@n1: ~# mkdir /u01/app/oraInventory
root@n1: ~# chown grid:oinstall /u01/app/oraInventory
root@n1: ~# chmod -R 775 /u01/

Подготовка и конфигурирование ASM.

Если у вас уже настроен сервер, к нему подключено хранилище, и луны/диски/разделы уже видны в системе, можно приступать к конфигурированию ASM. Для этих целей нам понадобятся несколько пакетов от оракла:

oracleasm-2.6.18-274.el5-2.0.5-1.el5.x86_64.rpm
oracleasmlib-2.0.4-1.el5.x86_64.rpm
oracleasm-support-2.1.7-1.el5.x86_64.rpm

Гланое, чтобы версия драйвера ASM совпадала с версией ядра вашей операционной системы. Ну и архитектура конечно тоже. В моем случае ядро было 2.6.18-274 и драйвер я скачал соответственный. Узнать версию ядра можно командой uname -a. Скачать все эти пакеты можно с сайта Оракла тут.

root@n1: ~# uname -a
Linux n1.rac 2.6.18-274.el5 #1 SMP Fri Jul 22 04:43:29 EDT 2011 x86_64 x86_64 x86_64 GNU/Linux

Итак, ставим пакеты на каждой ноде.

root@n2: /home/kostik# rpm -ivh oracleasm*
warning: oracleasm-2.6.18-274.el5-2.0.5-1.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...                ########################################### [100%]
   1:oracleasm-support      ########################################### [ 33%]
   2:oracleasm-2.6.18-274.el########################################### [ 67%]
   3:oracleasmlib           ########################################### [100%]

После этого можно приступать к конфигурации ASM. Первым делом надо сконфигурировать сам драйвер. Это делается один раз. Запускаем конфигурирование и указываем некоторые данные: пользователя, из-под которого будет работать драйвер и кому будет принадлежать интерфейс, группу, запускать ли драйвер при старте системы. Если вы придерживались этой статьи, и завели двух пользователей, одного для кластера, другого для базы данных, то здесь надо указать пользователя кластера.

root@n2: /home/kostik# /usr/sbin/oracleasm configure -i
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver.  The following questions will determine whether the driver is
loaded on boot and what permissions it will have.  The current values
will be shown in brackets ('[]').  Hitting  without typing an
answer will keep that current value.  Ctrl-C will abort.

Default user to own the driver interface []: grid
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done


# Инициализируем драйвер
root@n2: /home/kostik# oracleasm init
Creating /dev/oracleasm mount point: /dev/oracleasm
Loading module "oracleasm": oracleasm
Mounting ASMlib driver filesystem: /dev/oracleasm

После этого можно создать диски ASM из устройств с расшаренного хранилища. В моем случае в качестве хранилища выступает массив EMC, подключенный двумя оптическими шнурками с настроенным failover. Поэтому в моей системе эти диски видны как /dev/emcpower*. Для начала размечаем диски с помощью fdisk или любой другой утилиты, какая вам больше нравится. После этого инициализируем эти диски как ASM. Делаем это на одной ноде.

[18:18] cmd#:520
root@n1: /home/kostik# oracleasm createdisk DISK1 /dev/emcpowerb1
Writing disk header: done
Instantiating disk: done
[18:18] cmd#:522
root@n1: /home/kostik# oracleasm createdisk DISK2 /dev/emcpowerc1
Writing disk header: done
Instantiating disk: done
[18:19] cmd#:523
root@n1: /home/kostik# oracleasm createdisk DISK3 /dev/emcpowerd1
Writing disk header: done
Instantiating disk: done
[18:19] cmd#:524
root@n1: /home/kostik# oracleasm createdisk DISK4 /dev/emcpowere1
Writing disk header: done
Instantiating disk: done


[18:19] cmd#:526
root@n1: /home/kostik# oracleasm listdisks
DISK1
DISK2
DISK3
DISK4

Поскольку диски расшарены на всех нодах кластера, убеждаемся, что мы видим их на второй ноде.

root@n2: /home/kostik# oracleasm listdisks

# Дисков не видно - не беда, просканиурем диски.

root@n2: /home/kostik# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
Instantiating disk "DISK1"
Instantiating disk "DISK2"
Instantiating disk "DISK3"
Instantiating disk "DISK4"

# Ура! Чудо! Диски нашлись

После этого можно приступать к установке clusterware.

Установка Oracle Grid Infrastructure.

Проделав все вышеперечисленные процедуры и операции мы подошли к тому, что можно начинать ставить софт Оракл. Первым делом надо поставить Oracle Grid Infrastructure, в составе этого пакета идут необходимые кластерные компоненты Oracle Clusterware. К этому моменту у нас должен быть настроен dns, инициализированы ASM диски, созданы необходимые пользователи и структура каталогов, куда все будем ставить.

Вот, кстати, наглядная схемка компонентов Ораклового кластера и последовательность старта 🙂 Кому интересно копнуть глубже, в конце будет список документов, которые можно почитать по теме.

Запускаем инсталлер от имени пользователя, которого мы специально завели для кластера — grid и погнали!
Выбираем установку кластера.

Продвинутый режим.

Выбираем нужные языки

Далее указываем название нашего кластера и важно указываем scan-адрес, который мы прописали в dns.

Далее настраиваем наши ноды. По умолчанию, инсталлер конечно же добавляет одну ноду, ту, на которой он был запущен. Добавляем сюда нашу вторую ноду, указываем пароль пользователя, чтобы проверить доступность ноды по ssh. Так же здесь указываем виртуальные адреса нод, которые мы так же прописали в dns.

Если после нажатия «Next/Следующий» у вас появляется ошибка, что введенный виртуальный адрес не верен ( у меня появилась такая ошибка в одной из инсталляций), то исправить ее можно путем явного прописывания всех виртуальных адресов в /etc/hosts каждой ноды. По крайней мере так советуют сделать в MOS 264847.1.

Далее надо указать типы сетевых интерфейсов на узлах кластера. Напомню, что на каждом сервере у нас должно быть минимум 2 сетевых интерфейса, и они должны быть настроены однообразно. То есть если на одной ноде первый интерфейс eth0 — публичный, а eth1 — приватный, для интерконнекта, то на других нодах eth0 не может быть приватным, а так же должен быть настроен как публичный интерфейс.

Далее настраиваем хранилище. В нашем случае — это ASM. Выбираем те самые диски, которые мы инициализировали с помощью oracleasm. Важный момент — на забыть выбрать правильный режим избыточности. В моем случае раздела на массиве сделаны на RAID-группах, поэтому я выбираю внешнюю избыточность. В этом случае Оракл ASM не будет дублировать данные между дисками. Далее указываем пароль/пароли для администрирования ASM.

Пропустим настройку IPMI. Хотя если у вас настроена консоль управления — можете здесь указать ее параметры и oracle clusterware будет про нее знать и использовать для управления серверами.

Далее, указываем системные группы пользователей, которые будут обладать правами на администрирование ASM. Здесь я немного упростил себе жизнь и сделал одну группу для всех. Если вы сделаете так же, Оракл запросит подтверждения, что вы действительно хотите так сделать.

Далее, указываем место размещения, это те самые папки, которые мы создали и на которые дали права на запись соответствующему пользователю. Затем указываем место, где будет располагаться Oracle Inventory. Это место, куда любой оракловый софт будет писать информацию о том, что было установлено.

После этого инсталлер проведет ряд проверок, и выдаст окошко с информацией о том, какие тесты не прошли. В моем случае были обнаружены проблемы со свапом, но ее можно смело игнорировать, потому как оракл хотел 16 гиг, а у меня было 15.6 — в общем это вообще не проблема. Не было установлено несколько пакетов — пришлось их доставить. Ну и еще одна проблема с количеством открытых дескрипторов файлов — её мог устранить сам инсталлер.

Здесь стоит еще сказать, что у Grid Infrastructure 11.2.0.1 и 11.2.0.3 несколько разные требования и проверки. В случае установки 11.2.0.1 у меня возникли только ошибки, описанные выше. При установке версии 11.2.0.3 установщик так же ругнулся на неверные настройки в /etc/resolv.conf. В свежей версии проверяются различные таймауты на запросы к днс-серверу, так что потребовалось дополнительно настроить таймауты и количество попыток. Делается это так:

root@n2: /home/kostik# vim /etc/resolv.conf

search rac
nameserver 192.168.24.27
options attempts:1
options timeout:1

После этого краткий обзор нашей установки. Можно сохранить его в файл ответов и в дальнейшем проводить silent-установку без вопросов и графики. Жмем «Готово» и начинается уставновка.

Ближе к концу установки появится окно с предложением выполнить пару скриптов от имени root на каждой ноде. Делаем это и жмем «окей». Здесь стоит подчеркнуть, что НЕ НАДО запускать эти скрипты одновременно на всех нодах. Это может привести к ошибкам. Скрипт orainstRoot.sh отработает быстро, а вот root.sh — выполняется достаточно долго, потому что он производит конфигурирование ноды кластера. Поэтому мой совет, подождите, пока этот скрипт полностью отработает на одной ноде и только потом запускайте его на следующей.

[12:05] cmd#:220
root@n2: /home/kostik# /u01/app/oraInventory/orainstRoot.sh
Changing permissions of /u01/app/oraInventory.
Adding read,write permissions for group.
Removing read,write,execute permissions for world.

Changing groupname of /u01/app/oraInventory to oinstall.
The execution of the script is complete.
[12:33] cmd#:221
root@n2: /home/kostik# /u01/app/11.2.0/grid/root.sh
Running Oracle 11g root.sh script...

The following environment variables are set as:
    ORACLE_OWNER= grid
    ORACLE_HOME=  /u01/app/11.2.0/grid

Enter the full pathname of the local bin directory: [/usr/local/bin]:
   Copying dbhome to /usr/local/bin ...
   Copying oraenv to /usr/local/bin ...
   Copying coraenv to /usr/local/bin ...


Creating /etc/oratab file...
Entries will be added to the /etc/oratab file as needed by
Database Configuration Assistant when a database is created
Finished running generic part of root.sh script.
Now product-specific root actions will be performed.
2011-12-27 12:34:04: Parsing the host name
2011-12-27 12:34:04: Checking for super user privileges
2011-12-27 12:34:04: User has super user privileges
Using configuration parameter file: /u01/app/11.2.0/grid/crs/install/crsconfig_params
Creating trace directory
LOCAL ADD MODE
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
  root wallet
  root wallet cert
  root cert export
  peer wallet
  profile reader wallet
  pa wallet
  peer wallet keys
  pa wallet keys
  peer cert request
  pa cert request
  peer cert
  pa cert
  peer root cert TP
  profile reader root cert TP
  pa root cert TP
  peer pa cert TP
  pa peer cert TP
  profile reader pa cert TP
  profile reader peer cert TP
  peer user cert
  pa user cert
Adding daemon to inittab
CRS-4123: Oracle High Availability Services has been started.
ohasd is starting
ADVM/ACFS is not supported on centos-release-5-7.el5.centos



CRS-2672: Попытка запустить 'ora.gipcd' на 'n2'
CRS-2672: Попытка запустить 'ora.mdnsd' на 'n2'
CRS-2676: Запуск 'ora.gipcd' на 'n2' выполнен успешно.
CRS-2676: Запуск 'ora.mdnsd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.gpnpd' на 'n2'
CRS-2676: Запуск 'ora.gpnpd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.cssdmonitor' на 'n2'
CRS-2676: Запуск 'ora.cssdmonitor' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.cssd' на 'n2'
CRS-2672: Попытка запустить 'ora.diskmon' на 'n2'
CRS-2676: Запуск 'ora.diskmon' на 'n2' выполнен успешно.
CRS-2676: Запуск 'ora.cssd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.ctssd' на 'n2'
CRS-2676: Запуск 'ora.ctssd' на 'n2' выполнен успешно.

ASM created and started successfully.

DiskGroup DATA created successfully.

clscfg: -install mode specified
Successfully accumulated necessary OCR keys.
Creating OCR keys for user 'root', privgrp 'root'..
Operation successful.
CRS-2672: Попытка запустить 'ora.crsd' на 'n2'
CRS-2676: Запуск 'ora.crsd' на 'n2' выполнен успешно.
CRS-4256: Updating the profile
Successful addition of voting disk 9fba8d3955824f5ebf18b8c8c8d2ffbe.
Successfully replaced voting disk group with +DATA.
CRS-4256: Updating the profile
CRS-4266: Voting file(s) successfully replaced
##  STATE    File Universal Id                File Name Disk group
--  -----    -----------------                --------- ---------
 1. ONLINE   9fba8d3955824f5ebf18b8c8c8d2ffbe (ORCL:DISK1) [DATA]
Located 1 voting disk(s).
CRS-2673: Попытка остановить 'ora.crsd' на 'n2'
CRS-2677: Останов 'ora.crsd' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.asm' на 'n2'
CRS-2677: Останов 'ora.asm' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.ctssd' на 'n2'
CRS-2677: Останов 'ora.ctssd' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.cssdmonitor' на 'n2'
CRS-2677: Останов 'ora.cssdmonitor' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.cssd' на 'n2'
CRS-2677: Останов 'ora.cssd' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.gpnpd' на 'n2'
CRS-2677: Останов 'ora.gpnpd' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.gipcd' на 'n2'
CRS-2677: Останов 'ora.gipcd' на 'n2' выполнен успешно.
CRS-2673: Попытка остановить 'ora.mdnsd' на 'n2'
CRS-2677: Останов 'ora.mdnsd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.mdnsd' на 'n2'
CRS-2676: Запуск 'ora.mdnsd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.gipcd' на 'n2'
CRS-2676: Запуск 'ora.gipcd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.gpnpd' на 'n2'
CRS-2676: Запуск 'ora.gpnpd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.cssdmonitor' на 'n2'
CRS-2676: Запуск 'ora.cssdmonitor' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.cssd' на 'n2'
CRS-2672: Попытка запустить 'ora.diskmon' на 'n2'
CRS-2676: Запуск 'ora.diskmon' на 'n2' выполнен успешно.
CRS-2676: Запуск 'ora.cssd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.ctssd' на 'n2'
CRS-2676: Запуск 'ora.ctssd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.asm' на 'n2'
CRS-2676: Запуск 'ora.asm' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.crsd' на 'n2'
CRS-2676: Запуск 'ora.crsd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.evmd' на 'n2'
CRS-2676: Запуск 'ora.evmd' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.asm' на 'n2'
CRS-2676: Запуск 'ora.asm' на 'n2' выполнен успешно.
CRS-2672: Попытка запустить 'ora.DATA.dg' на 'n2'
CRS-2676: Запуск 'ora.DATA.dg' на 'n2' выполнен успешно.

n2     2011/12/27 12:38:15     /u01/app/11.2.0/grid/cdata/n2/backup_20111227_123815.olr
Preparing packages for installation...
cvuqdisk-1.0.7-1
Configure Oracle Grid Infrastructure for a Cluster ... succeeded
Updating inventory properties for clusterware
Starting Oracle Universal Installer...

Checking swap space: must be greater than 500 MB.   Actual 15999 MB    Passed
The inventory pointer is located at /etc/oraInst.loc
The inventory is located at /u01/app/oraInventory
'UpdateNodeList' was successful.

Ну что ж, на этом установка Oracle Grid Infrastructure for Cluster успешно (я надеюсь) завершается.

Чтобы проверить, что все прошло успешно, и наш новенький кластер функционирует как положено, можно воспользоваться утилитой crsctl. Запускаем ее вот такую штуку из-под рута на каждой ноде и убеждаемся, что все онлайн.

root@n2: /home/kostik# /u01/app/11.2.0/grid/bin/crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online

Проверить работоспособность ASM, сети, SCAN, listener’ов и прочих компонентов, можно так.

root@n1: ~# crsctl status resource -w "TYPE co ’ora’" -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.FRA.dg
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.LISTENER.lsnr
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.asm
               ONLINE  ONLINE       n1                       Started            
               ONLINE  ONLINE       n2                       Started            
ora.gsd
               OFFLINE OFFLINE      n1                                          
               OFFLINE OFFLINE      n2                                          
ora.net1.network
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.ons
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       n2                                          
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       n1                                          
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       n1                                          
ora.cvu
      1        ONLINE  ONLINE       n1                                          
ora.n1.vip
      1        ONLINE  ONLINE       n1                                          
ora.n2.vip
      1        ONLINE  ONLINE       n2                                          
ora.oc4j
      1        ONLINE  ONLINE       n1                                          
ora.scan1.vip
      1        ONLINE  ONLINE       n2                                          
ora.scan2.vip
      1        ONLINE  ONLINE       n1                                          
ora.scan3.vip
      1        ONLINE  ONLINE       n1                                          

Все прекрасно, все онлайн 🙂 Можно идти дальше. А дальше по плану — установка сервера базы данных. Однако здесь стоит сказать вот что: если вы планируете ставить БД версии 11.2.0.1, то можете переходить к установке БД; если же вы планируете ставить версию по-новее (на момент написания статьи это 11.2.0.4), то прежде чем приступать к установке БД, надо обновить clusterware. Да и вообще, если это продакшн-инсталляция, и у вас есть доступ к апдейтам, это крайне желательно сделать.

Установка Oracle Database Server 11gR2.

Сервер базы данных мы будем ставить из-под отдельного пользователя, исторически так сложилось, что обычно это oracle. Собственно, он был создан автоматически при установке пакета oracle-validated. Логинимся под пользователем oracle и запускаем runInstaller. Если у вас есть доступ на support.oracle.com к скачиванию свежих релизов — имеет смысл скачать последнюю версию, иначе придется ставить 11.2.0.1, доступную для всех.

Создаем новую базу данных.

Указываем, что мы хотим создать кластерную базу данных. Выбираем наши ноды, указываем пароль пользователя oracle и проверяем доступность нод по ssh.

Выбираем расширенный режим установки.

Выбираем нужные нам языки и затем редакцию базы данных.

Далее указываем место установки софта. Указываем здесь те папки, которые мы подготовили в начале.

Выбираем тип базы данных.

Указываем имя БД и ее SID.

Далее, выделяем память, и, самое главное, указываем кодировку нашей БД. Лучше всего использовать UTF8, это избавит вас в дальнейшем от многих проблем, уж поверьте 🙂

Дальше выбираем, как мы будем управлять нашей БД: если у вас есть настроенный EM Grid Control — на этом шаге можно сразу подключить БД в Grid, а если нет — использовать DB Control.

Указываем где мы будем хранить данные. Выбираем конечно же ASM, иначе зачем мы его настраивали 🙂 Указываем пароль ASMSNMP пользователя.

Сразу настраиваем ежедневные бэкапы в ASM. Затем указываем дисковую группу ASM, где будут лежать данные, у меня это DATA.

Указываем пароли системных пользователей баз данных, а затем системные группы пользователей с привилегиями sysdba и sysoper.

Далее инсталлер проводит несколько тестов. Если что-то не так, вы снова увидите список проваленных проверок и их надо будет поправить. В этот раз у меня провалилась только проверка на свап. Но вы помните что было в прошлый раз (при установке Grid Infrastructure), так что эту ошибку мы проигнорируем.

Крткий обзор нашей установки и погнали.

Как всегда, в процессе установки надо будет выполнить скрипт из-под рута. Делаем это на всех нодах.

Ну вот и все! Установка прошла успешно.

Создание cluster-based сервиса базы данных с TAF и FAN.

Теперь мы подошли к самому интересному. У нас настроен кластер, поднят сервер БД, осталось настроить сервис базы данных, чтобы он мог использовать наш кластер по максимум, например TAF, а для .NET и Java приложений еще и FAN. То есть уже можно обращаться к кластерной БД, но никакие плюшки типа перекидывания соединения при падении ноды нам не доступны. Исправим это. В EM версии 11.2.0.1 почему-то ссылка на управление кластерными сервисами появляется только после того, как хотя бы один такой сервис уже есть. В случае EM версии 11.2.0.4 такая ссылка есть сразу. Но в любом случае такой сервис можно сделать из консоли. Чтобы создать новый сервис, воспользуемся утилитой srvctl. Поскольку мы делаем сервис базы данных, то запускать ее следует из-под пользователя, под которым работает сервер БД, то есть oracle в нашем случае. У srvctl можно вывести помощь по любой команде или связке команда+объект. Для создания сервиса нам нужна команда srvctl add service. Я показал какие параметры есть у этой команды и что они значат.

[18:30] cmd#:469
oracle@n1: ~> which srvctl
/u01/app/oracle/product/11.2.0/dbhome_1/bin/srvctl

[18:31] cmd#:470
oracle@n1: ~> srvctl
Usage: srvctl  < object > []
    commands: enable|disable|start|stop|relocate|status|add|remove|modify|getenv|setenv|unsetenv|config|convert|upgrade
    objects: database|instance|service|nodeapps|vip|network|asm|diskgroup|listener|srvpool|server|scan|scan_listener|oc4j|home|filesystem|gns|cvu
For detailed help on each command and object and its options use:
  srvctl  -h or
  srvctl  < object > -h

[18:31] cmd#:471
oracle@n1: ~> srvctl add service -h

Adds a service configuration to the Oracle Clusterware.

Usage: srvctl add service -d  -s  {-r "" [-a ""] [-P {BASIC | NONE | PRECONNECT}] | -g  [-c {UNIFORM | SINGLETON}] } [-k   ] [-l [PRIMARY][,PHYSICAL_STANDBY][,LOGICAL_STANDBY][,SNAPSHOT_STANDBY]] [-y {AUTOMATIC | MANUAL}] [-q {TRUE|FALSE}] [-x {TRUE|FALSE}] [-j {SHORT|LONG}] [-B {NONE|SERVICE_TIME|THROUGHPUT}] [-e {NONE|SESSION|SELECT}] [-m {NONE|BASIC}] [-z ] [-w ] [-t ] [-f]
    -d       Unique name for the database
    -s              Service name
    -r ""    Comma separated list of preferred instances
    -a ""    Comma separated list of available instances
    -g            Server pool name
    -c {UNIFORM | SINGLETON} Service runs on every active server in the server pool hosting this service (UNIFORM) or just one server (SINGLETON)
    -k              network number (default number is 1)
    -P {NONE | BASIC | PRECONNECT}        TAF policy specification
    -l                 Role of the service (primary, physical_standby, logical_standby, snapshot_standby)
    -y               Management policy for the service (AUTOMATIC or MANUAL)
    -e        Failover type (NONE, SESSION, or SELECT)
    -m      Failover method (NONE or BASIC)
    -w              Failover delay
    -z              Failover retries
    -t              Edition (or "" for empty edition value)
    -j   Connection Load Balancing Goal (SHORT or LONG). Default is LONG.
    -B      Runtime Load Balancing Goal (SERVICE_TIME, THROUGHPUT, or NONE)
    -x   Distributed Transaction Processing (TRUE or FALSE)
    -q  AQ HA notifications (TRUE or FALSE)
Usage: srvctl add service -d  -s  -u {-r "" | -a ""} [-f]
    -d       Unique name for the database
    -s              Service name
    -u                       Add a new instance to service configuration
    -r        Name of new preferred instance
    -a       Name of new available instance
    -f                       Force the add operation even though a listener is not configured for a network
    -h                       Print usage


# Создаем сервис, указываем его название, список нод, на которых он будет крутиться, политику TAF, роль этого сервиса, режим и параметры отказоустойчивости.
[18:31] cmd#:472
oracle@n1: ~> srvctl add service -d orcl -s gisrac.rac -r orcl1,orcl2 -P BASIC -l PRIMARY -y AUTOMATIC -e SELECT -m BASIC -w 1 -z 180 -j LONG -B SERVICE_TIME -q TRUE



Теперь можем запустить его и проверить что этот сервис запущен и работает.

[18:38] cmd#:473
oracle@n1: ~> srvctl start service -d orcl

[18:38] cmd#:474
oracle@n1: ~> srvctl status service -d orcl
Service gisrac.rac is running on instance(s) orcl2,orcl1

Теперь, если мы выполним команду проверки статуса всех компонентов кластера, там появятся еще 2 компонента: просто база данных, и наш только что созданных сервис.

[18:41] cmd#:1444
root@n1: ~# crsctl status resource -w "TYPE co ’ora’" -t
--------------------------------------------------------------------------------
NAME           TARGET  STATE        SERVER                   STATE_DETAILS      
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.DATA.dg
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.FRA.dg
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.LISTENER.lsnr
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.asm
               ONLINE  ONLINE       n1                       Started            
               ONLINE  ONLINE       n2                       Started            
ora.gsd
               OFFLINE OFFLINE      n1                                          
               OFFLINE OFFLINE      n2                                          
ora.net1.network
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
ora.ons
               ONLINE  ONLINE       n1                                          
               ONLINE  ONLINE       n2                                          
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
      1        ONLINE  ONLINE       n2                                          
ora.LISTENER_SCAN2.lsnr
      1        ONLINE  ONLINE       n1                                          
ora.LISTENER_SCAN3.lsnr
      1        ONLINE  ONLINE       n1                                          
ora.cvu
      1        ONLINE  ONLINE       n1                                          
ora.n1.vip
      1        ONLINE  ONLINE       n1                                          
ora.n2.vip
      1        ONLINE  ONLINE       n2                                          
ora.oc4j
      1        ONLINE  ONLINE       n1                                          
ora.orcl.db
      1        ONLINE  ONLINE       n1                       Open               
      2        ONLINE  ONLINE       n2                       Open               
ora.orcl.gisrac.rac.svc
      1        ONLINE  ONLINE       n2                                          
      2        ONLINE  ONLINE       n1                                          
ora.scan1.vip
      1        ONLINE  ONLINE       n2                                          
ora.scan2.vip
      1        ONLINE  ONLINE       n1                                          
ora.scan3.vip
      1        ONLINE  ONLINE       n1                   

Теперь, если зайти в em dbconsole в раздел Availability, можно увидеть ссылку: Cluster Managed Database Services. Вот два скриншота из версий 11.2.0.1 и 11.2.0.4

Нажав на нее, указываем пользователей и пароли для доступа к сервису и попадаем в список кластерных сервисов.

Выбираем Manage и жмем «Go». Попадаем в более подробное описание нашего сервиса.

Если нажать Service Properties Edit — мы увидим те самые настройки отказоустойчивости, которые мы указывали при создании нашего сервиса.

Ну вот мы и подошли к самому главному и заключительному пункту нашей статьи.

Радость по поводу успешной настройки.

Ура!!! 🙂 🙂 🙂

На последок, наверное, стоит написать список документов, прочитанных мною по этой теме, и которые содержат в себе какую-либо полезную информацию.

  • An Oracle White Paper. Application Failover with Oracle Database 11g.
  • An Oracle White Paper. Automatic Workload Management with Oracle Real Application Clusters 11g Release 2.
  • White Paper. Deploying Oracle Database 11g Release 2 on EMC Unified Storage.
  • Oracle® Clusterware. Administration and Deployment Guide 11g Release 2 (11.2) E10717-03.
  • Oracle® Database. High Availability Overview 11g Release 2 (11.2) E10804-01.
  • Oracle® Database. Net Services Administrator’s Guide 11g Release 2 (11.2) E10836-07.
  • Oracle® Real Application Clusters. Administration and Deployment Guide 11g Release 2 (11.2) E16795-11.
  • Oracle® Database. 2 Day + Real Application Clusters Guide 11g Release 2 (11.2) E17264-11.
  • Oracle® Grid Infrastructure. Installation Guide 11g Release 2 (11.2) for Linux E22489-04.
  • Oracle® Real Application Clusters. Installation Guide 11g Release 2 (11.2) for Linux and UNIX E24660-02.
  • Oracle Maximum Availability Architecture White Paper. Client Failover Best Practices for Highly Available Oracle Databases: Oracle Database 11g Release 2.
  • Rac11gR2OnLinux.
  • SINGLE CLIENT ACCESS NAME (SCAN). scan-129069.
  • An Oracle White Paper. Oracle Real Application Clusters (RAC) 11g Release 2.