Практический опыт использования решений виртуализации в web-
проектахАлександр Чистяков
bOombatehttp://alexclear.livejournal.com
Докладчик?
• Разработчик серверных приложений• Эксплуатационщик• DevOps• Архитектор серверных приложений• Просто хороший человек
Аудитория?
• Разработчики серверных приложений• Эксплуатационщики• DevOps’ы• Архитекторы серверных приложений• Просто хорошие люди
Зачем нужна виртуализация?
• Возможность создания качественно разных окружений
• Возможность изоляции окружений• Возможность консолидации серверов• Слой абстракции между «голым железом» и
платформой• Возможность автоматического развертывания
и миграции
Не будем усложнять
• Windows-машины в Linux-окружении• Каждому разработчику – своя песочница• Один «железный» сервер на всех
разработчиков• Возможность легко выполнить миграцию
(апгрейд)• Возможность выполнить миграцию
автоматически, возможность быстро развернуть еще одну ноду
Типы виртуализации• Программная:
– Эмуляция (Bochs, PearPC)– Динамическая трансляция (VMWare, VirtualBox)– Паравиртуализация (Xen)
• Аппаратная виртуализация (Xen, KVM, VirtualBox, Hyper-V, VMWare)
• Виртуализация уровня ОС:– LXC, OpenVZ, Virtuozzo– FreeBSD Jail
Какой тип нужен нам?
• А чего хотим добиться?• Больше возможностей – меньше
производительность:– Попробуйте поставить Debian на Bochs
• Аппаратная виртуализация для Windows на Linux
• Уровня ОС (контейнерная) – для гомогенных сред (одно ядро на все инстансы)
• Паравиртуализация
Аппаратная виртуализация
• Xen и производные• KVM• VirtualBox• Hyper-V• VMWare Player• VMWare ESX• VMWare ESXi
Xen и производные• Xen исторически первая Open Source система
виртуализации, начинался как паравиртуализатор
• Отлично поддерживает ядро 2.6.18 и отлично поддерживался RedHat 5.x и производными
• Платный Citrix XenServer• Между 3-ей и 4-й версией был большой
перерыв, продукт перестал нормально поддерживаться многими дистрибутивами (отказ RedHat в пользу KVM)
Немного личного опыта• Xen 3.X, CentOS 5.X• Настройка через virt-manager тривиальна
– Если вы не настраиваете паравиртуализацию с ядром вне образа диска
• “unaligned memory access” в логе на Dom0– Решение проблемы методом черных очков (помогло)
• Под большой нагрузкой не использовался• Никаких проблем не доставлял
Паравиртуализация
• Ядро для DomU не такое, как для Dom0, поэтому вариантов гест-систем больше
• Можно располагать ядро вне файловой системы виртуального диска
• Виртуальные диски можно подключать прямо как логические, что упрощает разметку
• Amazon и другие так и делают
Что еще хорошего?
• Remus – механизм отказоустойчивости путем репликации системы в целом (в т.ч. состояния RAM)
• Xen + DRBD: http://www.drbd.org/users-guide/ch-xen.html
• Xen + DRBD + Heartbeat: http://old.nabble.com/DRBD-Xen-LVM2-Heartbeat-Ubuntu-Gutsy-HowTo-td17245190.html (я делал без LVM2 и без Ubuntu Gutsy, достаточно CentOS 6, например)
Семейство WMWare
• VMWare Player – невероятно интрузивное и неудобное решение (компилирует модули ядра, стартует какие-то сервисы и вообще ведет себя вызывающе)
• VMWare ESX, VMWare ESXi – не знаю, не пробовал, но если стоит ознакомиться, то дайте знать
VirtualBox
• При определенной сноровке можно заставить его работать в headless режиме
• А можно просто взять Vagrant (http://vagrantup.com) и сделать все с его помощью
• Нужно только иметь в виду, что VirtualBox виртуализирует диск таким образом, что при вызове fsync() не происходит ничего– Некоторые приложения могут пострадать
Hyper-V• Всего один график из Munin (в системе за это время не
поменялось ничего, кроме апдейтов ядра):
• Все еще хотите что-то хостить под Hyper-V? Удачи!
KVM
• Производится подразделением RedHat• Используется как базовая система
виртуализации в CentOS 6• Довольно давно код принят в ядро Linux• Виртуальные машины управляются через
libvirtd• Хорошие новости на этом закончились• Да ты просто не умеешь ее готовить!
Как готовить KVM
• Для сетевой подсистемы всегда выбирайте bridge с реальным устройством, а не виртуальный ethernet
• Для дисковой подсистемы лучше всего взять raw flat image либо block device целиком
• Кэш диска выставьте в none для block device– Или в writeback для image, если вы смелый человек
• Очень хорошо иметь RAID-контроллер с батарейкой
Как готовить KVM – тюнинг ядра
• Слева – host, справа - guest:
• kernel .... nohz=off highres=off• Видел один раз на Хетцнере
Все это не избавит вас от• [ 839.921196] INFO: task apache2:2444 blocked for more than
120 seconds. [ 839.921562] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.• Выглядит страшновато (к этому сообщению
еще прилагается стекртрейс)• У одного европейского «облачного хостера»
раз в неделю отказывал виртуальный диск в инстансе
• Что же делать?
Виртуализация уровня ОС?
• Ядро одно и то же:– Файловая система разделяется между инстансами– Свободная память разделяется между всеми
инстансами• Звучит заманчиво, потери
производительности должны быть очень небольшими
• Linux:– OpenVZ– LXC
OpenVZ
• Не входит в официальное ядро– Те же проблемы, что у Xen – есть только под stable
ядра• Давно на рынке
– Очень стабильно• Ориентировано на массовый хостинг
– Ограничения по умолчанию установлены довольно жестко
Личный опыт
• Работает отлично при любых нагрузках– 4 млн. хитов в день в контейнере с apache2
• Надо только следить за /proc/user_beancounters
• Есть тонкости при работе с IPsec• Хотите использовать Ubuntu 12.04 LTS в
контейнере? Good luck! (но это проблемы Canonical, а не ваши?)
LXC
• Входит в официальное ядро– Нужны достаточно свежие ядра, в «серверных»
дистрибутивах их пока нет• Пользовательская база пока довольно мала
– Про стабильность на следующем слайде• Ориентировано на всех
– Конфигурация стандартизована и не вызывает удивления у новичков, ограничения по умолчанию гораздо мягче
LXC – личный опыт• Первые дни все работало прекрасно• Потом стали пропадать вещи:
– ping есть, а git pull сделать нельзя– Иногда icmp ответы о том, что пакет очень велик– Роутинг до всех узлов есть, а до mxs.mail.ru нет
• Что-то крепко сломано в сетевой подсистеме– Писал в рассылку разработчиков, но письмо даже не
прошло модерацию– Нет проблем, мигрируем на OpenVZ
А как роутить?
• Если ситуация позволяет – static routes на подсети виртуальных машин на каждом хосте
• Если нет – IPsec туннели между хост-машинами с роутингом подсетей виртуальных машин
• IPsec:– Я использую racoon/setkey– iperf показывает 100Mbit/s, для моих задач
достаточно
IPsec и OpenVZ
• Просто так не заработает, нужно тюнить параметры ядра на guest-машине (!)
• /etc/sysctl.conf:net.ipv4.conf.venet0.disable_policy=1net.ipv4.conf.venet0.disable_xfrm=1
А как бэкапить?
• Общий принцип:– Сделать снэпшот– Переписать снэпшот в другое место
• Еще можно бэкапить guest-машину как обычную
• Снэпшоты:– Уровня системы виртуализации– Уровня блочного устройства– Уровня файловой системы
Снэпшоты
• Уровня системы виртуализации– Я лично применял только в Hyper-V
• Уровня блочного устройства– Снэпшот LVM со всеми его плюсами и минусами
• Снэпшоты уровня FS:– Нужна CoW файловая система– Лишены недостатков LVM снэпшотов– Все было бы хорошо, но...
LVM• Достоинства
– Работают вне зависимости от типа вышележащей FS• Недостатки
– Необходимо не забывать предварительно оставлять свободное место на LVM volume group
– Потеря производительности– Снэпшот может переполниться– При увеличении одновременного числа снэпшотов
проблемы линейно растут
CoW FSes• ZFS
– Давно в продакшн– Лицензионно несовместима с ядром Linux
• BTRFS– Пока не доросла до «беты»– Нет fsck– Не рекомендуется к использованию на разделах с
образами дисков виртуальных машин• HAMMER
– Кто-нибудь в зале о ней слышал?
ZFS и Linux• ZFS-FUSE
– Работает в userspace– Довольно стабильна– Pool version 21
• ZFS on Linux (http://zfsonlinux.org)– Модуль ядра– POSIX layer появился сравнительно недавно– Pool version 28
ZFS-FUSE vs ZFS on Linux• ZFS-FUSE: -a 86400 -e 3600 -v 160 -m 512• Найдите на графике момент перехода от ZFS-
FUSE к ZFS on Linux:
Развитие ситуации• ZFS-FUSE практически мертва• ZFS on Linux у многих в продакшне уже сейчас• В том числе, и у меня, но на некритичных
участках• BTRFS можно пытаться использовать для
OpenVZ и LXC уже сейчас
Выводы• На вкус и цвет все решения виртуализации
разные– Есть и такие, которые хорошо работают под
нагрузкой• При правильном использовании
виртуализация может приносить большую пользу– А при неправильном доставлять большую головную
боль• Универсального решения, по-прежнему, нет
– Но есть наборы граничных условий, определящих применимость того или иного варианта
Вопросы?• • • • • •
Спасибо за внимание!• С вами был Александр Чистяков• http://alexclear.livejournal.com• [email protected]• http://github.com/alexclear
Recommended