Тут нам приходит на помощь протокол iSCSI, поверх которого можно практически без потерь гонять инфу, монтируя харды со стораджа на узлах как локальную фс. Предположим iscsi-target и iscsi-initiator мы уже настроили, на конечных узлах у нас появилось новое устройство /dev/sd* (возьмем за пример /dev/sdg), на котором мы parted'ом или fdisk'ом создали раздел. Итак, надо его форматнуть, но тут образуется затык - при использовании стандартных ФС писать на смонтированый раздел сможет только один узел - тот который первым его подхватит. А так как нам это не интересно, будем искать выход. Погуглив по поводу кластерных файловых систем находим в гугле огромную кучу оных. Сразу откидываем распределенные ФС - у нас будет 1 сторадж а не несколько.
Далее откинем RedHat GFS2 - во-первых она тащит за собой кучу мусора (cman, clvm, corosync, fenced), который кстати тоже нужно настраивать, во-вторых блокировка выпавшей ноды у нее работает через демон fenced, который нет-нет да пришибет рабочий узел, а нет-нет и на выпавший узел забьет, вызывая тем самым deadlock в файловой системе и как результат kernel-panic.
Для данного эксперимента остановимся на файловой системе OCFS2 - она так же как и GFS2 асинхронна, и не тащит за собой кучу его родимого. Однако как и с любой ФС нужно озадачиться одним вопросом - а есть ли ее поддержка в ядре? Если нет в ядре и в репах - пересобираем ведро включив опции поддержки сабжа. Для АльтЛинукс готовое ядро есть в репозитории. Мне гораздо проще - я использую OracleLinux, а в нем она одна из родных ФС.
Ставим тулзу:
Код: Выделить всё
# yum -y install ocfs2-tools
Код: Выделить всё
# yum -y install ocfs2console
Предположим что у нас к разделу цепляются 4 клиента - 192.168.1.1, 192.168.1.2, 192.168.1.3 и 192.168.1.4. Конфиг будет такой:
# cat /etc/ocfs2/cluster.conf
Код: Выделить всё
cluster:
node_count = 4
name = my_mount
node:
ip_port = 7777
ip_address = 192.168.1.1
number = 0
name = node1.example.com
cluster = my_mount
node:
ip_port = 7777
ip_address = 192.168.1.2
number = 1
name = node2.example.com
cluster = my_mount
node:
ip_port = 7777
ip_address = 192.168.1.3
number = 2
name = node3.example.com
cluster = my_mount
node:
ip_port = 7777
ip_address = 192.168.1.4
number = 3
name = node7.example.com
cluster = my_mount
1. строки после слов node и cluster обязательно должны начинаться с пробела или табуляции - это критично!
2. name - реальный хостнейм сервера. если вы забьете имя сервера в хосты вам это ничего не даст!
3. параметр cluster = my_mount долен быть одинаковым для всех узлов кластера а также должен соответствовать значению записи O2CB_BOOTCLUSTER= в файле o2cb (у меня в /etc/sysconfig лежит)
Настраиваем o2cb:
Код: Выделить всё
# cat /etc/sysconfig/o2cb
#
# This is a configuration file for automatic startup of the O2CB
# driver. It is generated by running /etc/init.d/o2cb configure.
# On Debian based systems the preferred method is running
# 'dpkg-reconfigure ocfs2-tools'.
#
# O2CB_ENABLED: 'true' means to load the driver on boot.
O2CB_ENABLED=true
# O2CB_STACK: The name of the cluster stack backing O2CB.
O2CB_STACK=o2cb
# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.
O2CB_BOOTCLUSTER= my_mount
# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.
O2CB_HEARTBEAT_THRESHOLD=31
# O2CB_IDLE_TIMEOUT_MS: Time in ms before a network connection is considered dead.
O2CB_IDLE_TIMEOUT_MS=30000
# O2CB_KEEPALIVE_DELAY_MS: Max time in ms before a keepalive packet is sent
O2CB_KEEPALIVE_DELAY_MS=2000
# O2CB_RECONNECT_DELAY_MS: Min time in ms between connection attempts
O2CB_RECONNECT_DELAY_MS=2000
Код: Выделить всё
# service o2cb load
# service o2cb online
# service o2cb start
# service ocfs2 start
Код: Выделить всё
# mkfs.ocfs2 -N 4 -v /dev/sdg1
Код: Выделить всё
UUID=52db50c3-2f2c-4b3a-a04a-e395155bbfe5 /srv/shared ocfs2 defaults,_netdev 0 1
Код: Выделить всё
# service ocfs2 restart
И смотрим примонтируется-ли раздел и наслаждаемся результатом. Если что-то пошло не так советую перечитать все с начала)))