Содержание статьи
SmartOS — одна из ветвей дерева, растущего из корней легендарной ОС Solaris. Несмотря на экзотичную «родословную», эта платформа активно развивается и уже сегодня позволяет добиваться высокой скорости работы и внедрять некоторые фишки, недоступные в более привычном Linux. Эта статья рассказывает о нашем опыте работы со SmartOS.
Введение
В конце 2012 года у меня на проекте не хватало JS-программеров для изучения Node.js. И я решил восполнить пробел самостоятельно. Изучил фреймворк, написал «Hello world» и даже немножко больше, ведь на Node.js основан яндексовский инструментарий для работы по методологии БЭМ, который мы захотели использовать в том проекте. А когда что-то берешь для своего проекта, это почти всегда нужно патчить... Но речь пойдет о другом.
Посмотрев, кто основной спонсор развития Node.js, я узнал, что это компания Joyent, которая в том числе развивает проект SmartOS — облачной операционной системы. Сначала я подумал, что SmartOS — это какая-то специальная ОС, модифицированный линукс, под которой особенно хорошо живет Node.js. Но когда я почитал побольше, меня постиг культурный шок!
Оказалось, что SmartOS — это потомок ОС OpenSolaris, которая была похоронена компанией Oracle, купившей Sun Microsystems в 2010 году... Надо отметить, что я с девяностых годов был поклонником Sun. Еще до появления линухов весь роутинг в моей компании, которая продавала dial-up доступ в интернет, крутился на FreeBSD. А мечтой был какой-нибудь SparcStation под Solaris8. Тогда эти системы были несомненными лидерами на коммерческом рынке серверов и серверных ОС. И надо сказать, не зря. Система действительно была надежная, а инженеры в Sun работали одни из лучших в мире.
Когда в 2005-м Sun открыла код Solaris, я подумал, что наконец в мире может появиться что-то мощное, альтернативное линуксу. Я даже заказал на Амазоне книжку OpenSolaris Bible (зачем? Ведь есть интернет).
Но в силу организационных причин и невозможности преодолеть коммерческие лицензионные ограничения, к которым все привыкли, система развивалась плохо. И в конце концов Oracle ее закрыла. Я тогда подумал: жаль, опять в мире исчезло что-то хорошее.
Теперь вы поймете мои чувства, когда спустя более чем два года после закрытия OpenSolaris я узнал, что достаточно крупная фирма развивает этот код. Она наняла для этого бывших инженеров Sun, хоть и не всех. А такие технологии, как ZFS и DTrace, продолжают развиваться, в том числе их создателями, которые работают уже в не Oracle, а в других компаниях. Для меня это было сравнимо с радостью, которую испытываешь при возрождении из пепла чего-то хорошего и прекрасного!
Я погрузился в чтение про SmartOS и стал играться с ней.
Немного истории
В августе 2010 года в Oracle решили прекратить развитие проекта c открытым кодом OpenSolaris и сосредоточиться на разработке SolarisExpress с закрытым кодом. Сразу вслед за этим сообщество независимых инженеров, ранее работавших в Sun Microsystems, запустило проект с открытым кодом illumos, как форк ядра из проекта OpenSolaris. При этом разработчики illumos не ставят перед собой задачу делать полный дистрибутив, этим занимаются проекты SmartOS, Nexenta OS, OmniOS, BeleniX, OpenIndiana и другие.
Одновременно из Oracle стали уходить инженеры, стоявшие у истоков таких технологий начала двухтысячных годов, как ZFS, DTrace, Zones, — Брайан Кантрилл (Bryan Cantrill), Адам Левенталь (Adam Leventhal), Дэйв Пачеко (Dave Pacheco), Брэндан Грегг (Brendan Gregg), Роберт Мустаччи (Robert Mustacchi) и другие. Инициатором проекта illumos стал Гаррет Д’Амор (Garrett D’Amore).
Многие из дистрибутивов развиваются отдельными компаниями — Joyent, Nexenta, Delphix и другими. Там, как правило, есть один или несколько человек, ранее работавших в Sun или имевших отношение к этой экосистеме. В настоящей статье мы поговорим о SmartOS — дистрибутиве illumos, созданном для управления облачными услугами. Развивает SmartOS сейчас компания Joyent, занимающая 8–9-е место на американском рынке облачных IaaS-услуг.
Грузимся с флешки, работаем из памяти
В чем же состоят основные отличия SmartOS от «обычных» операционных систем?
Наверное, первое, о чем стоит сказать, — это отсутствие системных файлов ОС на локальном диске. SmartOS загружается с флешки или по сети и затем целиком располагается в памяти сервера. На диске находятся только данные (обычно данные виртуальных машин). Такое свойство позволяет системе очень быстро работать в связи с отсутствием дисковых операций, но, конечно, ценой более длительного времени загрузки и усложненным механизмом «запоминания» пользовательских данных сервера — его адресов, конфигураций и прочего, что должно настраиваться при загрузке ОС.
Второе важное отличие — встроенный механизм виртуализации, основанный на контейнерной технологии. В других ОС для виртуализации требуется дополнительное ПО гипервизора. Контейнерная виртуализация позволяет избежать дополнительного слоя гипервизора. Широкая система разделения прав, присутствовавшая в Solaris10 и OpenSolaris, позволила создать технологию Zones, благодаря ей виртуальная машина управляется той же самой ОС, которая стоит на всем сервере. Это похоже на OpenVZ и Virtuozzo Containers, но имеет совершенно другие и более глубокие корни, уходящие в семейство SunOS, развивавшееся с восьмидесятых — девяностых годов.
Третье важное отличие — это файловая система ZFS, используемая как основная. Рассказ о ZFS требует отдельной большой статьи. Здесь я скажу лишь, что эта файловая система несет в себе большое количество высокоуровневых функций и позволяет с легкостью обращаться с образами виртуальных машин — копируя и резервируя их очень гибко. Кроме того, ZFS имеет в своей основе принцип copy-on-write, который позволяет очень эффективно хранить резервные копии данных, занимая минимум физического дискового пространства. Также можно делать очень быстро и много snapshots (моментальные «снимки» папок файловой системы), для разных целей.
Благодаря мощному уровню сетевой виртуализации можно создавать виртуальные порты практически в неограниченном количестве, виртуальные сети между виртуальными машинами, осуществлять роутинг, фильтрацию пакетов и многое другое на одном физическом интерфейсе. Эта технология позволяет создавать сложные сетевые архитектуры с разными ролями и правами виртуальных серверов внутри одного физического сервера!
Ставим систему на сервер
В качестве сервера, на который мы решили поставить тестовую версию SmartOS, мы использовали машинку ASUS RS720-E6/RS12. В качестве дисковой системы в сервере было установлено четыре диска по 2 Тб и четыре SSD по 225 Гб. Для начала мы настроили на аппаратном RAID логические диски RAID-0, которые были равны физическим, — то есть мы получили восемь логических дисков, которые через BIOS отдавались на уровень ОС. ZFS хорошо умеет кешировать, поэтому лучше отдавать ей физические диски, однако в случае Dell его аппаратный RAID оказался более производительным. Если у тебя есть время измерить два варианта для своей системы — лучше измерить.
Качаем самый свежий образ системы с официального сайта, там нужно выбрать твой вариант образа. В нашем случае это был USB Image, который мы записали на флешку по инструкции. Вставляем флешку в сервер и указываем в BIOS, что грузиться надо именно с нее.
После загрузки система спрашивает нас имена дисков, которые надо подключить к ZFS, сетевую конфигурацию и просит ввести имя машины. Забавно, что после загрузки ты сможешь войти под root не с тем паролем, который ты скачал в дистрибутиве, а под паролем root. Ну все, система стоит, теперь можно посмотреть, как сконфигурированы диски при помощи команды zpool status, и настроить их немного по-другому, для лучшей производительности. Так, все SSD-диски, которые у тебя есть, нужно отдать под кеш при помощи команды, аналогичной приведенной ниже, но с твоими именами дисков:
# zpool create pool c0d0 c1d0 cache c2d0 c3d0
Если что-то не будет получаться, обращайся к мануалам :). А если что-то совсем не будет получаться — обращайся к нам.
Виртуалки создаются при помощи команды vmadm, сетевые настройки меняются при помощи dladm и ipadm. Все конфигурационные программы очень мощны, настроить можно практически любую сложную конфигурацию из виртуалок, специфически соединенных между собой разными сетевыми соединениями.
Warning!
Не покупай дешевые флешки для продакшена! Лучше купить нормальную: она будет стоять в теплом/горячем сервере. У меня одна так уже сгорела, когда я пытался обновить ее новым образом ПО.
А как насчет стандартного LAMP?
Какой у нас самый распространенный web stack? Правильно. Apache — PHP — MySQL. Посмотрим, как он ставится в виртуалку под SmartOS и как работает. Создадим новую виртуальную машину:
# vmadm -f newmachine.json
В файле newmachine.json находится описание JSON нашей виртуалки:
{
"zonename": "myvm",
"autoboot": true,
"brand": "joyent",
"cpu_shares": 100,
"image_uuid": "9eac5c0c-a941-11e2-a7dc-57a6b041988f",
"max_physical_memory": 768,
"hostname": "myhostname",
"quota": 30,
"zfs_io_priority": 100,
"resolvers": [
"8.8.8.8",
"8.8.4.4"
],
"nics": [
{
"interface": "net0",
"nic_tag": "admin",
"vlan_id": 0,
"gateway": "10.17.0.1",
"ip": "10.17.0.2",
"netmask": "255.255.255.0"
}
]
}
В реальной конфигурации рекомендую заменить hostname, resolvers и IP на твои.
В качестве образа мы выбрали практически «пустую» 64-битную систему SmartOS. Создание машины происходит за несколько секунд, после чего в нее можно залогиниться из глобальной зоны:
# zlogin myvm
Теперь нам нужно установить Apache и/или nginx, PHP, MySQL/percona. В качестве менеджера пакетов в SmartOS используется программа pkgin:
// Обновляем список пакетов
# pkgin -y up
// Ищем наши пакеты
# pkgin av | grep "\(percona\|apache\|php\)"
В списке будут пакеты нескольких последних версий. Выберем нужные и установим:
# pkgin in apache-2.2 php-5.4 ap22-php54 percona-server
Затем нужно установить необходимые библиотеки для PHP (они разные для разных движков, но те, что ниже, обычно устанавливаются всегда, обратись к документации твоей PHP-программы):
pkgin in php54-mysql php54-mysqli php54-curl php54-gd php54-dom php54-iconv php54-mbstring
Теперь пришло время настроить сервисы:
// Стартуем сервер баз данных
# svcadm enable percona-server
// Устанавливаем пароль
# /opt/local/bin/mysqladmin -u root -p password 'your_new_password'
// Прогоняем скрипт безопасной установки
# /opt/local/bin/mysql_secure_installation
Затем создавай новую базу и загружай туда данные, как в обычном MySQL. Далее настраиваем Apache:
# vim /opt/local/etc/httpd/httpd.conf
Как ты уже понял, все настройки лежат в /opt/local/etc. Думаю, что настраивать Apache умеют все. Хочу лишь напомнить, чтобы ты не забыл загрузить модуль PHP:
LoadModule php5_module lib/httpd/mod_php5.so
AddHandler application/x-httpd-php .php
После изменений файла конфигурации перезапускаем сервис:
# svcadm restart apache
Теперь настроим PHP:
# vim /opt/local/etc/php.ini
Как минимум, нужно прописать в конфигурации наши расширения:
extension=mysql.so
extension=mysqli.so
extension=curl.so
extension=iconv.so
extension=mbstring.so
extension=dom.so
extension=gd.so
Или что там у тебя еще есть... Не забудь заставить Apache перечитать новую конфигурацию PHP:
# svcadm refresh apache
Осталось положить в document_root твой контент, и сайт можно смотреть в браузере. Если твой сервер использует SSD и ты настроил кеш ZFS на нем, то измерения скорости загрузки страниц, скорее всего, приятно тебя удивят.
Кстати, для того, чтобы посмотреть процессы в SmartOS, используется команда prstat. Это аналог top в Linux. А если интересует таблица соответствия команд SmartOS и Linux, ее можно найти по ссылке в INFO.
Ставим Zabbix
Конечно, если у тебя стоят виртуальные серверы и что-то делают, имеет смысл запустить на них мониторинг. Один из самых популярных пакетов мониторинга Zabbix прекрасно ставится на SmartOS. Качаем последнюю версию Zabbix в /opt/local/src:
# mkdir -p /opt/local/src; cd /opt/local/src
# wget http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/2.0.6/zabbix-2.0.6.tar.gz/download
# tar xzvf zabbix-2.0.6.tar.gz
Теперь надо скомпилировать исходники. Не забудь поставить GCC, если он еще у тебя не поставлен:
# pkgin in gcc47
Затем нужно сконфигурировать пакет. Ты можешь сконфигурировать сервер и агент одновременно, а можешь скомпилировать только сервер или только агент. Выбор за тобой. Мы компилировали и то и другое.
# cd zabbix-2.0.6
# ./configure --prefix=opt/local --enable-server --enable-agent --withh-curl --with-iconv=/opt/local
Если не было ошибок, копируем скомпилированные бинарники в место их назначения:
# make install
Надеюсь, компиляция прошла успешно и ты можешь приступить к конфигурационным сайтам Zabbix (обратись к сайту Zabbix, если необходимо).
- Создай пользователя и группу:
# groupadd zabbix; useradd -g zabbix zabbix
- Создай базу данных и загрузи схему (мы использовали MySQL, если ты используешь другую СУБД, обратись к Zabbix site):
# cd /opt/local/src/zabbix-2.0.6 # mysql -u -p # create database zabbix character set utf8 collate utf8_bin; # quit; # mysql -u -p zabbix < database/mysql/schema.sql # mysql -u -p zabbix < database/mysql/images.sql # mysql -u -p zabbix < database/mysql/data.sql
- Отредактируй конфигурационные файлы. Мы предполагаем, что агент и сервер Zabbix находятся на одной виртуалке. Если это так, то конфигурация будет следующей. Содержание файла /opt/local/etc/zabbix_agentd.conf:LogFile=/var/log/zabbix/agentd.log Server=127.0.0.1 ServerActive=127.0.0.1
Оставь остальные параметры по умолчанию. А содержание /opt/local/etc/zabbix_server.conf будет таким:
LogFile=/var/log/zabbix/server.log
DBName=zabbix
DBUser=<your_user_with_acess_to_zabbix_db>
DBPassword=<password_for_above_user>
Остальные параметры также оставь по умолчанию.
- Стартуем демоны:
# LD_LIBRARY_PATH=/opt/local/lib zabbix_server # LD_LIBRARY_PATH=/opt/local/lib zabbix_agentd
Переменные окружения LDLIBRARYPATH необходимы либо здесь, либо при компиляции (последнее предпочтительнее, конечно). Я компилировал без них, поэтому моя инсталляция не распознает библиотеку iconv, которая находится в папке /opt/local/lib. Вот почему я использую переменные окружения.
- Теперь пришло время скопировать файлы интерфейса Zabbix (.php) в папку документов твоего веб-сервера:
# mkdir <htdocs>/zabbix # cd /opt/local/src/zabbix-2.0.6/frontends/php # cp -a . <htdocs>/zabbix
Если твой веб-сервер был настроен на использование PHP и его document_root смотрит в папку htdocs, то ты можешь продолжить установку из браузера, введя в адресной строке http://<адрес твоего сервера>/zabbix. Дальнейшие инструкции можешь взять на сайте Zabbix.
Настройка через веб-интерфейс достаточно сложна. Тем не менее ты должен знать, что в Заббиксе есть несколько предустановок для хостов Солярис, которые довольно неплохо работают и для SmartOS. Все дополнительное тебе придется настроить самостоятельно.
Выводы
Уже в течение года мы используем SmartOS в качестве основы инфраструктуры, на которой мы размещаем коммерческие проекты. Можем отметить, что по сравнению со стандартными Linux-системами решения на SmartOS удается делать более производительными и устойчивыми. Конечно, есть и минусы. База совместимого железа у SmartOS намного меньше, чем у Linux. Поэтому нужно тщательно относиться к выбору аппаратных платформ. Кроме того, несмотря на целенаправленную работу Joyent по пакетированию самого распространенного софта и наличию более 10 тысяч пакетов в репозитории, некоторых нужных пакетов, скорее всего, под SmartOS не окажется. Их придется компилировать, что может вырасти в отдельный геморрой. Тем не менее пакетов в репозитории становится все больше, а спектр поддерживаемого оборудования — все шире.
Git in Sky
Компания Git in Sky предоставляет услуги по оптимизации, настройке и поддержке серверных систем, построенных на базе Open Source Software. Большой опыт и компетенция инженеров, которые собрались в Git in Sky, позволяет настроить работу ваших серверов на максимальном уровне соотношения эффективность/стоимость.
Мы любим решения на SmartOS, так как эта ОС позволяет добиться максимума производительности веб-приложений и сервисов, но работаем с любыми Open Source системами, построенными на любых дистрибутивах Linux.