Рубрики
Администрирование

Настройка shared-storage раздела с OCFS2 файловой системой на RHEL/OEL/CentOS

Довльно-таки часто приходится ставить и настраивать оракловые кластеры из нескольких нод с использованием внешних хранилищ. И конечно же, для заливки дампов нужны расшаренные папки, то есть папка в БД создается на уровне кластера, а значит она должна быть доступна со всех нод кластера. В таких случаях идеальным решением является использование кластерных файловых систем, и конечно же, одним из самых подходящих вариантов является использование кластерной файловой системы от 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 ('[]').  Hitting
 without 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
...

Вот и все. Теперь можете попробовать создать файлик/папку на одной ноде и не успеете вы переключиться на другую, как она будет уже доступна там 😉