Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Отказоустойчивый 
микрокластер 
своими руками 
Виталий Гаврилов
Суть доклада 
• Построение отказоустойчивой «фермы» 
• Блочные устройства с высоким уровнем доступности и 
актуальности 
• «Живая» миграция виртуальных машин внутри «фермы» 
• «Отказоустойчивые» IP сервисы на базе corosync/pacemaker или 
carp/ucarp
Типовые решения 
Полноценный кластер – дорого, сложно, тяжело поддерживать
Типовые решения 
• Некластеризованные 
виртуальные/реальные сервера с 
синхронизацией данных «по 
необходимости» либо «по расписанию» с 
дублированием – избыточные ресурсы, 
дополнительные расходы на 
синхронизацию
Цель доклада 
• Отказоустойчивый микрокластер, «собранный» 
из попарно соединенных физических серверов. 
Бюджетно и надежно
Схема сетевой линковки 
NODE-LEFT 
NODE-RIGHT 
SWITCH1 SWITCH2 
eth0 
eth1 
eth2 
eth3 
eth0 
eth1 
eth2 
eth3 
bond1 bond0 
bond1 bond0 
EXT IP LEFT EXT IP RIGHT 
INT IP LEFT INT IP RIGHT
Схема сетевой линковки 
NODE-LEFT 
NODE-RIGHT 
SWITCH1 SWITCH2 
eth0 
eth1 
eth2 
eth3 
eth0 
eth1 
eth2 
eth3 
bond1 bond0 
bond1 bond0 
EXT IP 
RIGHT 
EXT IP LEFT 
INT IP 
RIGHT 
INT IP LEFT 
br1 br0 
br1 br0
Операционная система 
Операционная система – Oracle Linux 
• Бесплатная поддержка (обновления) 
• Единый репозиторий как для коммерческих, так и для платных 
условий поддержки 
• Продолжительный период поддержки
Разбивка диска 
• /boot/ - 200 Mb 
• SWAP – от 0.5 до 2.0 от 
объема RAM 
• Остальное под LVM 
(группа vg0) 
• / - 10Gb 
(volume_name = root) 
• Остальное не 
распределяем 
swap boot 
root 
data
Конфигурация сетевых интерфейсов (bonding) 
/etc/sysconfig/network-scripts/eth[0-1] 
DEVICE="eth[0-1]" 
BOOTPROTO="static" 
HWADDR=“XX:XX:XX:XX:XX:XX" 
NM_CONTROLLED="no" 
ONBOOT="yes" 
MASTER=bond0 
SLAVE=yes 
TYPE="Ethernet" 
/etc/sysconfig/network-scripts/bond0 
DEVICE=bond0 
BOOTPROTO=none 
ONBOOT=yes 
IPADDR=EXT IP (LEFT|RIGHT) 
NETMASK=X.X.X.X 
TYPE=Bonding 
USERCRL=no 
BONDING_OPTS="mode=1 miimon=100" 
/etc/sysconfig/network-scripts/eth[2-3] 
DEVICE="eth[2-3]" 
BOOTPROTO="static" 
HWADDR=“XX:XX:XX:XX:XX:XX" 
NM_CONTROLLED="no" 
ONBOOT="yes" 
MASTER=bond1 
SLAVE=yes 
MTU=9000 
TYPE="Ethernet“ 
/etc/sysconfig/network-scripts/bond1 
DEVICE=bond0 
BOOTPROTO=none 
ONBOOT=yes 
IPADDR=INT IP (LEFT|RIGHT) 
NETMASK=255.255.255.252 
TYPE=Bonding 
USERCRL=no 
MTU=9000 
BONDING_OPTS="mode=0 miimon=100"
Конфигурация сетевых интерфейсов (bridge) 
/etc/sysconfig/network-scripts/bond0 
DEVICE=bond0 
BOOTPROTO=none 
ONBOOT=yes 
TYPE=Bonding 
USERCRL=no 
BONDING_OPTS="mode=1 miimon=100" 
BRIDGE=br0 
/etc/sysconfig/network-scripts/ifcfg-br0 
DEVICE=br0 
BOOTPROTO=static 
IPADDR=EXT IP (LEFT|RIGHT) 
NETMASK=X.X.X.X 
ONBOOT=yes 
TYPE=Brige 
IPV6INIT=no 
STP=(on|off) 
/etc/sysconfig/network-scripts/bond1 
DEVICE=bond0 
BOOTPROTO=none 
ONBOOT=yes 
TYPE=Bonding 
USERCRL=no 
BONDING_OPTS="mode=0 miimon=100“ 
MTU=9000 
BRIDGE=br1 
/etc/sysconfig/network-scripts/ifcfg-br1 
DEVICE=br1 
BOOTPROTO=static 
IPADDR=INT IP (LEFT|RIGHT) 
NETMASK=255.255.255.252 
ONBOOT=yes 
TYPE=Brige 
IPV6INIT=no 
MTU=9000 
STP=off
Настраиваем Firewall 
#/etc/sysconfig/iptables 
-A INPUT -i br1 -j ACCEPT 
#service iptables restart
Результаты 
• Пара серверов 
• Отказоустойчивая связность между собой с размером пакеты 
mtu=9000 
• Отказоустойчивый выход в сеть 
• Операционная система с поддержкой файловой системы OCFS2
Дисковое пространство 
• Создаем на каждом сервере раздел 
lvcreate --name=data --size= (полный объем свободного места в группе) vg0
/etc/drbd.d/shared.res 
resource shared { 
protocol C; 
net { 
allow-two-primaries; 
sndbuf-size 0; 
} 
disk { 
no-disk-barrier; 
no-disk-flushes; 
} 
startup { 
become-primary-on both; 
} 
on HOSTNAME_LEFT { 
device minor 1; 
disk /dev/vg0/data; 
address INT IP LEFT:7789; 
meta-disk internal; 
} 
on HOSTNAME_RIGHT { 
device minor 1; 
disk /dev/vg0/data; 
address INT IP RIGHT:7789; 
meta-disk internal; 
} 
} 
• Конфигурируем DRBD
Дисковое пространство 
• Инициализируем раздел на обоих серверах: # drbdadm create-md 
shared 
• Запускаем DRBD на обоих серверах: 
# service drbd start 
# chkconfig drbd on 
• На любом сервере # drbdadm invalidate shared 
• Ожидаем пока #service drbd status покажет завершение 
синхронизации 
• На обоих узлах # drbdadm primary shared
Результат 
• Настроенная пара серверов с синхронизируемым дисковым 
пространством (блочным устройством) без файловой системы 
• На каждом сервере устройство доступно для чтения и записи
Файловая система 
• Ставим нужные пакеты 
# yum install ocfs2-tools 
• Настраиваем 
# /etc/ocfs2/cluster.conf 
node: 
ip_port = 7777 
ip_address = INT IP LEFT 
number = 0 
name = HOSTNAME_LEFT 
cluster = ocfs2 
node: 
ip_port = 7777 
ip_address = INT IP RIGHT 
number = 1 
name = HOSTNAME_RIGHT 
cluster = ocfs2 
cluster: 
node_count = 2 
name = ocfs2 
# service o2cb configure
Файловая система 
(продолжение) 
• Создаем файловую систему на любом сервере 
# mkfs.ocfs2 -F -N 3 -J block64 -L drbd_ocfs --mount cluster -T (datafiles|vmstore) 
/dev/drbd/by-res/shared 
• Настраиваем таблицу разделов на обоих серверах 
# /etc/fstab 
/dev/drbd1 /mnt/shared ocfs2 
defaults,noexec,nosuid,noacl,nouser_xattr,errors=remount-ro,localflocks 
• Монтируем файловую систему на обоих узлах 
# mkdir –p /mnt/shared/;chkconfig ocfs2 on;service ocf2 start
Проверка 
• Перезагружаем любой сервер и убеждаемся, что все работает 
• Делаем, чтобы работало 
• Не забываем, что узлов 2
Результат 
• Получили пару серверов с надежной файловой системой 
• В случае отказа одного из серверов все данные будут доступны 
• Можно переходить к виртуальным машинам
Структура раздела /mnt/shared 
• /mnt/shared/ 
• /mnt/shared/data/ 
• /mnt/shared/data/image1.bin 
• … 
• /mnt/shared/xml/ 
• /mnt/shared/xml/vhost1.xml 
• …
А дальше все просто! 
• Запускаем установку ОС 
# virt-install -n vhost1 -l http://mirror.yandex.ru/centos/6.5/os/x86_64/ -- 
vnc --disk path=/mnt/shared/data/iamge1-root.bin,size=200 –prompt 
• Ставим ОС 
• Сохраняем конфигурацию 
# virsh dumpxml vhost1 > /mnt/shared/xml/vhost1.xml
А дальше все просто! 
• Живая миграция виртуальной машины 
# virsh --connect=qemu:///system --quiet migrate --live vhost1 
qemu+ssh://INT_IP/system 
(лучше прописать внутренние адреса серверов в /etc/hosts) 
• Один сервер умер, срочно запускам на втором 
# virsh define /mnt/shared/xml/vhost1.xml 
# virsh start vhost1
А как бы автоматизировать 
• Pacemaker/corosync 
• Не забываем про STONITH девайсы 
• Ставим на мониторинг 
• Периодически проверяем
Отказоустойчивость сервиса 
• Оперативный запуск виртуальных машин – 1-15 минут в 
зависимости от сервиса 
• Наличие пассивного дублера – миграция IP адресов 
• Поддержка двух активных сервисов с автоматическим запуском 
по факту отказа
Отказоустойчивые ip адреса и сервисы 
Решений много 
1. HSRP – надежное аппаратное решение, требует наличия 
поддерживающего оборудования. Не знает ничего про другие 
сервисы, чем и ограничивается возможность применения. 
2. carp/ucarp – просто, надежно. Не знает ничего про другие 
сервисы, чем и ограничивается возможность применения. 
3. Heartbeat – фактически предок pacemaker/corosync. 
Конфигурировать сложно 
4. Pacemaker/corosync – аналог heartbeat но проще настраивать.
Отказоустойчивые ip адреса и сервисы 
Инструмент 
Управление 
сервисами 
Простота настройки Особенности 
HSRP Нет 
Зависит от 
конечного 
решения 
Требуется аппаратная 
поддержка 
UCARP Нет Просто 
heartbeat Да Сложно 
Может некорректно 
работать 
при высокой нагрузке на 
cистему 
pacemaker/corosync Да Средне 
Может некорректно 
работать 
при высокой нагрузке на 
cистему
Ограничение решения 
• Виртуальные машины не могут быть смигрированы за пределы 
своей пары хостов 
• Операции ввода-вывода медленнее, чем при некластерной 
(например ext3) файловой системе или локальном блочном 
устройстве выделенном через LVM 
• На каждом хосте необходимо иметь достаточно памяти для 
размещения всех критичных виртуальных машин этой пары 
хостовых машин
Типовые проблемы и решения 
Рассинхронизация DRBD после перезагрузки или аварийного сбоя 
• Не запускать виртуальные машины на хосте, на котором идет 
восстановление drbd до его завершения 
• Минимизировать операции ввода-вывода на неповрежденном 
хосте 
• При необходимости остановить синхронизацию и запустить ее в 
менее нагруженный интервал времени
Спасибо за внимание!

