<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Insight IT</title><link>https://www.insight-it.ru/</link><description></description><atom:link href="https://www.insight-it.ru/tag/lighttpd/feed/index.xml" rel="self"></atom:link><lastBuildDate>Sat, 24 Mar 2012 16:50:00 +0400</lastBuildDate><item><title>Архитектура YouTube 2012</title><link>https://www.insight-it.ru//highload/2012/arkhitektura-youtube-2012/</link><description>&lt;blockquote&gt;
&lt;p&gt;Выбирайте самое простое решение с наиболее общими гарантиями, которые
практически полезны.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;- Дао YouTube&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;YouTube&lt;/strong&gt; практически на протяжении всех 7 лет своего существования
является мировым лидером в сфере интернет-видео. С точки зрения
технической реализации проект оказался достаточно консервативным -
команда придерживается того же курса и стека технологий, с которых все
начиналось еще до приобретения проекта &lt;strong&gt;Google&lt;/strong&gt;. Но с 2008 года, когда
я написал первый обзор&amp;nbsp;&lt;a href="https://www.insight-it.ru/highload/2008/arkhitektura-youtube/"&gt;архитектуры YouTube&lt;/a&gt;, все же произошли интересные изменения, о которых я и хотел бы сегодня вкратце рассказать.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id="statistika"&gt;Статистика&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;4 млрд. просмотров страниц в день&lt;/li&gt;
&lt;li&gt;60 часов видео загружается каждую минуту&lt;/li&gt;
&lt;li&gt;350 миллионов устройств подключено к YouTube&lt;/li&gt;
&lt;li&gt;На февраль 2012 года в США по данным comScore:&lt;ul&gt;
&lt;li&gt;147,4 млн. уникальных зрителей&lt;/li&gt;
&lt;li&gt;16,7 млрд. просмотров видео (в октябре 2011 было больше 20 млрд.)&lt;/li&gt;
&lt;li&gt;Каждый зритель посмотрел в среднем 7 часов видео за месяц&lt;/li&gt;
&lt;li&gt;1.1 млрд. просмотров видео рекламы, суммарной длительностью в 10.8
млн. часов&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="tekhnologii"&gt;Технологии&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; - операционная система&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; - основной HTTP-сервер&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt; - отдача видео из YouTube CDN&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/zookeeper/"&gt;Zookeeper&lt;/a&gt; - распределенные блокировки, хранение
конфигураций&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="/tag/python/"&gt;Python&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/wiseguy/"&gt;wiseguy&lt;/a&gt; - FastCGI-прослойка между Apache и Python&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/pycurl/"&gt;pycurl&lt;/a&gt; - лучшая доступная реализация HTTP-клиента,
но в итоге все равно заменили на самописное низкоуровневое решение,
выиграв 8% в потреблении вычислительных ресурсов.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/spitfire/"&gt;spitfire&lt;/a&gt; - высокопроизводительный шаблонизатор на
основе абстрактного синтаксического дерева с регулируемым уровнем
оптимизации (как в gcc)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/bson/"&gt;bson&lt;/a&gt; в качестве формата сериализации&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt; - хранение изображений&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt; - используется просто как хранилище данных, версия
5.1.52 с InnoDB&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/vitess/"&gt;Vitess&lt;/a&gt; - система для масштабирования MySQL-кластера&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vitess"&gt;Vitess&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Основная цель проекта - предоставление всех необходимых инструментов и
серверов для горизонтального масштабирования баз данных на основе MySQL,
с учетом потребностей современных интернет-проектов.&lt;/li&gt;
&lt;li&gt;Реализован на &lt;a href="/tag/go/"&gt;Go&lt;/a&gt; - все еще экзотическом языке
программирования, также родившемся в стенах &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;.
Сравним по производительности с &lt;a href="/tag/c/"&gt;C++&lt;/a&gt; и &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;, но
несколько более "выразителен".&lt;/li&gt;
&lt;li&gt;Опубликован в opensource 24 февраля 2012 года, совсем недавно, так что
&lt;a href="/tag/youtube/"&gt;YouTube&lt;/a&gt; - по-прежнему единственный пример его
использования на практике в крупном проекте.&lt;/li&gt;
&lt;li&gt;Готовые клиентские библиотеки пока только для&amp;nbsp;&lt;strong&gt;Python&lt;/strong&gt;&amp;nbsp;и&amp;nbsp;&lt;strong&gt;Go&lt;/strong&gt;, что
не удивительно, но есть и универсальные интерфейсы на основе HTTP и
просто TCP-сокетов.&lt;/li&gt;
&lt;li&gt;Основной формат данных - &lt;strong&gt;bson&lt;/strong&gt;, как и в &lt;a href="/tag/mongodb/"&gt;MongoDB&lt;/a&gt;, но
по словам разработчиков &lt;em&gt;Vitess&lt;/em&gt;&amp;ensp;&lt;a href="https://www.insight-it.ru/goto/b807d615/" rel="nofollow" target="_blank" title="http://code.google.com/p/vitess/source/browse/#hg%2Fgo%2Fbson"&gt;их
реализация&lt;/a&gt;
выполняет (де)сериализацию в 10-15 раз быстрее.&lt;/li&gt;
&lt;li&gt;Ядром проекта выступает &lt;strong&gt;Vtocc&lt;/strong&gt;, &amp;nbsp;SQL-прокси с RPC интерфейсом,
позволяющий перераспределять запросы от большого количества (более 10
тыс.) одновременно подключенных клиентов в сравнительно небольшое
количество соединений с базами данных. Пропускная способность порядка 10
тыс. запросов в секунду.&lt;/li&gt;
&lt;li&gt;Встроенные возможности &lt;strong&gt;Vtocc&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;парсер и анализатор SQL-запросов для оптимизации их выполнения;&lt;/li&gt;
&lt;li&gt;заполнение типичных запросов переменными с поддержкой кэширования
результатов;&lt;/li&gt;
&lt;li&gt;управление транзакциями и сроками их выполнения ("убивает"
затянувшиеся);&lt;/li&gt;
&lt;li&gt;для каждого пространства ключей (логической таблицы) можно указать
фактор репликации, что создаст необходимое количество второстепенных
баз данных в дополнение к мастеру;&lt;/li&gt;
&lt;li&gt;можно явно указать, что чтение необходимо произвести с мастера
(важно когда пользователь только что выполнил какое-то действие и
должен сразу же увидеть его результат);&lt;/li&gt;
&lt;li&gt;отдельные пулы соединений для выполнения операций чтения и записи;&lt;/li&gt;
&lt;li&gt;исключение "зависших" соединений из пулов;&lt;/li&gt;
&lt;li&gt;перезапуск без простоя системы;&lt;/li&gt;
&lt;li&gt;поддержка DML.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Партиционирование&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Во всех таблицах должна быть колонка с уникальным ключем, на основе
которого данные будут распределяться по кластеру.&lt;/li&gt;
&lt;li&gt;Партиционирование основано на диапазонах ключей, что позволяет держать
"карту" партиций в памяти и очень быстро определять где располагаются те
или иные данные, но обратной стороной медали является вероятное
возникновение "горячих" узлов в кластере, особенно при монотонно
увеличивающихся значениях ключей (рекомендуется использовать случайные).&lt;/li&gt;
&lt;li&gt;Поддерживаются ключи в виде натуральных чисел или произвольных бинарных
данных.&lt;/li&gt;
&lt;li&gt;При высокой нагрузке на одну партицию она может быть распределена на две
путем фильтрованной репликации; в дальнейшем планируется реализовать и
обратный процесс.&lt;/li&gt;
&lt;li&gt;Еще в планах:&lt;ul&gt;
&lt;li&gt;Поэтапное внесение изменений в схему данных без видимого простоя
системы;&lt;/li&gt;
&lt;li&gt;Поддержка работы в нескольких датацентрах с концентрацией
мастер-серверов в одном датацентре и использования остальных в
режиме только для чтения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="podvodim-itogi"&gt;Подводим итоги&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;YouTube&lt;/strong&gt; - еще один проект мирового масштаба, который с самого начала
использовал MySQL и оказался не в силах от него отказаться, не смотря на
трудности с горизонтальным масштабированием.&lt;/li&gt;
&lt;li&gt;По аналогичному пути пошли и другие проекты, схожие с &lt;strong&gt;Vitess&lt;/strong&gt;
надстройки над MySQL используются в &lt;a href="https://www.insight-it.ru/highload/2010/arkhitektura-facebook/"&gt;Facebook&lt;/a&gt; и &lt;a href="https://www.insight-it.ru/highload/2011/arkhitektura-twitter-dva-goda-spustya/"&gt;Twitter&lt;/a&gt;:&lt;ul&gt;
&lt;li&gt;В &lt;a href="/tag/facebook/"&gt;Facebook&lt;/a&gt; она дополнена сильной интеграцией с
&lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt;&amp;nbsp;и сильно ограниченным интерфейсом, не
имеющим практически ничего общего с SQL.&amp;nbsp;Планы о публикации в
opensource, кажется, были, но я не слышал чтобы они воплотились в
жизнь. &lt;em&gt;// Уже почти дописав статью случайно заметил в коде, а потом
и мелким шрифтом в документации, что в Vitess тоже используется
memcached для кэширования из-за проблем со сборщиком мусора Go.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/twitter/"&gt;Twitter&lt;/a&gt;&amp;nbsp;по-прежнему использует свою связку
&lt;a href="https://www.insight-it.ru/goto/4fe0530b/" rel="nofollow" target="_blank" title="https://github.com/twitter/flockdb"&gt;FlockDB&lt;/a&gt; +
&lt;a href="https://www.insight-it.ru/goto/c4275cdf/" rel="nofollow" target="_blank" title="https://github.com/twitter/gizzard"&gt;Gizzard&lt;/a&gt;&amp;nbsp;на
&lt;a href="/tag/scala/"&gt;Scala&lt;/a&gt;, которые уже пару лет публично доступны. В
отличии от Vitess она заточена на хранение информации о социальных
графах, по-этому сфера её применения как в Twitter, так и за его
пределами ограничена.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vitess - пожалуй первая относительно успешная попытка построить
распределенную горизонтально масштабируемую СУБД на основе реляционной
базы данных, сохранив при этом SQL-интерфейс, пускай и с некоторыми
ограничениями.&lt;/li&gt;
&lt;li&gt;Выбирайте подходящее хранилище для каждого типа данных в системе - если
Vitess стал подходящим решением для структурированных данных вроде
информации о пользователях, метаданных видео и комментариев, это не
значит, что он хорошо (или плохо) справится, например, с медиа-файлами
вроде изображений и видео (для них в
&lt;a href="/tag/youtube/"&gt;YouTube&lt;/a&gt;&amp;nbsp;по-прежнему используют стек технологий
&lt;a href="/tag/google/"&gt;Google&lt;/a&gt;, подробности не публикуются).&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/python/"&gt;Python&lt;/a&gt; - вполне пригодный инструмент для реализации
бизнес-логики интернет-проектов, свет клином на &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; не
сошелся. Python предлагает широкий ассортимент инструментов для решения
любых типичных для интернет-проектов задач, хотя субъективно выбор
некоторых из них разработчиками YouTube мне кажется странным.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="card light-blue lighten-5"&gt;
&lt;div class="card-content"&gt;
        В комментариях предлагаю обсудить слабые и сильные стороны использования
        надстроек над реляционными базами данных, скажем по сравнению с
        использованием изначально-распределенных СУБД, таких как Riak, Cassandra
        и многих других. Может быть кто-то уже успел прикрутить к своему проекту
        Vitess или хотя бы FlockDB и готов поделиться впечатлениями?
    &lt;/div&gt;
