Конференция highload++ 2014, "Отказоустойчивый...
DESCRIPTION
inShare 0 views Компания "Ленвендо" занимается созданием, развитием и поддержкой крупномасштабных онлайн-проектов. Сегодня «Ленвендо» отвечает за работу ресурсов «Эльдорадо», «Связной», HomeMe, Газпромбанк, Эхо Москвы в ПетербургеTRANSCRIPT
Отказоустойчивый
микрокластер
своими рукамиВиталий Гаврилов
Суть доклада
• Построение отказоустойчивой «фермы»
• Блочные устройства с высоким уровнем доступности и
актуальности
• «Живая» миграция виртуальных машин внутри «фермы»
• «Отказоустойчивые» IP сервисы на базе corosync/pacemaker или
carp/ucarp
Типовые решенияПолноценный кластер – дорого, сложно, тяжело поддерживать
Типовые решения
• Некластеризованные
виртуальные/реальные сервера с
синхронизацией данных «по
необходимости» либо «по расписанию» с
дублированием – избыточные ресурсы,
дополнительные расходы на
синхронизацию
Цель доклада
• Отказоустойчивый микрокластер, «собранный»
из попарно соединенных физических серверов.
Бюджетно и надежно
Схема сетевой линковки
NO
DE
-LE
FT
NO
DE
-RIG
HT
eth0
eth1
eth2
eth3
eth0
eth1
eth2
eth3
bon
d0
bon
d1
bon
d1
bon
d0
SWITCH1 SWITCH2
EXT IP RIGHTEXT IP LEFT
INT IP RIGHTINT IP LEFT
Схема сетевой линковки
NO
DE
-LE
FT
NO
DE
-RIG
HT
eth0
eth1
eth2
eth3
eth0
eth1
eth2
eth3
bo
nd0
bon
d1
bon
d1
bo
nd0
SWITCH1 SWITCH2
EXT IP
RIGHTEXT IP LEFT
INT IP
RIGHTINT IP LEFT
br0
br1
br0
br1
Операционная система
Операционная система – Oracle Linux
• Бесплатная поддержка (обновления)
• Единый репозиторий как для коммерческих, так и для платных
условий поддержки
• Продолжительный период поддержки
Разбивка диска• /boot/ - 200 Mb
• SWAP – от 0.5 до 2.0 от
объема RAM
• Остальное под LVM
(группа vg0)
• / - 10Gb
(volume_name = root)
• Остальное не
распределяем
swap boot
data
root
Конфигурация сетевых интерфейсов (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.confnode:
ip_port = 7777ip_address = INT IP LEFTnumber = 0name = HOSTNAME_LEFTcluster = ocfs2
node:ip_port = 7777ip_address = INT IP RIGHTnumber = 1name = HOSTNAME_RIGHTcluster = ocfs2
cluster:node_count = 2name = 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 до его завершения
• Минимизировать операции ввода-вывода на неповрежденном
хосте
• При необходимости остановить синхронизацию и запустить ее в
менее нагруженный интервал времени
Спасибо за внимание!