More Related Content

Конференция Highload++ 2014, "Отказоустойчивый микрокластер своими руками", "Ленвендо", Виталий Гаврилов

  • 1. Отказоустойчивый микрокластер своими руками Виталий Гаврилов
  • 2. Суть доклада • Построение отказоустойчивой «фермы» • Блочные устройства с высоким уровнем доступности и актуальности • «Живая» миграция виртуальных машин внутри «фермы» • «Отказоустойчивые» IP сервисы на базе corosync/pacemaker или carp/ucarp
  • 3. Типовые решения Полноценный кластер – дорого, сложно, тяжело поддерживать
  • 4. Типовые решения • Некластеризованные виртуальные/реальные сервера с синхронизацией данных «по необходимости» либо «по расписанию» с дублированием – избыточные ресурсы, дополнительные расходы на синхронизацию
  • 5. Цель доклада • Отказоустойчивый микрокластер, «собранный» из попарно соединенных физических серверов. Бюджетно и надежно
  • 6. Схема сетевой линковки NODE-LEFT NODE-RIGHT SWITCH1 SWITCH2 eth0 eth1 eth2 eth3 eth0 eth1 eth2 eth3 bond1 bond0 bond1 bond0 EXT IP LEFT EXT IP RIGHT INT IP LEFT INT IP RIGHT
  • 7. Схема сетевой линковки NODE-LEFT NODE-RIGHT SWITCH1 SWITCH2 eth0 eth1 eth2 eth3 eth0 eth1 eth2 eth3 bond1 bond0 bond1 bond0 EXT IP RIGHT EXT IP LEFT INT IP RIGHT INT IP LEFT br1 br0 br1 br0
  • 8. Операционная система Операционная система – Oracle Linux • Бесплатная поддержка (обновления) • Единый репозиторий как для коммерческих, так и для платных условий поддержки • Продолжительный период поддержки
  • 9. Разбивка диска • /boot/ - 200 Mb • SWAP – от 0.5 до 2.0 от объема RAM • Остальное под LVM (группа vg0) • / - 10Gb (volume_name = root) • Остальное не распределяем swap boot root data
  • 10. Конфигурация сетевых интерфейсов (bonding) /etc/sysconfig/network-scripts/eth[0-1] DEVICE="eth[0-1]" BOOTPROTO="static" HWADDR=“XX:XX:XX:XX:XX:XX" NM_CONTROLLED="no" ONBOOT="yes" MASTER=bond0 SLAVE=yes TYPE="Ethernet" /etc/sysconfig/network-scripts/bond0 DEVICE=bond0 BOOTPROTO=none ONBOOT=yes IPADDR=EXT IP (LEFT|RIGHT) NETMASK=X.X.X.X TYPE=Bonding USERCRL=no BONDING_OPTS="mode=1 miimon=100" /etc/sysconfig/network-scripts/eth[2-3] DEVICE="eth[2-3]" BOOTPROTO="static" HWADDR=“XX:XX:XX:XX:XX:XX" NM_CONTROLLED="no" ONBOOT="yes" MASTER=bond1 SLAVE=yes MTU=9000 TYPE="Ethernet“ /etc/sysconfig/network-scripts/bond1 DEVICE=bond0 BOOTPROTO=none ONBOOT=yes IPADDR=INT IP (LEFT|RIGHT) NETMASK=255.255.255.252 TYPE=Bonding USERCRL=no MTU=9000 BONDING_OPTS="mode=0 miimon=100"
  • 11. Конфигурация сетевых интерфейсов (bridge) /etc/sysconfig/network-scripts/bond0 DEVICE=bond0 BOOTPROTO=none ONBOOT=yes TYPE=Bonding USERCRL=no BONDING_OPTS="mode=1 miimon=100" BRIDGE=br0 /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 BOOTPROTO=static IPADDR=EXT IP (LEFT|RIGHT) NETMASK=X.X.X.X ONBOOT=yes TYPE=Brige IPV6INIT=no STP=(on|off) /etc/sysconfig/network-scripts/bond1 DEVICE=bond0 BOOTPROTO=none ONBOOT=yes TYPE=Bonding USERCRL=no BONDING_OPTS="mode=0 miimon=100“ MTU=9000 BRIDGE=br1 /etc/sysconfig/network-scripts/ifcfg-br1 DEVICE=br1 BOOTPROTO=static IPADDR=INT IP (LEFT|RIGHT) NETMASK=255.255.255.252 ONBOOT=yes TYPE=Brige IPV6INIT=no MTU=9000 STP=off
  • 12. Настраиваем Firewall #/etc/sysconfig/iptables -A INPUT -i br1 -j ACCEPT #service iptables restart
  • 13. Результаты • Пара серверов • Отказоустойчивая связность между собой с размером пакеты mtu=9000 • Отказоустойчивый выход в сеть • Операционная система с поддержкой файловой системы OCFS2
  • 14. Дисковое пространство • Создаем на каждом сервере раздел lvcreate --name=data --size= (полный объем свободного места в группе) vg0
  • 15. /etc/drbd.d/shared.res resource shared { protocol C; net { allow-two-primaries; sndbuf-size 0; } disk { no-disk-barrier; no-disk-flushes; } startup { become-primary-on both; } on HOSTNAME_LEFT { device minor 1; disk /dev/vg0/data; address INT IP LEFT:7789; meta-disk internal; } on HOSTNAME_RIGHT { device minor 1; disk /dev/vg0/data; address INT IP RIGHT:7789; meta-disk internal; } } • Конфигурируем DRBD
  • 16. Дисковое пространство • Инициализируем раздел на обоих серверах: # drbdadm create-md shared • Запускаем DRBD на обоих серверах: # service drbd start # chkconfig drbd on • На любом сервере # drbdadm invalidate shared • Ожидаем пока #service drbd status покажет завершение синхронизации • На обоих узлах # drbdadm primary shared
  • 17. Результат • Настроенная пара серверов с синхронизируемым дисковым пространством (блочным устройством) без файловой системы • На каждом сервере устройство доступно для чтения и записи
  • 18. Файловая система • Ставим нужные пакеты # yum install ocfs2-tools • Настраиваем # /etc/ocfs2/cluster.conf node: ip_port = 7777 ip_address = INT IP LEFT number = 0 name = HOSTNAME_LEFT cluster = ocfs2 node: ip_port = 7777 ip_address = INT IP RIGHT number = 1 name = HOSTNAME_RIGHT cluster = ocfs2 cluster: node_count = 2 name = ocfs2 # service o2cb configure
  • 19. Файловая система (продолжение) • Создаем файловую систему на любом сервере # mkfs.ocfs2 -F -N 3 -J block64 -L drbd_ocfs --mount cluster -T (datafiles|vmstore) /dev/drbd/by-res/shared • Настраиваем таблицу разделов на обоих серверах # /etc/fstab /dev/drbd1 /mnt/shared ocfs2 defaults,noexec,nosuid,noacl,nouser_xattr,errors=remount-ro,localflocks • Монтируем файловую систему на обоих узлах # mkdir –p /mnt/shared/;chkconfig ocfs2 on;service ocf2 start
  • 20. Проверка • Перезагружаем любой сервер и убеждаемся, что все работает • Делаем, чтобы работало • Не забываем, что узлов 2
  • 21. Результат • Получили пару серверов с надежной файловой системой • В случае отказа одного из серверов все данные будут доступны • Можно переходить к виртуальным машинам
  • 22. Структура раздела /mnt/shared • /mnt/shared/ • /mnt/shared/data/ • /mnt/shared/data/image1.bin • … • /mnt/shared/xml/ • /mnt/shared/xml/vhost1.xml • …
  • 23. А дальше все просто! • Запускаем установку ОС # virt-install -n vhost1 -l http://mirror.yandex.ru/centos/6.5/os/x86_64/ -- vnc --disk path=/mnt/shared/data/iamge1-root.bin,size=200 –prompt • Ставим ОС • Сохраняем конфигурацию # virsh dumpxml vhost1 > /mnt/shared/xml/vhost1.xml
  • 24. А дальше все просто! • Живая миграция виртуальной машины # virsh --connect=qemu:///system --quiet migrate --live vhost1 qemu+ssh://INT_IP/system (лучше прописать внутренние адреса серверов в /etc/hosts) • Один сервер умер, срочно запускам на втором # virsh define /mnt/shared/xml/vhost1.xml # virsh start vhost1
  • 25. А как бы автоматизировать • Pacemaker/corosync • Не забываем про STONITH девайсы • Ставим на мониторинг • Периодически проверяем
  • 26. Отказоустойчивость сервиса • Оперативный запуск виртуальных машин – 1-15 минут в зависимости от сервиса • Наличие пассивного дублера – миграция IP адресов • Поддержка двух активных сервисов с автоматическим запуском по факту отказа
  • 27. Отказоустойчивые ip адреса и сервисы Решений много 1. HSRP – надежное аппаратное решение, требует наличия поддерживающего оборудования. Не знает ничего про другие сервисы, чем и ограничивается возможность применения. 2. carp/ucarp – просто, надежно. Не знает ничего про другие сервисы, чем и ограничивается возможность применения. 3. Heartbeat – фактически предок pacemaker/corosync. Конфигурировать сложно 4. Pacemaker/corosync – аналог heartbeat но проще настраивать.
  • 28. Отказоустойчивые ip адреса и сервисы Инструмент Управление сервисами Простота настройки Особенности HSRP Нет Зависит от конечного решения Требуется аппаратная поддержка UCARP Нет Просто heartbeat Да Сложно Может некорректно работать при высокой нагрузке на cистему pacemaker/corosync Да Средне Может некорректно работать при высокой нагрузке на cистему
  • 29. Ограничение решения • Виртуальные машины не могут быть смигрированы за пределы своей пары хостов • Операции ввода-вывода медленнее, чем при некластерной (например ext3) файловой системе или локальном блочном устройстве выделенном через LVM • На каждом хосте необходимо иметь достаточно памяти для размещения всех критичных виртуальных машин этой пары хостовых машин
  • 30. Типовые проблемы и решения Рассинхронизация DRBD после перезагрузки или аварийного сбоя • Не запускать виртуальные машины на хосте, на котором идет восстановление drbd до его завершения • Минимизировать операции ввода-вывода на неповрежденном хосте • При необходимости остановить синхронизацию и запустить ее в менее нагруженный интервал времени