&lt;/div&gt;
&lt;h2 id="istochniki-informatsii"&gt;Источники информации&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/fb446b63/" rel="nofollow" target="_blank" title="https://www.youtube.com/watch?v=G-lGCC4KKok"&gt;Mike Solomon на PyCon'12&lt;/a&gt; (один из первых
    разработчиков проекта)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/29524853/" rel="nofollow" target="_blank" title="http://code.google.com/p/vitess"&gt;О проекте Vitess&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/652a935e/" rel="nofollow" target="_blank" title="http://www.comscore.com/Press_Events/Press_Releases/2012/3/comScore_Releases_February_2012_U.S._Online_Video_Rankings"&gt;Статистика comScore на февраль '12&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sat, 24 Mar 2012 16:50:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-03-24:highload/2012/arkhitektura-youtube-2012/</guid><category>bson</category><category>Go</category><category>Google</category><category>lighttpd</category><category>Linux</category><category>MySQL</category><category>pycurl</category><category>Python</category><category>spitfire</category><category>Vitess</category><category>wiseguy</category><category>YouTube</category><category>ZooKeeper</category></item><item><title>Архитектура Wikimedia</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-wikimedia/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/687b5b81/" rel="nofollow" target="_blank" title="http://wikimedia.org"&gt;Wikimedia&lt;/a&gt; является платформой для
&lt;a href="https://www.insight-it.ru/goto/35f4fea7/" rel="nofollow" target="_blank" title="http://wikipedia.org"&gt;Wikipedia&lt;/a&gt;, &lt;a href="https://www.insight-it.ru/goto/389e980c/" rel="nofollow" target="_blank" title="http://wiktionary.org"&gt;Wiktionary&lt;/a&gt; и
еще семи менее крупных wiki-проектов. Этот документ очень пригодится
новичкам, пытающимся довести свои проекты до масштабов гигантских
вебсайтов. Здесь можно найти множество интересных деталей и
инновационных идей, которые уже успели доказать свою работоспособность
на самых посещаемых сайтах всего Интернета.
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Перевод &lt;a href="https://www.insight-it.ru/goto/cd47c021/" rel="nofollow" target="_blank" title="http://highscalability.com/wikimedia-architecture"&gt;статьи&lt;/a&gt;.
Автор - &lt;a href="https://www.insight-it.ru/goto/f3f1b405/" rel="nofollow" target="_blank" title="http://highscalability.com/user/todd-hoff"&gt;Todd Hoff&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/c8e5f8d0/" rel="nofollow" target="_blank" title="http://www.nedworks.org/~mark/presentations/san/Wikimedia%20architecture.pdf"&gt;Архитектура Wikimedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/62eceab/" rel="nofollow" target="_blank" title="http://meta.wikimedia.org/wiki/Wikimedia_servers"&gt;Серверы Wikimedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/c56ad62f/" rel="nofollow" target="_blank" title="http://oracle2mysql.wordpress.com/2007/08/22/12/"&gt;scale-out vs scale-up&lt;/a&gt; из блога "Oracle to MySQL"&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lvs/"&gt;LVS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lucene/"&gt;Lucene&lt;/a&gt; для поиска&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; для распределенного кэширования объектов&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt; для работы с изображениями&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statitstika"&gt;Статитстика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;8 миллионов статей распределены по сотням языковых подпроектов
    (английские, голландские, ...)&lt;/li&gt;
&lt;li&gt;В десятке самых высоконагруженных проектов по данным
    &lt;a href="https://www.insight-it.ru/goto/3b390e59/" rel="nofollow" target="_blank" title="http://alexa.com"&gt;Alexa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Экспоненциальный рост: в терминах посетителей, трафика и серверов
    удвоение происходит каждые 4-6 месяцев&lt;/li&gt;
&lt;li&gt;30000 HTTP запросов в секунду в периоды пиковой нагрузки&lt;/li&gt;
&lt;li&gt;3 GBps трафик данных&lt;/li&gt;
&lt;li&gt;3 датацентра: Тампа, Амстердам, Сеул&lt;/li&gt;
&lt;li&gt;350 серверов, конфигурации варьируются от однопроцессорных Pentium 4
    с 512 MB оперативной памяти до двухпроцессорных Xeon Quad-Core с 16
    GB RAM.&lt;/li&gt;
&lt;li&gt;Управляется ~6 людьми&lt;/li&gt;
&lt;li&gt;Три кластера на трех разных континентах&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Географическая балансировка нагрузки, основываясь на IP клиента,
    перенаправляет их на ближайший кластер. Происходит статическое
    отображение множества IP адресов на множество стран, а затем и на
    множество кластеров.&lt;/li&gt;
&lt;li&gt;Кэширование с помощью &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; группируется по типу
    контента: текст для wiki отдельно от изображений и больших
    статических файлов.&lt;/li&gt;
&lt;li&gt;На данный момент функционирует 55 &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; серверов, плюс
    еще 20 подготавливается к запуску.&lt;/li&gt;
&lt;li&gt;1000 HTTP запросов в секунду на каждый сервер, в периоды повышенной
    нагрузки эта цифра может достигать 2500.&lt;/li&gt;
&lt;li&gt;~ 100-250 MBps на сервер.&lt;/li&gt;
&lt;li&gt;~ 14000-32000 открытых соединений на каждом сервере.&lt;/li&gt;
&lt;li&gt;До 40 GB дискового кэша на каждом Squid сервере.&lt;/li&gt;
&lt;li&gt;До 4 дисков в каждом сервере (1U серверы).&lt;/li&gt;
&lt;li&gt;8 GB оперативной памяти, половину использует &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/e669c01a/" rel="nofollow" target="_blank" title="http://www.powerdns.com"&gt;PowerDNS&lt;/a&gt; предоставляет геораспределение.&lt;/li&gt;
&lt;li&gt;В основном и региональных датацентрах текстовые и медиа кластеры
    построены на &lt;a href="/tag/lvs/"&gt;LVS&lt;/a&gt;,
    &lt;abbr title="Common Address Redundancy Protocol"&gt;CARP&lt;/abbr&gt;
&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;, кэш &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;. В основном датацентре
    также находится хранилище медиа-данных.&lt;/li&gt;
&lt;li&gt;Для того, чтобы обеспечить предоставление только последних версий
    страниц, всем Squid-серверам отправляются инвалидационные запросы.&lt;/li&gt;
&lt;li&gt;Централизованно управляемая и синхронизированная установка
    программного обеспечения для сотен серверов.&lt;/li&gt;
&lt;li&gt;MediaWiki отлично масштабируется с несколькими процессорами, так что
    закупаются двухпроцессорный четырех ядерные серверы (8 ядер на
    сервер).&lt;/li&gt;
&lt;li&gt;Одно и то же оборудование выполняет как задачи внешнего хранения
    данных, так и кэширования &lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; используется для кэширования метаданных
    изображений, данных парсера, различий между ревизиями,
    пользователей, сессий. Метаданные, такие как история ревизий,
    отношений статей (ссылки, категории и так далее), учетные записи
    пользователей хранятся в основных базах данных&lt;/li&gt;
&lt;li&gt;Сам текст находится во внешних хранилищах данных.&lt;/li&gt;
&lt;li&gt;Статические (загруженные пользователями) файлы, например
    изображения, хранятся отдельно на сервере изображений, а метаданные
    (размер, тип и так далее) кэшируются в основной базе данных и
    объектном кэше.&lt;/li&gt;
&lt;li&gt;Отдельная база данных для каждой вики (не отдельный сервер!).&lt;/li&gt;
&lt;li&gt;Один master и много реплицированных slave серверов.&lt;/li&gt;
&lt;li&gt;Операции чтения равномерно распределяются по slave серверам,
    операции записи направляются на master.&lt;/li&gt;
&lt;li&gt;Иногда master используется и для операция чтения, когда репликация
    на slave еще не завершена.&lt;/li&gt;
&lt;li&gt;Внешнее хранение данных:&lt;ul&gt;
&lt;li&gt;Текст статей хранится на отдельных кластерах, которые представляют
собой простой средство хранения данных с возможностью только
дописывания новых данных. Такой подход позволяет сохранить
дорогостоящее место в высоконагруженных основных базах данных от
редко используемой информации.&lt;/li&gt;
&lt;li&gt;Благодаря этому появляются дополнительные неиспользованные ресурсы
на серверах приложений (порой 250-500 GB на сервер).&lt;/li&gt;
&lt;li&gt;На данной момент используются реплицируемые кластеры из 3
&lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt; серверов, но в будущем это может измениться, так
как требуется более удобное управление ими.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Сфокусируйтесь на архитектуре, а не на операциях или чем-то другом.&lt;/li&gt;
&lt;li&gt;Иногда кэширование обходится дороже, чем повторные вычисление или
    поиск данных в исходном источнике.&lt;/li&gt;
&lt;li&gt;Старайтесь избегать сложных алгоритмов, запросов к базе данных и
    тому подобного.&lt;/li&gt;
&lt;li&gt;Кэшируйте каждый результат, который дорого вам обошелся и является
    относительно локальным.&lt;/li&gt;
&lt;li&gt;Сфокусируйтесь на "горячих точках" в коде.&lt;/li&gt;
&lt;li&gt;Масштабируйтесь разделением:&lt;ul&gt;
&lt;li&gt;операций чтения и записи (master/slave);&lt;/li&gt;
&lt;li&gt;сложных операций и более частых и простых (группы запросов);&lt;/li&gt;
&lt;li&gt;больших, популярных вики и более мелких.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Улучшайте кэширование: временная и пространственная локализация
    данных, а также уменьшение набора данных на каждом сервере.&lt;/li&gt;
&lt;li&gt;Выполняйте компрессию текстовых данных, храните только изменения в
    статьях.&lt;/li&gt;
&lt;li&gt;Казалось бы простые вызовы библиотечных функций порой на практике
    могут занимать слишком много времени.&lt;/li&gt;
&lt;li&gt;Скорость поиска данных на диске ограничена, так что чем больше
    дисков - тем лучше!&lt;/li&gt;
&lt;li&gt;Масштабирование с использованием обычного оборудование не означает
    использование самых дешевых вещей, которые удастся найти. Серверы
    баз данных Wikipedia сегодня представляют собой 16GB RAM, двух- или
    четырех-ядерные серверы с 6 15000 rpm SCSI дисками, организованными
    в RAID 0. Возможно они бы и использовали более дешевые системы, но
    16 GB как раз хватает для размещения основного объема данных, а
    остальное берут на себя жесткие диски, это вполне соответствует
    потребностям системы, которую они построили. Примерно по таким же
    причинам их веб-сервера имеют 8 ядер, так как это позволяет достичь
    неплохой производительности &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; при достаточно простой
    организации балансировки нагрузки.&lt;/li&gt;
&lt;li&gt;Для масштабирования требуется выполнение массы работы, но если
    заранее этого не предусмотреть - понадобится сделать еще больше.
    MediaWiki изначально была написана для одного master сервера баз
    данных. Затем добавилась поддержка slave. Затем добавилось
    распределение по языкам и проектам. Дизайн системы с тех пор
    прекрасно выдерживает все нагрузки, но без очистки от новых узких
    мест системы не обошлось.&lt;/li&gt;
&lt;li&gt;Каждый, кто хочет разработать свою базу данных таким образом, чтобы
    она позволила недорого масштабироваться с уровня одного сервера до
    уровня десятки лучших сайтов Интернета, должен начать с обработки
    слегка устаревших данных на реплицированных slave серверах, при этом
    не забывать балансировать нагрузку операций чтения между slave
    серверами. Если это возможно - блоки данных (группы пользователей,
    учетных записей, или чего угодно) должны размещаться каждый на
    разных серверах. Можно делать это с самого начала используя
    виртуализацию, чтобы удостовериться в работоспособности архитектуры,
    когда вы еще "маленькие". Это &lt;strong&gt;намного&lt;/strong&gt; проще, чем когда вы
    делаете то же самое, но под ежемесячно удваивающейся нагрузкой.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 28 Mar 2008 15:32:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-03-28:highload/2008/arkhitektura-wikimedia/</guid><category>Apache</category><category>lighttpd</category><category>Linux</category><category>Lucene</category><category>LVS</category><category>Memcached</category><category>MySQL</category><category>PHP</category><category>Squid</category><category>архитектура</category><category>архитектура Wikimedia</category><category>геораспределение</category><category>Масштабируемость</category></item><item><title>Архитектура YouTube</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-youtube/</link><description>&lt;p&gt;Рост &lt;a href="https://www.insight-it.ru/goto/628b8f6a/" rel="nofollow" target="_blank" title="http://www.youtube.com"&gt;YouTube&lt;/a&gt; был феноменально быстр,
количество просмотров видео превысило 100 миллионов в сутки при том, что
только около пяти человек работало над масштабированием проекта. Как им
удается управлять предоставлением всех этих видеороликов своим
посетителям? Как они развивались с тех пор, как были приобретены
&lt;a href="/tag/google/"&gt;Google&lt;/a&gt;?
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/python/"&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; (SuSe)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/psyco/"&gt;psyco&lt;/a&gt;, динамический компилятор &lt;a href="/tag/python/"&gt;Python&lt;/a&gt; &amp;rarr;
    &lt;a href="/tag/c/"&gt;C&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt; для видео&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="chto-vnutri"&gt;Что внутри?&lt;/h3&gt;
&lt;h4&gt;Статистика&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Поддержка обработки более 100 миллионов видеороликов в сутки&lt;/li&gt;
&lt;li&gt;Сервис был запущен в феврале 2005 года&lt;/li&gt;
&lt;li&gt;В марте 2006 года в среднем производилось около 30 миллионов
    просмотров видео в день&lt;/li&gt;
&lt;li&gt;К июлю 2006 года эта цифра достигла 100 миллионов просмотров в день&lt;/li&gt;
&lt;li&gt;Над проектом работают: 2 системных администратора, 2 архитектора
    масштабируемости программного обеспечения, 2 разработчика новых
    возможностей, 2 инженера по сетям, 1 архитектор баз данных&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Рецепт управления огромными темпами роста&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;identify_and_fix_bottlenecks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;drink&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
   &lt;span class="n"&gt;notice_new_bottleneck&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Этот цикл проходит далеко не одну итерацию ежедневно.&lt;/p&gt;
&lt;h3 id="veb-servery"&gt;Веб-серверы&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/netscalar/"&gt;NetScalar&lt;/a&gt; используется для балансировки нагрузки и
    кэширования статического контента.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; работает с включенным &lt;code&gt;mod_fast_cgi&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Запросы отправляются на обработку с помощью серверного приложения на
    &lt;a href="/tag/python/"&gt;Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Приложение взаимодействует с различными базами данных и другими
    источниками информации для формирования финальной
    &lt;a href="/tag/html/"&gt;HTML&lt;/a&gt;-страницы.&lt;/li&gt;
&lt;li&gt;Масштабирование обычно происходит просто добавлением дополнительных
    компьютеров.&lt;/li&gt;
&lt;li&gt;Код на &lt;a href="/tag/python/"&gt;Python&lt;/a&gt; обычно не является узким местом
    системы, он проводит большую часть времени заблокированным RPC.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/python/"&gt;Python&lt;/a&gt; предоставляет быстроту и гибкость в процессе
    разработки и развертывания. Этот факт является очень актуальным,
    если учесть кто является их конкурентами.&lt;/li&gt;
&lt;li&gt;На формирование страницы обычно уходит не более 100 миллисекунд.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/psyco/"&gt;psyco&lt;/a&gt;, динамический компилятор &lt;a href="/tag/python/"&gt;Python&lt;/a&gt; &amp;rarr;
    &lt;a href="/tag/c/"&gt;C&lt;/a&gt;, использует JIT подход к компилированию для оптимизации
    внутренних циклов&lt;/li&gt;
&lt;li&gt;Для интенсивных вычислений, таких как шифрование, используются
    расширения, написанные на &lt;a href="/tag/c/"&gt;C&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Какая-то часть заранее сгенерированного &lt;a href="/tag/html/"&gt;HTML&lt;/a&gt; хранится в
    кэше.&lt;/li&gt;
&lt;li&gt;Кэширование данных в &lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt; на уровне строк.&lt;/li&gt;
&lt;li&gt;Кэшируются полностью сформированные объекты &lt;a href="/tag/python/"&gt;Python&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Некие данные вычисляются и отправляется каждому серверу для
    кэширования в локальной оперативной памяти. Эта стратегия годится
    далеко не всегда, чаще всего более эффективен другой метод: самым
    быстрым кэшем является само серверное приложение, а отправка уже
    готовых данных остальным серверам для дальнейшей обработки обычно не
    занимает так много времени. Для организации такого подхода
    необходимы агенты, осуществляющие отслеживание изменений,
    предварительную обработку и отправку данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="upravlenie-video"&gt;Управление видео&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Издержки включают в себя затраты на пропускную способность каналов
    связи, приобретение нового оборудования и оплату огромных счетов за
    электроэнергию.&lt;/li&gt;
&lt;li&gt;Каждый видеоролик расположен на мини-кластере, что означает
    управление работой с ним группой из нескольких компьютеров.&lt;/li&gt;
&lt;li&gt;Использование кластеров влечет за собой:
    &amp;ndash; увеличение производительности пропорционально количеству дисков,
    на которых расположен контент;
    &amp;ndash; возможность поддержания функционирования всей системы даже в
    случае прекращения работоспособности части компьютеров;
    &amp;ndash; возможность организации создания резервных копий
    &lt;a href="/tag/online/"&gt;online&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;В роли HTTP-сервера для работы с видео используется
    &lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt;:
    &amp;ndash; Он способен дать фору &lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; в плане
    производительности предоставления статического контента;
    &amp;ndash; Для работы с событиями ввода-вывода используется &lt;strong&gt;epoll&lt;/strong&gt;;
    &amp;ndash; Многопоточная конфигурация способна обрабатывать большее
    количество соединений одновременно;&lt;/li&gt;
&lt;li&gt;Самая популярная часть контента размещается в &lt;abbr title="Content Delivery Network"&gt;CDN&lt;/abbr&gt;
    &amp;ndash; &lt;abbr title="Content Delivery Network"&gt;CDN&lt;/abbr&gt; реплицирует весь контент в разных частях системы;
    &amp;ndash; Компьютеры &lt;abbr title="Content Delivery Network"&gt;CDN&lt;/abbr&gt; в основном предоставляют данные напрямую из кэша в оперативной памяти, так как ассортимент популярного видео с течением времени
    меняется достаточно медленно.&lt;/li&gt;
&lt;li&gt;Менее популярный контент, количество просмотров в день которого
    варьируется в диапазоне от одного до двадцати, обычно размещается на
    серверах &lt;a href="/tag/youtube/"&gt;YouTube&lt;/a&gt;, расположенных в датацентрах на
    &lt;em&gt;colocation&lt;/em&gt;:
    &amp;ndash; Не смотря на тот факт, что такое видео может быть просмотрено
    всего несколько раз за день, количество таких роликов велико, что
    приводит к случайным блокировкам данных на жестких дисках;
    &amp;ndash; В такой ситуации кэширование практически бесполезно, инвестиции в
    кэширование контента с низкой вероятностью востребованности обычно
    является пустой тратой средств;
    &amp;ndash; Более детальная настройка низкоуровневых компонентов системы,
    таких как, например, RAID-контроллеры, в этой ситуации может
    достаточно положительно повлиять на производительность;
    &amp;ndash; Выбор оптимального размера оперативной памяти на каждой машине
    также очень важен: как недостаточное, так и излишнее ее количество
    не являются эффективными решениями.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Ключевые моменты&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Чем &lt;strong&gt;проще&lt;/strong&gt; - тем &lt;strong&gt;лучше&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;Старайтесь минимизировать количество устройств (маршрутизаторов,
    коммутаторов и тому подобных) между контентом и пользователями:
    далеко не факт, что все они будут способны выдерживать интенсивную
    нагрузку;&lt;/li&gt;
&lt;li&gt;Старайтесь использовать самое обыкновенное оборудование. Hi-end
    оборудование обычно влечет за собой рост издержек, связанных с
    сопутствующими процессами, например технической поддержкой, а также
    уменьшает вероятность нахождение решения той или иной проблемы с
    оборудованием в Сети;&lt;/li&gt;
&lt;li&gt;Используйте самые простые распространенные утилиты.
    &lt;a href="/tag/youtube/"&gt;YouTube&lt;/a&gt; использует идущий в комплекте с
    &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; набор утилит для построения системы именно на их
    основе;&lt;/li&gt;
&lt;li&gt;Не забывайте о случайных доступах к жестким дискам, эту, казалось
    бы, мелочь тоже стоит настроить.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="upravlenie-miniatiurami-video"&gt;Управление миниатюрами видео&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;На удивление сложно решаемая задача, особенно если необходима
    эффективность;&lt;/li&gt;
&lt;li&gt;Для каждого видео хранится 4 миниатюры, что приводит к существенному
    преобладанию количества миниатюр над количеством видеороликов;&lt;/li&gt;
&lt;li&gt;Миниатюры хранятся всего на нескольких компьютерах;&lt;/li&gt;
&lt;li&gt;Некоторые проблемы наблюдаются в связи с работой с большим
    количеством маленьких объектов:
    &amp;ndash; Проблемы на уровне операционной системы, связанные с большим
    количеством запросов на поиск данных, а также кэшем страниц и
    &lt;em&gt;inode&lt;/em&gt;'ов файловой системы;
    &amp;ndash; Ограничение на количество файлов в одной директории (особенно
    актуально для &lt;strong&gt;ext3&lt;/strong&gt;), возможно частичное решение в виде перехода
    к более иерархической структуре хранения данных, а также переходе к
    ядру &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; версии 2.6, что может привести к более чем
    стократному росту производительности, но в любом случае хранение
    такого огромного количества файлов в локальной файловой системе - не
    самая лучшая идея;
    &amp;ndash; Большое количество запросов в секунду, так как одна страница может
    содержать до 60 миниатюр различных видеороликов;
    &amp;ndash; В условиях таких нагрузок &lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; показывает плохую
    производительность;
    &amp;ndash; Проводились эксперименты с использованием &lt;a href="/tag/squid/"&gt;squid&lt;/a&gt;
    (обратной proxy) между &lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; и посетителями.
    Какое-то время такой вариант казался работоспособным, но с ростом
    нагрузки производительность начала падать. С обработки 300 запросов
    в секунду она упала до 20;
    &amp;ndash; Попытки использовать &lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt; также не
    завершились успехом: однопоточный режим не справлялся с задачей, а
    многопоточный требовал отдельного кэша для каждого потока, что
    сводило на нет его эффективность;
    &amp;ndash; С таким количеством изображений добавление в систему нового
    компьютера могло занимать более 24 часов;
    &amp;ndash; Перезагрузка занимала 6-10 часов, так как кэш должен был
    "разогреться" прежде чем перестать использовать данные с жестких
    дисков.&lt;/li&gt;
&lt;li&gt;Решением всех описанных выше проблем стала распределенная система
    хранения данных &lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt; от &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;:
    &amp;ndash; Она позволяет избежать проблем, связанных с большим количеством
    файлов, так как объединяет маленькие файлы вместе.
    &amp;ndash; Она работает быстро и устойчива к сбоям, помимо этого она
    прекрасно приспособлена для работы по ненадежной сети.
    &amp;ndash; Уменьшает задержки, так как использует распределенный
    многоуровневый кэш, который способен работать даже между удаленными
    датацентрами.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="bazy-dannykh"&gt;Базы данных&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Раньше:
    &amp;ndash; &lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt; использовалась для хранения данных:
    пользователей, тэгов, описаний и так далее.
    &amp;ndash; Данные хранились на монолитном RAID 10 массиве, состоящем из 10
    жестких дисков;
    &amp;ndash; Оборудование арендовалось, что негативно сказывалось на состоянии
    их кредитных карточек. В случае необходимости нового оборудования,
    на оформление заказа и доставку мог уходить далеко не один день.
    &amp;ndash; Они прошли через весь путь эволюции: сначала был один сервер,
    затем добавилось несколько дополнительных серверов, обслуживающих
    операции чтения, после чего они решили разбить базу данных на части,
    и, наконец, они пришли к полноценной распределенной архитектуре.
    &amp;ndash; Поначалу их система страдала от задержек, связанных с
    реплицированием. Основной сервер, обрабатывающий операции записи,
    являлся мощным сервером, работающим в многопоточном режиме, это было
    необходимо для своевременного выполнения большого объема работы.
    Второстепенные сервера, которые обрабатывали только операции чтения,
    асинхронно реплицировали данные в одном потоке, что влекло за собой
    возможность серьезного отставания некоторых из них.
    &amp;ndash; Обновления были причиной частого отсутствия необходимой информации
    в кэше, что заставляло сервера читать данные с жестких дисков. Этот
    факт сильно замедлял процесс чтения и репликации.
    &amp;ndash; Реплицирующая архитектура требует немалых вложений в оборудование,
    необходимого для поддержания постоянно растущих темпов записи
    информации.
    &amp;ndash; Основным из кардинальных решений, принятых в архитектуре системы
    было отделение обеспечения процесса просмотра видео от основного
    кластера. Основной целью посетителей является просмотр видео, а
    второстепенные задачи можно возложить и на менее производительный
    кластер.&lt;/li&gt;
&lt;li&gt;Сейчас:
    &amp;ndash; Используются распределенные базы данных;
    &amp;ndash; Сегментированная система &lt;em&gt;(прим.: &lt;a href="https://www.insight-it.ru/highload/2008/arkhitektura-flickr/"&gt;по аналогии с Flickr&lt;/a&gt;)&lt;/em&gt;;
    &amp;ndash; Распределенные чтение и запись;
    &amp;ndash; Более эффективное расположение кэша, что ведет к уменьшению работы
    с жесткими дисками;
    &amp;ndash; Такая архитектура привела к 30%-й экономии на оборудовании;
    &amp;ndash; Задержки в реплицировании сведены к нулю;
    &amp;ndash; Размеры базы данных могут расти практически неограниченно&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="strategiia-razmeshcheniia-v-datatsentrakh"&gt;Стратегия размещения в датацентрах&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Поначалу использовались хостинг провайдеры, предоставляющие услуги
    colocation. Не самый экономичный подход, но тогда не было другого
    выхода.&lt;/li&gt;
&lt;li&gt;Хостинг провайдеры не могут поспеть за темпами роста проекта. Не
    всегда получается получить контроль над необходимым оборудованием
    или сделать необходимые соглашения о предоставлению сетевых услуг.&lt;/li&gt;
&lt;li&gt;Решением этой проблемы стало создание собственной базы для
    размещения оборудования. Появилась возможность настраивать абсолютно
    все и подписывать свои собственные контракты такого рода.&lt;/li&gt;
&lt;li&gt;Было использовано 5 или 6 разных датацентров в дополнение к
    &lt;abbr title="Content Delivery Network"&gt;CDN&lt;/abbr&gt;.&lt;/li&gt;
&lt;li&gt;Видео поступает из случайного датацентра, никаких специальных
    проверок не проводится. Если ролик становится достаточно
    популярным - он перемещается в
    &lt;abbr title="Content Delivery Network"&gt;CDN&lt;/abbr&gt;.&lt;/li&gt;
&lt;li&gt;Основным фактором, влияющим на доступность того или иного ролика
    является пропускная способность канала связи.&lt;/li&gt;
&lt;li&gt;Для изображений же более актуальны задержки, особенно если на одной
    страницы должно быть размещено под 60 изображений.&lt;/li&gt;
&lt;li&gt;Репликация изображений производится средствами
    &lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt;. В этом случае используются различные меры
    для определения ближайшего места, откуда можно получить необходимые
    данные.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Остановитесь на секунду.&lt;/strong&gt; Креативные и рискованные трюки могут
    помочь справиться с задачей в краткосрочном периоде, но со временем
    понадобятся более продуманные решения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Расставьте приоритеты.&lt;/strong&gt; Определите какие части Вашего сервиса
    являются более важными и стройте систему обеспечения ресурсами и
    усилиями именно в соответствии с поставленными приоритетами.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Выбирайте свои битвы.&lt;/strong&gt; Не бойтесь пользоваться аутсорсингом в
    некоторых ключевых сервисах. &lt;a href="/tag/youtube/"&gt;YouTube&lt;/a&gt; использует
    &lt;abbr title="Content Delivery Network"&gt;CDN&lt;/abbr&gt; для распределения
    своего наиболее популярного контента. Создание своей собственной
    подобной сети стоило бы им слишком много и потребовало бы слишком
    много времени. Возможно у Вас появятся подобные возможности в
    отношении Вашей системы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Будьте проще!&lt;/strong&gt; Простота позволяет изменять архитектуру более
    быстро, что позволяет своевременно реагировать на возникающие
    проблемы. Никто на самом деле не знает что такое &lt;em&gt;простота&lt;/em&gt;, но если
    Вы не боитесь делать изменения, то это неплохой знак что вашей
    системе свойственна та самая &lt;em&gt;простота&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сегментирование.&lt;/strong&gt; Сегментирование позволяет изолировать и
    ограничить дисковое пространство, процессорное время, оперативную
    память и ввод-вывод. Оно выполняется не только для повышения
    производительности операций записи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Постоянная работа над поиском и устранением узких мест в
    системе:&lt;/strong&gt;
    &amp;ndash; на программном уровне это чаще всего бывает кэширование и работа с
    &lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt;;
    &amp;ndash; на уровне операционной системы - операции ввода-вывода;
    &amp;ndash; на уровне оборудования - оперативная память и RAID массивы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Залог Вашего успеха - командная работа.&lt;/strong&gt; Хорошая команда разного
    рода специалистов должна понимать принцип системы вцелом и того, что
    лежит &lt;em&gt;под&lt;/em&gt; ней. Каждый должен знать свое дело: настраивать
    принтеры, подключать к системе новые компьютеры, строить сети и так
    далее. С отличной командой Вам по силам все что угодно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;В отличии от &lt;a href="https://www.insight-it.ru/highload/"&gt;остальных&lt;/a&gt;, этот перевод
&lt;a href="https://www.insight-it.ru/goto/ea16b832/" rel="nofollow" target="_blank" title="http://highscalability.com/youtube-architecture"&gt;статьи&lt;/a&gt; от &lt;a href="https://www.insight-it.ru/goto/f3f1b405/" rel="nofollow" target="_blank" title="http://highscalability.com/user/todd-hoff"&gt;Todd Hoff&lt;/a&gt;'а уже был выполнен до
меня (при желании можно найти в любой поисковой системе), но я все равно
решил опубликовать свою версию просто для собственного развития и
полноты &lt;a href="https://www.insight-it.ru/highload/"&gt;коллекции&lt;/a&gt;, да и многим читателям, возможно,
покажется интересным. Что ж, перейдем к источнику информации оригинала:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/f5823d0b/" rel="nofollow" target="_blank" title="http://video.google.com/videoplay?docid=-6304964351441328559"&gt;Google Video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sat, 01 Mar 2008 16:07:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-03-01:highload/2008/arkhitektura-youtube/</guid><category>Apache</category><category>BigTable</category><category>lighttpd</category><category>Linux</category><category>MySQL</category><category>NetScalar</category><category>psyco</category><category>Python</category><category>YouTube</category><category>архитектура</category><category>архитектура YouTube</category><category>интернет</category><category>Масштабируемость</category><category>производительность</category><category>хранение данных</category></item><item><title>Веб-сервер за два вечера</title><link>https://www.insight-it.ru//linux/2008/web-server-za-dva-vechera/</link><description>&lt;p&gt;&lt;img alt="Beastie" class="left" src="https://www.insight-it.ru/images/beastie.png" title="Beastie: The BSD Daemon"/&gt;
Многие из вас наверняка все еще помнят те времена, когда компьютерная
техника находилась лишь на ранней стадии своего развития. Позволить себе
иметь в личном распоряжении персональный компьютер мог далеко не каждый,
а о серверном оборудовании и вовсе не могло быть и речи.&lt;/p&gt;
&lt;p&gt;Но, к счастью, времена меняются, и на сегодняшний день покупка даже
серверного оборудования связана с достаточно скромными затратами,
сопоставимыми с бюджетом покупки настольного компьютера или ноутбука. Но
возникает другой вопрос - а что же с этим оборудованием делать? Вполне
логичным ответом было бы: "использовать по прямому назначению", о чем мы
с Вами сегодня и поговорим в компании с замечательным персонажем по
имени &lt;em&gt;&lt;a href="/tag/beastie/"&gt;Beastie&lt;/a&gt;&lt;/em&gt; и операционной системой
&lt;strong&gt;&lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;&lt;/strong&gt;, с которой он частенько ассоциируется.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Под "использованием по прямому назначению" конечно же можно было
подразумевать множество разных применений, но я хотел все-таки
остановиться на варианте использования в роли веб-сервера, как
альтернативу многочисленным услугам по предоставлению shared и VPS
хостинга.&lt;/p&gt;
&lt;h3 id="predistoriia"&gt;Предистория&lt;/h3&gt;
&lt;p&gt;Некоторое время назад ко мне в руки попал простенький сервер, который
как раз предполагалось использовать как хостинг для одного из проектов.
Оставалось лишь сделать его пригодным для выполнения этой задачи.
Казалось бы дело это как минимум не тривиальное, но буквально через пару
дней мне довелось убедиться в обратном.&lt;/p&gt;
&lt;p&gt;Ассортимент оборудования, спрятанного внутри &lt;strong&gt;1U&lt;/strong&gt; корпуса, был вполне
стандартным, ничего особенного: процессор &lt;strong&gt;Intel Xeon 5335&lt;/strong&gt;,
оперативная память &lt;strong&gt;Kingston 2х2 GB ECC Full-buffered&lt;/strong&gt;, жесткий диск
изначально только один - &lt;strong&gt;WD 150 GB 10000rpm SATA&lt;/strong&gt;, а вот модель
материнской платы, к сожалению, на память назвать не могу, вроде что-то
от &lt;strong&gt;SuperMicro&lt;/strong&gt;, с простенькой встроенной видеокартой, сетевой картой
с двумя гигабитными Ethernet портами и встроенным же видимо software
RAID-контроллером. Опытный глаз наверняка заметил бы в этом списке
сильную недоукомплектацию, особенно проявляющуюся при упоминании
процессора в единственном числе, отсутствии RAID, и скромным объемам
оперативной памяти. Объясняется это достаточно просто - проект еще
предстоит тестировать перед запуском, а этой платформы для этого будет
более чем достаточно.&lt;/p&gt;
&lt;p&gt;Перед запуском проекта в открытое плавание естественно предстоит upgrade
оборудования.&lt;/p&gt;
&lt;h3 id="den-pervyi"&gt;День первый&lt;/h3&gt;
&lt;h4&gt;Подготовка&lt;/h4&gt;
&lt;p&gt;Если верить бумажкам, идущим в комплекте с сервером, на единственный
жестком диск в магазине установили демо-версию одной из серверных
операционных систем от одной мало кому известной корпорации. Смотреть
что это за зверь такой у меня особого желания не было, по-этому я не
долго думая пошел искать среди своей коллекции дистрибутивов болванку с
заранее выбранным &lt;a href="/tag/opensource/"&gt;opensource&lt;/a&gt; решением вопроса об
&lt;a href="/tag/os/"&gt;операционной системе&lt;/a&gt; - &lt;strong&gt;&lt;a href="/tag/freebsd/"&gt;FreeBSD 6.2&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Почему выбор пал именно на эту &lt;a href="/tag/os/"&gt;ОС&lt;/a&gt; объяснить не так уж и
просто, но я все же попробую. Выбор был достаточно классический:
&lt;em&gt;&lt;a href="/tag/unix/"&gt;Unix&lt;/a&gt; vs &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;&lt;/em&gt;, возникали еще некоторые
сомнения насчет решений от &lt;em&gt;Sun&lt;/em&gt; в виде &lt;em&gt;Solaris&lt;/em&gt; и &lt;em&gt;OpenSolaris&lt;/em&gt;, но от
них я отказался достаточно быстро в основном из-за более чем скромной
документации и проприетарного происхождения, попутно закрыв глаза на все
положительные отзывы, которые я видел в Сети.&lt;/p&gt;
&lt;p&gt;Так как мне хотелось иметь иметь перед собой &lt;em&gt;конструктор&lt;/em&gt; для сбора
системы именно таким образом, как было бы удобно мне, а не разработчикам
дистрибутива, то список вариантов, выступавших на стороне
&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; быстро начал сокращаться, начиная с &lt;strong&gt;CentOS&lt;/strong&gt;.
Предпоследним вычеркнутым из списка дистрибутивов &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;
был &lt;strong&gt;Debian&lt;/strong&gt;, что оставило в нем лишь &lt;a href="/tag/gentoo/"&gt;Gentoo Linux&lt;/a&gt;.
Финальный выбор между &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt; и &lt;a href="/tag/gentoo/"&gt;Gentoo&lt;/a&gt;
был сделан уже легче: во-первых, по &lt;a href="https://www.insight-it.ru/linux/2008/gentoo-linux-sony-vaio/"&gt;своему опыту с ноутбуком&lt;/a&gt; я уже понял, что с
&lt;a href="/tag/gentoo/"&gt;Gentoo&lt;/a&gt; предстояло бы немало хлопот, а, во-вторых, в новый
&lt;em&gt;конструктор&lt;/em&gt;, как ни крути, "играть" намного интереснее, чем в старый,
так что долго думать не пришлось :)&lt;/p&gt;
&lt;h4&gt;Установка&lt;/h4&gt;
&lt;p&gt;Найдя наконец диск с &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;, я попытался решить
следующий возникший вопрос: а как же установить операционную систему с
компакт-диска на компьютер, не имеющий соответствующего привода? Так как
сервер был запломбирован и находился на гарантии, вариант частично
разобрать и подключить обычный привод отпал сразу же, ровно как и
вариант с подключением внешнего привода по причине его отсутствия.
Подходящее решение было найдено практически сразу же, благо жесткие
диски подключались по принципу hotswap: вытащив жесткий диск без
развинчивания корпуса, я подключил его к подвернувшемуся под руку
настольному компьютеру, обладающему DVD-приводом. Загрузка прошла
успешно и я приступил к установке, руководствуясь &lt;a href="https://www.insight-it.ru/goto/358a772c/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html"&gt;FreeBSD Handbook&lt;/a&gt;,
пересказывать его особого желания у меня нет, остановлюсь лишь на
некоторых особенностях этого процесса.&lt;/p&gt;
&lt;p&gt;Первым этапом установки, где пришлось задуматься, был &lt;strong&gt;fdisk&lt;/strong&gt;
(разбиение диска на так называемые &lt;em&gt;slice&lt;/em&gt;). Для избежания путаницы для
самого себя, я решил, что размещу рабочие директории http-сервера и базы
данных в &lt;strong&gt;/var&lt;/strong&gt;, которую и выделил в отдельный &lt;em&gt;slice&lt;/em&gt;, занимающий
б&lt;em&gt;о&lt;/em&gt;льшую часть доступного дискового пространства. В ассортимент
доступного при установке программного обеспечения я особо вникать не
стал, так как знал, что у меня всегда будет возможность заняться им
позже, и как следствие этого выбрал что-то очень близкое к стандартному
набору &lt;a href="/tag/po/"&gt;ПО&lt;/a&gt;.
Подтвердив установку и подождав достаточно непродолжительный период
времени, я перезагрузил систему, вытащив установочный диск в процессе.
Установка оказалась на удивление элементарной, что привело к полученной
с первой попытки работоспособной системе. Увидев долгожданное
приглашение к вводу логина и пароля я убедился, что могу
беспрепятственно получить доступ к консоли и сразу же выключил систему,
чтобы перенести жесткий диск обратно на сервер.&lt;/p&gt;
&lt;p&gt;Так как сетевое подключение еще только предстояло настроить, то на
сервер переносить пришлось не только жесткий диск, но и монитор с
клавиатурой. На новом оборудовании все так же прекрасно запустилось, и я
принялся за настройку подключения. Особых проблем не возникло - в
&lt;a href="https://www.insight-it.ru/goto/ecbcc1a6/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#NETWORK-COMMUNICATION"&gt;Handbook&lt;/a&gt;'е
все более чем качественно задокументировано, самым сложным был процесс
выбора драйвера, вернее осознавание того, что он изначально правильно
сам установился. Следующей маленькой проблемой было угадывание какой же
из &lt;em&gt;Ethernet&lt;/em&gt;-портов был только что настроен, и, соответственно,
подключение кабеля именно в него, а не в его соседа. После завершения
всех манипуляций я с радостью обнаружил, что &lt;strong&gt;ping&lt;/strong&gt; от сервера до
gateway'а успешно проходит, что по сути и означало окончание настройки
сетевого подключения.
Следущей целью было избавить себя от необходимости пользоваться
позаимствованными у другого компьютера клавиатурой и монитором. Дело
тоже оказалось достаточно нехитрым, &lt;strong&gt;sshd&lt;/strong&gt; установился и настроился
вполне самостоятельно где-то в процессе установки, от меня потребовалось
лишь создать дополнительного пользователя, написать нехитрую строчку в
&lt;strong&gt;rc.conf&lt;/strong&gt;: &lt;code&gt;sshd_enable="YES"&lt;/code&gt; и собственно запустить daemon'а. Этого
было вполне достаточно, чтобы набрав на своем &lt;a href="/tag/noutbuk/"&gt;ноутбуке&lt;/a&gt;
&lt;strong&gt;ssh&lt;/strong&gt; в консоли, с указанием необходимых параметров, получить
удаленный доступ к серверу по протоколу &lt;strong&gt;SSH&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Решив, что для начала этого будет вполне достаточно, я отправился по
другим делам, так как тот вечер еще даже не успел подойти к своему
завершению.&lt;/p&gt;
&lt;h3 id="den-vtoroi"&gt;День второй&lt;/h3&gt;
&lt;h4&gt;Программное обеспечение&lt;/h4&gt;
&lt;p&gt;Хорошо, вполне работоспособную &lt;a href="/tag/os/"&gt;операционную систему&lt;/a&gt; мы
получили. Осталось снабдить ее необходимым &lt;a href="/tag/po/"&gt;программным обеспечением&lt;/a&gt; для выполнения своих обязанностей, определенных
нами заранее.&lt;/p&gt;
&lt;p&gt;Прежде чем что-либо устанавливать, очень не пожалел, что ознакомился как
с соответствующим &lt;a href="https://www.insight-it.ru/goto/6ffb90d6/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#PORTS"&gt;разделом handbook'a&lt;/a&gt;,
так и с &lt;a href="https://www.insight-it.ru/goto/a3e92771/" rel="nofollow" target="_blank" title="http://www.freebsd.org/ports/"&gt;доступным ассортиментом ПО&lt;/a&gt;.
После этого я перешел-таки собственно к выбору и установке
&lt;a href="/tag/po/"&gt;ПО&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Так как одной из основных составных частей практически любого
    веб-сервера является http-daemon, именно с его выбора я и решил
    начать. Причем начал еще задолго до описываемых событий, вся
    многофункциональность &lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; мне была не нужна, а
    аналоги &lt;code&gt;mod_auth&lt;/code&gt; и &lt;code&gt;mod_rewrite&lt;/code&gt; есть и в более легких
    http-серверах. Cамо веб-приложение, которое там предполагалось
    располагать, работает по большей части на &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;, так что
    ничего особенного от httpd совсем не требовалось. В итоге финальный
    выбор был между &lt;em&gt;быстрыми&lt;/em&gt; и &lt;em&gt;легкими&lt;/em&gt; вариантами: &lt;strong&gt;&lt;a href="/tag/nginx/"&gt;nginx&lt;/a&gt;&lt;/strong&gt; и &lt;strong&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt;&lt;/strong&gt;, какой-либо весомой причины по которой я выбрал &lt;strong&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt;&lt;/strong&gt; с &lt;code&gt;mod\_fastcgi&lt;/code&gt; привести
    не могу, основным фактором был мой некоторый опыт работы с ним в
    прошлом, и отсутствие такового в отношении &lt;strong&gt;&lt;a href="/tag/nginx/"&gt;nginx&lt;/a&gt;&lt;/strong&gt;. Установка
    прошла легко и непринужденно с помощью в сжатые сроки найденного в
    &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;
