Довльно-таки часто приходится ставить и настраивать оракловые кластеры из нескольких нод с использованием внешних хранилищ. И конечно же, для заливки дампов нужны расшаренные папки, то есть папка в БД создается на уровне кластера, а значит она должна быть доступна со всех нод кластера. В таких случаях идеальным решением является использование кластерных файловых систем, и конечно же, одним из самых подходящих вариантов является использование кластерной файловой системы от Oracle — OCFS2.
Небольшая инструкция, как просто поднять ocfs2 под CentOS/RHEL/OEL на расшаренном дисковом массиве. Под расшаренным я понимаю то, что массив подключен одновременно ко всем нодам, и lun доступен как блочное устройство на всех нодах.
Первым делом смотрим на версию нашего ядра. Это важно, потому как ocfs2 работает как модуль ядра и важно скачать модули именно той версии, что и ваше ядро.
root@SZ-HQ-BD-K-01: ~# uname -a Linux SZ-HQ-BD-K-01.mes.sz.fsk 2.6.18-348.el5 #1 SMP Tue Jan 8 17:53:53 EST 2013 x86_64 x86_64 x86_64 GNU/Linux
И качаем соответствующие пакеты с oss.oracle.com/projects/ocfs2/. Так же надо скачать утилиты для работы с ocfs2. Качаем их тут: oss.oracle.com/projects/ocfs2-tools/.
ocfs2-2.6.18-348.el5-1.4.10-1.el5.x86_64.rpm ocfs2-tools-1.6.3-2.el5.x86_64.rpm ocfs2console-1.6.3-2.el5.x86_64.rpm
Далее устанавливаем все скачанные пакеты. В новых версиях ocfs2console уже не актуальна и она даже не поставится. Но это не страшно. Это всего лишь GUI-консоль, которая и делать-то ничего кроме первоначальной правки конфига не умеет.
root@SZ-HQ-BD-K-01: ~# yum localinstall ocfs2*.rpm
В случае, если вы используете OEL, то скорее всего у вас эти пакеты уже стоят. Только обратите внимание, если вы меняли дефолтное ядро, то версии ocfs2-пакетов не будут соответствовать вашему новому ядру.
Следующий шаг — конфигурация O2CB cluster stack’а.
Настройки стека хранятся в /etc/ocfs2/cluster.conf. Если хочется, можно сконфигурить стек через GUI-утилитку ocfs2console, а затем скопировать конфиг на все ноды. Правда эта утилитка уже стала obsolete после версии 1.6. Но в любом случае, здесь есть одна тонкость — названия нод должны совпадать с именами хостов. Это важно. Так же рекомендуется использовать интерконнект-сеть вместо публичной сети. Подробнее про формат и параметры конфига можно прочитать в документации. После создания конфиг-файла, надо скопировать его на все ноды кластера.
Вот как выглядит мой cluster.conf:
cluster: node_count = 2 name = raccluster node: ip_port = 7777 ip_address = 10.65.181.65 number = 1 name = SZ-HQ-BD-K-01 cluster = raccluster node: ip_port = 7777 ip_address = 10.65.181.66 number = 2 name = SZ-HQ-BD-K-02 cluster = raccluster
Теперь надо сконфигурить o2cb сервис. И снова это нужно проделать на каждой ноде.
root@SZ-HQ-BD-K-01: ~# service o2cb configure Configuring the O2CB driver. This will configure the on-boot properties of the O2CB driver. The following questions will determine whether the driver is loaded on boot. The current values will be shown in brackets ('[]'). Hittingwithout typing an answer will keep that current value. Ctrl-C will abort. Load O2CB driver on boot (y/n) [y]: y Cluster stack backing O2CB [o2cb]: Cluster to start on boot (Enter "none" to clear) [raccluster]: Specify heartbeat dead threshold (>=7) [31]: Specify network idle timeout in ms (>=5000) [30000]: Specify network keepalive delay in ms (>=1000) [2000]: Specify network reconnect delay in ms (>=2000) [2000]: Writing O2CB configuration: OK Loading filesystem "ocfs2_dlmfs": OK Creating directory '/dlm': OK Mounting ocfs2_dlmfs filesystem at /dlm: OK Registering O2CB cluster "raccluster": OK Setting O2CB cluster timeouts : OK
Текущий статус кластера можно проверить так:
root@SZ-HQ-BD-K-01: ~# service o2cb status Driver for "configfs": Loaded Filesystem "configfs": Mounted Driver for "ocfs2_dlmfs": Loaded Filesystem "ocfs2_dlmfs": Mounted Checking O2CB cluster "raccluster": Online Heartbeat dead threshold: 31 Network idle timeout: 30000 Network keepalive delay: 2000 Network reconnect delay: 2000 Heartbeat mode: Local Checking O2CB heartbeat: Not active
Теперь пришло время подготовить файловую систему.
Первым делом отформатируем наш раздел. Тут тоже есть один тонкий момент. Заключается он в том, что в свежих версиях ocfs2 некоторые возможности включены по умолчанию, а поддержка этих самых возможностей есть только в свежих ядрах. Например, опция sparse включена по умолчанию в ocfs2-tools начиная с версии 1.3.9, но для работы этой опции необходимо ядро, начиная с 2.6.22. У меня же стоит ванильное ядро от RedHat 2.6.18. Для таких случаев, при форматировании раздела можно указать опцию —fs-feature-level=max-compat которая включит по умолчанию только те опции, которые поддерживаются текущим ядром. Или же можете сами указать какие конкретные опции вы хотите использовать.
В начале я конечно же отформатировал без этой опции и получил вот такую ошибку при монтировании:
(mount.ocfs2,12338,4):ocfs2_initialize_super:1727 ERROR: couldn't mount because of unsupported optional features (1700). (mount.ocfs2,12338,4):ocfs2_fill_super:789 ERROR: status = -22 ocfs2: Unmounting device (253,2) on (node 255)
root@SZ-HQ-BD-K-01: ~# mkfs.ocfs2 -L "ora-exports" /dev/mapper/lun4 mkfs.ocfs2 1.8.0 Cluster stack: classic o2cb Label: ora-exports Features: sparse extended-slotmap backup-super unwritten inline-data strict-journal-super xattr indexed-dirs refcount discontig-bg Block size: 4096 (12 bits) Cluster size: 4096 (12 bits) Volume size: 1099511627776 (268435456 clusters) (268435456 blocks) Cluster groups: 8323 (tail covers 1024 clusters, rest cover 32256 clusters) Extent allocator size: 71303168 (17 groups) Journal size: 268435456 Node slots: 16 Creating bitmaps: done Initializing superblock: done Writing system files: done Writing superblock: done Writing backup superblock: 5 block(s) Formatting Journals: done Growing extent allocator: done Formatting slot map: done Formatting quota files: done Writing lost+found: done mkfs.ocfs2 successful
Если же включить эту опцию, то все будет хорошо.
root@SZ-HQ-BD-K-01: ~# mkfs.ocfs2 --fs-feature-level=max-compat -L "ora-exports" /dev/mapper/lun4 mkfs.ocfs2 1.8.0 Cluster stack: classic o2cb Overwriting existing ocfs2 partition. Proceed (y/N): y Label: ora-exports Features: backup-super strict-journal-super Block size: 4096 (12 bits) Cluster size: 4096 (12 bits) Volume size: 1099511627776 (268435456 clusters) (268435456 blocks) Cluster groups: 8323 (tail covers 1024 clusters, rest cover 32256 clusters) Extent allocator size: 71303168 (17 groups) Journal size: 268435456 Node slots: 16 Creating bitmaps: done Initializing superblock: done Writing system files: done Writing superblock: done Writing backup superblock: 5 block(s) Formatting Journals: done Growing extent allocator: done Formatting slot map: done Formatting quota files: done Writing lost+found: done mkfs.ocfs2 successful
Далее смонтируем наш раздел. А чтобы он монтировался автоматом при старте системы, пропишем его в fstab. Здесь следует обратить внимание на флаг _netdev, потому как для корректной работы кластерной фс необходима сетевая подсистема.
root@SZ-HQ-BD-K-02: ~# cat /etc/fstab ... /dev/mapper/lun4 /u02 ocfs2 _netdev,defaults 0 0 ...
Вот и все. Теперь можете попробовать создать файлик/папку на одной ноде и не успеете вы переключиться на другую, как она будет уже доступна там 😉