Введение
Поставили передо мной как-то задачу… говорят один сервер это хорошо… но учитываю рост посетителей, неплохо бы было повысить производительность отдачи и для этой цели будет приобретен еще 1 сервер…
еще один сервер это хорошо, подумал я… только что с ним делать ??
Поговорив с програмистом и примерно поняв чего он хочет…
А именно одновременную отдачу контента, и что-то типа nfs или шары…
но тогда был бы оверхед ибо данные гонялись по сети и нагружен был бы диск одного сервера, посему надо было чтобы данные одновременно хранились на обоих серверах и реплицировались друг на друга…
поискав в гугле что-то на эту тему нашел информацию по кластерным фс, и для меня подходили gfs2 и позднее обнаруженная ocfs2, но была проблема в том что обычно использовалось выделенное файловое хранилище и его уже монтировали ноды… что было неприемлимо для меня, и тогда позадавав вопросы народу в конференции (gentoo@conference.gentoo.ru благо там были люди работающие с кластерами и прочими веселыми вещами) я вышел на drbd
Исходные данные
1 Боевой сервер 70 гигов информации, на обычном 1Tb reiserfs разделе
2 Новый сервер с 2TB диска, используется lvm чтобы выделить раздел равный разделу на первом сервере, + безопасная зона с которой будет работать сайт перенесенный rsync'ом c первого сервера.
Drbd
Что же это такое?
зайдя на офф сайт drbd.org сразу стало понятно что это то что мне нужно, после взгляда на эту картинку.
т.е это по сути сетевой raid-1
тадам репликация есть, но drbd создает только устройства и поверх нужна кластерная фс, иначе работать оно будет достаточно странно.
Итак ставим drbd
1. Сеть между нодами должна работать
2. В /etc/host желательно прописать алиасы, для удобства
3. Размеры дисков должны совпадать, но тк у меня на втром компе было значительно больше места 2TB а на первом всего 1TB, я использовал lvm чтобы выделить кусок примерно равный месту на первом сервере, а оставшуюся часть использовать для работы сайта пока идет работа с дисками.
примерно равный кусок потому что при создании drbd устройства оно автоматически стало равным размеру меньшего из двух… вот такой приятный бонус…
4. В ядре должно быть включено
Device Drivers --->
— Connector — unified userspace <-> kernelspace linker
Cryptographic API --->
— Cryptographic algorithm manager
5. Ставим drbd на обоих нодах
#emerge drbd
6. Правим конфиг /etc/drbd.conf
примерно он должен выглядеть так
global { usage-count yes; }
common { syncer { rate 100M; } }
resource drbd0 {
protocol C;
startup {
wfc-timeout 20;
degr-wfc-timeout 10;
# become-primary-on both; # Enable this *after* initial testing
}
net {
cram-hmac-alg sha1;
shared-secret "megaSeCrEt";
allow-two-primaries;
ping-timeout 20;
}
on node1 {
device /dev/drbd0;
disk /dev/sdb1;
address 192.168.0.1:7789;
meta-disk internal;
}
on node2 {
device /dev/drbd0;
disk /dev/mapper/vg-home;
address 192.168.0.2:7789;
meta-disk internal;
}
disk {
fencing resource-and-stonith;
no-disk-flushes;
no-md-flushes;
}
handlers {
outdate-peer "/sbin/obliterate"; # We'll get back to this.
}
за более точным и полным описанием man drbd.conf :)
7. На обоих нодах вводим
# modprobe drbd
# drbdadm create-md drbd0
# drbdadm attach drbd0
# drbdadm connect drbd0
8. Затем на второй ноде (тк рядом лежит сайт и надо будет его заливать на новый раздел)
#drbdadm — --overwrite-data-of-peer primary drbd0
и перезапускаем
#/etc/init.d/drbd restart
перезапуск нужен чтобы сервис нормально стартовал и взял настройки из конфига, ибо по умолчанию скорость синхронизации достатоно низкая…
9. За синхронизацией можно наблюдать вот так
#watch cat /proc/drbd
теперь пора занятся ФС
OCFS2
Почему ocfs2?
Потому что она есть в ядре.
Почему не gfs2?
Она есть в ядре, но при попытке использования при удалении файлов уходит в дедлок
(изначально была попытка использовать именно ее, но после прочуствования на своей шкуре того что, таки да она не готова к продакшену, о чем неоднократно упоминается на сайте разработчика и не толька :( была выбрана ocfs2)
Почему не gfs1?
На тот момент ее поддержки в ядре 2.6.27 небыло + она просто не работала…
1. Не забываем включить в ядре
--> File systems
--> OCFS2 file system support (EXPERIMENTAL)
а также dlm
2. Последнии ебилды ищем в багзилле
bugs.gentoo.org/show_bug.cgi?id=193249
3. Ставим
#emerge ocfs2-tools
4. Простейший конфиг, по сравнению с тем что пришлось делать на gfs2 (опять же на обоих нодах)
/etc/ocfs2/cluster.conf
node:
ip_port = 7777
ip_address = 192.168.0.1
number = 0
name = node1
cluster = ocfs2
node:
ip_port = 7777
ip_address = 192.168.0.2
number = 1
name = node2
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
5. Создаем фс на первой ноде (этот шаг является 10м в части drbd)
#mkfs.ocfs2 -b 4K -C 32K -N 2 /dev/drbd0 (тут еще имя кластера добавить надо и использование dlm)
(точная команда вылетела из головы но примерно так… как всегда полная информация man mkfs.ocfs2)
а на вторую ноду оно зальется ибо синхронизация…
Итог
После неспешного форматирования.
монтируем полученный раздел на второй ноде
#mount /dev/drbd0 /home/site/www/ -t ocfs2
(лирическое отступление все логи вебсервера и тд лежат в /home/site/logs ибо не имеет смысла их передавать на др ноду, также из /home/site/www сделаны симлинки в /home/site на некоторые конфиги которые отличаются на нодах)
и теперь заливаем сайт rsync'ом обратно…
спустя 6 часов синхронизации сервера готовы к боевому дежурству, осталось дело за малым сделать раскидывание запросов веб сервера по нодам… но это уже другая статья ))
зы незабываем
#rc-update add drbd default
#rc-update add ocfs2 default
зыы возможно при форматировании и монтировании ocfs2 надо перезапустить службу… точно к сожалению не помню…
#/etc/init.d/ocfs2 restart
зыыы возможна ситауция split-brain о том как справлятся с ней есть информация на офф сайте,
также здесь неупомянуты действия drbd в случае потери связи с другой нодой, но это достаточно специфичная вещь по сему лучше об этом читать сразу в документации…
основные ссылки на основе которых была написана данная статья
www.debian-administration.org/articles/578
oss.oracle.com/projects/ocfs2
www.netup.ru/articles.php?n=13
en.gentoo-wiki.com/wiki/HOWTO_Heartbeat_and_DRBD
www.drbd.org