The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Зеркалирование дисков по сети, между двумя FreeBSD серверами (аналог DRBD)
Функциональности DRBD во FreeBSD можно добиться примонтировав блочное устройство по сети 
при помощи GEOM Gate (ggate) и добавив его в зеркало с локальным диском средствами gmirror.
Для увеличения производительности две машины желательно соединить напрямую
через отдельные гигабитные Ethernet порты.
Размер зеркалируемых дисковых разделов должен быть минимально возможным для решаемой задачи,
так как для последующего перестроения зеркала большого размера может
понадобиться слишком много времени.
Например, 20Гб раздел будет синхронизирован при 100Мбит линке за 30 минут, а 500Гб - за 11 часов.

Имеем два узла: master - машина на которой выполняется работа, 
slave - запасная машина, которая в случае краха мастера перехватит инициативу.

Организуем процесс зеркалирования: разделы /dev/da0s1d на обоих машинах будут
использованы в качестве вешнего диска, а /dev/ad0s1e - в качестве локального.

Включаем на обоих машинах поддержку GEOM модулей geom_mirror и geom_gate.
Прописываем в /boot/loader.conf:

   geom_mirror_load="YES"
   geom_gate_load="YES"

Перезагружаем системы или загружаем модули руками, если то позволяет текущий securelevel:
 
  kldload geom_mirror
  kldload geom_gate

Предположим, что обе машины имеют два сетевых интерфейса:
fxp0 - для взаимодействия с внешним миром (мастер узел имеет IP 172.16.100.1, а
slave - 172.16.100.2).
fxp1 - для зеркалирования дисков между узлами (master - 192.168.100.1, slave - 192.168.100.2).
На fxp0 мастера также поднят через алиас 172.16.100.12, который будет использоваться 
для предоставления публичных сервисов и в случа краха мастера будет перехвачен на slave узле.

Для переключения на slave в случае сбоя будем использовать freevrrpd, установленный 
из порта /usr/ports/net/freevrrpd

Пример конфигурации freevrrpd:
Мастер узел:

   [VRID]
   serverid = 1
   interface = fxp0
   priority = 255 # повышенный приоритет для master
   addr = 172.16.100.12/32 #  рабочий IP, обрабатывающий запросы внешнего мира.
   password = anyoneulike
   masterscript = /usr/local/bin/become_master
   backupscript = /usr/local/bin/become_standby

Резервный узел, который перехватит инициативу в случае краха мастера:

   [VRID]
   serverid = 1
   interface = fxp0
   priority = 240 # пониженный приоритет, поднимать сервер только в случае краха мастера
   addr = 172.16.100.12/32 # какой IP поднимать в случае краха мастера
   password = anyoneulike
   masterscript = /usr/local/bin/become_master
   backupscript = /usr/local/bin/become_standby


Экспорт дисковых разделов.

На мастер узле прописываем параметры экспортируемого со slave диска в /etc/gg.exports:

   192.168.0.2 RW /dev/da0s1d

А на slave-е параметры диска на мастр-узле (в случае краха мастера, slave
возмет на себя роль мастера):

   192.168.0.1 RW /dev/da0s1d


На запасной машине запускаем процесс ggated (только на slave, не на мастере !).

   ggated -v

Демон будет запущен в режиме отладки. 
После того как все заработает нужно прописать запуск ggated в стартовый скрипт слейва.

Импортирование удаленного блочного устройства на мастер-узле осуществляется командой:

   ggatec create 192.168.100.2 /dev/da0s1d

которая вернет имя нового устройства, как правило это будет ggate0
В дальнейшем на мастере нужно осуществлять дисковые операции с /dev/ggate0
Запускаем  ggatec только на мастере !

При сбое мастера freevrrpd скрипт become_master завершит выполнение ggated на
slave узле и выполнит ggatec,
а после восстановления старого мастера поднимет на нем ggated через скрипт become_standby


Настройка заркалирования.

На мастер-узле создаем RAID-1 из локального и удаленного дисков:

   gmirror label -v -n -b prefer gm0 /dev/ggate0
   gmirror insert -p 100 gm0 /dev/ad0s1e

Алгоритм балансировки "prefer" важен для минимизации нагрузки на вторичный диск, 
все операции чтения будут производится с локального диска, которому выставлен
более высокий приоритет 100.

Перестраиваем массив:

   gmirror rebuild rm0 ggate0

Для включения опции автосинхронизации слайсов выполняем:

   gmirror configure -a gm0