&lt;a href="https://www.insight-it.ru/goto/14d0519d/" rel="nofollow" target="_blank" title="http://www.cyberciti.biz/faq/howto-setup-lighttpd-fastcgi-php-server/"&gt;мануала&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Другим немаловажным компонентом сервера является &lt;strong&gt;ftpd&lt;/strong&gt;, как
    известно используемый для передачи файлов. Собственно говоря, если
    активное его использование не планируется, то особого значения какой
    именно сервер будет использоваться значения не имеет: любой из
    доступных устанавливается настраивается в пару простых шагов без
    каких-либо проблем (если это имеет значение - я выбрал &lt;strong&gt;vsftpd&lt;/strong&gt;,
    так как мне уже далеко не один раз доводилось его настраивать на
    домашних компьютерах, и, как следствие, даже инструкция не
    понадобилась). Но при потенциальной возможности работы через
    Интернет, этот протокол является достаточно уязвимым, так как не
    использует никакого шифрования. Эта проблема решается с помощью
    механизма &lt;em&gt;FTP over SSH&lt;/em&gt;, который представляет собой использование
    &lt;strong&gt;SSH&lt;/strong&gt; в роли туннеля для передачи файлов по &lt;strong&gt;FTP&lt;/strong&gt;. О том, как
    воспользоваться этим механизмом вам подскажет &lt;strong&gt;man ssh&lt;/strong&gt;,
    какой-либо дополнительной конфигурации он не требует, разве что
    настройки соответствующим образом firewall'а, но об этом я расскажу
    позже.&lt;/li&gt;
&lt;li&gt;Сам &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; установлен последней доступной в
    &lt;a href="https://www.insight-it.ru/goto/a3e92771/" rel="nofollow" target="_blank" title="http://www.freebsd.org/ports/"&gt;ports&lt;/a&gt; версии и , как уже
    упоминалось, был подключен к &lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt; с помощью
    &lt;code&gt;mod_fastcgi&lt;/code&gt;, какой-либо дополнительной конфигурации с моей
    стороны не потребовалось, я разве что выбрал список модулей (в
    общем-то тоже занятие не сложное, достаточно лишь осознавать какие
    именно используются, плюс я еще решил
    &lt;strong&gt;&lt;a href="https://www.insight-it.ru/goto/41a25ac6/" rel="nofollow" target="_blank" title="http://www.hardened-php.net/suhosin/"&gt;Suhosin&lt;/a&gt;&lt;/strong&gt; установить) и
    просто просмотрел по диагонали все конфиги (в основном сам
    &lt;strong&gt;php.ini&lt;/strong&gt; и &lt;strong&gt;lighttpd.conf&lt;/strong&gt;) на предмет их соответствия
    потребностям моего приложения. Отдельная история возникла с лишь
    одним модулем - &lt;em&gt;&lt;a href="/tag/blitz/"&gt;Blitz&lt;/a&gt;&lt;/em&gt;, который на данный момент все
    еще отсутствует в репозиториях как &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;, так и
    подавляющего большинства (если не всех) дистрибутивов
    &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;. Его пришлось устанавливать вручную из
    исходников по &lt;a href="https://www.insight-it.ru/goto/1e985790/" rel="nofollow" target="_blank" title="http://alexeyrybak.com/blitz/blitz_ru.html#install_config.install"&gt;соответствующему мануалу&lt;/a&gt;,
    что правда тоже дело не хитрое и заняло всего несколько минут.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt;&lt;/strong&gt; особо выбирать не пришлось - приложение
    написано было с расчетом на &lt;strong&gt;&lt;a href="/tag/postgresql/"&gt;PostrgeSQL&lt;/a&gt;&lt;/strong&gt;, ее
    соответственно и прикручивал к &lt;strong&gt;&lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;.&lt;/strong&gt; Этот этап был
    пожалуй одним из самых проблематичных, так как сразу после
    классического &lt;code&gt;make install clean&lt;/code&gt; соответствующий daemon
    запускаться отказался. Какого-либо осознанного сообщения об ошибке
    &lt;code&gt;/usr/local/etc/rc.d/postgresqld start&lt;/code&gt; не выводило как в консоль,
    так и в логи, но тем не менее консольный клиент &lt;strong&gt;psql&lt;/strong&gt; и само
    веб-приложение жаловались на отсутствие запущенной
    &lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt;. Этот факт сильно затруднял поиск возможных
    вариантов решения на просторах &lt;a href="/tag/internet/"&gt;Сети&lt;/a&gt;, так что не
    найдя ничего полезного я решил заняться диагностикой проблемы и
    поиском решения для нее самостоятельно. Методом проб и ошибок,
    перебрав множество возможных вариантов запуска daemon'а, я пришел к
    выводу, что у пользователя от имени которого он должен был
    запускаться явно проблемы с доступом к файловой системе. Видимо так
    получилось из-за нестандартного расположения самой базы данных - в
    директории &lt;strong&gt;/var&lt;/strong&gt;. Не смотря на тот факт, что &lt;strong&gt;chown&lt;/strong&gt; и
    &lt;strong&gt;chmod&lt;/strong&gt; были использованы по прямому назначению в отношении
    соответствующих директорий для установления прав доступа. В итоге
    оказалось, что директория указанная для этого пользователя как
    домашняя (по памяти пишу, могу ошибиться, но вроде
    &lt;strong&gt;/usr/local/pgsql&lt;/strong&gt;) по каким-то причинам не создалась и
    соответственно именно этот факт и мешал запуску daemon'а.
    Восстановив справедливость в отношении этого пользователя, я
    обнаружил, что &lt;strong&gt;&lt;a href="/tag/postgresql/"&gt;PostrgeSQL&lt;/a&gt;&lt;/strong&gt; успешно
    запустился-таки, а мое приложение тоже стало функционировать именно
    так, как ему было положено. Проверив содержимое соответствующего
    конфига, я решил его больше не трогать, а то как говорится
    "premature optimization is the root of all evil"&amp;amp;copyright;. За
    компанию решил установить веб-интерфейс к
    &lt;a href="/tag/postgresql/"&gt;PostrgeSQL&lt;/a&gt; - &lt;strong&gt;phppgadmin&lt;/strong&gt;. Собравшись из
    &lt;a href="https://www.insight-it.ru/goto/a3e92771/" rel="nofollow" target="_blank" title="http://www.freebsd.org/ports/"&gt;портов&lt;/a&gt;, он повел себя как-то не
    очень адекватно, совсем не так каким я привык его видеть у себя на
    &lt;a href="/tag/noutbuk/"&gt;ноутбуке&lt;/a&gt;, разбираться в причинах было не охота -
    простое копирование и замена соответствующей директории по &lt;em&gt;ftp&lt;/em&gt;
    буквально за минуту решило проблему.&lt;/li&gt;
&lt;li&gt;Вариантов фильтров сетевого трафика в &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;
    имеется предостаточно:
    &lt;a href="https://www.insight-it.ru/goto/b7a4c2f7/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-PF"&gt;pf&lt;/a&gt;,
    &lt;a href="https://www.insight-it.ru/goto/963bd5ec/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPF"&gt;ipf&lt;/a&gt;,
    &lt;a href="https://www.insight-it.ru/goto/aee50277/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPFW%22"&gt;ipfw&lt;/a&gt;.
    Опыта работы ни с одним из них у меня не было, так что выбор
    происходил из достаточно субъективных критериев - очевидности
    принципов работы правил и достаточности документации. Так как я был
    уверен, что каждый из них сможет обеспечить достаточный уровень
    безопасности, основываясь на указанных выше критериях в итоге я
    выбрал &lt;strong&gt;ipf&lt;/strong&gt;. Документация позволила легко и непринужденно все
    установить и настроить, правда за компанию пришлось разбираться и с
    &lt;a href="https://www.insight-it.ru/goto/420d629d/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#KERNELCONFIG"&gt;пересборкой ядра&lt;/a&gt;.
    В качестве базы для построения собственного списка правил я
    использовал приведенный все там же, в документации, пример. Само
    собой пришлось доработать его под конкретную систему, но методом
    проб и ошибок эта задача выполняется достаточно быстро &lt;em&gt;(будте
    осторожны с 22 портом, используемым для SSH - очень легко на этом
    этапе случайно заблокировать самому себе доступ к серверу)&lt;/em&gt;.
    Получившийся в итоге список правил приводить не буду, так как его
    еще предстоит довести до ума на активно работающей системе.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="zakliuchenie"&gt;Заключение&lt;/h3&gt;
&lt;p&gt;Не прошло и двух дней, как из простого набора оборудования получился
вполне готовый к работе веб-сервер, конечно же доводить до ума его
придется еще достаточно долго, но просто стабильно работать он был в
состоянии уже тогда. Дальше его отвезли в место постоянного его
прибывания, подключили к более-менее приличному интернет-каналу, с моей
стороны при этом потребовалось лишь слегка поменять настройки сетевого
подключения, и вот - он уже доступен из Сети. Практически сразу
же обнаружился один мой недочет в плане выбора &lt;a href="/tag/po/"&gt;ПО&lt;/a&gt; - буквально
в первую же ночь после открытия публичного доступа к серверу нашлась
масса желающих попытаться подобрать по словарю логин и пароль для
доступа к серверу по SSH, но он был открыт лишь для одной учетной
записи, у которой было мягко говоря нестандартное имя пользователя, даже
его никто за ночь не смог угадать, а до более чем 20-символьного пароля
дело так и не дошло. На следующее утро я, не долго думая, установил
программу под названием &lt;strong&gt;&lt;a href="https://www.insight-it.ru/goto/d4707261/" rel="nofollow" target="_blank" title="http://www.freebsd.org/cgi/url.cgi?ports/security/sshguard/pkg-descr"&gt;sshguard&lt;/a&gt;&lt;/strong&gt;, которая сразу же предотвратила все последующие попытки подобным образом издеваться над сервером. Дальше надо было настроить запись на
DNS-сервере для ассоциации домена с IP нашего сервера, настроить почту,
закончить работу над самим веб-приложением и много чего еще, но это уже
совсем другая история.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 14 Feb 2008 15:59:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-14:linux/2008/web-server-za-dva-vechera/</guid><category>Beastie</category><category>FreeBSD</category><category>lighttpd</category><category>PostgreSQL</category><category>Unix</category><category>веб-сервер</category><category>операционная система</category><category>сервер</category><category>системное администрирование</category></item></channel></rss>