Практический опыт использования решений виртуализации в web-проектах Александр Чистяков bOombate http://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/chxen.html • Xen + DRBD + Heartbeat: http://old.nabble.com/DRBDXen-LVM2-Heartbeat-Ubuntu-Gutsy-HowTotd17245190.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=1 net.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