После завершения синхронизации массива в логе увидим:

   GEOM_MIRROR: Device gm0: rebuilding provider ggate0 finished.
   GEOM_MIRROR: Device gm0: provider ggate0 activated.

Далее /dev/gm0 можно отформатировать стандартным образом через newfs и
примонтировать на мастер сервере.


Переключение на резевный (slave) сервер в случае краха основного сервера.

Проведем эксперимент - отключим линк у мастер-сервера, симулировав его крах. 
Ниже описана логика работы скрипта become_master

На slave завершим ggated процесс. Зеркало должно автоматически заработать на запасном узле:

   GEOM_MIRROR: Device gm0 created (id=2381431211).
   GEOM_MIRROR: Device gm0: provider ad0s1e detected.
   GEOM_MIRROR: Force device gm0 start due to timeout.
   GEOM_MIRROR: Device gm0: provider ad0s1e activated.
   GEOM_MIRROR: Device gm0: provider mirror/gm0 launched.

Далее выпоним fsck на случай нарушения целостности ФС и примонтируем раздел:

   fsck -t ufs /dev/mirror/gm0
   mount /dev/mirror/gm0 /mnt

После того как раздел заработал на slave-сервере, попытаемся восстановить работу мастера,
который должен после краза занять роль запасной машины.

После включения мастер-узла, займемся восстановления его статуса первичного узла.

На местере останавливаем работу зеркала gmirror для перевода его в подчиненный режим.

   gmirror stop gm0

Запускаем ggated для приема репликаций от бывшего слейва, теперь ставшего основным сервером

   ggated -v

Подключаем локальный диск /dev/da0s1e в зеркало в качестве неприоритетного раздела.
Для этого выполняем автоконфигурацию:

   gmirror configure -n gm0

Оформляем экспорт локального диска /dev/da0s1e:

   ggatec create 192.168.100.2 /dev/da0s1e

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

   gmirror insert -p 0 gm0 /dev/ggate

Включаем автоконфигурацию зеркала:

   gmirror cinfigure -a gm0

Перестраиваем зеркало:

   gmirror rebuild gm0 ggate0

После завершения перестроения в логе наблюдаем:

   GEOM_MIRROR: Device gm0: rebuilding provider ggate0 finished.
   GEOM_MIRROR: Device gm0: provider ggate0 activated.

Удаляем раздел /dev/ad0s1d из зеркала и вновь добавляем его с повышенным приоритетом, 
для восстановления функций основного сервера:

   gmirror remove gm0 /dev/ad0s1d
   gmirror insert -p 100 gm0 /dev/ad0s1d


Ситуация краха запасного сервера, при работающей мастере.

После восстановления работы слейва, на мастер хосте временно отключаем импорт диска:

   ggatec destroy -f -u 0

в логе

   GEOM_GATE: Device ggate0 destroyed.
   GEOM_MIRROR: Device gm0: provider ggate0 disconnected.

На слейв узде останавливаем зеркалирование:

   gmirror stop gm0

Запускаем на слейве экспорт ggated

   ggated -v

На мастер узле подключаем удаленный диск:

   ggatec create 192.168.100.2 /dev/da0s1e

На мастере автоматически должен быть обнаружен подключенный внешний диск:

   GEOM_MIRROR: Device gm0: provider ggate0 detected.
   GEOM_MIRROR: Device gm0: provider ggate0 activated.

Запускаем перестроение raid и ждем его завершения:

   gmirror rebuild gm0 ggate0


Замечания по поводу сохранения целостности данных:

- нельзя экспортировать через ggated физические разделы, если они уже добавлены в зеркало;
- не нужно предпринимать попытки создания мастер-мастер репликации, это невозможно;
- нельзя монтировать экспортируемый раздел на активном слейв сервере.
Монтирование экспортируемого раздела слейва возможно только на мастер-узле;
- После сбоя необходимо выполнить fsck для зеркала;
- Обязательно ведение резервного копирования зеркала.
 
Ключи: drbd, mirror, freebsd, geom, raid, disk, cluster / Лицензия: CC-BY
Раздел:    Корень / Администратору / Система / Диски и файлы / RAID массивы

Обсуждение [ RSS ]
  • 1, nikos (??), 10:12, 25/11/2010 [ответить]  
  • +/
    вот интересно,  у меня  при первом  эксперименте  по данной  схеме ( просто зеркалирование, переключение не использовалось) получилось что  выпадение слейва  приводит в master в состояние упал geom_mirror, вместе с ядром

     

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру