<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Insight IT &#187; Linux</title>
	<atom:link href="http://www.insight-it.ru/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:34:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Архитектура DISQUS</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-disqus/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-disqus/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 00:37:19 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[DISQUS]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[Fabric]]></category>
		<category><![CDATA[Ganglia]]></category>
		<category><![CDATA[Git]]></category>
		<category><![CDATA[HAProxy]]></category>
		<category><![CDATA[heartbeat]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[pgbouncer]]></category>
		<category><![CDATA[pgFouine]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Pyflakes]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[Slony]]></category>
		<category><![CDATA[syslog-ng]]></category>
		<category><![CDATA[WSGI]]></category>
		<category><![CDATA[Архитектура DISQUS]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=893</guid>
		<description><![CDATA[DISQUS &#8212; самая популярная система комментирования и одновременно самое большое в мире Django-приложение. Она установлена более чем на полумиллионе сайтов и блогов, в том числе и очень крупных, таких как Engadget, CNN, MTV, IGN. Основной особенностью в её реализации является тот факт, что DISQUS не является тем сайтом, который хотят увидеть пользователи, он лишь предоставляет [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:left; margin:0 1em;" class="size-full wp-image-894 alignleft" title="DISQUS" src="http://www.insight-it.ru/wp-content/uploads/2011/03/disqus.jpg" alt="DISQUS" width="256" height="256" /> <a href="http://www.disqus.com" target="_blank">DISQUS</a> &#8212; самая популярная система комментирования и одновременно самое большое в мире Django-приложение. Она установлена более чем на полумиллионе сайтов и блогов, в том числе и очень крупных, таких как Engadget, CNN, MTV, IGN. Основной особенностью в её реализации является тот факт, что DISQUS не является тем сайтом, который хотят увидеть пользователи, он лишь предоставляет механизмы комментирования, авторизации и интеграции с социальными сетями. Пики нагрузки возникают одновременно c появлением какой-то шумихи в Интернете, что достаточно непредсказуемо. Как же им удается справляться с этой ситуацией?<span id="more-893"></span></p>
<h2 style="padding-top:2em;">Платформа</h2>
<ul>
<li><a href="/tag/linux/" target="_blank">Linux</a> &#8212; операционная система</li>
<li><a href="/tag/python/" target="_blank">Python</a> &#8212; язык программирования</li>
<li><a href="/tag/django/" target="_blank">Django</a> &#8212; основной framework</li>
<li><a href="/tag/django/" target="_blank"></a><a href="/tag/apache/" target="_blank">Apache 2.2</a> + <a href="/tag/wsgi/" target="_blank">mod_wsgi</a> &#8212; веб-сервер</li>
<li><a href="/tag/wsgi/" target="_blank"></a><a href="/tag/postgresql/" target="_blank">PostgreSQL</a> &#8212; СУБД</li>
<li><a href="/tag/postgresql/" target="_blank"></a><a href="/tag/memcached/" target="_blank">memcached</a> &#8212; кэширование</li>
<li><a href="/tag/memcached/" target="_blank"></a><a href="/tag/haproxy/" target="_blank">HAProxy</a> &#8212; балансировка нагрузки</li>
<li><a href="/tag/pgbouncer/" target="_blank"></a><a href="/tag/slony/" target="_blank">Slony</a> &#8212; репликация данных</li>
<li><a href="/tag/slony/" target="_blank"></a><a href="/tag/heartbeat/" target="_blank">heartbeat</a> &#8212; обеспечение доступности</li>
</ul>
<h2>Статистика</h2>
<ul>
<li>До 17 тысяч запросов в секунду</li>
<li>500 000 сайтов</li>
<li>15 миллионов зарегистрированных пользователей</li>
<li>75 миллионов комментариев</li>
<li>250 миллионов посетителей (на август 2010г.)</li>
</ul>
<h2>Основные трудности</h2>
<ul>
<li>Непредсказуемость нагрузки (основными причинами шумихи в Интернете являются катастрофы и выходки знаменитостей)</li>
<li>Обсуждения никогда не теряют актуальность (нельзя держать в кэше все дискуссии с 2008 года)</li>
<li>Нельзя угадать на каком сайте из тысяч возникнет пик трафика</li>
<li>Персональные настройки, динамическое разбиение на страницы и сортировки снижают эффективность кэширования</li>
<li>Высокая доступность (из-за разнообразия сайтов и их аудитории сложно запланировать технические работы)</li>
</ul>
<h2>Архитектура</h2>
<p><div id="attachment_895" class="wp-caption aligncenter" style="width: 607px"><a href="http://www.insight-it.ru/wp-content/uploads/2011/03/disqus_architecture.jpeg"><img class="size-full wp-image-895" title="Архитектура DISQUS" src="http://www.insight-it.ru/wp-content/uploads/2011/03/disqus_architecture.jpeg" alt="Архитектура DISQUS" width="597" height="918" /></a><p class="wp-caption-text">Архитектура DISQUS</p></div></p>
<ul>
<li><strong>Оборудование</strong>, в сумме около 100 серверов:
<ul>
<li>30% веб-серверов (Apache + mod_wsgi)</li>
<li>10% серверов баз данных (PostgreSQL)</li>
<li>25% кэш-серверов (memcached)</li>
<li>20% балансировка нагрузки и обеспечение доступности (HAProxy + heartbeat)</li>
<li>15% прочие сервера (Python скрипты)</li>
</ul>
</li>
<li><strong>Балансировка нагрузки</strong>:
<ul>
<li>HAProxy:
<ul>
<li>Высокая производительность</li>
<li>Интеллектуальная проверка доступности</li>
<li>Неплохая статистика</li>
</ul>
</li>
</ul>
</li>
<li><strong>Репликация</strong>:
<ul>
<li>Используется Slony-I</li>
<li>Основана на триггерах</li>
<li>Master/Slave для обеспечения большего объема операций чтения</li>
</ul>
</li>
<li><strong>Высокая доступность</strong>:
<ul>
<li>heartbeat</li>
<li>Пассивная копия мастер баз данных на случай сбоя основной</li>
</ul>
</li>
<li><strong>Партиционирование</strong>:
<ul>
<li>Реализовано на уровне кода</li>
<li>Простая реализация, быстрые положительные результаты</li>
<li>Два метода разделения данных:
<ul>
<li><em>Вертикальное:</em>
<ul>
<li>Создание нескольких таблиц с меньшим количеством колонок вместо одной (она же нормализация)</li>
<li>Позволяет разделять базы данных</li>
<li>Данные объединяются в коде (медленнее, чем на уровне СУБД, но не намного)</li>
<li>Бартер производительности на масштабируемость</li>
<li>Более эффективное кэшировние</li>
<li>Механизм роутеров в Django позволяет достаточно легко реализовать данный функционал</li>
</ul>
</li>
<li><em>Горизонтальное:</em>
<ul>
<li>Некоторые сайты имеют очень большие массивы данных</li>
<li>Партнеры требуют повышенного уровня доступности</li>
<li>Помогает снижать загрузку по записи на мастер базе данных</li>
<li>В основном используется все же вертикальное партиционирование</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><strong>Производительность базы данных</strong>:
<ul>
<li>Особое внимание уделяется тому, чтобы индексы помещались в оперативную память</li>
<li>Логгирование медленных запросов (автоматизировано с помощью syslog-ng + pgFouine + cron)</li>
<li>Использование пулов соединений (Django не умеет этого, используется pgbouncer, позволяет экономить на ресурсоемких операциях установления и прекращения соединений)</li>
<li>Оптимизация QuerySet&#8217;ов:
<ul>
<li>Не используется чистый SQL</li>
<li>Встроенный кэш позволяет выделять части выборки</li>
<li>Но это не всегда нужно, они убрали этот кэш</li>
</ul>
</li>
<li>Атомарные операции:
<ul>
<li>Поддерживают консистентность данных</li>
<li>Использование update(), так как save() не является thread-safe</li>
<li>Отлично работают для таких вещей, как счетчики</li>
</ul>
</li>
<li>Транзакции:
<ul>
<li>TransactionMiddleware поначалу использовалось, но со временем стало обузой</li>
<li>В postgrrsql_psycopg2 есть опция autocommit:
<ul>
<li>Это означает что каждый запрос выполняется в отдельной транзакции</li>
<li>Обработка каждого пользовательского HTTP-запроса не начинает новую транзакцию</li>
<li>Но все же транзакции из нескольких операций записи в СУБД нужны (сохранение нескольких объектов одновременно и полный откат в  случае ошибки)</li>
<li>В итоге все HTTP-запросы по-умолчанию начинаются в режиме autocommit, но в случае необходимости  переключаются в транзакционный режим</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><strong>Отложенные сигналы</strong>:
<ul>
<li>Постановка в очередь низкоприоритетных задач (даже если они не длинные по времени)</li>
<li>Асинхронные сигналы очень удобны для разработчика (но не так, как настоящие сигналы)</li>
<li>Модели отправляются в очередь в сериализованном виде</li>
</ul>
</li>
<li><strong>Кэширование</strong>:
<ul>
<li>Используется memcached</li>
<li>Новый pylibmcна основе libmemcached в качестве клиента (проекты django-pylibmc и django-newcache)</li>
<li>Настраиваемые алгоритмы поведения клиента</li>
<li>Используется _auto_reject_hosts и _retry_timeout для предотвращения повторных подключений к вышедшим из строя кэш-серверам</li>
<li>Алгоритм размещения ключей: консистентное хэширование на основе libketama</li>
<li>Существует проблема, когда одно очень часто используемое значение в кэше инвалидируется:
<ul>
<li>Множество клиентов одновременно пытаются получить новое значение из СУБД одновременно</li>
<li>В большинстве случаев правильным решением было бы вернуть большинству устаревшие данные и позволить одному клиенту обновить кэш</li>
<li>django-newcache и MintCache умеют это делать</li>
<li>Заполнение кэша новым значением вместо удаления при инвалидации также помогает избежать этой проблемы</li>
</ul>
</li>
</ul>
</li>
<li><strong>Мониторинг</strong>:
<ul>
<li>Информация о производительности запросов к БД, внешних вызовов и рендеринге шаблонов записывается через собственный middleware</li>
<li>Сбор и отображение с помощью Ganglia</li>
</ul>
</li>
<li><strong>Отключение функционала</strong>:
<ul>
<li>Необходим способ быстро отключить новый функционал, если оказывается, что он работает не так, как планировалось</li>
<li>Система должна срабатывать мгновенно, по всем серверам, без записи на диск</li>
<li>Позволяет запускать новые возможности постепенно, лишь для части аудитории</li>
<li>Позволяет постоянно использовать основную ветку кода</li>
<li>Аналогичная система используется и в <a href="/tag/facebook/" target="_blank">Facebook</a></li>
</ul>
</li>
<li><strong>Масштабирование команды разработчиков</strong>:
<ul>
<li>Небольшая команда</li>
<li>Месячная аудитория / количество разработчиков = 40 миллионов</li>
<li>Это означает:
<ul>
<li>Автоматическое тестирование</li>
<li>И максимально простой процесс разработки</li>
</ul>
</li>
<li>Новый сотрудник может начать работать уже через несколько минут, нужно лишь:
<ul>
<li>Установить и настроить PostgreSQL</li>
<li>Скачать исходный код из <a href="/tag/git/" target="_blank">git</a></li>
<li>С помощью pip и virtualenv установить зависимости</li>
<li>Изменить настройки в settings.py</li>
<li>Выполнить автоматическое создание структуры данных средствами Django</li>
</ul>
</li>
</ul>
</li>
<li><strong>Непрерывное тестирование</strong>:
<ul>
<li>Ежедневное развертывание с помощью <a href="/tag/fabric/" target="_blank">Fabric</a></li>
<li><a href="/tag/hudson/" target="_blank">Hudson</a> обеспечивает регулярно осуществляет и тестирует сборки</li>
<li>Интегрирован <a href="/tag/selenium/" target="_blank">Selenium</a></li>
<li>Быстрое тестирование с помощью <a href="/tag/pyflakes/" target="_blank">Pyflakes</a> и post-commit hooks</li>
<li>70 тысяч строк Python кода, 73% покрытие тестами, прогон всех тестов занимает 20 минут</li>
<li>Собственная система исполнения тестов с поддержкой XML, Selenium, подсчета количества запросов, тестирования Master/Slave базы данных и интеграцией с очередью</li>
</ul>
</li>
<li><strong>Отслеживание проблем и задач</strong>:
<ul>
<li>Переключились с Trac на Redmine (из-за поддержки под-задач)</li>
<li>Отправка исключений на e-mail &#8212; плохая идея</li>
<li>Раньше использовали django-db-log, но теперь опубликовали свою систему сбора ошибок и логов под названием <a href="https://github.com/dcramer/django-sentry" target="_blank">Sentry</a></li>
</ul>
</li>
</ul>
<h2>Делаем выводы</h2>
<ul>
<li>Язык программирования, каким бы он ни был, не является проблемой</li>
<li>Django в целом очень хорош (но приходится все же использовать набор собственных патчей)</li>
<li>Даже при использовании низкопроизводительного framework можно построить масштабируемую систему</li>
<li>Вертикальное партиционирование позволяет пожертвовать производительностью в пользу масштабируемости</li>
<li>Даже небольшой командой разработчиков можно добиться высоких результатов, если не пренебрегать автоматизацией тестирования</li>
<li>Большое значение имеет возможность вовремя отслеживать и оперативно реагировать на сбои</li>
</ul>
<h2>Источник информации</h2>
<p>Данная статья написана на основе выступления Jason Yan и David Cramer на DjangoConf 2010. В презентации можно найти примеры кода, ссылки на упоминаемые проекты и дополнительные материалы:</p>
<div id="__ss_5148151" style="width: 425px;"><object id="__sse5148151" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=djangocon2010scalingdisqus-100907133713-phpapp01&amp;stripped_title=djangocon-2010-scaling-disqus&amp;userName=zeeg" /><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=djangocon2010scalingdisqus-100907133713-phpapp01&amp;stripped_title=djangocon-2010-scaling-disqus&amp;userName=zeeg" allowfullscreen="true" allowscriptaccess="always" name="__sse5148151"></embed></object></div>
<p><em>Другие статьи по масштабируемости высоконагруженных систем можно почитать <a href="/highload" target="_blank">в соответствующем разделе</a>, а вовремя узнавать о новых &#8212; <a href="/feed" target="_blank">подписавшись на RSS</a>. Вчера, кстати, прикрутил DISQUS к Insight IT, приглашаю постоянных читателей и всех остальных потестировать <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-disqus/feed/</wfw:commentRss>
		<slash:comments>45</slash:comments>
		</item>
		<item>
		<title>Архитектура Вконтакте</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-vkontakte/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-vkontakte/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 17:12:52 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[ffmpeg]]></category>
		<category><![CDATA[HAProxy]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[mod_php]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[openssl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[XCache]]></category>
		<category><![CDATA[xfs]]></category>
		<category><![CDATA[Архитектура Вконтакте]]></category>
		<category><![CDATA[Вконтакте]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=641</guid>
		<description><![CDATA[Самая популярная социальная сеть в рунете пролила немного света на то, как же она работает. Представители проекта в лице Павла Дурова и Олега Илларионова на конференции HighLoad++ ответили на шквал вопросов по совершенно разным аспектам работы Вконтакте, в том числе и техническим. Спешу поделиться своим взглядом на архитектуру проекта по результатам данного выступления. Платформа Debian [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.insight-it.ru/wp-content/uploads/2010/10/vkontakte-512x512.png"><img class="alignleft size-medium wp-image-655" style="float: left; margin: 0 8px; border: 0!important;" title="Логотип Вконтакте" src="http://www.insight-it.ru/wp-content/uploads/2010/10/vkontakte-512x512-150x150.png" alt="Логотип Вконтакте" width="125" height="125" /></a><br />
Самая популярная социальная сеть в рунете пролила немного света на то, как же она работает. Представители проекта в лице Павла Дурова и Олега Илларионова на конференции <a href="http://www.insight-it.ru/life/highload-2010/" target="_blank">HighLoad++</a> ответили на шквал вопросов по совершенно разным аспектам работы <a href="http://www.vkontakte.ru" target="_blank">Вконтакте</a>, в том числе и техническим. Спешу поделиться своим взглядом на архитектуру проекта по результатам данного выступления.<span id="more-641"></span></p>
<h2>Платформа</h2>
<ul>
<li><a href="/tag/debian" target="_blank">Debian</a> <a href="/tag/linux" target="_blank">Linux</a> &#8212; основная операционная система</li>
<li><a href="/tag/nginx" target="_blank">nginx</a> &#8212; балансировка нагрузки</li>
<li><a href="/tag/php" target="_blank">PHP</a> + <a href="/tag/xcache" target="_blank">XCache</a></li>
<li><a href="/tag/apache" target="_blank">Apache</a> + <a href="/tag/mod_php" target="_blank">mod_php</a></li>
<li><a href="/tag/memcached" target="_blank">memcached</a></li>
<li><a href="/tag/mysql" target="_blank">MySQL</a></li>
<li>Собственная СУБД на <a href="/tag/c" target="_blank">C</a>, созданная &#171;лучшими умами&#187; России</li>
<li><a href="/tag/node-js" target="_blank">node.js</a> &#8212; прослойка для реализации XMPP, живет за <a href="/tag/haproxy" target="_blank">HAProxy</a></li>
<li>Изображения отдаются просто с файловой системы <a href="/tag/xfs">xfs</a></li>
<li><a href="/tag/ffmpeg">ffmpeg</a> &#8212; конвертирование видео</li>
</ul>
<h2>Статистика</h2>
<ul>
<li>95 миллионов учетных записей</li>
<li>40 миллионов активных пользователей во всем мире (сопоставимо с аудиторией интернета в России)</li>
<li>11 миллиардов запросов в день</li>
<li>200 миллионов личных сообщений в день</li>
<li>Видеопоток достигает 160Гбит/с</li>
<li>Более 10 тысяч серверов, из которых только 32 &#8212; фронтенды на <a href="/tag/nginx" target="_blank">nginx</a> (количество серверов с <a href="/tag/apache" target="_blank">Apache </a>неизвестно)</li>
<li>30-40 разработчиков, 2 дизайнера, 5 системных администраторов, много людей в датацентрах</li>
<li>Каждый день выходит из строя около 10 жестких дисков</li>
</ul>
<h2>Архитектура</h2>
<h3>Общие принципы</h3>
<ul>
<li>Cервера многофункциональны и используются одновременно в нескольких ролях:
<ul>
<li>Перебрасывание полуавтоматическое</li>
<li>Требуется перезапускать daemon&#8217;ы</li>
</ul>
</li>
<li>Генерация страниц с новостями (микроблоги) происходит очень похожим образом с <a href="/tag/facebook" target="_blank">Facebook</a> (см. <a href="/masshtabiruemost/arkhitektura-facebook/" target="_blank">Архитектура  Facebook</a>), основное отличие &#8212; использование собственной СУБД вместо MySQL</li>
<li>При балансировке нагрузки используются:
<ul>
<li>Взвешенный round robin внутри системы</li>
<li>Разные сервера для разных типов запросов</li>
<li>Балансировка на уровне ДНС на 32 IP-адреса</li>
</ul>
</li>
<li>Большая часть внутреннего софта написано самостоятельно, в том числе:
<ul>
<li>Собственная СУБД (см. ниже)</li>
<li>Мониторинг с уведомлением по СМС (Павел сам помогал верстать интерфейс <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</li>
<li>Автоматическая система тестирования кода</li>
<li>Анализаторы статистики и логов</li>
</ul>
</li>
<li>Мощные сервера:
<ul>
<li>8-ядерные процессоры Intel (по два на сервер, видимо)</li>
<li>64Гб оперативной памяти</li>
<li>8 жестких дисков (соответственно скорее всего корпуса 2-3U)</li>
<li>RAID не используется</li>
<li>Не брендированные, собирает компания ТехноОкта</li>
</ul>
</li>
<li>Вычислительные мощности серверов используются менее, чем на 20%</li>
<li>Сейчас проект расположен в 4 датацентрах в Санкт-Петербурге и Москве, причем:
<ul>
<li>Вся основная база данных располагается в одном датацентре в Санкт-Петербурге</li>
<li>В Московских датацентрах только аудио и видео</li>
<li>В планах сделать репликацию базы данных в другой датацентр в ленинградской области</li>
</ul>
</li>
<li><a href="/tag/cdn">CDN</a> на данный момент не используется, но в планах есть</li>
<li>Резервное копирование данных происходит ежедневно и инкрементально</li>
</ul>
<h3>Волшебная база данных на <a href="/tag/c" target="_blank">C</a></h3>
<p>Этому продукту, пожалуй, уделялось максимум внимания аудитории, но при этом почти никаких подробностей о том, что он собственно говоря собой представляет, так и не было обнародовано. Известно, что:</p>
<ul>
<li>Разработана &#171;лучшими умами&#187; России, победителями олимпиад и конкурсов топкодер; озвучили даже имена этих &#171;героев&#187; Вконтакте (писал на слух и возможно не всех успел, так что извиняйте):
<ul>
<li>Андрей Лопатин</li>
<li>Николай Дуров</li>
<li>Арсений Смирнов</li>
<li>Алексей Левин</li>
</ul>
</li>
<li>Используется в огромном количестве сервисов:
<ul>
<li>Личные сообщения</li>
<li>Сообщения на стенах</li>
<li>Статусы</li>
<li>Поиск</li>
<li>Приватность</li>
<li>Списки друзей</li>
</ul>
</li>
<li>Нереляционная модель данных</li>
<li>Большинство операций осуществляется в оперативной памяти</li>
<li>Интерфейс доступа представляет собой расширенный протокол <a href="/tag/memcached" target="_blank">memcached</a>, специальным образом составленные ключи возвращают результаты сложных запросов (чаще всего специфичных для конкретного сервиса)</li>
<li>Хотели бы сделать из данной системы универсальную СУБД и опубликовать под GPL, но пока не получается из-за высокой степени интеграции с остальными сервисами</li>
<li>Кластеризация осуществляется легко</li>
<li>Есть репликация</li>
<li>Если честно, я так и не понял зачем им <a href="/tag/mysql" target="_blank">MySQL </a>с такой штукой &#8212; возможно просто как legacy живет со старых времен</li>
</ul>
<h3>Аудио и видео</h3>
<p>Эти подпроекты являются побочными для социальной сети, на них особо не фокусируются. В основном это связанно с тем, что они редко коррелируют с основной целью использования социальной сети &#8212; <em>общением</em>, а также создают большое количество проблем: видеотраффик &#8212; основная статья расходов проекта, плюс всем известные проблемы с нелегальным контентом и претензиями правообладателей. Медиа-файлы банятся по хэшу при удалении по просьбе правообладателей, но это неэффективно и планируется усовершенствовать этот механизм.</p>
<p>1000-1500 серверов используется для перекодирования видео, на них же оно и хранится.</p>
<h3>XMPP</h3>
<p>Как известно, некоторое время назад появилась возможность общаться на Вконтакте через протокол Jabber (он же XMPP). Протокол совершенно открытый и существует масса opensource реализаций.</p>
<p>По ряду причин, среди которых проблемы с интеграцией с остальными сервисами, было решено за месяц создать собственный сервер, представляющий собой прослойку между внутренними сервисами Вконтакте и реализацией XMPP протокола. Основные особенности этого сервиса:</p>
<ul>
<li>Реализован на <a href="/tag/node-js">node.js</a> (выбор обусловлен тем, что JavaScript знают практически все разработчики проекта, а также хороший набор инструментов для реализации задачи)</li>
<li>Работа с большими контакт-листами &#8212; у многих пользователей количество друзей на вконтакте измеряется сотнями и тысячами</li>
<li>Высокая активность смены статусов &#8212; люди появляются и исчезают из онлайна чаще, чем в других аналогичных ситуациях</li>
<li>Аватарки передаются в base64</li>
<li>Тесная интеграция с внутренней системой обмена личными сообщениями Вконтакте</li>
<li>60-80 тысяч человек онлайн, в пике &#8212; 150 тысяч</li>
<li><a href="/tag/haproxy" target="_blank">HAProxy</a> обрабатывает входящие соединения и используется для балансировки нагрузки и развертывания новых версий</li>
<li>Данные хранятся в <a href="/tag/mysql" target="_blank">MySQL</a> (думали о MongoDB, но передумали)</li>
<li>Сервис работает на 5 серверах разной конфигурации, на каждом из них работает код на<a href="/tag/node-js" target="_blank"> node.js</a> (по 4 процесса на сервер), а на трех самых мощных &#8212; еще и <a href="/tag/mysql" target="_blank">MySQL</a></li>
<li>В <a href="/tag/node-js" target="_blank">node.js</a> большие проблемы с использованием <a href="/tag/openssl" target="_blank">OpenSSL</a>, а также течет память</li>
<li>Группы друзей в XMPP не связаны с группами друзей на сайте &#8212; сделано по просьбе пользователей, которые не хотели чтобы их друзья из-за плеча видели в какой группе они находятся</li>
</ul>
<h3>Интеграция со внешними ресурсами</h3>
<p>Во Вконтакте считают данное направление очень перспективным и осуществляют массу связанной с этим работы. Основные предпринятые шаги:</p>
<ul>
<li>Максимальная кроссбраузерность для виджетов на основе библиотек easyXDM и fastXDM</li>
<li>Кросс-постинг статусов в <a href="/tag/twitter">Twitter</a>, реализованный с помощью очередей запросов</li>
<li>Кнопка &#171;поделиться с друзьями&#187;, поддерживающая openGraph теги и автоматически подбирающая подходящую иллюстрацию (путем сравнивание содержимых тега &lt;title&gt; и атрибутов alt у изображений, чуть ли не побуквенно)</li>
<li>Возможность загрузки видео через сторонние видео-хостинги (YouTube, RuTube, Vimeo, и.т.д.), открыты к интеграции с другими</li>
</ul>
<h2>Интересные факты не по теме</h2>
<ul>
<li>Процесс разработки близок к Agile, с недельными итерациями</li>
<li>Ядро операционной системы модифицированно (на предмет работы с памятью), есть своя пакетная база для <a href="/tag/debian">Debian</a></li>
<li>Фотографии загружаются на два жестких диска одного сервера одновременно, после чего создается резервная копия на другом сервере</li>
<li>Есть много доработок над <a href="/tag/memcached" target="_blank">memcached</a>, в.т.ч. для более стабильного и длительного размещения объектов в памяти; есть даже persistent версия</li>
<li>Фотографии не удаляются для минимизации фрагментации</li>
<li>Решения о развитии проекта принимают Павел Дуров и Андрей Рогозов, ответственность за сервисы &#8212; на них и на реализовавшем его разработчике</li>
<li>Павел Дуров откладывал деньги на хостинг с 1 курса <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ul>
<h2>Подводим итоги</h2>
<p>В целом Вконтакте развивается в сторону увеличения скорости распространения информацию внутри сети. Приоритеты поменялись в этом направлении достаточно недавно, этим обусловлено, напимер, перенос выхода почтового сервиса Вконтакте, о котором очень активно говорили когда появилась возможность забивать себе текстовые URL вроде vkontakte.ru/ivan.blinkov. Сейчас этот подпроект имеет низкий приоритет и ждет своего часа, когда они смогут предложить что-то более удобное и быстрое, чем Gmail.</p>
<p>Завеса тайны насчет технической реализации Вконтакте была немного развеяна, но много моментов все же остались секретом. Возможно в будущем появится более детальная информация о собственной СУБД Вконтакте, которая как оказалось является ключом к решению всех самых сложных моментов в масштабируемости системы.</p>
<p>Как я уже упоминал этот пост написан почти на память, на основе небольшого конспекта &#171;круглого стола Вконтакте&#187;, так что хочется сразу извиниться за возможные неточности и недопонимания. Я лишь структурировал хаотичную кучу ответов на вопросы. Буду рад уточнениям и дополнениям.</p>
<p>Если хотите быть в курсе новых веяний в сфере масштабируемости высоконагруженных интернет-проектов &#8212; по традиции рекомендую <a href="/feed" target="_blank">подписаться на RSS</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-vkontakte/feed/</wfw:commentRss>
		<slash:comments>105</slash:comments>
		</item>
		<item>
		<title>Архитектура Facebook</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-facebook/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-facebook/#comments</comments>
		<pubDate>Wed, 20 Oct 2010 09:02:27 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[CDN]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[HipHop]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[ODS]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Scribe]]></category>
		<category><![CDATA[Thrift]]></category>
		<category><![CDATA[Архитектура Facebook]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=579</guid>
		<description><![CDATA[На сегодняшний день Facebook является пожалуй самым обсуждаемым интернет-проектом во всем мире. Не смотря на довольно низкий уровень проникновения Facebook в России, темпы захвата аудитории этим проектом мягко говоря поражают. Как же им удается управляться с таким огромным социальным графом и удовлетворять потребности в общении невероятно большого количества людей по всему миру? Платформа Linux &#8212; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.insight-it.ru/wp-content/uploads/2010/10/facebook_logo.jpg"><img class="alignleft size-full wp-image-584" style="border: 0!important; float: left; margin: 0 8px;" title="Facebook Logo" src="http://www.insight-it.ru/wp-content/uploads/2010/10/facebook_logo.jpg" alt="Facebook Logo" width="200" height="75" /></a>На сегодняшний день <a href="http://www.facebook.com" target="_blank">Facebook</a> является пожалуй самым обсуждаемым интернет-проектом во всем мире. Не смотря на довольно низкий уровень проникновения Facebook в России, темпы захвата аудитории этим проектом мягко говоря поражают. Как же им удается управляться с таким огромным социальным графом и удовлетворять потребности в общении невероятно большого количества людей по всему миру?</p>
<p><span id="more-579"></span></p>
<h2>Платформа</h2>
<ul>
<li><a href="/tag/linux" target="_blank">Linux</a> &#8212; операционная система</li>
<li><a href="/tag/php" target="_blank">PHP</a> с <a href="/tag/hiphop" target="_blank">HipHop</a> &#8212; код на PHP компилируется в C++</li>
<li><a href="/tag/memcached" target="_blank">memcached</a> &#8212; агрессивное кэширование объектов</li>
<li><a href="/tag/mysql" target="_blank">MySQL</a> &#8212; используется как хранилище пар ключ-значение, никаких join&#8217;ов</li>
<li><a href="/tag/thrift" target="_blank">Thrift</a> &#8212; интерфейс взаимодействия между сервисами, написанными на разных языках программирования</li>
<li><a href="/tag/scribe" target="_blank">Scribe</a> &#8212; универсальная система сбора и агрегации данных с рабочих серверов</li>
</ul>
<h2>Статистика</h2>
<ul>
<li>Более 500 миллионов активных пользователей (месячная аудитория)</li>
<li>Более миллиарда социальных связей</li>
<li>Более 200 миллиардов просмотров страниц в месяц</li>
<li>Более 4 триллионов действий попадает в новостные ленты каждый день</li>
<li>Более 150 миллионов обращений к кэшу в секунду; 2 триллиона объектов в кэше</li>
<li>Более 8 миллиардов минут провели пользователи на Facebook&#8217;е ежедневно</li>
<li>Более 3 миллиардов фотографий загружается каждый месяц, до 1.2 миллиона фотографий в секунду</li>
<li>20 миллиардов фотографий в 4 разрешениях = 80 миллиардов фотографий, их бы хватило чтобы покрыть поверхность земли в 10 слоев; это больше, чем на всех других фото-ресурсах в месте взятых</li>
<li>О более чем 5 миллиардах единиц контента рассказывается друзьям еженедельно</li>
<li>Более миллиарда сообщений в чате каждый день</li>
<li>Более ста миллионов поисковых запросов в день</li>
<li>Более 250 приложений и 80 тысяч сторонних ресурсов на платформе Facebook Connect</li>
<li>Более 400 тысяч разработчиков сторонних приложений</li>
<li>Менее 500 разработчиков и системных администраторов в штате</li>
<li>Более миллиона активных пользователей на одного инженера</li>
<li>Десятки тысяч серверов, десятки гигабит трафика</li>
</ul>
<h2>Архитектура</h2>
<h3>Общие принципы</h3>
<ul>
<li>Балансировщик нагрузки выбирает веб-сервер для обработки запроса</li>
<li>PHP-код в веб-сервере подготавливает HTML, пользуясь данными из различных источников:
<ul>
<li>MySQL</li>
<li>memcached</li>
<li>Специализированные сервисы</li>
</ul>
</li>
<li>Если взглянуть с другой стороны, то получим трехуровневую архитектуру:
<ul>
<li>Вер-приложение</li>
<li>Распределенный индекс</li>
<li>Постоянное хранилище</li>
</ul>
</li>
<li>Использование открытых технологий там, где это возможно</li>
<li>Поиск возможностей оптимизации используемых продуктов</li>
<li>Философия Unix:
<ul>
<li>Старайтесь делать каждый компонент системы простым и производительным</li>
<li>Комбинируйте компоненты для решения задач</li>
<li>Концентрируйте внимание на хорошо обозначенных точках взаимодействия</li>
</ul>
</li>
<li>Все усилия направлены на масштабируемость</li>
<li>Попытки минимизации количества точек отказа</li>
<li>Простота, простота, простота!</li>
</ul>
<h3>PHP</h3>
<p><strong>Почему PHP?</strong></p>
<ul>
<li>Во многом &#171;так исторически сложилось&#187;</li>
<li>Хорошо подходит для веб-разработки</li>
<li>Легок в изучении: небольшой набор выражений и языковых конструкций</li>
<li>Легок в написании: нестрогая типизация и универсальный &#171;массив&#187;</li>
<li>Легок в чтении: синтаксис похож на C++ и Java</li>
<li>Прост в дебаггинге: нет необходимости в перекомпиляции</li>
<li>Большой ассортимент библиотек, актуальных для веб-проектов</li>
<li>Подходит для процесса разработки с короткими итерациями</li>
<li>Активное сообщество разработчиков по всему миру</li>
<li>Динамическая типизация, интерпретируемый язык для скриптов</li>
</ul>
<p><strong>Как оказалось на самом деле?</strong></p>
<ul>
<li>Высокий расход оперативной памяти и вычислительных ресурсов</li>
<li>Сложно работать, когда объем исходного кода очень велик: слабая типизация и ограниченные возможности для статичного анализа и оптимизации кода</li>
<li>Не особо оптимизирован для использования в крупных проектах</li>
<li>Линейный рост издержек при подключении файлов с исходным кодом</li>
<li>Механизм разработки расширений не очень удобен</li>
</ul>
<p><strong>Доработки:</strong></p>
<ul>
<li>Оптимизация байт-кода</li>
<li>Улучшения в APC (ленивая загрузка, оптимизация блокировок, &#171;подогрев&#187; кэша)</li>
<li>Свои расширения (клиент memcache, формат сериализации, логи, статистика, мониторинг, механизм асинхронной обработки событий)</li>
<li><strong><a href="http://github.com/facebook/hiphop-php" target="_blank">HipHop</a></strong> &#8212; трансформатор исходных кодов:
<ul>
<li>Разработчики пишут на PHP, который конвертируется в оптимизированный C++</li>
<li>Статический анализ, определение типов данных, генерация кода, и.т.д.</li>
<li>Облегчает разработку расширений</li>
<li>Существенно сокращает расходы оперативной памяти и вычислительных ресурсов</li>
<li>У команды из трех программистов ушло полтора года на разработку, переписаны большая часть интерпретатора и многие расширения языка</li>
<li>Опубликован под opensource лицензией в начале года, нет необходимости проходить этот же путь с нуля</li>
</ul>
</li>
</ul>
<h3>MySQL</h3>
<p><strong>Как используется MySQL?</strong></p>
<ul>
<li>Используется как хранилище пар ключ-значение</li>
<li>Большое количество логических узлов распределено между физическими машинами</li>
<li>Балансировка нагрузке на уровне физических серверов</li>
<li>Репликация для распределения операций чтения <strong>не</strong> используется</li>
<li>Большинство запросов касаются самой свежей информации: оптимизация таблиц для доступа к новым данным, архивация старых записей</li>
<li>В целом быстро и надежно</li>
</ul>
<p><strong>Как оказалось на самом деле?</strong></p>
<ul>
<li>Логическая миграция данных <em>очень</em> сложна</li>
<li>Создавать большое количество логических баз данных и перераспределять их между физическими узлами, балансируя таким образом нагрузку, намного удобнее</li>
<li>Никаких join&#8217;ов на рабочих серверах баз данных</li>
<li>Намного проще наращивать вычислительные мощности на веб-серверах, чем на серверах баз данных</li>
<li>Схемы, основанные на структуре данных, делают программистов счастливыми и создают большую головную боль администраторам</li>
<li>Никогда не храните не-статичные данные в централизованное базе данных</li>
</ul>
<p><strong>Доработки:</strong></p>
<ul>
<li>Практически никаких модификаций исходного кода MySQL</li>
<li>Своя схема партиционирования с глобально-уникальными идентификаторами</li>
<li>Своя схема архивирования, основанная на частоте доступа к данным относительно каждого пользователя</li>
<li>Расширенный движок запросов для репликации между датацентрами и поддержания консистенции кеша</li>
<li>Библиотеки для доступа к данным на основе графа:
<ul>
<li>Объекты (вершины графа) с ограниченными типами данных (целое число, строка ограниченно длины, текст)</li>
<li>Реплицированные связи (ребра графа)</li>
<li>Аналоги распределенных внешних ключей (foreign keys)</li>
<li>Большинство данных распределено случайно</li>
</ul>
</li>
</ul>
<h3>Memcache</h3>
<p><strong>Как используется memcached?</strong></p>
<ul>
<li>Высокопроизводительная распределенная хэш-таблица</li>
<li>Содержит &#171;горячие&#187; данные из MySQL</li>
<li>Снижает нагрузку на уровень баз данных</li>
<li>Основная форма кэширования</li>
<li>Используется более 25TB памяти на нескольких тысячах серверов</li>
<li>Среднее время отклика менее 250 микро-секунд</li>
<li>Кэшируются сериализованные структуры данных PHP</li>
<li>Отсутствие автоматического механизма проверки консистенции данных между memcached и MySQL &#8212; приходится делать это на уровне программного кода</li>
<li>Множество multi-get запросов для получения данных на другом конце ребер графа</li>
<li>Ограниченная модель данных, неэффективен для маленьких объектов</li>
</ul>
<p><strong>Доработки:</strong></p>
<ul>
<li>Порт на 64-битную архитектуру</li>
<li>Более эффективная сериализация</li>
<li>Многопоточность</li>
<li>Улучшенный протокол</li>
<li>Компрессия</li>
<li>Проксирование запросов</li>
<li>Доступ к memcache через UDP:
<ul>
<li>уменьшает расход памяти благодаря отсутствию тысяч буферов TCP соединений</li>
<li>управление ходом исполнения приложение (оптимизация для multi-get)</li>
</ul>
</li>
<li>Статистика о работе потоков по запросу &#8212; уменьшает блокировки</li>
<li>Ряд изменений в ядре Linux для оптимизации работы memcache:
<ul>
<li>распределение управления сетевыми прерывания по всем ядрам</li>
<li>оппортунистический опрос сетевых интерфейсов</li>
</ul>
</li>
<li> После вышеперечисленных модификаций memcached способен выполнять до 250 тысяч операций в секунду, по сравнению со стандартными 30-40 тысячами без данных изменений</li>
</ul>
<h3>Thrift</h3>
<p><strong>Что это?</strong></p>
<ul>
<li>Легкий механизм построения приложений с использованием нескольких языков программирования</li>
<li>Высокая цель: предоставить механизм прозрачного взаимодействия между языками программирования.</li>
<li>Предоставляет язык описания интерфейсов, статический генератор кода</li>
<li>Поддерживаемые языки: <a href="/tag/c++" target="_blank">C++</a>, <a href="/tag/php" target="_blank">PHP</a>, <a href="/tag/python" target="_blank">Python</a>, <a href="/tag/java" target="_blank">Java</a>, <a href="/tag/ruby" target="_blank">Ruby</a>, <a href="/tag/erlang" target="_blank">Erlang</a>, <a href="/tag/perl" target="_blank">Perl</a>, <a href="/tag/haskell" target="_blank">Haskell</a> и многие другие</li>
<li>Транспорты: простой интерфейс для ввода-вывода (сокеты, файлы, буферы в памяти)</li>
<li>Протоколы: стандарты сериализации (бинарный, JSON)</li>
<li>Серверы: неблокирующие, асинхронные, как однопоточные, так и многопоточные</li>
</ul>
<p><strong>Почему именно Thrift?</strong></p>
<ul>
<li>Альтернативные технологии: SOAP, CORBA, COM, Pillar, Protocol Buffers &#8212; но у всех есть свои существенные недостатки, что вынудило Facebook создать свою технологию</li>
<li>Он быстрый, очень быстрый</li>
<li>Меньше рабочего времени тратится каждым разработчиком на сетевые интерфейсы и протоколы</li>
<li>Разделение труда: работа над высокопроизводительными серверами ведется отдельно от работы над приложениями</li>
<li>Общий инструментарий, знакомый всем разработчикам</li>
</ul>
<h3>Scribe</h3>
<p><strong>Что это?</strong></p>
<ul>
<li>Масштабированный распределенный механизм ведения логов</li>
<li>Перемещает данные с серверов в центральный репозиторий</li>
<li>Широкая сфера применения:
<ul>
<li>Логи поисковых запросов</li>
<li>Публикации в новостных лентах</li>
<li>Данные по A/B тестированиям</li>
</ul>
</li>
<li>Более надежен, чем традиционные системы логгирования, но недостаточно надежен для транзакций баз данных</li>
<li>Простая модель данных</li>
<li>Построен на основе Thrift</li>
</ul>
<h3>Хранение фотографий</h3>
<p><strong>Сначала сделали это просто:</strong></p>
<ul>
<li>Загрузка на сервер: приложение принимает изображение, создает миниатюры в нужных разрешениях, сохраняет в NFS</li>
<li>Загрузка с сервера: изображения отдаются из NFS через HTTP</li>
<li>NFS построена на коммерческих продуктах</li>
<li>Это было необходимо, чтобы сначала проверить, что продукт востребован пользователями и они правда будут активно загружать фотографии</li>
<li>На самом деле оказалось, что:
<ul>
<li> Файловые системы непригодны для работы с большим количеством небольших файлов</li>
<li>Метаданные не помещаются в оперативную память, что приводит к дополнительным обращениям к дисковой подсистеме</li>
<li>Ограничивающим фактором является ввод-вывод, а не плотность хранения</li>
</ul>
</li>
</ul>
<p><strong>Потом начали оптимизировать:</strong></p>
<ul>
<li>Кэширование более часто используемых миниатюр изображений в памяти на оригинальных серверах для масштабируемости, надежности и производительности</li>
<li>Распределение их по <a href="/tag/cdn">CDN</a> для уменьшения сетевых задержек</li>
<li>Возможно сделать еще лучше:
<ul>
<li>Хранение изображений в больших бинарных файлах (blob)</li>
<li>Сервис, отвечающий за фотографии имеет информацию о том, в каком файле и с каким отступом от начала расположена каждая фотография (по ее идентификатору)</li>
<li>Этот сервис в Facebook называется Haystack и он оказался в 10 раз эффективнее &#171;простого&#187; подхода и в 3 раза эффективнее &#171;оптимизированного&#187;</li>
</ul>
</li>
</ul>
<h3>Другие сервисы</h3>
<ul>
<li><strong>SMC</strong>: консоль управления сервисами &#8212; централизованная конфигурация, определение на какой физической машине работает логический сервис</li>
<li><strong>ODS</strong>:  инструмент для визуализации изменений любых статистических данных, имеющихся в системе; удобен для мониторинга и оповещений</li>
<li><strong>Gatekeeper:</strong> разделение развертывания и запуска, A/B тестирования, таргетированный запуск, постепенный запуск</li>
<li>И еще около 50 других сервисов&#8230;</li>
</ul>
<h2>Как это работает все вместе?</h2>
<h3>Новые альбомы друзей</h3>
<p style="text-align: center;"><a style="width: 100%; text-align: center;" href="http://www.insight-it.ru/wp-content/uploads/2010/10/fb.png"><img class="size-medium wp-image-583 aligncenter" style="border: 0pt none  ! important;" title="Facebook" src="http://www.insight-it.ru/wp-content/uploads/2010/10/fb-300x190.png" alt="Facebook Screenshot" width="300" height="190" /></a></p>
<ol>
<li>Получаем профиль по идентификатору пользователя (скорее всего из кэша, но потенциально возможно обращение к базе данных)</li>
<li>Получаем список друзей (опять же на основе идентификатора пользователя из кэша или из базы данных в случае промаха)</li>
<li>Параллельно запрашиваем идентификаторы последних 10 альбомов для каждого из друзей (multi-get, каждый промах мимо кэша индивидуально вытаскивается из MySQL)</li>
<li>Параллельно получаем данные о всех альбомах (на основе идентификаторов альбомов из предыдущего шага)</li>
<li>Все данные получены, выполняем логику отрисовки конкретной страницы на PHP</li>
<li>Отправляем HTML в браузер, пользователь счастлив <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
</ol>
<h3>Новостная лента</h3>
<p style="text-align: center;"><a href="http://www.insight-it.ru/wp-content/uploads/2010/10/fb2.png"><img class="size-medium wp-image-588 aligncenter" style="border: 0pt none  ! important;" title="News Feed" src="http://www.insight-it.ru/wp-content/uploads/2010/10/fb2-300x199.png" alt="News Feed Screenshot" width="300" height="199" /></a></p>
<p style="text-align: center;"><a href="http://www.insight-it.ru/wp-content/uploads/2010/10/fb3.png"><img class="size-medium wp-image-589 aligncenter" style="border: 0pt none  ! important;" title="News Feed" src="http://www.insight-it.ru/wp-content/uploads/2010/10/fb3-300x180.png" alt="News Feed Scheme" width="300" height="180" /></a></p>
<h3>Поиск</h3>
<p style="text-align: center;"><a href="http://www.insight-it.ru/wp-content/uploads/2010/10/fb4.png"><img class="size-medium wp-image-590 aligncenter" style="border: 0pt none  ! important;" title="Search" src="http://www.insight-it.ru/wp-content/uploads/2010/10/fb4-300x199.png" alt="Search Screenshot" width="300" height="199" /></a></p>
<p style="text-align: center;"><a href="http://www.insight-it.ru/wp-content/uploads/2010/10/fb5.png"><img class="size-medium wp-image-591 aligncenter" style="border: 0pt none  ! important;" title="Search" src="http://www.insight-it.ru/wp-content/uploads/2010/10/fb5-300x184.png" alt="Search Scheme" width="300" height="184" /></a></p>
<h2>Подводим итоги</h2>
<p>LAMP не идеален</p>
<ul>
<li>PHP+MySQL+Memcache решает большинство задач, но не может решить совсем все:
<ul>
<li>PHP не может хранить состояния</li>
<li>PHP не самый производительный язык</li>
<li>Все данные находятся удаленно</li>
</ul>
</li>
<li>Facebook разрабатывает собственные внутренние сервисы, чтобы:
<ul>
<li>Располагать исполняемый код ближе к данным</li>
<li>Скомпилированное окружение более эффективно</li>
<li>Некоторая функциональность присутствует только в других языках программирования</li>
</ul>
</li>
<li>Философия сервисов:
<ul>
<li>Создание сервисов только при необходимости (минимизация издержек по развертке, поддержке и ведению отдельной кодовой базы; потенциальная дополнительная точка сбоя)</li>
<li>Создание общего набора инструментов для создания сервисов (Thrift, Scribe, ODS, средства мониторинга и уведомлений)</li>
<li><em>Использование правильных языка программирования, библиотек и инструментов для решения задачи</em></li>
</ul>
</li>
<li>Возвращение инноваций общественности &#8212; важный аспект разработки в Facebook:
<ul>
<li>Опубликованные свои проекты:
<ul>
<li>Thrift</li>
<li>Scribe</li>
<li>Tornado</li>
<li>Cassandra</li>
<li>Varnish</li>
<li>Hive</li>
<li>xhprof</li>
</ul>
</li>
<li>Доработки популярных решений:
<ul>
<li>PHP</li>
<li>MySQL</li>
<li>memcached</li>
</ul>
</li>
<li>Информация о взаимодействии Facebook с opensource-сообществом, этих и других проектах расположена на <a href="http://developers.facebook.com/opensource/">странице, посвященной opensource</a>.</li>
</ul>
</li>
<li>Ключевые моменты культуры разработки в Facebook:
<ul>
<li><strong>Двигайся быстро</strong> и не бойся ломать некоторые вещи</li>
<li><strong>Большое влияние</strong> маленьких команд</li>
<li><strong>Будь откровенным</strong> и инновационным</li>
</ul>
</li>
</ul>
<h2>Источники информации</h2>
<p>Данная статья не является переводом готовой статьи, в качестве источников информации послужили записи выступлений сотрудников Facebook на конференциях:</p>
<ul>
<li><a href="http://www.infoq.com/presentations/Facebook-Software-Stack" target="_blank">Facebook Architecture: Science and the Social Graph</a></li>
<li><a href="http://www.infoq.com/presentations/Facebook-Moving-Fast-at-Scale" target="_blank">Facebook: Moving Fast at Scale</a></li>
<li><a href="http://www.infoq.com/presentations/Scale-at-Facebook" target="_blank">Scale at Facebook</a></li>
</ul>
<p>Очень рекомендую посмотреть материалы в оригинале, так как естественно я осветил в статье далеко не все, да и неточности какие-либо неисключены. Помимо этого возможно многим будет интересно мероприятие <a href="http://styleru.timepad.ru/event/3571" target="_blank">&#171;Facebook: how we scaled to 500 000 000 users &#171;</a>, где Robert Johnson выступает 22 октября в Москве. Еще он числится в списке докладчиков <a href="http://www.highload.ru" target="_blank">Highload++</a> с аналогичным выступлением. Дополнительную информацию можно почерпнуть в <a href="http://facebook.com/eblog">блоге инженеров Facebook</a>.</p>
<p><strong>UPD:</strong> Обновил некоторые моменты после посещения вышеупомянутого выступления Роберта.</p>
<p>И по традиции напоминаю, что так как я пишу довольно редко &#8212; читать мой блог намного удобнее по <a href="/feed" target="_blank">RSS</a>. Спасибо за внимание <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-facebook/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Amazon Web Services</title>
		<link>http://www.insight-it.ru/masshtabiruemost/amazon-web-services/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/amazon-web-services/#comments</comments>
		<pubDate>Mon, 28 Jul 2008 17:35:03 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[Amazon EC2]]></category>
		<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[Amazon SimpleDB]]></category>
		<category><![CDATA[Amazon SQS]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=85</guid>
		<description><![CDATA[Если Вы уже успели прочитать статью про архитектуру Amazon, то Вы уже знаете, что этот проект активно использует сервис-ориентированную архитектуру для максимально эффективной организации взаимодействия между всеми подпроектами. Этот подход используется практически во всех начинаниях Amazon и во многом благодаря ему они выпустили в свет групу сервисов под общим названием Amazon Web Services. Идея их [...]]]></description>
			<content:encoded><![CDATA[<p>Если Вы уже успели прочитать статью про <a href="/net/scalability/arkhitektura-amazon/" target="_blank">архитектуру Amazon</a>, то Вы уже знаете, что этот проект активно использует сервис-ориентированную архитектуру для максимально эффективной организации взаимодействия между всеми подпроектами. Этот подход используется практически во всех начинаниях Amazon и во многом благодаря ему они выпустили в свет групу сервисов под общим названием <em>Amazon Web Services</em>.<br />
<span id="more-85"></span><br />
Идея их достаточно проста: они предоставляют практически все необходимое для запуска веб-проектов абсолютно произвольной направленности и практически неограниченных масштабов. Причем они старались учесть все возможные потребности потребителей и именно по-этому сервисов в эту группу входит четыре:</p>
<dl>
<dt><strong>Elastic Cloud 2</strong></dt>
<dd>&#171;Практически любой высоконагруженный сервис требует внушительных вычислительных мощностей&#187; &#8212; вполне закономерное высказывание, именно проблемы с ним связанные и призван решить данный сервис. Сервис предоставляет в распоряжение пользователей виртуальные машины сопоставимые по производительности с &#171;железными&#187; серверами в считанные минуты, причем имеется возможность настраивать изначальный набор программного обеспечения и конфигурацию виртуального оборудования. Размещаемые на таких виртуальных машинах сервисы могут наращивать вычислительные мощности существенно быстрее по сравнению с  использованием dedicated или colocation хостинга.</dd>
<dt><strong>Simple Storage Service</strong></dt>
<dd>Этот сервис по сути представляет собой &#171;бездонное&#187; хранилище для произвольных файлов. Функционал достаточно прост: положить, забрать, удалить. Доступ возможен с использованием нескольких предоставляемых интерфейсов, а доступ к файлам может быть ограничен. Казалось бы ничего особенного, но во многих интернет-проектах такая возможность может оказаться полезной.</dd>
<dt><strong>SimpleDB</strong></dt>
<dd>Позиционируется как сервис для предоставления доступа к структурированным данным. С точки зрения разработчика проще охарактеризовать его как нереляционную базу данных. Схема данных генерируется в процессе эксплуатирования сервиса &#8212; заранее ее указывать не нужно, а запросы в какой-то степени напоминают сильно ограниченный SQL с возможностью только самых примитивных операций: сравнение, объединение, пересечение и т.п. У этой системы есть несколько аналогов, среди них Apache HBase и Hypertable.</dd>
<dt><strong>Simple Queue Service</strong></dt>
<dd>Более экзотический сервис &#8212; предоставляет возможность создания распределенных очередей сообщений для обеспечения взаимодействия других компонентов системы, которые предполагается, что будут размещены в Amazon EC2. Далеко не всем веб-проектам такая функциональность нужна, но если она все же понадобится &#8212; этот сервис здорово упростит жизнь разработчикам.</dd>
</dl>
<p>Все это можно было бы легко узнать и просто посетив <a href="http://www.amazon.com/AWS-home-page-Money/b/ref=sc_iw_l_0_3435361_2?ie=UTF8&#038;node=3435361&#038;no=3435361&#038;me=A36L942TSJ2AJA" target="_blank" rel="nofollow">официальный их сайт</a>, но не в этом суть &#8212; написать этот пост меня подтолкнул тот факт, что мне довелось столкнуться с этими сервисами и на личном опыте по работе. Собственно говоря просто хочу поделиться впечатлениями <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Знакомство было не долгим &#8212; всего пару недель, да и поиграться удалось по большей части лишь с <strong>Amazon EC2</strong> и совсем чуть-чуть с <strong>S3</strong>. Первое впечатление произвел их <a href="http://docs.amazonwebservices.com/AWSEC2/2008-02-01/GettingStartedGuide/" target="_blank" rel="nofollow">Getting Started Guide</a> &#8212; все просто и лаконично, еще даже до получения доступа к сервису у меня сложилось четкое представление о том, как он работает &#8212; несомненный плюс. После получения всех необходимых ключей от аккаунта (их было несколько, запутаться достаточно легко, но документация всегда спасала) можно сразу же приступать к работе с сервисом, скачав набор консольных утилит. Первым делом стоит взглянуть на ассортимент предоставляемых операционных систем для установки на будущие виртуальные машины &#8212; на первый взгляд представлены все популярные дистрибутивы Linux, что в общем-то более, чем достаточно (но при более детальном рассмотрении это оказалось далеко не так: различается в них только набор программного обеспечения, а ядро везде одно и то же &#8212; от Fedora 8). Так что выбор предстоит хоть и непростой, но скорее его стоит основывать его на личном предпочтении и удобстве, а не на каких-то других соображениях &#8212; разница в итоге будет невелика. Я лично остановил свой выбор на Debian Etch &#8212; не знаю по каким соображениям, да и не важно это вовсе, как впоследствии оказалось. Сделав свой выбор и подождав буквально несколько секунд можно узнать по какому URL располагается свежесозданная виртуальная машина (хочется отметить, что у утилиты их создания есть параметр &#171;количество&#187;, то есть создавать их можно целыми пачками).</p>
<p>Взмахнув волшебной палочкой (всмысле парой команд в локальной консоли) пользователь попадает в виртуальную консоль не менее виртуального сервера, с которым можно работать абсолютно так же, как и с настоящим железным сервером &#8212; варианты использования ограничиваются лишь воображением и требованиями проекта, который планируется там размещать. Останавливаться на дальнейшем смысла не вижу &#8212; все сугубо индивидуально.</p>
<p><strong>S3</strong> использовался мной лишь для хранения созданных модифицированных образов операционных систем, но своему описанию он соответствует абсолютно полностью: файлы загружаются простейшим образом, абсолютно не забивая себе голову о том, как они там будут храниться (хотя сервис на самом деле имеет под собой достаточно непростую структуру).</p>
<p>На закуску я оставил ложку дегтя &#8212; их ценовую политику. За пару недель достаточно неактивного, &#171;ознакомительного&#187; использования счет легко достиг отметки в пятьсот долларов. EC2 тарифицируется по часам &#8212; от 10 до 80 центов в час за виртуальную машину плюс трафик (более детально можно посмотреть на все том же <a href="http://www.amazon.com/EC2-AWS-Service-Pricing/b/ref=sc_fe_l_2?ie=UTF8&#038;node=201590011&#038;no=3435361&#038;me=A36L942TSJ2AJA" target="_blank" rel="nofollow">официальном сайте</a>). Там же и указаны гарантируемые вычислительные мощности и объем дискового пространства и оперативной памяти. На практике же все остальные параметры системы (пропускная способность сетевых интерфейсов, скорость чтения/записи на диски и так далее) делятся между всеми виртуальными машинами, располагаемыми на одной физической и по большей части это происходит по принципу &#171;как повезет&#187;, хотя наблюдаются и некоторые закономерности: узлам за 40-80 центов/час дается явный приоритет при доступе к дискам (что, впрочем, упоминается в их <a href="http://docs.amazonwebservices.com/AWSEC2/2007-08-29/DeveloperGuide/" target="_blank" rel="nofollow">Developer Guide</a>), но, как оказалось, приоритет этот настолько высок, что скорость записи отличается между ними более чем на порядок &#8212; в 15-20 раз, такое вот несколько удивительное наблюдение. Интернет-канал же тоже делится &#8212; ограничения сверху достичь не удалось, но есть предположение, что в сумме &#171;на всех&#187; он равен гигабиту на физическую машину.</p>
<p>В целом сервис производит достаточно положительные впечатления (если закрыть глаза на цены) &#8212; быстро и удобно, да и сфера его использования вовсе не ограничивается веб-проектами, его запросто можно приспособить и к, скажем, научным исследованиям, связанным с моделированием чего-нибудь, да и вообще к решению любых задач, требующих больших вычислительных мощностей. Жалко, что не удалось поближе познакомится с остальными веб-сервисами Amazon &#8212; они также кажутся достаточно интересными, если взглянуть со стороны.</p>
<p>Напоследок хочется напомнить, что подписаться на RSS <a href="/feed" target="_blank">никогда не поздно</a>, а помочь развитию блога можно <a href="/guest-posts" target="_blank">написав гостевой пост</a>. А то сам я, как не трудно заметить, в последнее время почти не справляюсь с относительно регулярным написанием новых информативных постов&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/amazon-web-services/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Архитектура Mailinator</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mailinator/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mailinator/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 15:17:50 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Mailinator]]></category>
		<category><![CDATA[электронная почта]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=81</guid>
		<description><![CDATA[Ваш пьяный друг когда-либо вдохновлял Вас на создание первого в своем роде интернет-сервиса, который пришелся бы по вкусу миллионам пользователей и при этом неприхотливо обрабатывал миллиарды электронных писем ежегодно? Именно так Paul Tyma и создал Mailinator. Mailinator представляет собой бесплатный, не требующий инсталляции, сервис для разрушения планов злобных спаммеров путем предоставления регистрации &#171;одноразовых&#187; почтовых адресов. [...]]]></description>
			<content:encoded><![CDATA[<p>Ваш пьяный друг когда-либо вдохновлял Вас на создание первого в своем роде интернет-сервиса, который пришелся бы по вкусу миллионам пользователей и при этом неприхотливо обрабатывал миллиарды электронных писем ежегодно? Именно так Paul Tyma и создал Mailinator.</p>
<p><a href="http://www.mailinator.com" target="_blank" rel="nofollow">Mailinator</a> представляет собой бесплатный, не требующий инсталляции, сервис для разрушения планов злобных спаммеров путем предоставления регистрации &#171;одноразовых&#187; почтовых адресов. Если Вы не не будете публиковать в Сети свой настоящий интернет-адрес &#8212; спаммеру не будут слать вам письма, вместо этого они будут спамить Mailinator <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Как же Mailinator справляется со своей ролью анти-спам супергероя?<br />
<span id="more-81"></span></p>
<h3>Источники информация</h3>
<p><em>Да-да, это снова перевод <a href="http://highscalability.com/mailinator-architecture" target="_blank" rel="nofollow">статьи</a> от <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd</a>&#8216;а (цифры правда не первой свежести, но все же). На что-то более глобальное я в ближайшее время способен не буду, в основном благодаря незаметно подкравшейся сессии и, отчасти, работе.</em></p>
<li><a href="http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html" target="_blank" rel="nofollow">The Architecture of Mailinator</a></li>
<li><a href="http://mailinator.blogspot.com/2007/02/mailinators-2006-stats.html" target="_blank" rel="nofollow">Mailinator&#8217;s 2006 Stats</a></li>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/linux" rel="nofollow" target="_blank">Linux</a></li>
<li><a href="/tag/tomcat" rel="nofollow" target="_blank">Tomcat</a></li>
<li><a href="/tag/java" rel="nofollow" target="_blank">Java</a></li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Сервис обработал:  1.29 миллиардов электронных писем за 2007 год. 450.74 миллионов за 2006. 280.68 миллионов за 2005.</li>
<li>В период пиковых нагрузок обрабатывается 6.5 миллионов электронных писем в сутки или 4513 сообщений в минуту или 75 в секунду.</li>
<li>Mailinator работает на всего одном весьма средненьком компьютере с AMD Athlon 2GHz процессором, 1 GB оперативной памяти (которая используется не целиком) и низкопроизводительным IDE жестким диском объемом 80 GB. И она в общем-то загружена далеко не полностью.</li>
<li>Mailinator работает месяцами без присмотра и теряется очень небольшое количество сообщений, даже при постоянных спам-атаках и высоких пиковых нагрузках.</li>
</ul>
<h3>Архитектура</h3>
<ul>
<li>Так как система бесплатна, она не должна быть идеальной. Таким образом основные цели:
<dl>
<dd>- Создание системы, которая ценит выживание превыше всего, даже пользователей. Основным ключом является именно выживание, так как Mailinator вынужден ежедневно отражать спам-атаки.</dd>
<dd>- Предоставить пользователям 99,99% доступность и точность данных. Более высокие гарантии будут существенно менее практичными и приведут к большим затратам. И так как сервис бесплатен, этот небольшой риск для пользователей становится просто частью правил игры.</dd>
<dd>- Поддержка следующей модели сервиса: пользователь регистрируется где-то, заходит в Mailinator, жмет на пришедшую ссылку и забывает об этом. Это означает, что письма не должны храниться постоянно. Они могут размещаться в оперативной памяти, так как являются временными (живут три-четыре часа). Если Вам нужен обычный настоящий почтовый ящик &#8212; воспользуйтесь любым другим соответствующим сервисом.</dd>
</dl>
</li>
<li>Изначально письма обрабатывались следующим образом:
<dl>
<dd>- Sendmail получал письмо в общий ящик на диске.</dd>
<dd>- Java-приложение доставало сообщение используя IMAP и/или POP (с течением времени это менялось) и удаляло их.</dd>
<dd>- Система загружала все письма в память и оставляла их там.</dd>
<dd>- Наиболее старые сообщения вытеснялись как только накапливался лимит в 20000 сообщений.</dd>
</dl>
</li>
<li>Данный принцип работал вполне неплохо:
<dl>
<dd>- Он стабилен и работал месяцами без каких-либо проблем.</dd>
<dd>- Использовался практически весь гигабайт оперативной памяти.</dd>
<dd>- Проблемы начались, когда количество сообщений в сутки начало превышать 800000. Система начала давать сбои из-за использования жесткого диска между Mailinator и email подсистемой.</dd>
<dd>- Наиболее старые сообщения вытеснялись как только накапливался лимит в 20000 сообщений.</dd>
</dl>
</li>
<li>Новая архитектура:
<dl>
<dd>- Идея заключалась в отказе от временного хранения данных на жестком диске путем полного переписывания всей системы с нуля.</dd>
<dd>- Веб-приложение, почтовый сервер и все хранилище писем функционируют в рамках одной JVM.</dd>
<dd>- Sendmail был заменен на специально написанный для этого проекта SMTP сервер. Так как природа Mailinator не требовала полноценного SMTP сервера. Mailinator не отправляет писем, основная цель &#8212; принимать или отвергать входящие письма. Это является недостатком многоуровневой архитектуры. Она часто является залогом успеха в процессе масштабирования веб-приложения, но порой она может и наоборот полностью убить всю производительность благодаря неверному принятию ответственных решений. Решение о создании собственного SMTP сервера было достаточно интересным и смелым, многие другие руководители проектов вместо этого просто добавили бы дополнительное оборудование в систему. Это не было бы ошибкой, но, согласитесь, создание своего собственного решения задачи &#8212; намного более интересный подход.</dd>
<dd>- Сейчас Mailinator получает почту напрямую, обрабатывает ее и хранит в оперативной памяти. Жесткие диски полностью обходятся и практически не используются.</dd>
<dd>- Основное их применение &#8212; хранение сообщений в случае остановки сервиса для того, чтобы они могли быть восстановлены при запуске.</dd>
<dd>- Ведение логов было отключено.</dd>
<dd>- Система использует менее 300 потоков. Это оказалось вполне достаточно.</dd>
<dd>- При принятии сообщения, система пропускает его через набор фильтров и хранит его в памяти только в том случае, если все фильтры были успешно пройдены.</dd>
<dd>- Каждый почтовый адрес ограничен только 10 письмами, так что популярные адреса вроде joe@mailinator.com не могут &#171;взорвать&#187; систему.</dd>
<dd>- Письма не могут превышать 100 kb, а все приложения автоматически уничтожаются. Это позволяет существенно сэкономить в плане используемой оперативной памяти..</dd>
</dl>
</li>
<li>Электронные письма сжимаются в оперативной памяти:
<dl>
<dd>- 99% писем никто даже не открывает, компрессия позволяет сэкономить место в оперативной памяти. Письмо разжимается в исходное состояние только если кто-то решает его открыть.</dd>
<dd>- Mailinator может хранить около 80000 писем в оперативной памяти, используя лишь 300 MB памяти, по сравнению с 20000 писем, занимающих 1 GB без использования компрессии.</dd>
<dd>- С таким подходом к хранению писем, они живут в среднем 3-4 часа.</dd>
<dd>- В память поместится и 200000 писем, но на практике это и не требуется.</dd>
<dd>- Оперативная память ценна, а процессорное время &#8212; вовсе нет. Именно из-за этого используется компрессия для экономии памяти и использования излишков вычислительных мощностей.</dd>
</dl>
</li>
<li>Mailinator не гарантирует анонимность или приватность:
<dl>
<dd>- Любой пользователь может получить доступ к любому почтовому ящику.</dd>
<dd>- Отказ от ограничений доступа делает схему работы системы намного более простой.</dd>
<dd>- Со стороны пользователя такой подход очень прост, так как не требуется абсолютно никакой регистрации. Когда сайт требует ввести почтовый адрес достаточно лишь просто ввести любой адрес Mailinator. Вам не нужно создавать отдельный аккаунт. Банальный ввод адреса создает почтовый ящик. Все просто.</dd>
<dd>- На практике же, не смотря на вышесказанное, пользователи все же получают изрядную степень приватности.</dd>
</dl>
</li>
<li>Стремление к выживанию требует агрессивной борьбы со спамом:
<dl>
<dd>- Mailinator не имеет ничего против спама, но так как спама приходит нереально много, когда он подвергает риску работоспособность сервиса приходится его фильтровать.</dd>
<dd>- Этот факт привел к правилу: если Вы делаете что-то (получаете спам или что-то еще), что мешает работе системы &#8212; Ваши письма не будут приниматься и Вы можете быть временно заблокированы.</dd>
</dl>
</li>
<li>Для успешного приема письмо должно пройти следующую цепочку фильтров:
<dl>
<dd>- Все письма, которые не смогли быть доставлены, отклоняются.</dd>
<dd>- При слишком большом количестве писем с одного IP они перестают приниматься.</dd>
<dd>- Слишком много писем с одинаковой темой не принимаются.</dd>
<dd>- Письма, содержащие в заголовках запрещенные сервисом слова, также не попадают в почтовые ящики.</dd>
</dl>
</li>
<li>Выживание в условиях наплыва писем с одного IP адреса:
<dl>
<dd>- Для этого типа фильтрации используется AgingHashMap. Когда сервис получает очередное письмо, IP помещается в массив и счетчик, соответствующий этому ключу, увеличивается на единицу в момент получения каждого последующего письма с этого IP.</dd>
<dd>- Спустя определенное время без получения писем с IP, соответствующие ему счетчик обнуляется.</dd>
<dd>- Когда счетчик достигает определенного порога, IP блокируется, предотвращая поток сообщений.</dd>
<dd>- Этим простым методом пользуются многие интернет-ресурсы для защиты различных своих компонентов, например комментариев. В роли хранилища для такого массива при распределенном функционировании системы часто используют <a href="/tag/memcached" target="_blank">memcached</a>.</dd>
</dl>
</li>
<li>Защита от &#171;зомби&#187; атак:
<dl>
<dd>- Спам может приходить и с больших координированных сетей с разными IP адресами, как раз участников таких сетей и называют &#171;зомби&#187;. Одинаковые письма приходят со множества разных адресов, так что защита по IP адресам становится бессильна.</dd>
<dd>- Этот фильтр несколько более сложный, чем блокировка по IP, так как требуется достать из письма строку с заголовком, да и их сравнение &#8212; несколько ресурсоемкая задача.</dd>
<dd>- Когда около 20 писем с одинаковыми темами приходят в течении 2 минут, этот заголовок блокируется на час.</dd>
<dd>- Что интересно,  Mailinator не хранит заблокированные темы вечно, так как это значило бы, что этот список неуклонно рос и приходилось бы вечно отслеживать соответствия с ним. Это никак не приемлемо для мимолетной природы Mailinator. Более комплексные алгоритмы защиты от спама нужны лишь только если ставятся цели с более жесткой борьбой со спама, для Mailinator же данный вариант &#8212; наиболее эффективный.</dd>
<dd>- Этим фильтром блокируется около 9% писем.</dd>
<dd>- Mailinator фильтрует сообщения только по теме и IP, так что системе не приходится прочитывать и анализировать все письмо целиком. Это позволяет неплохо сэкономить на вычислительных ресурсах при достаточно эффективной итоговой фильтрации.</dd>
</dl>
</li>
<li>Для уменьшения угрозы DDoS атак:
<dl>
<dd>- Все соединения, неактивные какое-то время обрываются.</dd>
<dd>- Mailinator отвечает отправителям писем очень медленно, 10, 20 или даже 30 секунд, даже для небольших объемов данных. Это замедляет работу спаммеров, пытающихся отправлять спам как можно быстрее, и заставляет их лишний раз задуматься о целесообразности отправки снова спама на этот адрес. Период ожидания уменьшается во время повышенных нагрузок на сервис, так что письма не теряются из-за этого.</dd>
</dl>
</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li><strong>Идеальность &#8212; всего лишь ловушка.</strong> Как много систем были кардинально усложнены лишь для того, чтобы достичь 100%-го результата во всех аспектах. Если Вы участвовали в подобных совещаниях, Вы понимаете о чем идет речь. О нет, мы не можем сделать этого, так как есть 0,01% шанс, что что-то пойдет не так. Лучше спросите себя: насколько неидеальными можно позволить себе быть, чтобы все равно оставаться достаточно неплохим сервисом?</li>
<li><strong>То, что Вы отвергаете, ничуть не менее важно, чем то, что Вы оставляете в системе.</strong> Существует масса концепций по построению архитектуры системы. Нужно не только выбрать подходящие, но и отказаться от тех, которые излишни.</li>
<li><strong>Знайте предназначение своей системы и разрабатывайте ее в соответствии с этим.</strong> Быть всем для всех значит быть ничем для никого. Временное хранение электронных писем, позволяя небольшой части спама пробиться через фильтры, в совокупности с не 100% временем работы системы производят достаточно хорошее впечатление на пользователей. Построение собственного SMTP-сервера необходимо лишь в случае, если у Вас есть весомые аргументы в пользу того, что он Вам необходим. Далеко не факт, что такая идея придет в голову, возможно выбор пал бы и на более тривиальное решение, связанное просто с добавлением дополнительного оборудования.</li>
<li><strong>Постарайтесь как можно быстрее свести механизм работы системы к наиболее общему случаю.</strong> Очень большой процент писем отвергается, так что это оправданно сделать это как можно раньше, чтобы минимизировать ресурсы, требуемые для их обработки. Найдите способ сделать это как можно быстрее в отношении наиболее частых случаев. то очень часто становится важным компонентом стратегии масштабирования.</li>
<li><strong>Эффективность часто означает &#171;постройте это самостоятельно&#187;.</strong> Готовые решения обычно решают большой спектр задач, но на практике часто нужна лишь небольшая часть функционала, в таких случаях можно написать небольшой компонент с нуля самостоятельно, чтобы он мог выполнять только нужные функции, но более эффективно.</li>
<li><strong>Небольшое количество сбоев &#8212; вполне допустимо.</strong> Все заблокированные адреса не должны быть запомнены навечно. Позвольте этим спискам генерироваться на основе локальных данных, а не глобального состояния. Это очень простая и эффективная архитектура.</li>
<li><strong><a href="/tag/java" target="_blank">Java</a> совсем не обязательно должна быть медленной.</strong> На эту тему сказано уже достаточно.</li>
<li><strong>Избегайте работы с жесткими дисками.</strong> Многие приложения требуют работы с дисковой системой, но очень часто именно она оказывается узким местом в системе. Можете ли Вы обойтись без него, используя более креативные подходы к архитектуре системы?</li>
<li><strong>Ограничте использование ресурсов.</strong> Задайте рамки для размеров почтовых ящиков и других подобных элементов системы, это позволит избежать неконтролируемых скачков нагрузок. Неограниченное использование ресурсов недопустимо при ограниченности ресурсов.</li>
<li><strong>Сжимайте данные.</strong> Компрессия данных может стать неплохим достижением в попытках сэкономить оперативную память. Можно сократить использование памяти вдвое с лишь небольшой дополнительной нагрузкой, связанной с компрессией и декомпрессией информации. Если обмен данными происходит локально, достаточно лишь закодировать данные и предоставить API для доступа к данным без полной декомпрессии.</li>
<li><strong>Используйте фиксированные объемы ресурсов для обработки запросов.</strong> Многие приложения не могут контролировать используемые ресурсы, в частности &#8212; оперативную память, таким образом они могут порой давать сбой при использовании излишне больших ее объемов. Для более стабильной работы стоит ограничить используемые ресурсы и откладывать выполнение новых задач пока они используются полностью. Для управление доступом к ресурсам можно использовать определенную логику в зависимости от ситуации: по времени, по приоритету, &#171;честный&#187; доступ, но так как ресурсы ограничены, система несколько ослабнет под серьезной нагрузкой.</li>
<li>Если данные не хранятся длительное время, они не могут стать причиной возбуждения судебного дела о нарушении чьих-либо прав.</li>
<li><strong>Пользуйтесь тем, что знаете лучше всего.</strong> Этот урок не раз оправдывал себя. Paul знал Java лучше, чем что-либо еще, именно по-этому он заставил приложение на этом языке работать и выполнить все поставленные задачи.</li>
<li><strong>Найдите свои собственные Mailinator&#8217;ы.</strong> Конечно, Mailinator является очень небольшой системой. В более крупной системе этот проект был бы лшь небольшой дополнительной возможностью, но такие системы обычно состоят просто из нескольких подроектов размером с Mailinator. А что если подойти к разработке некоторых из них так же как и к Mailinator?</li>
<li><strong>KISS работает, правда довольно редко.</strong> Простота систем часто обсуждается, но практические примеры появляются достаточно редко. Чаще всего разговор остается на уровне: твоя система сложная, а моя &#8212; простая, просто так как она моя. Mailinator является хорошим примером простой архитектуры системы.</li>
<li><strong>Надежность является функцией архитектуры системы.</strong> Для построения системы, эффективно использующей память и выживающей серьезные атаки спаммеров, потребовалось серьезно подойти к каждому уровню ее архитектуры.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mailinator/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>Архитектура Google Talk</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-googletalk/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-googletalk/#comments</comments>
		<pubDate>Thu, 22 May 2008 13:39:44 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Talk]]></category>
		<category><![CDATA[IM]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[sharding]]></category>
		<category><![CDATA[XMPP]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Google Talk]]></category>
		<category><![CDATA[присутствие]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=79</guid>
		<description><![CDATA[Google Talk представляет собой сервис мгновенного обмена сообщениями от Google. В основе этого сервиса лежит XMPP протокол, более известный как Jabber. В России среди IM-сервисов несомненно наиболее широко распространен ICQ, но количество русских пользователей Jabber тоже неуклонно растет. Вам когда-нибудь доводилось задумываться какое количество сообщений приходится обрабатывать такого рода сервисам? Допустим есть абстрактный IM-сервис, которым [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.google.com/talk" target="_blank" rel="nofollow">Google Talk</a> представляет собой сервис мгновенного обмена сообщениями от Google. В основе этого сервиса лежит <strong><abbr title="eXtensible Messaging and Presence Protocol">XMPP</abbr></strong> протокол, более известный как <em>Jabber</em>. В России среди IM-сервисов несомненно наиболее широко распространен <em>ICQ</em>, но количество русских пользователей <em>Jabber</em> тоже неуклонно растет.</p>
<p>Вам когда-нибудь доводилось задумываться какое количество сообщений приходится обрабатывать такого рода сервисам? Допустим есть абстрактный IM-сервис, которым пользуется миллион пользователей, в среднем каждый из них отправляет сто текстовых сообщений. Сколько всего сообщений обработал и доставил сервис? Сто миллионов? Наивно!<br />
<span id="more-79"></span></p>
<h3>Введение</h3>
<p>Сервисы мгновенного обмена на самом деле подвергаются существенно большей нагрузке, чем это может показаться на первый взгляд. Давайте взглянем на расшифровку аббревиатуры XMPP: eXtensible Messaging and Presence Protocol. Обмен сообщениями &#8212; лишь одна из его функций, наиболее важная же его часть остается &#171;за сценой&#187; &#8212; отображение присутствия пользователей <em>online</em>.</p>
<p>Давайте посмотрим на наш абстрактный пример с точки зрения присутствия: пускай им пользуется все тот же миллион пользователей, когда один из них включил компьютер и появился online &#8212; он должен уведомить весь свой список контактов об этом событии, а также узнать кто из них находится online. Если этот список велик, то такое элементарное событие может обернуться для сервиса далеко не одной сотней обработанных и доставленных сообщений. Помимо простого изменения статуса online/offline подобную цепочку сообщений может генерировать и любое другое изменение статуса: связанное с отсутствием пользователя около компьютера или с изменением небольшого текстового сообщения, которое обычно отображается в контакт листе рядом с ником пользователя и призвано отображать текущее его состояние, занятие или чего там только не пишут (эта функция не всегда предоставляется IM-сервисами, но наверняка многим знакома по <em>ICQ</em>, если не по <em>Jabber</em>). Все эти сообщения как раз и стоят за &#171;presence&#187; в аббревиатуре XMPP, суммарный траффик, ими генерируемый, может в несколько раз превышать траффик от собственно самих текстовых сообщений.</p>
<p>Если учесть факты, описанные в предыдущем абзаце, не трудно догадаться, что зависимость суммарного количества presence-сообщений от количества пользователей IM-сервиса далеко не линейна. Их количество за какой-то период времени можно очень приблизительно посчитать как произведение трех параметров: количества пользователей online, средней длины списка контактов среди них и количества изменений статуса каждым пользователем. А каждый дополнительный пользователь в системе так или иначе увеличивает как минимум два из этих трех параметров.</p>
<p>Введение несколько затянулась, а проблема масштабируемости XMPP-сервисов я думаю теперь стала очевидна, так что сейчас очень подходящий момент, чтобы вернуться к основной теме разговора &#8212; сервису Google Talk и том, как команда его разработчиков решает эту проблему.</p>
<h3>Источники информации</h3>
<p>Наверное уже стало заметно, что это не очередной перевод, а лично мной написанный текстик. Так что сразу выдам <a href="http://video.google.com/videoplay?docid=6202268628085731280" rel="nofollow" target="_blank">видео</a>, являющееся основным источником информации, и продолжу.</p>
<h3>Архитектура</h3>
<p>Со стороны Google (о котором я, кстати говоря, <a href="/net/scalability/arkhitektura-google" target="_blank">уже писал</a>) было бы глупо строить сервис мгновенного обмена сообщениями в стороне от остальных коммуникационных сервисов, предоставляемых этой компанией. Еще до своего публичного старта Google Talk был интегрирован в почтовый сервис <a href="http://www.gmail.com" rel="nofollow" target="_blank">GMail</a> и социальную сеть <a href="http://www.orkut.com" rel="nofollow" target="_blank">Orkut</a>: эти сервисы просто запрашивали у Google Talk присутствие online пользователей из своего списка контактов при возникновении соответствующих событий, но при этом не отображали результаты в своих страницах. Таким образом разработчики получили возможность оценить предстоящие нагрузки и готовность сервиса к публичному запуску намного более точно, чем они могли бы это сделать средствами синтетических тестов.</p>
<p>В отношении распределения нагрузок, сразу же был выбран и реализован подход, связанный с разбиением пользователей на группы и распределением работы с каждой отдельной группой по разным серверам. Это позволило избежать всей той эволюции серверной части приложения от одного сервера до большого кластера, что впрочем вполне оправданно, так как сразу же после запуска сервису предстояло столкнуться с огромным количеством пользователей и не ничуть не меньшей нагрузкой. Разработчики не забыли и сразу же предусмотреть безболезненный перенос пользователей с одного сервера на другой без видимых для него изменений, это позволило очень гибко изменять количество серверов в системе.</p>
<p>С точки зрения интеграции сервиса с другими проектами <a href="/tag/google" target="_blank">Google</a>, очень важно было предоставить определенный уровень абстракции для взаимодействия в виде API и набора адресов, по которым необходимо обращаться к сервису. Придерживаясь одного API можно производить практически любые архитектурные или программные изменения в рамках проекта таким образом, что все его пользователи и проекты, в которые он интегрирован, просто не заметят что что-то изменилось. Адреса, к которым происходит обращение при обмене данных, так же являются своеобразной абстракцией &#8212; можно переместить сервис в новый датацентр и благодаря DNS трафик будет направляться в нужное место.</p>
<p>С другой стороны необходимо учитывать и программное обеспечение работающие ниже уровнем, чем собственно код приложения: особенно ядро операционной системы и используемые библиотеки. В данном случае большую роль играет количество открытых TCP соединений, так как IM требует большое их количество, но активность в них не велика.</p>
<p>Разработчики Google Talk постарались как можно больше внимания уделить возможным сбоям и связанным с ними ситуациям. Любое даже запланированное временное прекращение функционирования какой-то части системы может резко увеличить нагрузку на остальную часть, даже если это просто перезагрузка части системы &#8212; из-за очистившегося кэша серверы снова начнут полноценно функционировать далеко не сразу, не говоря уже о непредвиденных сбоях, когда последствия намного более глобальны. Для своевременного устранения потенциальных проблем как с общем функционированием системы, так и с недостаточной производительностью, ведутся логи для всех этапов обработки запросов, а также предусмотрена возможность профайлинга прямо на работающих в системе серверах.</p>
<p>Но не стоит забывать и о клиентской части программного обеспечения: какая-нибудь глупая ошибка в коде клиента сервиса запросто может устроить DDoS атаку на сервис, что и случилось с одной из ранних версий клиента Google Talk. Помимо этого необходимо поддерживать совместимость разных версий клиентских приложений.</p>
<h3>Заключение</h3>
<p>Благодаря описанным выше принципам Google Talk удается обрабатывать каждое из миллиардов сообщений в день менее чем за 100 миллисекунд. Тесная интеграция с другими сервисами <a href="/tag/google" target="_blank">Google</a> позволила проекту сразу же получить невероятную популярность, а продуманный подход к разработке сервиса позволил справиться с огромной нагрузкой.</p>
<p>На этот раз статья получилась скорее о специфике сервиса, чем о его реализации. Технической информации найти практически не удалось, так что очень кратко все, но надеюсь и в таком варианте было достаточно интересно почитать. Напоследок хочу порекомендовать <a href="/feed" target="_blank">подписаться на RSS</a>, если не хотите пропустить публикацию новых постов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-googletalk/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Архитектура Digg</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-digg/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-digg/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 17:49:21 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Digg]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Digg]]></category>
		<category><![CDATA[интернет]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-digg/</guid>
		<description><![CDATA[Трафик, генерируемый более чем 1.2 миллионами пользователей Digg, знаменитых своей жаждой информации, способен загнать любой невинный сайт за рамки его вычислительных ресурсов и пропускной способности канала. Как же сам Digg справляется с такой нагрузкой? Источники информации Этот текст &#8212; перевод статьи, автор &#8212; Todd Hoff. Как Digg.com использует LAMP для масштабирования Масштабируемость и производительность PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Трафик,  генерируемый более чем 1.2 миллионами пользователей <a href="http://www.digg.com" rel="nofollow" target="_blank">Digg</a>, знаменитых своей жаждой информации, способен загнать любой невинный сайт за рамки его вычислительных ресурсов и пропускной способности канала. Как же сам Digg справляется с такой нагрузкой?<br />
<span id="more-61"></span></p>
<h3>Источники информации</h3>
<p><em>Этот текст &#8212; перевод <a href="http://highscalability.com/digg-architecture" target="_blank" rel="nofollow">статьи</a>, автор &#8212; <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd Hoff</a>.</em></p>
<ul>
<li><a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&#038;articleId=9017778" target="_blank" rel="nofollow">Как Digg.com использует LAMP для масштабирования</a></li>
<li><a href="http://www.oreillynet.com/onlamp/blog/2006/04/digg_phps_scalability_and_perf.html" target="_blank" rel="nofollow">Масштабируемость и производительность PHP в Digg</a></li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/mysql" target="_blank">MySQL</a></li>
<li><a href="/tag/linux" target="_blank">Linux</a></li>
<li><a href="/tag/php" target="_blank">PHP</a></li>
<li><a href="/tag/lucene" target="_blank">Lucene</a></li>
<li><a href="/tag/apc" target="_blank">APC PHP Accelerator</a></li>
<li><a href="/tag/memcached" target="_blank">Memcached</a></li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Проект стартовал в конце 2004 года на одном сервере под управлением <a href="/tag/linux" target="_blank">Linux</a> с использованием <a href="/tag/apache" target="_blank">Apache 1.3</a>, <a href="/tag/php" target="_blank">PHP 4</a> и <a href="/tag/mysql" target="_blank">MySQL 4.0</a> (со стандартной системой хранения данных &#8212; MyISAM).</li>
<li>Более 1.2 миллиона пользователей.</li>
<li>Более 200 миллионов просмотров страниц в месяц.</li>
<li>100 серверов расположены в нескольких датацентрах, из них:
<dl>
<dd>&ndash; 20 серверов баз данных;</dd>
<dd>&ndash; 30 веб-серверов;</dd>
<dd>&ndash; несколько поисковых серверов, использующих Lucene;</dd>
<dd>&ndash; остальные используются для обеспечения избыточности.</dd>
</dl>
</li>
<li>30 GB данных.</li>
<li>Ни одна из проблем, с которыми пришлось столкнуться проекту не была связана с <a href="/tag/php" target="_blank">PHP</a>, в основном они касались базы данных.</li>
<li>Легковесная природа <a href="/tag/php" target="_blank">PHP</a> позволила переместить вычислительные работы из базы данных в приложение для улучшения производительности.</li>
</ul>
<h3>Что внутри?</h3>
<ul>
<li>Балансировщик нагрузки равномерно распределяет запросы между <a href="/tag/php" target="_blank">PHP</a> серверами.</li>
<li>MySQL используется по принципу master-slave:
<dl>
<dd>&nbsp; Сервера, обрабатывающие большое количество транзакций, используют движок InnoDB.</dd>
<dd>&nbsp; Сервера, выполняющие аналитическую обработку данных в реальном времени, используют MyISAM.</dd>
<dd>&nbsp; Снижения производительности при переходе с <a href="/tag/mysql" target="_blank">MySQL</a> 4.1 на версию 5 замечено не было.</dd>
</dl>
</li>
<li>Для кэширования используется <a href="/tag/memcached" target="_blank">Memcached</a>.</li>
<li>Используется сегментирование баз данных.</li>
<li>Особенности использования Digg существенно облегчают процесс масштабирования. Большинство посетителей просто просматривают главную страницу и уходят. Это приводит к тому, что 98% запросов к базе данных являются операциями чтения. Такое соотношение операций чтения и записи позволяет не беспокоиться о комплексной работе по проектированию операций записи, что позволяет намного проще масштабировать проект.</li>
<li>Возникали проблемы, связанные с системой хранения данных, которые сообщали, что данные уже записаны на диск, когда на самом деле это было не так. Контроллеры делали это для создания впечатления более высокой производительности. Но на практике это приводило лишь к проблемам с целостностью данных. Это достаточно распространенная проблема, которую порой не так уж просто решить, правда все зависит от используемого оборудования.</li>
<li>Для облегчения нагрузки на базы данных используется кэшрование и <a href="/tag/apc" target="_blank">APC PHP Accelerator</a>.</li>
<li>С использованием рабочих потоков <a href="/tag/apache" target="_blank">Apache2</a>, FastCGI и <a href="/tag/php" target="_blank">PHP</a> акселератора возможно избежать необходимости каждый раз заново интерпретировать и компилировать PHP скрипты: скрипт компилируется только при первом обращении, что существенно ускоряет скорость его выполнения при последующих обращениях.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Используйте возможность выбора движка для <a href="/tag/mysql" target="_blank">MySQL</a>. Если Вам нужны транзакции &#8212; используйте InnoDB, если нет &#8212; MyISAM. Например, если на master сервере расположены транзакционные таблицы, то для slave серверов можно использовать и MyISAM.</li>
<li>В определенный момент рост стал невозможен путем добавления дополнительной оперативной памяти, пришлось продолжать рост путем изменения архитектуры.</li>
<li>Люди часто жалуются, что Digg медлителен. Скорее это вызвано их огромными <a href="/tag/javascript" target="_blank">JavaScript</a> библиотеками, чем работой их серверной системы.</li>
<li>Стоит тщательно выбирать какие именно приложения развертывать. Они приложили все усилия, чтобы не использовать приложения, требующие больших вычислительных мощностей. Очевидно, что Digg работает на совершенно стандартной <a href="/tag/lamp" target="_blank">LAMP</a> архитектуре, но тем не менее реализована она достаточно интересно. У инженеров часто возникает желание реализовать какой-либо дополнительный функционал, но всегда стоит иметь ввиду, что они могут разрушить инфраструктуру, если она не сможет расти теми же темпами. Так что с этим стоит повременить до тех пор пока система сможет выдерживать все необходимые нагрузки. Это приводит к планированию ресурсов, особенно большое внимание этому аспекту уделяет <a href="/tag/flickr" target="_blank">Flickr</a>.</li>
<li>Вам остается лишь догадываться, сможет ли <a href="/tag/digg" target="_blank">Digg</a> удержать свои позиции, если и дальше будет ограничивать добавление новых возможностей, или уступит более активно развивающимся сервисам социальных закладок? Возможно если бы была возможность увеличивать масштабы более простыми методами, более быстрое добавление новых функций и возможностей позволило бы более эффективно конкурировать на этом рынке? С другой стороны, просто добавление новых возможностей может и не поменять ситуацию кардинальным образом.</li>
<li>Основные проблемы с масштабируемостью и производительностью связаны с обработкой данных и в большинстве случаев они не зависят от используемого языка программирования. Вы столкнетесь с ними при работе с <a href="/tag/java" target="_blank">Java</a>, <a href="/tag/php" target="_blank">PHP</a>, <a href="/tag/ruby" target="_blank">Ruby</a>, или подставьте сюда Ваш любимый язык программирования.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-digg/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Архитектура Wikimedia</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-wikimedia/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-wikimedia/#comments</comments>
		<pubDate>Fri, 28 Mar 2008 12:32:49 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[LVS]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Wikimedia]]></category>
		<category><![CDATA[геораспределение]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-wikimedia/</guid>
		<description><![CDATA[Wikimedia является платформой для Wikipedia, Wiktionary и еще семи менее крупных wiki-проектов. Этот документ очень пригодится новичкам, пытающимся довести свои проекты до масштабов гигантских вебсайтов. Здесь можно найти множество интересных деталей и инновационных идей, которые уже успели доказать свою работоспособность на самых посещаемых сайтах всего Интернета. Источники информации Перевод статьи. Автор &#8212; Todd Hoff. Архитектура [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://wikimedia.org" target="_blank" rel="nofollow">Wikimedia</a> является платформой для <a href="http://wikipedia.org" target="_blank" rel="nofollow">Wikipedia</a>, <a href="http://wiktionary.org" target="_blank" rel="nofollow">Wiktionary</a> и еще семи менее крупных wiki-проектов. Этот документ очень пригодится новичкам, пытающимся довести свои проекты до масштабов гигантских вебсайтов. Здесь можно найти множество интересных деталей и инновационных идей, которые уже успели доказать свою работоспособность на самых посещаемых сайтах всего Интернета.<br />
<span id="more-59"></span></p>
<h3>Источники информации</h3>
<p><em>Перевод <a href="http://highscalability.com/wikimedia-architecture" target="_blank" rel="nofollow">статьи</a>. Автор &#8212; <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd Hoff</a>.</em></p>
<ul>
<li><a href="http://www.nedworks.org/~mark/presentations/san/Wikimedia%20architecture.pdf" target="_blank" rel="nofollow">Архитектура Wikimedia</a></li>
<li><a href="http://meta.wikimedia.org/wiki/Wikimedia_servers" target="_blank" rel="nofollow">Серверы Wikimedia</a></li>
<li><a href="http://oracle2mysql.wordpress.com/2007/08/22/12/" target="_blank" rel="nofollow">scale-out vs scale-up</a> из блога &#171;Oracle to MySQL&#187;</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/apache" target="_blank">Apache</a></li>
<li><a href="/tag/linux" target="_blank">Linux</a></li>
<li><a href="/tag/mysql" target="_blank">MySQL</a></li>
<li><a href="/tag/php" target="_blank">PHP</a></li>
<li><a href="/tag/squid" target="_blank">Squid</a></li>
<li><a href="/tag/LVS" target="_blank">LVS</a></li>
<li><a href="/tag/lucene" target="_blank">Lucene</a> для поиска</li>
<li><a href="/tag/memcached" target="_blank">Memcached</a> для распределенного кэширования объектов</li>
<li><a href="/tag/lighttpd" target="_blank">lighttpd</a> для работы с изображениями</li>
</ul>
<h3>Статитстика</h3>
<ul>
<li>8 миллионов статей распределены по сотням языковых подпроектов (английские, голландские, &#8230;)</li>
<li>В десятке самых высоконагруженных проектов по данным <a href="http://alexa.com" target="_blank" rel="nofollow">Alexa</a></li>
<li>Экспоненциальный рост: в терминах посетителей, трафика и серверов удвоение происходит каждые 4-6 месяцев</li>
<li>30000 HTTP запросов в секунду в периоды пиковой нагрузки</li>
<li>3 GBps трафик данных</li>
<li>3 датацентра: Тампа, Амстердам, Сеул</li>
<li>350 серверов, конфигурации варьируются от однопроцессорных Pentium 4 с 512 MB оперативной памяти до двухпроцессорных Xeon Quad-Core с 16 GB RAM.</li>
<li>Управляется ~6 людьми</li>
<li>Три кластера на трех разных континентах</li>
</ul>
<h3>Архитектура</h3>
<ul>
<li>Географическая балансировка нагрузки, основываясь на IP клиента, перенаправляет их на ближайший кластер. Происходит статическое отображение множества IP адресов на множество стран, а затем и на множество кластеров.</li>
<li>Кэширование с помощью <a href="/tag/squid" target="_blank">Squid</a> группируется по типу контента: текст для wiki отдельно от изображений и больших статических файлов.</li>
<li>На данный момент функционирует 55 <a href="/tag/squid" target="_blank">Squid</a> серверов, плюс еще 20 подготавливается к запуску.</li>
<li>1000 HTTP запросов в секунду на каждый сервер, в периоды повышенной нагрузки эта цифра может достигать 2500.</li>
<li>~ 100-250 MBps на сервер.</li>
<li>~ 14000-32000 открытых соединений на каждом сервере.</li>
<li>До 40 GB дискового кэша на каждом Squid сервере.</li>
<li>До 4 дисков в каждом сервере (1U серверы).</li>
<li>8 GB оперативной памяти, половину использует <a href="/tag/squid" target="_blank">Squid</a>.</li>
<li><a href="http://www.powerdns.com" target="_blank" rel="nofollow">PowerDNS</a> предоставляет геораспределение.</li>
<li>В основном и региональных датацентрах текстовые и медиа кластеры построены на <a href="/tag/lvs" target="_blank">LVS</a>, <abbr title="Common Address Reduncancy Protocol">CARP</abbr> <a href="/tag/squid" target="_blank">Squid</a>, кэш <a href="/tag/squid" target="_blank">Squid</a>. В основном датацентре также находится хранилище медиа-данных.</li>
<li>Для того, чтобы обеспечить предоставление только последних версий страниц, всем Squid-серверам отправляются инвалидационные запросы.</li>
<li>Централизованно управляемая и синхронизированная установка программного обеспечения для сотен серверов.</li>
<li>MediaWiki отлично масштабируется с несколькими процессорами, так что закупаются двухпроцессорный четырех ядерные серверы (8 ядер на сервер).</li>
<li>Одно и то же оборудование выполняет как задачи внешнего хранения данных, так и кэширования <a href="/tag/memcached" target="_blank">Memcached</a>.</li>
<li><a href="/tag/memcached" target="_blank">Memcached</a> используется для кэширования метаданных изображений, данных парсера, различий между ревизиями, пользователей, сессий. Метаданные, такие как история ревизий, отношений статей (ссылки, категории и так далее), учетные записи пользователей хранятся в основных базах данных</li>
<li>Сам текст находится во внешних хранилищах данных.</li>
<li>Статические (загруженные пользователями) файлы, например изображения, хранятся отдельно на сервере изображений, а метаданные (размер, тип и так далее) кэшируются в основной базе данных и объектном кэше.</li>
<li>Отдельная база данных для каждой вики (не отдельный сервер!).</li>
<li>Один master и много реплицированных slave серверов.</li>
<li>Операции чтения равномерно распределяются по slave серверам, операции записи направляются на master.</li>
<li>Иногда master используется и для операция чтения, когда репликация на slave еще не завершена.</li>
<li>Внешнее хранение данных:
<dl>
<dd>&ndash; Текст статей хранится на отдельных кластерах, которые представляют собой простой средство хранения данных с возможностью только дописывания новых данных. Такой подход позволяет сохранить дорогостоящее место в высоконагруженных основных базах данных от редкоиспользуемой информации.</dd>
<dd>&ndash; Благодаря этому появляются дополнительные неиспользованные ресурсы на серверах приложений (порой 250-500 GB на сервер).</dd>
<dd>&ndash; На данной момент используются реплицируемые кластеры из 3 <a href="/tag/mysql" target="_blank">MySQL</a> серверов, но в будущем это может измениться, так как требуется более удобное управление ими.</dd>
</dl>
</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Сфокусируйтесь на архитектуре, а не на операциях или чем-то другом.</li>
<li>Иногда кэширование обходится дороже, чем повторные вычисление или поиск данных в исходном источнике.</li>
<li>Старайтесь избегать сложных алгоритмов, запросов к базе данных и тому подобного.</li>
<li>Кэшируйте каждый результат, который дорого вам обошелся и является относительно локальным.</li>
<li>Сфокусируйтесь на &#171;горячих точках&#187; в коде.</li>
<li>Масштабируйтесь разделением:
<dl>
<dd>&ndash; операций чтения и записи (master/slave);</dd>
<dd>&ndash; сложных операций и более частых и простых (группы запросов);</dd>
<dd>&ndash; больших, популярных вики и более мелких.</dd>
</dl>
</li>
<li>Улучшайте кэширование: временная и пространственная локализация данных, а также уменьшение набора данных на каждом сервере.</li>
<li>Выполняйте компрессию текстовых данных, храните только изменения в статьях.</li>
<li>Казалось бы простые вызовы библиотечных функций порой на практике могут занимать слишком много времени.</li>
<li>Скорость поиска данных на диске ограничена, так что чем больше дисков &#8212; тем лучше!</li>
<li>Масштабирование с использованием обычного оборудование не означает использование самых дешевых вещей, которые удастся найти. Серверы баз данных Wikipedia сегодня представляют собой 16GB RAM, двух- или четырех-ядерные серверы с 6 15000 rpm SCSI дисками, организованными в RAID 0. Возможно они бы и использовали более дешевые системы, но 16 GB как раз хватает для размещения основного объема данных, а остальное берут на себя жесткие диски, это вполне соответствует потребностям системы, которую они построили. Примерно по таким же причинам их веб-сервера имеют 8 ядер, так как это позволяет достичь неплохой производительности <a href="/tag/php" target="_blank">PHP</a> при достаточно простой организации балансировки нагрузки.</li>
<li>Для масштабирования требуется выполнение массы работы, но если заранее этого не предусмотреть &#8212; понадобится сделать еще больше. MediaWiki изначально была написана для одного master сервера баз данных. Затем добавилась поддержка slave. Затем добавилось распределение по языкам и проектам. Дизайн системы с тех пор прекрасно выдерживает все нагрузки, но без очистки от новых узких мест системы не обошлось.</li>
<li>Каждый, кто хочет разработать свою базу данных таким образом, чтобы она позволила недорого масштабироваться с уровня одного сервера до уровня десятки лучших сайтов Интернета, должен начать с обработки слегка устаревших данных на реплицированных slave серверах, при этом не забывать балансировать нагрузку операций чтения между slave серверами. Если это возможно &#8212; блоки данных (группы пользователей, учетных записей, или чего угодно) должны размещаться каждый на разных серверах. Можно делать это с самого начала используя виртуализацию, чтобы удостовериться в работоспособности архитектуры, когда вы еще &#171;маленькие&#187;. Это <strong>намного</strong> проще, чем когда вы делаете то же самое, но под ежемесячно удваивающейся нагрузкой.</li>
</ul>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-wikimedia/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Lustre</title>
		<link>http://www.insight-it.ru/masshtabiruemost/lustre/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/lustre/#comments</comments>
		<pubDate>Fri, 21 Mar 2008 18:53:05 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Cluster File Systems]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lustre]]></category>
		<category><![CDATA[Sun]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[файловая система]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/lustre/</guid>
		<description><![CDATA[Lustre представляет собой кластерную файловую систему, основными особенностями которой являются превосходные надежность и масштабируемость. Производительность также более чем высока &#8212; скорость передачи данных может достигать сотен гигабит в секунду, а теоретический максимум доступного дискового пространства измеряется петабайтами. Эта файловая система может использоваться как на скромных рабочих группах из нескольких компьютеров, так и на огромных кластерах, [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float:right; margin: 8px;" src="/wp-content/uploads/lustre_logo.gif" alt="Lustre Logo" title="Lustre" /><br />
<a href="http://www.lustre.org" target="_blank" rel="nofollow">Lustre</a> представляет собой кластерную файловую систему, основными особенностями которой являются превосходные надежность и масштабируемость. Производительность также более чем высока &#8212; скорость передачи данных может достигать сотен гигабит в секунду, а теоретический максимум доступного дискового пространства измеряется петабайтами. Эта файловая система может использоваться как на скромных рабочих группах из нескольких компьютеров, так и на огромных кластерах, насчитывающих десятки тысяч машин.</p>
<p>Помимо этого поддерживаются все возможности, который должна иметь любая уважающая себя кластерная файловая система:</p>
<ul>
<li>поддержка широкого ассортимента типов высокоскоростных сетевых соединений;</li>
<li>надежная система &#171;замков&#187; для обеспечения параллельного доступа к файлам;</li>
<li>возможность автоматического самовосстановления в случае падения любого из узлов;</li>
<li>распределенное управление файловыми объектами для предоставления масштабируемого доступа к файлам.</li>
</ul>
<p><span id="more-55"></span><br />
Изначально архитектура этой файловой системы была разработана просто в рамках исследовательского проекта Петера Браама в 1999, но он решил не останавливаться на достигнутом и основал <em>Cluster File Systems, Inc.</em>, в которой уже и велась основная разработка самой файловой системы. Первый релиз Lustre 1.0 был выпущен в 2003 году. Спустя четыре года компания была приобретена Sun Microsystems в октябре 2007 года, но это лишь способствовало дальнейшему развитию проекта. Программное обеспечение, входящее в состав проекта, выпускается под лицензией GPL, что также сыграло немаловажную роль в его жизни.</p>
<h3>Архитектура</h3>
<p>Каждый компьютер, входящий состав кластера Lustre, выполняет свою четко определенную функцию:</p>
<ul>
<li><strong><abbr title="metadata server">MDS</abbr>.</strong> Сервер метаданных предназначен для хранения всей служебной информации о системе: названия файлов, директорий, прав доступа и так далее. Достаточно наличие одного такого сервера в системе, но для обеспечения надежности на случай каких-либо сбоев, обычно его дублируют. Возможно использование внешнего хранилища данных (<abbr title="metadata target">MDT</abbr>), которое может быть общим для двух дублирующих друг друга <abbr title="metadata server">MDS</abbr>.</li>
<li><strong><abbr title="Object Storage Server">OSS</abbr>.</strong> Компьютеры для хранения самих данных. Каждый из них работает с 2-8 <abbr title="Object Storage Target">OST</abbr>, в их роли могут выступать практически любые средства хранения данных, начиная от просто жестких дисков или RAID массивов внутри OSS, заканчивая внешними системами хранения данных enterprise-класса. Сумма дискового пространства всех OST и является размером доступного дискового пространства всей файловой системы Lustre.</li>
<li><strong>Клиент.</strong> Компьютеры, непосредственно использующие файловую систему. Им предоставляется полный параллельный доступ, полностью соответствующий стандарту POSIX.</li>
</ul>
<p>Один и тот же компьютер теоретически может совмещать в себе несколько функций, но в большинстве случаев это нецелесообразно (за исключением совмещения клиентов с OST и, возможно, случаев, когда количество узлов кластера очень мало).</p>
<p>Возможно более наглядно вышенаписанное сможет представить схема архитектуры системы (<a href="http://manual.lustre.org/manual/LustreManual16_HTML/figures/ClusterWithLustre-4.gif" target="_blank" rel="nofollow">позаимствована</a> с официального сайта и переведена):<br />
<a href="/wp-content/uploads/lustrearchitecture.gif" target="_blank"><img src="/wp-content/uploads/lustrearchitecture-s.gif" title="Схема архитектуры" alt="Схема архитектуры файловой системы Lustre" /></a></p>
<p>Помимо этого для функционирования системы необходим еще один компонент, по большому счету не являющийся ее частью &#8212; <strong><abbr title="management server">MGS</abbr></strong>. Его роль заключается в предоставлении конфигурационной информации всем компонентам одной или нескольким файловым системам Lustre. Он также нуждается в отдельном хранилище данных, но чисто теоретически он может быть и совмещен с одним из компонентов файловой системы.</p>
<h3>Функционирование</h3>
<p>Основным толчком для выполнения каких-либо действий в рамках всей файловой системы обычно является запрос с одного из клиентов. Программное обеспечение для клиентов представляет по сути интерфейс между виртуальной файловой системой <a href="/tag/linux" target="_blank">Linux</a> и серверами Lustre. Каждому типу серверов соответствует своя часть клиентского ПО: <abbr title="metadata client">MDC</abbr>, <abbr title="object storage client">OSC</abbr>, <abbr title="management client">MGT</abbr>. В отличии от <a href="/tag/hadoop" target="_blank">Hadoop</a> и <a href="/tag/gfs" target="_blank">GFS</a> файловая система Lustre должна быть примонтирована к локальной системе клиентов для полноценного их функционирования.</p>
<p>Для осуществления коммуникации между клиентами и серверами используется собственный API, известный как <abbr title="Lustre Networking">LNET</abbr>. Он поддерживает множество сетевых протоколов с помощью <abbr title="Network Abstraction Layer">NAL</abbr>.</p>
<p>В системе отсутствуют незаменимые компоненты, это является залогом отказоустойчивости системы. В случае возникновения каки-либо неполадок или сбоев в работе оборудования, работу потерявших работоспособность компонентов системы перехватят другие ее компоненты, что сделает сбой незаметным для пользователей системы. Это достигается за счет дублирование серверов, выполняющих одинаковые функции, а также наличие налаженных алгоритмов действий, направленных на автоматическое восстановление полноценного функционирования системы в случае возникновения чрезвычайных ситуаций. Но этого конечно же не достаточно для абсолютной надежности системы, в дополнение должна быть предоставлена как минимум система бесперебойного питания для всех компонентов кластера на случай проблем с электроэнергией в датацентре (для России более чем актуально).</p>
<p>В списке дополнительных возможностей, предоставляемых файловой системой, можно назвать возможность выделения квот на дисковое пространство для каждого пользователя системы, аутентификацию пользователей с помощью механизма Kerberos, повышение физической пропускной способности сетевого соединения путем аггрегирования физических сетевых соединений в одно логическое виртуально сетевое соединение (достаточно интересная возможность, способная при выполнении определенных условий существенно повлиять на быстродействие системы). Помимо этого предоставляется целый ряд возможностей по созданию резервных копий данных на уровне файловой системы в целом, отдельных устройств или же файлов.</p>
<h3>Заключение</h3>
<p>Эта файловая система нашла свое применение во множестве крупнейших кластеров и суперкомпьютеров по всему миру, но это не мешает ей с тем же успехом демонстрировать и на кластерах существенно меньшего масштаба. Около половины из самых производительных суперкомпьютеров во всем мире используют Lustre в качестве файловой системы. Помимо этого многие компании предоставляют ее в качестве основы для Linux кластеров (например HP StorageWorks SFS, Cray XT3, Cray XD1). Чем не показатель ее конкурентоспособности?</p>
<p>В качестве источников информации были использованы <a href="http://www.lustre.org" target="_blank" rel="nofollow">официальный сайт проекта</a> и иногда <a href="http://en.wikipedia.org/wiki/Lustre_%28file_system%29" target="_blank" rel="nofollow">страница английской wikipedia.org</a>. На все том же официальном сайте всегда можно найти всю необходимую документацию, а само программное обеспечение проекта доступно на <a href="http://www.sun.com/software/products/lustre/get.jsp" target="_blank" rel="nofollow">соответствующей странице</a> сайта Sun Mictosystems.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/lustre/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Архитектура YouTube</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-youtube/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-youtube/#comments</comments>
		<pubDate>Sat, 01 Mar 2008 13:07:09 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[BigTable]]></category>
		<category><![CDATA[lighttpd]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[NetScalar]]></category>
		<category><![CDATA[psyco]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[YouTube]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура YouTube]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[производительность]]></category>
		<category><![CDATA[хранение данных]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-youtube/</guid>
		<description><![CDATA[Рост YouTube был феноменально быстр, количество просмотров видео превысило 100 миллионов в сутки при том, что только около пяти человек работало над масштабированием проекта. Как им удается управлять предоставлением всех этих видеороликов своим посетителям? Как они развивались с тех пор, как были приобретены Google? Источники информации В отличии от остальных, этот перевод статьи от Todd [...]]]></description>
			<content:encoded><![CDATA[<p>Рост <a href="http://www.youtube.com" target="_blank" rel="nofollow">YouTube</a> был феноменально быстр, количество просмотров видео превысило 100 миллионов в сутки при том, что только около пяти человек работало над масштабированием проекта. Как им удается управлять предоставлением всех этих видеороликов своим посетителям? Как они развивались с тех пор, как были приобретены <a href="/tag/google" target="_blank">Google</a>?<br />
<span id="more-51"></span></p>
<h3>Источники информации</h3>
<p><em>В отличии от <a href="/highload" target="_blank">остальных</a>, этот перевод <a href="http://highscalability.com/youtube-architecture" target="_blank" rel="nofollow">статьи</a> от <a href="http://highscalability.com/user/todd-hoff" rel="nofollow" target="_blank">Todd Hoff</a>&#8216;а уже был выполнен до меня (при желании можно найти в любой поисковой системе), но я все равно решил опубликовать свою версию просто для собственного развития и полноты <a href="/highload" target="_blank">коллекции</a>, да и многим читателям, возможно, покажется интересным. Что ж, перейдем к источнику информации оригинала:</em></p>
<ul>
<li><a href="http://video.google.com/videoplay?docid=-6304964351441328559" target="_blank" rel="nofollow">Google Video</a></li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/apache" target="_blank">Apache</a></li>
<li><a href="/tag/python" target="_blank">Python</a></li>
<li><a href="/tag/linux" target="_blank">Linux</a> (SuSe)</li>
<li><a href="/tag/mysql" target="_blank">MySQL</a></li>
<li><a href="/tag/psyco" target="_blank">psyco</a>, динамический компилятор <a href="/tag/python" target="_blank">Python</a> &rarr; <a href="/tag/c" target="_blank">C</a></li>
<li><a href="/tag/lighttpd" target="_blank">lighttpd</a> для видео</li>
</ul>
<h3>Что внутри?</h3>
<h4>Статистика</h4>
<ul>
<li>Поддержка обработки более 100 миллионов видеороликов в сутки</li>
<li>Сервис был запущен в феврале 2005 года</li>
<li>В марте 2006 года в среднем производилось около 30 миллионов просмотров видео в день</li>
<li>К июлю 2006 года эта цифра достигла 100 миллионов просмотров в день</li>
<li>Над проектом работают: 2 системных администратора, 2 архитектора масштабируемости программного обеспечения, 2 разработчика новых возможностей, 2 инженера по сетям, 1 архитектор баз данных</li>
</ul>
<h4>Рецепт управления огромными темпами роста</h4>
<pre lang="PHP">
while (true)
{
   identify_and_fix_bottlenecks();
   drink();
   sleep();
   notice_new_bottleneck();
}
</pre>
<p>Этот цикл проходит далеко не одну итерацию ежедневно.</p>
<h3>Веб-серверы</h3>
<ul>
<li><a href="/tag/netscalar" target="_blank">NetScalar</a> используется для балансировки нагрузки и кэширования статического контента.</li>
<li><a href="/tag/apache" target="_blank">Apache</a> работает с включенным <strong>mod_fast_cgi</strong></li>
<li>Запросы отправляются на обработку с помощью серверного приложения на <a href="/tag/python" target="_blank">Python</a>.</li>
<li>Приложение взаимодействует с различными базами данных и другими источниками информации для формирования финальной <a href="/tag/html" taget="_blank">HTML</a>-страницы.</li>
<li>Масштабирование обычно происходит просто добавлением дополнительных компьютеров.</li>
<li>Код на <a href="/tag/python" target="_blank">Python</a> обычно не является узким местом системы, он проводит большую часть времени заблокированным RPC.</li>
<li><a href="/tag/python" target="_blank">Python</a> предоставляет быстроту и гибкость в процессе разработки и развертывания. Этот факт является очень актуальным, если учесть кто является их конкурентами.</li>
<li>На формирование страницы обычно уходит не более 100 миллисекунд.</li>
<li><a href="/tag/psyco" target="_blank">psyco</a>, динамический компилятор <a href="/tag/python" target="_blank">Python</a> &rarr; <a href="/tag/c" target="_blank">C</a>, использует JIT подход к компилированию для оптимизации внутренних циклов</li>
<li>Для интенсивных вычислений, таких как шифрование, используются расширения, написанные на <a href="/tag/c" target="_blank">C</a>.</li>
<li>Какая-то часть заранее сгенерированного <a href="/tag/html" taget="_blank">HTML</a> хранится в кэше.</li>
<li>Кэширование данных в <a href="/tag/subd" target="_blank">СУБД</a> на уровне строк.</li>
<li>Кэшируются полностью сформированные объекты <a href="/tag/python" target="_blank">Python</a>.</li>
<li>Некие данные вычисляются и отправляется каждому серверу для кэширования в локальной оперативной памяти. Эта стратегия годится далеко не всегда, чаще всего более эффективен другой метод: самым быстрым кэшем является само серверное приложение, а отправка уже готовых данных остальным серверам для дальнейшей обработки обычно не занимает так много времени. Для организации такого подхода необходимы агенты, осуществляющие отслеживание изменений, предварительную обработку и отправку данных.</li>
</ul>
<h3>Управление видео</h3>
<ul>
<li>Издержки включают в себя затраты на пропускную способность каналов связи, приобретение нового оборудования и оплату огромных счетов за электроэнергию.</li>
<li>Каждый видеоролик расположен на мини-кластере, что означает управление работой с ним группой из нескольких компьютеров.</li>
<li>Использование кластеров влечет за собой:
<dl>
<dd>&ndash; увеличение производительности пропорционально количеству дисков, на которых расположен контент;</dd>
<dd>&ndash; возможность поддержания функционирования всей системы даже в случае прекращения работоспособности части компьютеров;</dd>
<dd>&ndash; возможность организации создания резервных копий <a href="/tag/online" target="_blank">online</a>.</dd>
</dl>
</li>
<li>В роли HTTP-сервера для работы с видео используется <a href="/tag/lighttpd" target="_blank">lighttpd</a>:
<dl>
<dd>&ndash; Он способен дать фору <a href="/tag/apache" target="_blank">Apache</a> в плане производительности предоставления статического контента;</dd>
<dd>&ndash; Для работы с событиями ввода-вывода используется <strong>epoll</strong>;</dd>
<dd>&ndash; Многопоточная конфигурация способна обрабатывать большее количество соединений одновременно;</dd>
</dl>
</li>
<li>Самая популярная часть контента размещается в <strong><abbr title="Content Delievery Network">CDN</abbr></strong>
<dd>
<dd>&ndash; <strong><abbr title="Content Delievery Network">CDN</abbr></strong> реплицирует весь контент в разных частях системы;</dd>
<dd>&ndash; Компьютеры <strong><abbr title="Content Delievery Network">CDN</abbr></strong> в основном предоставляют данные напрямую из кэша в оперативной памяти, так как ассортимент популярного видео с течением времени меняется достаточно медленно.</dd>
</dl>
</li>
<li>Менее популярный контент, количество просмотров в день которого варьируется в диапазоне от одного до двадцати, обычно размещается на серверах <a href="/tag/youtube" target="_blank">YouTube</a>, расположенных в датацентрах на <em>colocation</em>:
<dl>
<dd>&ndash; Не смотря на тот факт, что такое видео может быть просмотрено всего несколько раз за день, количество таких роликов велико, что приводит к случайным блокировкам данных на жестких дисках;</dd>
<dd>&ndash; В такой ситуации кэширование практически бесполезно, инвестиции в кэширование контента с низкой вероятностью востребованности обычно является пустой тратой средств;</dd>
<dd>&ndash; Более детальная настройка низкоуровневых компонентов системы, таких как, например, RAID-контроллеры, в этой ситуации может достаточно положительно повлиять на производительность;</dd>
<dd>&ndash; Выбор оптимального размера оперативной памяти на каждой машине также очень важен: как недостаточное, так и излишнее ее количество не являются эффективными решениями.</dd>
</dl>
</li>
</ul>
<h4>Ключевые моменты</h4>
<ul>
<li>Чем <strong>проще</strong> &#8212; тем <strong>лучше</strong>;</li>
<li>Старайтесь минимизировать количество устройств (маршрутизаторов, коммутаторов и тому подобных) между контентом и пользователями: далеко не факт, что все они будут способны выдерживать интенсивную нагрузку;</li>
<li>Старайтесь использовать самое обыкновенное оборудование. Hi-end оборудование обычно влечет за собой рост издержек, связанных с сопутствующими процессами, например технической поддержкой, а также уменьшает вероятность нахождение решения той или иной проблемы с оборудованием в Сети;</li>
<li>Используйте самые простые распространенные утилиты. <a href="/tag/youtube" target="_blank">YouTube</a> использует идущий в комплекте с <a href="/tag/linux" target="_blank">Linux</a> набор утилит для построения системы именно на их основе;</li>
<li>Не забывайте о случайных доступах к жестким дискам, эту, казалось бы, мелочь тоже стоит настроить.</li>
</ul>
<h3>Управление миниатюрами видео</h3>
<ul>
<li>На удивление сложно решаемая задача, особенно если необходима эффективность;</li>
<li>Для каждого видео хранится 4 миниатюры, что приводит к существенному преобладанию количества миниатюр над количеством видеороликов;</li>
<li>Миниатюры хранятся всего на нескольких компьютерах;</li>
<li>Некоторые проблемы наблюдаются в связи с работой с большим количеством маленьких объектов:
<dl>
<dd>&ndash; Проблемы на уровне операционной системы, связанные с большим количеством запросов на поиск данных, а также кэшем страниц и <em>inode</em>&#8216;ов файловой системы;</dd>
<dd>&ndash; Ограничение на количество файлов в одной директории (особенно актуально для <strong>ext3</strong>), возможно частичное решение в виде перехода к более иерархической структуре хранения данных, а также переходе к ядру    <a href="/tag/linux" target="_blank">Linux</a> версии 2.6, что может привести к более чем стократному росту производительности, но в любом случае хранение такого огромного количества файлов в локальной файловой системе &#8212; не самая лучшая идея;</dd>
<dd>&ndash; Большое количество запросов в секунду, так как одна страница может содержать до 60 миниатюр различных видеороликов;</dd>
<dd>&ndash; В условиях таких нагрузок <a href="/tag/apache" target="_blank">Apache</a> показывает плохую производительность;</dd>
<dd>&ndash; Проводились эксперименты с использованием <a href="/tag/squid" target="_blank">squid</a> (обратной proxy) между <a href="/tag/apache" target="_blank">Apache</a> и посетителями. Какое-то время такой вариант казался работоспособным, но с ростом нагрузки производительность начала падать. С обработки 300 запросов в секунду она упала до 20;</dd>
<dd>&ndash; Попытки использовать <a href="/tag/lighttpd" target="_blank">lighttpd</a> также не завершились успехом: однопоточный режим не справлялся с задачей, а многопоточный требовал отдельного кэша для каждого потока, что сводило на нет его эффективность;</dd>
<dd>&ndash; С таким количеством изображений добавление в систему нового компьютера могло занимать более 24 часов;</dd>
<dd>&ndash; Перезагрузка занимала 6-10 часов, так как кэш должен был &#171;разогреться&#187; прежде чем перестать использовать данные с жестких дисков.</dd>
</dl>
</li>
<li>Решением всех описанных выше проблем стала распределенная система хранения данных <a href="/tag/bigtable" target="_blank">BigTable</a> от <a href="/tag/google" target="_blank">Google</a>:
<dl>
<dd>&ndash; Она позволяет избежать проблем, связанных с большим количеством файлов, так как объединяет маленькие файлы вместе.</dd>
<dd>&ndash; Она работает быстро и устойчива к сбоям, помимо этого она прекрасно приспособлена для работы по ненадежной сети.</dd>
<dd>&ndash; Уменьшает задержки, так как использует распределенный многоуровневый кэш, который способен работать даже между удаленными датацентрами.</dd>
</dl>
</li>
</ul>
<h3>Базы данных</h3>
<ul>
<li>Раньше:
<dl>
<dd>&ndash; <a href="/tag/mysql" target="_blank">MySQL</a> использовалась для хранения данных: пользователей, тэгов, описаний и так далее.</dd>
<dd>&ndash; Данные хранились на монолитном RAID 10 массиве, состоящем из 10 жестких дисков;</dd>
<dd>&ndash; Оборудование арендовалось, что негативно сказывалось на состоянии их кредитных карточек. В случае необходимости нового оборудования, на оформление заказа и доставку мог уходить далеко не один день.</dd>
<dd>&ndash; Они прошли через весь путь эволюции: сначала был один сервер, затем добавилось несколько дополнительных серверов, обслуживающих операции чтения, после чего они решили разбить базу данных на части, и, наконец, они пришли к полноценной распределенной архитектуре.</dd>
<dd>&ndash; Поначалу их система страдала от задержек, связанных с реплицированием. Основной сервер, обрабатывающий операции записи, являлся мощным сервером, работающим в многопоточном режиме, это было необходимо для своевременного выполнения большого объема работы. Второстепенные сервера, которые обрабатывали только операции чтения, асинхронно реплицировали данные в одном потоке, что влекло за собой возможность серьезного отставания некоторых из них.</dd>
<dd>&ndash; Обновления были причиной частого отсутствия необходимой информации в кэше, что заставляло сервера читать данные с жестких дисков. Этот факт сильно замедлял процесс чтения и репликации.</dd>
<dd>&ndash; Реплицирующая архитектура требует немалых вложений в оборудование, необходимого для поддержания постоянно растущих темпов записи информации.</dd>
<dd>&ndash; Основным из кардинальных решений, принятых в архитектуре системы было отделение обеспечения процесса просмотра видео от основного кластера. Основной целью посетителей является просмотр видео, а второстепенные задачи можно возложить и на менее производительный кластер.</dd>
</dl>
</li>
<li>Сейчас:
<dl>
<dd>&ndash; Используются распределенные базы данных;</dd>
<dd>&ndash; Сегментированная система <em>(прим.: <a href="/net/scalability/arkhitektura-flickr" target="_blank">по аналогии с Flickr</a>)</em>;</dd>
<dd>&ndash; Распределенные чтение и запись;</dd>
<dd>&ndash; Более эффективное расположение кэша, что ведет к уменьшению работы с жесткими дисками;</dd>
<dd>&ndash; Такая архитектура привела к 30%-й экономии на оборудовании;</dd>
<dd>&ndash; Задержки в реплицировании сведены к нулю;</dd>
<dd>&ndash; Размеры базы данных могут расти практически неограниченно</dd>
</dl>
</li>
</ul>
<h3>Стратегия размещения в датацентрах</h3>
<ul>
<li>Поначалу использовались хостинг провайдеры, предоставляющие услуги colocation. Не самый экономичный подход, но тогда не было другого выхода.</li>
<li>Хостинг провайдеры не могут поспеть за темпами роста проекта. Не всегда получается получить контроль над необходимым оборудованием или сделать необходимые соглашения о предоставлению сетевых услуг.</li>
<li>Решением этой проблемы стало создание собственной базы для размещения оборудования. Появилась возможность настраивать абсолютно все и подписывать свои собственные контракты такого рода.</li>
<li>Было использовано 5 или 6 разных датацентров в дополнение к <abbr title="Content Delievery Network">CDN</abbr>.</li>
<li>Видео поступает из случайного датацентра, никаких специальных проверок не проводится. Если ролик становится достаточно популярным &#8212; он перемещается в <abbr title="Content Delievery Network">CDN</abbr>.</li>
<li>Основным фактором, влияющим на доступность того или иного ролика является пропускная способность канала связи.</li>
<li>Для изображений же более актуальны задержки, особенно если на одной страницы должно быть размещено под 60 изображений.</li>
<li>Репликация изображений производится средствами <a href="/tag/bigtable" target="_blank">BigTable</a>. В этом случае используются различные меры для определения ближайшего места, откуда можно получить необходимые данные.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li><strong>Остановитесь на секунду.</strong> Креативные и рискованные трюки могут помочь справиться с задачей в краткосрочном периоде, но со временем понадобятся более продуманные решения.</li>
<li><strong>Расставьте приоритеты.</strong> Определите какие части Вашего сервиса являются более важными и стройте  систему обеспечения ресурсами и усилиями именно в соответствии с поставленными приоритетами.</li>
<li><strong>Выбирайте свои битвы.</strong> Не бойтесь пользоваться аутсорсингом в некоторых ключевых сервисах. <a href="/tag/youtube" target="_blank">YouTube</a> использует <abbr title="Content Delievery Network">CDN</abbr> для распределения своего наиболее популярного контента. Создание своей собственной подобной сети стоило бы им слишком много и потребовало бы слишком много времени. Возможно у Вас появятся подобные возможности в отношении Вашей системы.</li>
<li><strong>Будьте проще!</strong> Простота позволяет изменять архитектуру более быстро, что позволяет своевременно реагировать на возникающие проблемы. Никто на самом деле не знает что такое <em>простота</em>, но если Вы не боитесь делать изменения, то это неплохой знак что вашей системе свойственна та самая <em>простота</em>.</li>
<li><strong>Сегментирование.</strong> Сегментирование позволяет изолировать и ограничить дисковое пространство, процессорное время, оперативную память и ввод-вывод. Оно выполняется не только для повышения производительности операций записи.</li>
<li><strong>Постоянная работа над поиском и устранением узких мест в системе:</strong>
<dl>
<dd>&ndash; на программном уровне это чаще всего бывает кэширование и работа с <a href="/tag/subd" target="_blank">СУБД</a>;</dd>
<dd>&ndash; на уровне операционной системы &#8212; операции ввода-вывода;</dd>
<dd>&ndash; на уровне оборудования &#8212; оперативная память и RAID массивы.</dd>
</dl>
</li>
<li><strong>Залог Вашего успеха &#8212; командная работа.</strong> Хорошая команда разного рода специалистов должна понимать принцип системы вцелом и того, что лежит <em>под</em> ней. Каждый должен знать свое дело: настраивать принтеры, подключать к системе новые компьютеры, строить сети и так далее. С отличной командой Вам по силам все что угодно.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-youtube/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>Архитектура Amazon</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-amazon/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-amazon/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 18:47:49 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jboss]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mason]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Servlet]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Amazon]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[информационные технологии]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-amazon/</guid>
		<description><![CDATA[Amazon вырос из крошечной книжной лавки в один из крупнейших магазинов вселенной. Они добились этого благодаря их инновационному подходу к обзорам, рекомендациям и оценке продукции. Источники информации Как и остальные статьи об архитектурах высоконагруженных систем на этом блоге, эта запись представляет собой перевод статьи, автором которой является Todd Hoff. Источниками информации для оригинала послужили: Ранний [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://amazon.com" rel="nofollow" target="_blank">Amazon</a> вырос из крошечной книжной лавки в один из крупнейших магазинов вселенной. Они добились этого благодаря их инновационному подходу к обзорам, рекомендациям и оценке продукции.<br />
<span id="more-45"></span></p>
<h3>Источники информации</h3>
<p><em>Как и <a href="/highload" target="_blank">остальные статьи</a> об архитектурах высоконагруженных систем на <a href="/about" target="_blank">этом блоге</a>, эта запись представляет собой перевод <a href="http://highscalability.com/amazon-architecture" rel="nofollow" target="_blank">статьи</a>, автором которой является <a href="http://highscalability.com/user/todd-hoff" rel="nofollow" target="_blank">Todd Hoff</a>. Источниками информации для оригинала послужили:</em></p>
<ul>
<li><a href="http://glinden.blogspot.com/2006/05/early-amazon-end.html" target="_blank" rel="nofollow">Ранний Amazon</a> от Greg Linden</li>
<li><a href="http://news.com.com/2100-1001-275155.html" target="_blank" rel="nofollow">Как Linux позволил Amazon сэкономить миллионы</a></li>
<li><a href="http://www.se-radio.net/index.php?post_id=157593" target="_blank" rel="nofollow">Интервью с Werner Vogels&#8217;ом</a> &#8212; техническим директором Amazon</li>
<li><a href="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html" target="_blank" rel="nofollow">Асинхронные архитектуры</a> &#8212; краткий пересказ речи Werner Vogels&#8217;а от Cris Loosley</li>
<li><a href="http://www.acmqueue.com/modules.php?name=Content&#038;pa=showpage&#038;pid=388" target="_blank" rel="nofollow">Познание технологической платформы Amazon</a> &#8212; диалог с Werner Vogels</li>
<li><a href="http://www.allthingsdistributed.com/" target="_blank" rel="nofollow">Блог Werner Vogels&#8217;а</a> &#8212; построение масштабируемых распределенных систем</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/linux" target="_blank">Linux</a></li>
<li><a href="/tag/oracle" target="_blank">Oracle</a></li>
<li><a href="/tag/c" target="_blank">C++</a></li>
<li><a href="/tag/perl" target="_blank">Perl</a></li>
<li><a href="/tag/mason" target="_blank">Mason</a></li>
<li><a href="/tag/java" target="_blank">Java</a></li>
<li><a href="/tag/jboss" target="_blank">Jboss</a></li>
<li><a href="/tag/servlet" target="_blank">Сервлеты</a></li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Более чем 55 миллионов учетных записей активных покупателей.</li>
<li>Более миллиона активных розничных партнеров по всему Миру.</li>
<li>Для построения страницы осуществляется доступ к 100-150 сервисам.</li>
</ul>
<h3>Архитектура</h3>
<ul>
<li>Что мы на самом деле подразумеваем под словом <a href="/tag/masshtabiruemost/" target="_blank">&#171;масштабируемость&#187;</a>? Обычно говорят, что сервис является масштабируемым, если в случае расширения ресурсов системы производительность растет пропорционально. Рост производительности обычно означает увеличение количества выполняемых в единицу времени работ, но с другой стороны он может означать и рост объемов выполняемых работ, например размер обрабатываемых наборов данных.</li>
<li><a href="/tag/amazon" target="_blank">Amazon</a> пришлось претерпеть большое архитектурное преобразование в процессе перехода от двух-уровневой монолитной системы к полностью распределенной децентрализованной платформе для сервисов и приложений.</li>
<li>Все началось с одного приложения, обменивающегося данными с внутренним интерфейсом, написанного на <a href="/tag/c" target="_blank">C++</a>.</li>
<li>Оно росло. За годы усилий, направленных на масштабирование, <a href="/tag/amazon" target="_blank">Amazon</a> сфокусировался на масштабировании <a href="/tag/bd" target="_blank">баз данных</a> для хранения постоянно растущего объема информации о предметах, покупателях, заказах, для поддержки нескольких интернациональных сайтов. В 2001 году стало ясно, что исходное веб-приложение больше не в состоянии <a href="/tag/masshtabiruemost" target="_blank">масштабироваться</a> такими темпами. Базы данных были разбиты на маленькие части и для каждой их них был построен отдельный <a href="/tag/interfejs" target="_blank">интерфейс</a>, выполненный в виде сервиса, который являлся единственным способом получить доступ к данным.</li>
<li><a href="/tag/bd" target="_blank">Базы данных</a> стали общим ресурсом, что затрудняло рост бизнеса в целом. Интерфейсы, связанные с пользователями и базами данных, были сильно ограничены в своей эволюции, так как они одновременно использовались множеством разных команд разработчиков и процессов.</li>
<li>Их <a href="/tag/arkhitektura" target="_blank">архитектура</a> тесно связана и построена вокруг сервисов. Ориентированная на сервисы архитектура дала им необходимый уровень изоляции для построения множества программных компонентов быстро и независимо.</li>
<li>Система выросла до сотен сервисов и не меньшего количества серверов приложений, аггрегирующих информацию, полученную от сервисов. Приложение, генерирующее страницы для <a href="http://amazon.com" target="_blank" rel="nofollow">Amazon.com</a>, является одним из таких серверов. То же самое можно сказать и про приложения, служащие в роли интерфейса для Веб-сервисов, сервиса, обслуживающего покупателя, интерфейса для продавцов.</li>
<li>Многие другие <a href="/tag/tekhnologiya" target="_blank">технологии</a> очень трудно масштабировать до размеров <a href="/tag/amazon" target="_blank">Amazon</a>, особенно технологии коммуникационной инфраструктуры. Они отлично работают до какого-то предела в размерах системы, а после перестают справляться с выполнения своих обязанностей. Именно это подтолкнуло <a href="/tag/amazon" target="_blank">Amazon</a> на создание своих <a href="/tag/tekhnologiya" target="_blank">технологий</a> в  этой области.</li>
<li>Не ограничиваясь одним конкретным подходом, некоторые части системы используют <a href="/tag/java" target="_blank">Java</a>/<a href="/tag/jboss" target="_blank">Jboss</a>, но они являются всего лишь <a href="/tag/servlet">сервлетами</a>.</li>
<li><a href="/tag/c" target="_blank">C++</a> используется для обработки запросов, в то время как <a href="/tag/perl" target="_blank">Perl</a> и <a href="/tag/mason" target="_blank">Mason</a> &#8212; для составления контента.</li>
<li><a href="/tag/amazon" target="_blank">Amazon</a> предпочитает не пользоваться промежуточным <a href="/tag/po" target="_blank">программным обеспечением</a>, так как оно в большинстве случаев является каркасом, а не средством разработки. Если используется промежуточное <a href="/tag/po" target="_blank">программное обеспечение</a>, то разработчик становится <em>заперт</em> в использование тех принципов разработки, которые выбрал разработчик промежуточного <a href="/tag/po" target="_blank">ПО</a>. Если появится необходимость использовать какие-либо другие решения, ничего не выйдет &#8212; вы заперты. Один и тот же цикл используется для обработки всех типов событий: сообщений, задержек в передаче данных, <em>AJAX</em>, и так далее. Слишком громоздко. Если бы промежуточное <a href="/tag/po" target="_blank">программное обеспечение</a> было бы доступно в виде более мелких компонентов, скорее на правах средства разработки, чем каркаса для системы, тогда <a href="/tag/amazon" target="_blank">Amazon</a> был бы более заинтересован в нем.</li>
<li>Кажется, что <a href="/tag/soap" target="_blank">SOAP</a> веб стек собирается заново решать все те же проблемы распределенных систем.</li>
<li>Если предложить разработчиком на выбор работу над <a href="/tag/soap" target="_blank">SOAP</a> и <a href="/tag/rest" target="_blank">REST</a> веб-сервисами, то только 30% выберут <a href="/tag/soap" target="_blank">SOAP</a>, это скорее всего будут разработчики на .NET и <a href="/tag/java" target="_blank">Java</a>, привыкшие использовать WSDL файлы для генерации интерфейсов удаленных объектов. Оставшиеся 70% выберут <a href="/tag/rest" target="_blank">REST</a> &#8212; это будут пользователи <a href="/tag/php" target="_blank">PHP</a> и <a href="/tag/perl" target="_blank">Perl</a>.</li>
<li>Обе категории разработчиков имеют возможность получить интерфейс к объектам <a href="/tag/amazon" target="_blank">Amazon</a>. Разработчики заинтересованы просто выполнить свою работу, не заботясь о том, что происходит на другом конце провода.</li>
<li>Идея <a href="/tag/amazon" target="_blank">Amazon</a> заключалась в построении открытого сообщества вокруг своих сервисов. Веб-сервисы были выбраны благодаря своей простоте. Но так это выглядит только снаружи. Внутри же находится архитектура, ориентированная на сервисы. Доступ к данным может быть получен только через соответстыующий <a href="/tag/interfejs" target="_blank">интерфейс</a>. Этот процесс описан в WSDL, но они используют свои собственные механизмы транспортировки и инкапсуляции данных.</li>
<li>Команды разработчиков очень небольшие и организуются вокруг сервисов
<dl>
<dd>&ndash; Сервисы являются независимыми единицами предоставления функционала в рамках <a href="/tag/amazon" target="_blank">Amazon</a></dd>
<dd>&ndash; Если у разработчика возникает новая бизнес-идея или проблема, которую ему хотелось бы решить, он собирает команду для ее решения или реализации. Количество участников ограничено 8-10 людьми. Комманды из такого количества человек обычно называют <em>пиццерийными</em>, так как для того, чтобы ее накормить достаточно двух пицц.</dd>
<dd>&ndash; Команды очень небольшие, но они уполномочены решать поставленную задачу любыми доступными способами, именно так, как они считают нужным.</dd>
<dd>&ndash; В качестве примера задачи, поставленной перед такой командой, может служить поиск фраз в рамках книги, уникальных для конкретного текста.</dd>
<dd>&ndash; Экстенсивное A/B тестирование используется для интеграции новых сервисов. Они смотрят на произведенное влияние на систему и выполняют экстенсивные измерения.</dd>
</dl>
</li>
<li><strong>Развертывание</strong>
<dl>
<dd>&ndash; Они создают специальную инфраструктуру для управления зависимостями и развертывания</dd>
<dd>&ndash; Цель состоит в том, чтобы иметь все необходимые сервисы развернутыми на новом оборудовании, в том числе код приложений, системы мониторинга и лицензирования и так далее.</dd>
<dd>&ndash; Результатом развертывания является виртуальная машина, которая запускается с помощью <strong>EC2</strong>.</dd>
</dl>
</li>
<li>Работа с покупателями для того, чтобы убедиться, что внедрение нового сервиса того стоит
<dl>
<dd>&ndash; Фокусировка на конкретно на тех возможностях, которые планируется предоставить покупателям</dd>
<dd>&ndash; Разработчики принуждаются работать в первую очередь с упором на предоставление пользователям новых возможностей, а не на внедрение новых технологий и уже после этого осознавание того, зачем это делалось</dd>
<dd>&ndash; Все начинается с пресс-релиза о новых возможностях, предоставляемых пользователям, а после чего ведется работа по определению того факта, планировалось ли все же что-то значимое для пользователей или нет?</dd>
<dd>&ndash; Дизайн должен быть минимален. Простота &#8212; залог успеха, когда речь идет о больших распределенных системах</dd>
</dl>
</li>
<li><strong>Управление состояниями, как основная проблема крупномасштабных систем</strong>
<dl>
<dd>&ndash; Изнутри они теоретически могут предоставить практически бесконечный оъем дискового пространства.</dd>
<dd>&ndash; Не все, но многие операции имеют состояния. Например, оформление покупки продукта.</dd>
<dd>&ndash; Сервис отслеживания последних открытых страниц использует рекоммендации, базирующиеся на идентификационных номерах сессий.</dd>
<dd>&ndash; Они следят за всем, так что в любом случае цель вовсе не в поддержании состояний. Достаточно небольшой набор состояний требует поддержания с помощью сессий. Сервисы уже хранят всю необходимую информацию, остается лишь ими воспользоваться.</dd>
</dl>
</li>
<li><strong>Три свойства системы или теорема Eric Brewer&#8217;а:</strong>
<dl>
<dd>&ndash; Три свойства системы: <em>стабильность, доступность, переносимость возможномых распадений сети</em></dd>
<dd>&ndash; В большинстве случаев для любой системы с общими данными выполняются два свойства из трех</dd>
<dd>&ndash; <em>Возможность разделения:</em> распределение узлов по небольшим группам, которые могут иметь доступ к другим группам, но не могут получить доступ к конкретному произвольному узлу системы</dd>
<dd>&ndash; <em>Стабильность:</em> запишите какие-либо данные, а затем прочитайте их же &#8212; получите те же самые данные обратно. Для распределенных систем это далеко не всегда так.</em></dd>
<dd>&ndash; <em>Доступность:</em> не всегда имеется возможность произвести чтение или запись каких-либо данных. Система иногда сообщает, что она не может произвести запись, так как она хочет остаться целостностной.</dd>
<dd>&ndash; Для масштабирования системы необходимо разбиение ее на части, что приводит к выбору между стабильностью и доступностью. Необходимо найти некий баланс между ними.</dd>
<dd>&ndash; Выберите определенный подход в соответствии с нуждами сервиса.</dd>
<dd>&ndash; В процессе выбора продуктов приоритет предоставляется доступности: все запросы на добавление товаров в корзину учитываются, так как именно они приносят прибыль. Даже если возникают какие-либо ошибки, они скрываются от покупателя, и разработчики разбираются с ним позже.</dd>
<dd>&ndash; В процессе подтверждения заказа покупателем важна надежность, так как сразу несколько сервисов одновременно используют одни и те же данные: работа с кредитными картами, доставка, составление отчетов.</dd>
</dl>
</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Для того, чтобы строить реально масштабируемые системы, Вам необходимо изменить свой склад ума. Вероятностный подход к хаосу может принести неплохие результаты. В традиционных системах мы представляем себе идеальный мир, где не происходит никаких чрезвычайных ситуаций, а затем мы в этом же мире пытаемся построить реализацию по-настоящему сложных алгоритмов. При первом же удобном случае вся система гарантированно рушится, это реальность, пора бы уже к этому привыкнуть. Например, неплохим решением мог бы стать подход, использующий быструю перезагрузку и тем самым быстрое восстановление работоспособности. При достаточной избыточности данных и сервисов этот подход может дать практически 100% отказоустойчивость. Необходимо создание самовосстанавливающихся и самоорганизовывающихся операций.</li>
<li>Создание инфраструктуры, в которой компоненты ничего друг с другом не разделяют. Сама инфраструктура может стать общим ресурсом для разработки и развертывания с теми же недостатками, что и совместные ресурсы в логике и на уровне данных. Это может вызвать запирание и блокировку данных. <a href="/tag/arkhitektura" target="_blank">Архитектура</a>, ориентированная на сервисы, позволяет создание параллельных изолированных процессов разработки, позволяющих масштабировать будущие разработки для соответствия темпам роста.
<li>
<li>Откройте систему с помощью собственной API для создания экосистемы вокруг Ваших приложений.</li>
<li>Единственный способ управлять большой распределенной системой &#8212; разрабатывать ее как можно более простой. Это достигается благодаря отсутствию скрытых требований и зависимостей в ее структуре. Минимизируйте использование технологий до того уровня, который Вам необходим для решения конкретно Ваших проблем и задач. Создание дополнительных искуственных и ненужных уровней в системе никогда не пойдет ей на пользу.</li>
<li>Организация вокруг сервисов дает гибкость. Параллельная работа возможна, так как на выходе получается сервис. Этот факт резко сокращает время, необходимое для выхода на рынок. Построение инфраструктуры позволяет сервисам реализовываться очень быстро.</li>
<li>Определенно будут возникать проблемы со всем, что пускает пыль в глаза еще до реальной реализации.</li>
<li>Для внутреннего управления сервисами стоит использовать SLA.</li>
<li>Кто угодно может быстро добавлять веб-сервисы к их продукту. Достаточно лишь реализовать часть продукта в виде сервиса и начать его использовать.</li>
<li>Построение инфраструктуры производится для обеспечения производительности, надежности и контролирования издержек. После ее построения Вы никогда не сможете сказать после очередной неудачи, что в этом виновата компания <em>Х</em>. Ваше <a href="/tag/po" target="_blank">программное обеспечение</a> не всегда является более надежным, чем любой другой, но зато у Вас появляется возможность быстро устранять неполадки и развертывать ее, в отличии от продуктов других компаний.</li>
<li>Используйте систему оценивания и целенаправленные обсуждения для отделения &#171;хорошего&#187; от &#171;плохого&#187;. Бывшие сотрудники <a href="/tag/amazon" target="_blank">Amazon</a> в своих презентациях неоднократно демонстрировали свою глубоко засевшую привычку ставить покупателей перед выбором и смотреть какой из вариантов сработает лучшим образом, и уже на результатах такого рода тестов строить свои решения.
<li><a href="http://www.kaushik.net/avinash/" rel="nofollow" target="_blank">Avinash Kaushik</a> называет это избавлением от &#171;гиппопотамов&#187;, наиболее высоко оплачиваемых людей. Осуществляется оно с помощью A/B тестирований и веб-аналитиков. Если у вас есть выбор пути развития, реализуйте оба, позвольте людям ими пользоваться, и посмотрите какой из альтернативных результатов приведет в лучшим результатам.
<li>
<li>Создайте экономичную культуру. <a href="/tag/amazon" target="_blank">Amazon</a> использовал двери в роли столов, например.</li>
<li>Знайте, что Вам необходимо. <a href="/tag/amazon" target="_blank">Amazon</a> имеет печальный опыт с ранней системой рекомендаций, которая не сработала: &#171;Это было не то, что требовалось <a href="/tag/amazon" target="_blank">Amazon</a>. Рекомендации книг в <a href="/tag/amazon" target="_blank">Amazon</a> требовали работы с разбросанными данными, всего лишь несколько рейтингов или покупок. Она должна работать быстро. Система должна иметь необходимый <a href="/tag/masshtabiruemost" target="_blank">масштаб</a> для работы с массивным количеством клиентов и огромным каталогом. Все, что было необходимо: лишь усовершенствовать обнаружение книг из глубин каталога, откуда читатели не могли достать из самостоятельно.&#187;</li>
<li>Работа в сторонних проектах, просто так как Вы в них заинтересованы, часто является намного более продуктивной и инновационной, чем просто работа за деньги. Никогда не недооценивайте мощь блуждания в той сфере, которая Вам интересна.</li>
<li>Вовлеките всех в производство еды для собак. Пойдите на склад и упаковывайте книги во время рожденственской суеты. Это называется командной работой.</li>
<li>Создайте специальный сайт для тестирования нововведений перед выпуском их в вольное плавание.</li>
<li>Непоколебимая, кластеризованная, реплицирующая, распределенная файловая система является идеальным решением для хранения данных, доступных только для чтения, используемых веб-серверами.</li>
<li>Предусмотрите способы отменить изменения, если обновление не удалось. Если нужно, напишите соответствующие программные средства.</li>
<li>Переключитесь на глубоко <a rel="nofollow target="_blank" "href="http://webservices.sys-con.com/read/262024.htm">сервис-ориентированную архитектуру</a>.</li>
<li>Во время интервью обращайте внимание на три критерия: энтузиазм, креативность, компетентность. Самым крупным залогом успеха <a href="http://amazon.com" target="_blank" rel="nofollow">Amazon.com</a> был энтузиазм.</li>
<li>Наймите Боба, кого-то кто знает свое дело, обладает невероятными способностями и знанием системы, и что самое важное, умеет решать даже самые невообразимые проблемы просто нырнув в них с головой.</li>
<li>Инновация может прийти только снизу. Те, кто находится ближе всего к проблеме, являются наиболее вероятными людьми, кто смог бы ее решить. Любая организация, зависящая от инноваций, должна уметь пользоваться хаосом. Лояльность и подчинение &#8212; не наш метод.</li>
<li>Креативность должна лезть из всех щелей.</li>
<li>У всех должна быть возможность эксперементировать и учиться. Позиции, подчинение и традиции не должны играть какой-либо роли. Для процветания инновации балом должен править точный расчет.</li>
<li>Выберите путь инноваций. Перед лицом всей компании, Jeff Bezos может дать старый кроссовок Nike в роли награды &#171;Просто сделай это&#187; тому, кто привнес инновацию.</li>
<li>Не платите за производительность. Предоставьте хороший повод задрать нос и высокую оплату труда, но оставляйте это простым. Распознать выдающуюся работу можно и другими методами. Оплата по заслугам звучит неплохо, но в условиях большой организации это практически невозможно. Используйте не-денежные награды, такие как тот старый кроссовок. Если преподнести это как способ сказать спасибо, кто-то оценит.</li>
<li>Вырастайте быстро. Большие парни вроде Barnes и Nobel у Вас на хвосте. <a href="/tag/amazon" target="_blank">Amazon</a> не был ни первым, ни вторым, ни даже третим книжным магазинам в <a href="/tag/internet" target="_blank">Сети</a>, но их взгляд на работу и драйв в итоге позволили им вырваться вперед.</li>
<li>В дата-центрах персонал проводит только 30% времени в работе над вопросами создания инфраструктуры, остальные 70% они проводят за размещения поставок тяжелого оборудования, управлением программным обеспечением, балансировкой нагрузок, техническими работами, изменениями в масштабе и так далее.</li>
<li>Запретите клиентам прямой доступ к базе данных. Это значит появление возможность масштабировать сервис и делать его более надежным не вовлекая при этом клиентов. Это очень похоже на возможность Google независимо вносить улучшения в части системы, что приводит к улучшениям в работе всех остальных ее компонентов.</li>
<li>Создайте единый универсальный механизм получения доступа к сервисам. Это позволяет более легко аггрегировать информацию, полученную от сервисов, децентрализованно прокладывать маршруты передачи запросов, распределенно следить за ними, а также получать доступ к другим инфраструктурным механизмам.</li>
<li>Предоставление свободного доступа ко всем сервисам <a href="http://amazon.com" target="_blank" rel="nofollow">Amazon.com</a> разработчикам со всех уголков Мира также было достаточно значимым компонентом успеха, так как это привлекло на порядок больше инноваций, чем они могли надеяться построить самостоятельно.</li>
<li>Разработчики сами знают какими инструментами они владеют лучше всего, какие из них делают их наиболее продуктивными.</li>
<li>Не накладывайте слишком много ограничений на инженеров. Предоставляйте стимулы для использования некоторых вещей, например интеграцию с системами мониторинга и другими инструментами инфраструктуры. Для всего остального старайтесь предоставлять возможность командам функционировать максимально независимо.</li>
<li>Разработчики, они как художники; они делают свою работу лучше всего только тогда, когда им предоставляют свободу это делать, но в любом случае им требуются качественные инструменты. Имейте много вспомогательных инструментов, имеющих само-помогающую природу. Поддерживайте окружение вокруг разработки сервисов, которое никогда не будет вмешиваться в сам процесс разработки.</li>
<li>Вы построили это, вы и поддерживаете. Это позволяет разработчикам почувствовать повседневную работу их приложения, а также предоставляет им постоянный контакт с покупателями.</li>
<li>Раз в пару лет разработчики должны проводить некоторое время в отделе по работе с клиентами. Это позволит им выслушать покупателей, ответить на электронные письма, и реально осознать влияние тех вещей, которые они реализовали с помощью как технологи.</li>
<li>Пользуйтесь &#171;голосом покупателя&#187;, который являлся бы реалистичной историей от покупателя о какой-то конкретной части сайта. Это поможет менеджерам и инженерам осознать тот факт, что все эти технологии построены для реальных людей. Статистика отдела по работе с клиентами является ранним индикатором того, что вы делаете что-то не так, а также указывает на то, что реально является болевыми точками для ваших покупателей.</li>
<li>Инфраструктура <a href="/tag/amazon" target="_blank">Amazon</a>, подобно <a href="/tag/google" target="_blank">Google</a>, является огромным конкурентным преимуществом. Они могут строить комплексные приложения на основе примитивных сервисов, которые сами по себе просты до безобразия. Они могут независимо масштабировать свою работу, поддерживать доступность не распараллеленной системы, быстро реализовывать новые сервисы без необходимости массивных изменений в конфигурации.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-amazon/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Архитектура Flickr</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 19:41:28 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cvsup]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Ganglia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RedHat]]></category>
		<category><![CDATA[shard]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[Subcon]]></category>
		<category><![CDATA[SystemImager]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Flickr]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[сервер]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-flickr/</guid>
		<description><![CDATA[Flickr является мировым лидером среди сайтов размещения фотографий. Перед Flickr стоит впечатляющая задача, они должны контролировать обширное море ежесекундно обновляющегося контента, непрерывно пополняющиеся легионы пользователей, постоянный поток новых предоставляемых пользователям возможностей, а делается все это при постоянной поддержке отличной производительности. Как же они это делают? Источники информации Как и предыдущий пост &#171;Архитектура Google&#187;, этот тоже [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com" rel="nofollow" target="_blank">Flickr</a> является мировым лидером среди сайтов размещения фотографий. Перед Flickr стоит впечатляющая задача, они должны контролировать обширное море ежесекундно обновляющегося контента, непрерывно пополняющиеся легионы пользователей, постоянный поток новых предоставляемых пользователям возможностей, а делается все это при постоянной поддержке  отличной производительности. Как же они это делают?<br />
<span id="more-37"></span></p>
<h3>Источники информации</h3>
<p><em>Как и предыдущий пост <a href="/net/scalability/arkhitektura-google" target="_blank">&#171;Архитектура Google&#187;</a>, этот тоже является переводом <a href="http://highscalability.com/flickr-architecture" target="_blank" rel="nofollow">статьи</a> от <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd&#8217;а Hoff&#8217;а</a>. Возможно читателям <a href="/tag/google" target="_blank">Google</a> был более интересен, но подход Flickr к масштабируемости тоже более чем заслуживает внимания. Далее привожу источники информации из оригинальной статьи:</em></p>
<ul>
<li><a href="http://www.niallkennedy.com/blog/uploads/flickr_php.pdf" rel="nofollow" target="_blank">Flickr и PHP</a> (ранний документ)</li>
<li>Планирование нагрузок на LAMP</li>
<li><a href="http://www.bytebot.net/blog/archives/2007/04/25/federation-at-flickr-a-tour-of-the-flickr-architecture" rel="nofollow" target="_blank">Федерация Flickr: Тур по архитектуре Flickr</a></li>
<li><a href="http://highscalability.com/book-building-scalable-web-sites" rel="nofollow" target="_blank">Построение масштабируемых веб-сайтов</a> от Call Handerson&#8217;а из Flickr</li>
<li>История войн баз данных #3: Tim O&#8217;Reilly о Flickr</li>
<li><a href="http://www.iamcal.com/talks/" rel="nofollow" target="_blank">Cal Henderson&#8217;s Talks</a> &#8212; много полезных презентаций</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/php" target="_blank">PHP</a></li>
<li><a href="/tag/sql" target="_blank">MySQL</a></li>
<li>Сегментирование <em>(прим.: разбиение системы на части, обслуживающие каждая свою группу пользователей; называть можно было по-разному, но давайте остановимся на этом варианте перевода слова &#171;Shards&#187;)</em></li>
<li><a href="/tag/memcached" target="_blank">Memcached</a> для кэширования</li>
<li><a href="/tag/squid" target="_blank">Squid</a> в качестве обратной-прокси для html и изображений</li>
<li><a href="/linux" target="_blank">Linux</a> (<a href="/tag/redhat" target="_blank">RedHat</a>)</li>
<li><a href="/tag/smarty" target="_blank">Smarty</a> в роли шаблонизатора</li>
<li><a href="/tag/perl" target="_blank">Perl</a></li>
<li>PEAR для парсинга e-mail и XML</li>
<li>ImageMagick для обработки изображений</li>
<li><a href="/tag/java" target="_blank">Java</a> для узлового сервиса</li>
<li><a href="/tag/apache">Apache</a></li>
<li><a href="/tag/systemimager" target="_blank">SystemImager</a> для развертывания систем</li>
<li><a href="/tag/ganglia" target="_blank">Ganglia</a> для мониторинга распределенных систем</li>
<li><a href="/tag/subcon" target="_blank">Subcon</a> хранит важные системные конфигурационные файлы в SVN-репозитории для легкого развертывания на машины в кластере.</li>
<li><a href="/tag/cvsup" target="_blank">Cvsup</a> для распространения и обновления коллекций файлов по сети</li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Более четырех миллиардов запросов в день</li>
<li>Примерно 35 миллионов фотографий в кэше <a href="/tag/squid" target="_blank">Squid</a></li>
<li>Около двух миллионов фотографий в оперативной памяти <a href="/tag/squid" target="_blank">Squid</a></li>
<li>Всего приблизительно 470 миллионов изображений, каждое представлено в 4 или 5 размерах</li>
<li>38 тысяч запросов к <a href="/tag/memcached" target="_blank">memcached</a> (12 миллионов объектов)</li>
<li>2 петабайта дискового пространства</li>
<li>Более 400000 фотографий добавляются ежедневно</li>
</ul>
<h3>Архитектура</h3>
<p>Симпатичное изображение архитектуры Flickr можно увидеть на <a href="http://www.slideshare.net/techdude/scalable-web-architectures-common-patterns-and-approaches/138" target="_blank" rel="nofollow">этом слайде</a>. Краткое ее описание выглядит следующим образом:<br />
–– Два ServerIron<br />
–––– <a href="/tag/squid" target="_blank">Squid</a> кэши<br />
–––––– Системы хранения NetApp<br />
–––– Серверы <a href="/tag/php" target="_blank">PHP</a>-приложений<br />
–––––– Менеджер хранения данных<br />
–––––– Master-master сегменты<br />
–––––– Центральная база данных, структурированная по принципу Dual Tree<br />
–––––– <a href="/tag/memcached" target="_blank">Memcached</a> кластер<br />
–––––– Поисковая система</p>
<dl> </dl>
<dl>
<dd>– Структура Dual Tree является индивидуальным набором модификаций для <a href="/tag/sql" target="_blank">MySQL</a>, позволяющим масштабировать систему путем добавления новых мастер-серверов без использования кольцевой архитектуры. Эта система позволяет экономить на масштабировании, так как варианты мастер-мастер требовали бы удвоенных вложений в оборудование.</dd>
</dl>
<dl>
<dd>– Центральная база данных включает в себя таблицу пользователей, состоящую из основных ключей пользователей (несколько уникальных идентификационных номеров) и указатель на сегмент, на котором может быть найдена остальная информация о конкретном пользователе.</dd>
</dl>
<ul>
<li>Использование выделенных серверов для статического контента</li>
<li>Все, за исключением фотографий, хранится в базе данных</li>
<li>Отсутствие состояний заключается в том, что в случае необходимости они имеют возможность передать пользователей от сервера к серверу, что стало намного проще для них после создания своего API</li>
<li>В основе масштабируемости лежит репликация, но этот факт помогает лишь при обработке операций чтения</li>
<li>Для поиска по определенной части базы данных создается отдельная копия этого фрагмента</li>
<li>Использования горизонтального масштабирования для того чтобы можно было проще добавлять новые машины в систему</li>
<li>Обработка изображений, полученных от пользователей по электронной почте, происходит с помощью <a href="/tag/php" target="_blank">PHP</a></li>
<li>Раньше система страдала от задержек связанных с организацией по принципу мастер-слуга. При слишком большой нагрузке они имели одну точку, которая теоретически могла дать сбой.</li>
<li>Им было необходимо иметь возможность проводить технические работы во время непрерывной работы сайта, не прекращая его функционирование.</li>
<li>Были проведены отличные работы по планированию распределения дискового пространства, более подробную информацию можно найти по ссылкам в разделе &#171;Источники информации&#187;.</li>
<li>Для обеспечения возможности масштабирования в будущем, они пошли по федеративному пути развития:
<dl>
<dd>– <em>Сегменты системы:</em> Мои данные хранятся на моем сегменте, но запись о Вашем комментарии хранится на Вашем сегменте.</dd>
<dd>– <em>Глобальное кольцо:</em> Принцип работы схож с DNS, Вам необходимо знать куда Вы хотите пойти и кто контролирует то место, куда Вы собираетесь пойти.</dd>
<dd>– Логика на <a href="/tag/php" target="_blank">PHP</a> устанавливает соединение с сегментом и поддерживает целостность данных (10 строк кода с комментариями!)</dd>
</dl>
</li>
<li><strong>Сегменты:</strong>
<dl>
<dd>– Срез основной базы данных</dd>
<dd>– Активная репликация по принципу мастер-мастер: имеет несколько недостатков в <a href="/tag/sql" target="_blank">MySQL</a> 4.1. Автоматическое инкрементирование идентификационных номеров используется для поддержания системы в режиме одновременной активности обоих серверов в паре</dd>
<dd>– Привязывание новых учетных записей к сегментам системы происходит случайным образом</dd>
<dd>– Миграция пользователей проводится время от времени для того, чтобы избавиться от проблем, связанных с излишне активными пользователями. Необходима сбалансированность в этом процессе, особенно в случаях с большим количеством фотографий… 192 тысячи фотографий, 700 тысяч тэгов, может занять несколько минут. Миграция выполняется вручную.</dd>
</dl>
</li>
<li>Нажатие на <strong>Favorite</strong>:
<dl>
<dd>– Получается информация об учетной записи владельца из кэша для того, чтобы узнать к какому сегменту он привязан (допустим на shard-5)</dd>
<dd>– Получается информация о моей учетной записи из кэша, более конкретно &#8212;  мой сегмент (например shard-13) </dd>
<dd>– Начинается &#171;распределенная трансакция&#187; для определения ответов на вопросы: Кто добавил эту фотографию в избранное? Как изменился список избранных фотографий?</dd>
</dl>
</li>
<li>Подобные вопросы могут задаваться любому сегменту, информация на них абсолютно избыточна.</li>
<li>Для избавления от задержек, связанных с репликацией&#8230;
<dl>
<dd>– при каждой загрузке страницы, пользователю предоставляется список серверов</dd>
<dd>– если сервер не в состоянии ответить на запрос, запрос переходит к следующему серверу в списке; если список кончился &#8212; выводится сообщение об ошибке. При этом не используются постоянные соединения, каждый раз создаются и разрываются новые соединения.</dd>
</dl>
</li>
<li>Запросы на чтение и запись от каждого пользователя ограничиваются рамками одного сегмента. Задержки репликации исчезают из поля зрения пользователей.</li>
<li>Каждый сервер в рамках одного сегмента в обычном состоянии нагружен ровно на половину. Выключите половину серверов в каждом сегменте и система продолжит функционировать без изменений. Это значит, что один сервер внутри сегмента может взять на себя всю нагрузку второго, в то время как второй сервер может по каким либо причинам быть отключен от системы, например для проведения технических работ. Обновление оборудования производится очень просто: отключается половина сегмента, она же обновляется, подключается обратно, процесс повторяется для оставшейся половины.</li>
<li>Периоды пиковой нагрузки также нарушают правило 50% нагрузки. В такие моменты система получает 6-7 тысяч запросов в секунду, в то время как на данный момент система может работать на пятидесятипроцентном уровне нагрузки только при четырех тысячах запросов в секунду.</li>
<li>В среднем при загрузке одной страницы выполняется 27-35 SQL-запросов. Списки избранных фотографий обрабатываются в реальном времени, ровно как и доступ через API к базе данных. Все требования к нагрузке в реальном времени выполняются без каких-либо недостатков.</li>
<li>Более 36 тысяч запросов в секунду может выполняться не выходя за рамки возможностей системы, даже при резком росте трафика.</li>
<li>Каждый сегмент содержит данные о более чем 400 тысячах пользователей.
<dl>
<dd>– Многие данные хранятся в двух местах одновременно. Например, комментарий является частью между комментатором и автором комментируемого контента. Где его хранить? Как насчет обоих мест? Трансакции используются для предотвращения рассинхронизации данных: открывается первая трансакция, выполняется запись, открывается вторая трансакция, выполняется запись, подтверждается первая трансакция если все нормально, после чего вторая подтверждается только в случае  если первая прошла успешно.</dd>
</dl>
</li>
<li><strong>Поиск:</strong>
<dl>
<dd>- Используется два варианта поиска: поиск в рамках сегмента, поддерживающий до 35 тысяч запросов в секунду, а также проприетарный веб-поиск от Yahoo!</dd>
<dd>- В 90% случаев используется система от Yahoo!, за исключением поиска по тэгу фотографий одного пользователя и массовых изменений тэгов.</dd>
<dd>- Эту систему стоит рассматривать как аналог Lucene.</dd>
</dl>
</li>
<li><strong>Оборудование:</strong>
<dl>
<dd>- EMT64 под управлением RHEL 4 с 16 Gb оперативной памяти.</dd>
<dd>- 6 жестких дисков с 15000rpm, объединены в RAID-10.</dd>
<dd>- Размер для пользовательских метаданных достигает 12 терабайт (это не включает фотографии, для них цифры существенно больше).</dd>
<dd>- Используются 2U корпуса.</dd>
</dl>
</li>
<li><strong>Процедура резервного копирования данных:</strong>
<dl>
<dd>- ibbackup выполняется регулярно посредством cron daemon&#8217;а, на каждом сегменте настроен на разное время.</dd>
<dd>- Каждую ночь делается снимок со всего кластера баз данных.</dd>
<dd>- Запись или удаление нескольких больших файлов с резервными копиями одновременно на реплицирующую систему хранения может сильно сократить производительность системы вцелом на последующие несколько часов из-за процесса репликации. Выполнение этого на активно работающей системе хранения фотографий было бы не самой лучшей идеей.</dd>
<dd>- Содержание нескольких резервных копий всех Ваших данных требует существенных материальных затрат, но оно того стоит. Особенно это актуально для тех ситуаций, когда Вы понимаете, что что-то пошло не так только спустя несколько  дней после того как это случилось, в таких случаях неплохо иметь, например, резервные копии 1, 3, 10 и 30-дневной давности.</dd>
</dl>
</li>
<li>Фотографии хранятся в системе хранения данных. После загрузки изображения система выдает различные его размеры, на чем ее работа заканчивается. Метаданные и ссылки на файловые системы, где расположены фотографии, хранятся в базе данных.</li>
<li>Аггрегация данных проходит очень быстро, так как она ограничена пределами сегмента.</li>
<li>max_connections = 400 соединений на каждый сегмент, неплохой запас. Значение для кэша потоков установлено равным 45, так как не бывает ситуаций когда более 45 пользователей одновременно выполняют какие-либо действия с одним конкретным сегментом.</li>
<li><strong>Тэги:</strong>
<dl>
<dd>- Тэги плохо вписываются в традиционную нормализованную схему реляционной базы данных. Денормализация или активное кэширование &#8212; единственные способы сгенерировать облако меток для сотен миллионов тэгов в течении миллисекунд.</dd>
<dd>Некоторые данные обрабатываются отдельными вычислительными кластерами, которые сохраняют результаты своей работы в MySQL, так как иначе вычисление сложных отношений заняло бы все процессорное время основных серверов баз данных.</dd>
</dl>
</li>
<li>Направления для развития: ускорение работы с помощью создания организационного плана для непрерывной работы всей системы на уровне нескольких датацентров, таким образом чтобы все датацентры имели возможность получать запросы на общий уровень данных (как сами БД, так и memcache и прочее) все вместе одновременно. Если все части системы постоянно активны &#8212; время простоя оборудования будет сведено к минимуму.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Старайтесь думть о своем приложении как о чем-то большем, чем просто веб-приложении, тогда у Вас возможно появятся поддержка различных API, RSS и Atom ленты и многие другие возможности.</li>
<li>Отсутствие состояний системы позволяет более  легко выполнять модернизации не моргнув и глазом.</li>
<li>Реструктуризация базы данных &#8212; не самое лучшее занятие.</li>
<li>Планирование нагрузок должно проводиться уже на ранних этапах развития проекта</li>
<li>Начинайте медленно. Не покупайте сразу много оборудования просто из-за того, что Вы рады/боитесь, что ваш сайт взорвется.</li>
<li>Измеряйте реально, планирование нагрузок должно базироваться на реальных вещах, а не абстрактных.</li>
<li>Внедряйте ведение логов и индивидуальные измерения для оценки реальных показателей на основе серверной статистики, статистика использования не менее важна чем серверная.</li>
<li>Кэширование и оперативная память может стать ответом на все вопросы.</li>
<li>Создавайте четкие уровни абстракции между работой базы данных, бизнес-логикой, логикой страниц, разметкой страниц и презентационным уровнем. Это позволяет ускорить циклы итеративной разработки.</li>
<li>Разделение приложения на уровни позволяет каждому заниматься своим делом: разработчики могут строить логику страниц, в то время как дизайнеры работают с удобством работы для пользователей.</li>
<li>Делайте релизы как можно чаще, пускай даже это будет происходить каждые полчаса.</li>
<li>Забудьте о всех небольших эффективных вещах, предварительная оптимизация является корнем всего зла в примерно 97% всех случаев.</li>
<li>Тестируйте в работе. Постройте архитектурные механизмы (флаги конфигурации, балансировку нагрузки, и так далее), которые позволят Вам разворачивать новое оборудование в (и из) работу.</li>
<li>Забудьте об искусственных тестах, они годятся только для получения общего представления о нагрузках, но не для планирования. Искуственные тесты дают искусственные результаты, для настоящих тестов все же стоит пользоваться реальным временем выполнения задач.</li>
<li>Найдите максимальное значения для всех показателей:
<dl>
<dd>- Какой максимум чего-то, что может выполнять каждый сервер?</dd>
<dd>- Как близко параметр находится к максимуму и каковы тенденции?</dd>
<dd>- <a href="/tag/sql" target="_blank">MySQL</a> (дисковый ввод/вывод?)</dd>
<dd>- <a href="/tag/squid" target="_blank">Squid</a> (дисковый ввод/вывод? или процессорное время?)</dd>
<dd>- <a href="/tag/memcached" target="_blank">Memcached</a> (процессорное время? или пропускная способность сети?)</dd>
</dl>
</li>
<li>Старайтесь учесть особенности использования Вашего приложения.
<dl>
<dd>- Возможен ли резкий рост нагрузки, связанный с каким-либо событием? Например: какое-либо бедствие, или может быть новость?</dd>
<dd>- Flickr получает на 20-40% больше новых фотографий в первый рабочий день нового года, чем в любой пик в предыдущем году.</dd>
<dd>- По воскресеньям нагрузка в среднем на 40-50% выше, чем в любой другой день недели.</dd>
</dl>
</li>
<li>Учтите возможность экспонентациального роста. Больше пользователей означает больше контента, больше контента означает больше соединений, больше соединений означает более активное использование.</li>
<li>Планируйте возможные варианты управления работой системы в периоды пиковых нагрузок.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
		<item>
		<title>Первые впечатления от релиза KDE 4</title>
		<link>http://www.insight-it.ru/unix-way/linux/pervye-vpechatleniya-ot-reliza-kde-4/</link>
		<comments>http://www.insight-it.ru/unix-way/linux/pervye-vpechatleniya-ot-reliza-kde-4/#comments</comments>
		<pubDate>Thu, 24 Jan 2008 16:17:01 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[kde 4]]></category>
		<category><![CDATA[kde4]]></category>
		<category><![CDATA[впечатления]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/unix-way/linux/pervye-vpechatleniya-ot-reliza-kde-4/</guid>
		<description><![CDATA[Вчера вечером, решив провести очередное обновление программного обеспечения, я обнаружил в списке замаскированных пакетов внушительное количество заветных цифр 4.0.0. Не долго думая все эти пакеты были отправлены в комментарии с целью разрешить их установку, а на ночь компьютер был оставлен включенным с указанием к утру предоставить мне рабочую версию KDE 4. И, как ни странно, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/kde.png" title="K Desktop Environment" alt="KDE Icon" style="margin: 10px; float: right" /></p>
<p>Вчера вечером, решив провести очередное обновление программного обеспечения, я обнаружил в списке <a href="http://gentoo-wiki.com/Masked" target="_blank" rel="nofollow">замаскированных</a> пакетов внушительное количество заветных цифр <em>4.0.0</em>. Не долго думая все эти пакеты были отправлены в комментарии с целью разрешить их установку, а на ночь компьютер был оставлен включенным с указанием к утру предоставить мне рабочую версию <a href="/tag/kde-4" target="_blank">KDE 4</a>. И, как ни странно, с заданием он справился более чем успешно!</p>
<p><span id="more-31"></span></p>
<p>На утро если честно был слегка удивлен. увидев сообщение в консоли о том, что пакет <strong>kde-base/kdebase-meta-4.0.0</strong> установлен успешно. Запустив по привычке <strong>etc-update</strong> и сделав на всякий случай backup настроек третьего <a href="/tag/kde" target="_blank">KDE</a>, я приступил к запуску свежеустановленного рабочего окружения.</p>
<p>Процесс оказался простым до безобразия, достаточно было лишь сменить тип сессии в <strong>kdm</strong>, и рабочее окружение успешно загрузилось. Представшее передо мной зрелище меня ничуть не удивило &#8212; мне уже доводилось собирать beta-версию <a href="/tag/kde-4" target="_blank">KDE 4</a> из SVN, да и screenshot&#8217;ы стандартного рабочего окружения KDE я видел далеко не один раз.</p>
<p>Первым делом я решил запустить Kopete, реально конечно из-за того, что перед завершением сеанса работы с третьим KDE мне кто-то успел написать в ICQ, и меня ждал неоконченный разговор, но посмотреть как он изменился со времен беты тоже хотелось. Попытавшись зайти с его помощью в ICQ, я обнаружил что этого протокола в списке доступных нет, причина нашлась быстро с помощью консоли (которая изменений практически не претерпела) &#8212; <strong>kopete</strong> по-умолчанию был собран без флага <strong>oscar</strong>. Не долго думая, по-быстрому пересобрал клиент, но в ходе указания настроек account&#8217;а он мне заявил, что ему нужен еще и <strong>KWallet</strong> для хранения пароля. Отправив на сборку и его, я решил временно отложить повторное знакомство с <strong>kopete</strong> и запустил <strong>Pidgin</strong>, которым достаточно часто пользуюсь.</p>
<p>После решения вопроса со связью, я отправился на изучения остальных пунктов <strong>KMenu</strong>, ничего принципиально нового я там не нашел, но решил все же заглянуть в пункт под названием <em>System Settings</em> с целью сделать небольшой обзор доступных настроек и оценить потенциал нового рабочего рабочего окружения в плане &#171;доработки напильником&#187;, чем я и планирую в обозримом будущем заняться. Большую часть интересных для меня настроек я нашел прямо в GUI, а если бы не поленился покопаться в конфигурационных файлах &#8212; нашел бы и все остальное.</p>
<p><strong>Plasma</strong> &#8212; по-моему одно из самых существенных изменений в новой версии KDE, в котором невооруженным глазом можно увидеть огромный потенциал для развития пользовательских интерфейсов. Но если сейчас смотреть на эту технологию как обычный пользователь, то можно увидеть во всех эти widget&#8217;ах лишь недоделанность, неудобство и непривычность. В будущем, когда ассортимент и качество &#171;плазмоидов&#187; приумножится, эта технология станет очень гибкой и удобной в повседневном использовании для очень разнообразного спектра задач.</p>
<p>Самым большим недостатком доступной на данный момент версии <a href="/tag/kde" target="_blank">KDE</a>, на мой взгляд, является та самая черная панель внизу экрана, которая используется для размещения любых виджетов наравне с рабочим столом, но имеет один большой недостаток &#8212; практически полное отсутствие каких-либо настроек (за исключением непонятно зачем и кому нужного &#171;Show tooltips&#187;), и как следствие, отсутствие элементарных способов ее переместить или изменить в размерах. Именно из-за этого факта я сейчас и пишу снова из KDE 3.5.8, так как я слишком привык получать доступ ко всем функциям рабочего окружения из верхней части экрана, а переучиваться или искать какие-либо нестандартные решения этой небольшой проблемки на данный момент нет ни времени, ни желания.</p>
<p>По не помню какой причине мне пришлось залезть в файловую систему, сделал я это естественно с помощью <strong>Dolphin</strong>, но сам факт осознал далеко не сразу: настолько привычен и удобен оказался его интерфейс, что мне показалось, что я всю жизнь всегда им пользовался, хотя на самом деле по большому счету увидел его впервые.</p>
<p>В целом новинка произвела по большей части положительные впечатления, обязательно вернусь к ее освоению через какое-то время, когда хотябы существенные недоработки будут тем или иной способом исправлены. Так что пока даже не стал ее удалять, тем более отдельными приложениями можно пользоваться и из KDE 3, что я сейчас с удовольствием и делаю в отношении нового Kopete, который в итоге прекрасно запустился и работает существенно лучше чем многие другие ICQ-клиенты.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/linux/pervye-vpechatleniya-ot-reliza-kde-4/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Gentoo Linux + Sony Vaio = &#9829;</title>
		<link>http://www.insight-it.ru/unix-way/linux/gentoo-linux-sony-vaio/</link>
		<comments>http://www.insight-it.ru/unix-way/linux/gentoo-linux-sony-vaio/#comments</comments>
		<pubDate>Mon, 21 Jan 2008 22:06:32 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[gentoo]]></category>
		<category><![CDATA[gentoo linux]]></category>
		<category><![CDATA[notebook]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[sony]]></category>
		<category><![CDATA[sony vaio]]></category>
		<category><![CDATA[sony vaio fe41zr]]></category>
		<category><![CDATA[sony vaio vgn-fe41zr]]></category>
		<category><![CDATA[линукс]]></category>
		<category><![CDATA[ноутбук]]></category>
		<category><![CDATA[ОС]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/unix-way/linux/gentoo-linux-sony-vaio/</guid>
		<description><![CDATA[Gentoo is all about choices Абсолютно не важно, держите ли Вы в руках блестящую болванку с надписью &#171;Прощай, предустановленная Vista!&#187; или только подумываете о том, чтобы избавить свой ноутбук от тяжести этой ноши. Прочитав это повествование, Вы сможете представить себе процесс установки альтернативной операционной системы на ноутбук на примере Gentoo Linux и Sony Vaio. Я [...]]]></description>
			<content:encoded><![CDATA[<blockquote style="margin-left: 200pt"><p>Gentoo is all about choices</p></blockquote>
<p><img src="/wp-content/uploads/gentoo.png" style="float: left" title="Gentoo Linux" alt="Gentoo Linux" /></p>
<p>Абсолютно не важно, держите ли Вы в руках блестящую болванку с надписью <em>&#171;Прощай, предустановленная Vista!&#187;</em> или только подумываете о том, чтобы избавить свой ноутбук от тяжести этой ноши. Прочитав это повествование, Вы сможете представить себе процесс установки альтернативной операционной системы на ноутбук на примере <em><a href="/tag/gentoo" target="_blank">Gentoo</a> <a href="/tag/linux" target="_blank">Linux</a></em> и <em><a href="/tag/sony-vaio" target="_blank">Sony Vaio</a></em>. Я постараюсь освятить все особенности этого процесса, а также по возможности дать советы по избежанию потенциальных проблем. Не надейтесь найти здесь пересказ <a href="http://www.gentoo.org/doc/ru/handbook/index.xml" rel="nofollow" title="Gentoo Hanbook" target="_blank">Gentoo Handook</a>, ее стоит прочитать в любом случае, если Вы на самом деле задумали установить эту очень серьезную <a href="/tag/os" target="_blank">операционную систему</a>.</p>
<p><span id="more-30"></span></p>
<p>Сам я занимался этим делом уже более полугода назад на ноутбуке <strong>Sony Vaio VGN-FE41ZR</strong>, не знаю почему мой выбор в свое время пал именно на эту модель, были доступны и более производительные и &#171;навороченные&#187; &#8212; видимо приглянулась она мне чем-то. Далее речь пойдет именно об этой модели ноутбука, но думаю большая часть написанного далее будет справедлива и для других моделей линейки <a href="/tag/sony-vaio" target="_blank">Sony Vaio</a>. Поначалу процесс установки и настройки был очень непрост, ведь часто приходилось пользоваться методом &#171;проб и ошибок&#187;, да и достойную документацию найти удавалось далеко не по каждому вопросу. Все про все заняло далеко не один мой летний вечер, терпения потребовалось изрядное количество, но полученный в итоге результат до сих пор не дает повода пожалеть о потраченном свободном времени.</p>
<p>Как я уже успел намекнуть во вступлении, начинается все с болванки на которую записан <a href="http://www.gentoo.org/main/ru/where.xml" rel="nofollow" target="_blank">тот самый волшебный образ</a>. Никто не мешает выбрать любой из доступных вариантов, но предположим, что выбор пал на <a href="/tag/gentoo" target="_blank">Gentoo</a> <a href="/tag/linux" target="_blank">Linux</a> LiveCD 2007.0. Загрузка ноутбука с этого диска проходит плавно и непринужденно, ровно как и сама работа с уже загруженным LiveCD как в консоли, так и в используемом там рабочем окружении &#8212; <em>Gnome</em>. Следуя инструкциям из <em>настольной книги</em> начать установку операционной системы очень нетрудно, но если честно у меня прочитав пару раз этот немаленьких размеров текст возникла мысль попытаться сэкономить некоторое количество времени, воспользовавшись услугами двух предложенных автоматических инсталляторов &#8212; с графическим и консольным пользовательским интерфейсом &#8212; не повторяйте этой ошибки, так как качество реализации обоих вариантов на данный момент оставляет желать лучшего, заставить успешно установить систему один из них может занять ничуть не меньше времени, чем ручная установка. Лично мне приручить ни один из автоматических инсталлятора так и не удалось, но как ни странно тоже не пришлось жалеть об этом факте &#8212; как оказалось ручная установка очень качественно позволяет разобраться в структуре <a href="/tag/os" target="_blank">операционной системы</a> вцелом, ровно как и в принципе работы отдельных ее компонентов.</p>
<p>Следовать инструкциям из <em>Книги</em> я думаю у всех должно неплохо получаться, единственное что могу порекомендовать: делайте это неторопясь, стараясь как можно подробнее осознавать что, как и зачем Вы делаете. Здесь же я хочу останавливаться лишь на специфических моментах для этой модели ноутбуков.</p>
<h3>Ядро</h3>
<p>Как известно, для <a href="/tag/gentoo" target="_blank">Gentoo</a> доступно несколько вариантов ядер, в процессе установки мой выбор пал на <strong>suspend2-sources</strong>, но со временем полностью перебрался на <strong>gentoo-sources</strong>, так как я понял, что сами suspend-to-ram и suspend-to-hdd мне абсолютно не нужны, но suspend2 слегка отстают от gentoo по версиям. Тем более, насколько я знаю, в современных версиях основной ветки ядра suspend тоже поддерживается на достойном уровне (но так как мне он не нужен &#8212; пробовать на собственном опыте не доводилось).</p>
<p>Поначалу осознать как именно необходимо настроить ядро довольно непросто, часто забываешь какой-нибудь драйвер или маленькую опцию, сильно влияющую на ту или иную часть системы, или наоборот включаешь множество абсолютно бесполезных компонентов. Вариантов решения этой ситуации есть несколько:</p>
<ul>
<li><em>Просто скопировать ядро с LiveCD.</em> Этот вариант является самым простым в плане реализации, систему с его помощью запустить вполне реально &#8212; пробовал, но в плане производительности ему до идеала о-о-очень далеко.</li>
<li><em>Собрать ядро с помощью <strong>genkernel</strong> и стандартной его конфигурации.</em> Прочитав <strong>man genkernel</strong> это занятие тоже становится простым и привычным. Именно этот вариант я и выбрал в первый раз, слегка подредактировав конфигурационный файл с помощью <strong>––menuconfig</strong> в тех местах, где был точно уверен что это не повлияет на функциональность и положительно повлияет на производительность. Естественно этот вариант тоже годится только на первое время.</li>
<li><em>Ручная сборка классическим способом &#8212; <strong>make</strong>, с использованием конфигурационного файла, взятого с LiveCD</em>. Чисто теоретически возможно, но не могу порекомендовать этот способ, при его реализации возникает существенно больше проблем, до конца решить которые мне так и не удалось в процессе установки, а в последующем как-то не возникало желания возвращаться к ручной сборке ядра, так как привык к <strong>genkernel</strong> &#8212; просто и удобно.</li>
<li><em>Метод &#171;проб и ошибок&#187;.</em> Если есть желание и возможность потратить существенное количество времени на подбор оптимальной конфигурации ядра прямо в процессе установки &#8212; почему бы этим и не заняться?</li>
</ul>
<p>Вне зависимости от выбранного варианта сборки ядра, рано или поздно Вы получите успешно загружающуюся без помощи LiveCD систему (естественно имеется ввиду, что в консоль, о X-ах говорить еще рано), о которой и пойдет речь дальше.</p>
<h3>Сеть</h3>
<p>Первым делом, конечно же появляется желание выползти на просторы Сети, даже скорее не желание, а необходимость, ведь жизнь компьютера без Сети хоть и возможна, но грустна и нелегка.</p>
<p>Как известно, у большинства ноутбуков дорога в Сеть может пролегать по трем маршрутам:</p>
<ul>
<li>Сетевая карта &#8212; Ethernet</li>
<li>Беспроводная сеть &#8212; WiFi</li>
<li>Старый-добрый модем</li>
</ul>
<p>Из всех трех вариантов мне довелось опробовать только первые два, испытать модем в полевых условиях, к сожалению, не удалось в связи с отсутствием как возможности, так и желания.</p>
<h4 style="text-align: right">Ethernet</h4>
<p>Воткнув заветный штекер RJ45 в соответствующий разъем, я с удивлением обнаружил с помощью команды <strong>ifconfig</strong>, что на этом мои телодвижения по получению доступа в Интернет благополучно закончились. Все драйвера оказались на месте, DHCP-клиент без моего вмешательства получил IP-адрес, все необходимые настройки по-умолчанию были выбраны верно &#8212; вобщем в этом плане все отлично.</p>
<p>Конечно далеко не у всех локальная сеть организована таким же образом, как и у меня, возможно придется поизучать man <strong>ifconfig</strong>&#8216;а или повозиться с VPN-соединением.</p>
<h4 style="text-align: right">WiFi</h4>
<p>С беспроводным соединением все прошло далеко не так гладко, как хотелось бы. Первой задачей стояло определение того, какой же драйвер необходим для функционирования соответствующего устройства. Вариантов ответа на этот вопрос в <a href="/net" target="_blank">Сети</a> нашлось множество, но какой именно подошел бы именно к моей модели ноутбука было как минимум не очевидно.</p>
<p>Попробовав несколько вариантов, мне удалось-таки установить беспроводное соединение с помощью драйвера под названием <strong>ipw3945</strong> и сопутствующего ему daemon&#8217;а <strong>ipw3945d</strong>. Подробно весь процесс описывать не буду, я думаю при необходимости подробную инструкцию найти особого труда не составит.</p>
<p>Я еще не упоминал, что в качестве рабочего окружения предпочитаю использовать KDE, как-то с самого начала к нему привык, как внешне так и внутренне он меня более чем устраивает. Не сочтите предыдущее предложение за отступ от темы, я всеголишь хотел как-то объяснить переход к разговору об утилите, предоставляющей GUI к работе с беспроводными соединениями, &#8212; <strong>KWifiManager</strong>. Утилитка достаточно своеобразная, манера ее поведения поначалу сильно удивляла, но со временем привыкаешь. Особенно странно она производит выбор беспроводной сети, к которой подключаться. Не смотря на установленную в настройках мою домашнюю сеть, как сеть по-умолчанию, она все равно частенько пытается залезть к соседям или еще куда. И что самое интересное &#8212; вернуть ее на <em>путь истинный</em> ее же средствами мне обычно так и не удается. Из-за этого пришлось написать bash-скрипт, который помогает укратить эту утилиту. Включать в текст записи его особо желания нету, если кто хочет его заполучить: оставьте соответствующий комментарий &#8212; выложу.</p>
<h3>Альтернатива консоли</h3>
<p>Консоль &#8212; штука конечно полезная, но со временем пользоваться только ей на домашнем компьютере все же надоедает, хочется чего-то большего &#8212; например, компании состоящей из X-сервера, Xorg и какого-либо рабочего окружения (как я уже успел упомянуть &#8212; в его роли я предпочитаю использовать <a href="/tag/kde" target="_blank">KDE</a>, о нем и буду дальше говорить, но Ваш выбор это естественно ни капли не ограничивает).</p>
<p>Проблем как ни странно с этим пунктом нашей программы не возникло никаких &#8212; официальная документация по этому поводу обширна, и чуть ли не гарантированно приводит к положительным результатам. Все прекрасно собирается (правда долговато) и не менее прекрасно работает.</p>
<p>Одно время конечно возникали некоторые трудности, например в одной из версий X-сервера была неприятная недоработка с LED&#8217;ами на клавиатуре &#8212; не было видно нажат ли Caps Lock, или при одной конкретной комбинации программного обеспечения и ядра системы по странному стечению обстоятельств частоиспользуемая клавиша <strong>F2</strong> приводила к сворачиванию X-сервера и возвращению в консоль, что тоже доставляло массу неудобств. На данный же момент все проблемы такого рода решены руками огромного <a href="/tag/opensource" target="_blank">opensource</a>-сообщества и все снова замечательно работает точно также как и полгода назад сразу после установки системы.</p>
<p>Через некоторое время после установки <a href="/tag/kde" target="_blank">KDE</a> мне все же захотелось привести его в более приятный моим глазам внешний вид. Вооружившись любимым графическим редактором под названием <strong>The GIMP</strong> я принялся за дело. В итоге получилось  нечто странное, которое выглядит примерно вот так:</p>
<p><a href="/wp-content/uploads/screenshot-desktop.jpg" target="_blank"><img src="/wp-content/uploads/screenshot-desktop-s.jpg" alt="Screenshot" title="KDE 3.5.8 Screenshot" /></a></p>
<h3>Видео</h3>
<p>Используемый по-умолчанию видеодрайвер <em>vesa</em> оставляет желать лучшего, этот факт заметен сразу же после первой загрузки рабочего окружения, а значит ничего не остается кроме как искать ему замену. Искать долго не придется &#8212; отличный видеодрайвер для присутствующей в внутри этого ноутбука <em>Nvidia GeForce 7600</em> легко доступен через Portage, называется он, как ни странно, <strong>nvidia-drivers</strong>.</p>
<p>Впечатления он оставляет только положительные: легко настраивается, достаточно производительный, поддерживает множество технологий, в том числе пресловутый Composite Extension в Xorg, который необходим для работы большинства (если не всех) трехмерных приложений.</p>
<h3>Аудио</h3>
<p>С ним все еще проще &#8212; достаточно лишь не забыть включить <strong>ALSA</strong> и <strong>Intel HD Audio</strong> в конфигурации ядра.</p>
<p>Качество конечно не идеальное, но для такого класса устройств звук вполне &#171;на уровне&#187;, для просмотра фильмов и негромкого воспроизведения музыки более чем достаточно.</p>
<h3>Bluetooth</h3>
<p>Синий зуб прекрасно чувствует себя под руководством встроенного в ядра драйвера <strong>BlueZ</strong>, с работой в качестве GUI для работы с этим устройством также неплохо справляются KDE&#8217;шные утилиты KBluetooth и компания.</p>
<p>На роль помощника в тестировании и настройке bluetooth&#8217;а я не смог придумать ничего лучше, чем выбрать свой старенький телефон <em>Qtek S200</em>. Передача файлов заработала безукоризненно в обоих направлениях, а вот с использованием телефона в роли GPRS-модема пришлось изрядно повозиться: узнать необходимые настройки соединения на сайте оператора, найти хотябы примерно подходящую документацию по данному вопросу, настроить все как положено. Когда дело дошло до процесса дозвона по указанному номеру, телефон по каким-то причинам отказывался реагировать на запросы компьютера. Попытки понять в чем же причина длились достаточно долго, пока я не наткнулся в интернете на подробное техническое описание своего телефона, где было сказано, что он просто-напросто не поддерживает доступ у своему GPRS-модему через bluetooth-соединение. Узнав об этом факте я решил больше себя не мучать и бросил эту затею, но чисто технически с другим телефоном оно должно было заработать, но на практике проверить руки так до сих пор и не дошли.</p>
<h3>Разные мелочи</h3>
<p>Устав от продолжительной установки и настройки системы, на вещи, которыми я не планировал активно пользоваться, я не тратил много времени, по-этому упомяну их лишь вкратце.</p>
<p>Очень удивил меня тот факт, что для приведения к жизни различных нестандартных кнопок вроде регулировки громкости, S1, S2 и Fn необходима достаточно серьезная &#171;работа напильником&#187;: модули ядра вроде <strong>sonypi</strong> способны оживить их лишь частично, для полного их функционирования возможно придется изрядно покопаться в конфигурационных файлах, а также написать/найти некоторое количество bash-скриптов. Надеюсь в будущем найду в себе силы довести это дело до конца, правда особого дискомфорта от ненастроенных кнопок я не испытываю &#8212; не успел к ним привыкнуть, да и реализованного на уровне оборудования mute sound мне вполне хватает.</p>
<p>Регулировка яркости дисплея работает прекрасно через консоль с помощью утилиты <strong>nvclock</strong>, но какого-либо GUI к ней мне найти не удалось, т.к. особой необходимости в этом не испытываю &#8212; все равно предпочитаю держать экран максимально ярким, лишь в очень редких случаях возникает необходимость его приглушить, но в таких случаях обычно проще бывает нажать <strong>Alt+F2</strong> и набрать необходимую команду.</p>
<p>Встроенная камера заслуживает отдельного разговора. С одной стороны драйвера под нее есть и легко доступны, весь необходимый набор модулей для ядра &#8212; <strong>v4l, gspcav1</strong>, установить абсолютно не проблема. Найдя неплохую статейку в вики я достаточно быстро разобрался с их установкой, но после этого возник вопрос: а зачем оно собственно говоря надо? Как оказалось, камера является абсолютно бесполезным для меня device&#8217;ом, и я даже не придумал никакого адекватного способа проверить ее работоспособность. Так эти драйвера и находятся установленными в системе непонятно зачем.</p>
<p>Порт IEEE 1394 aka FireWire опробовать в действии не удалось, так как я не являюсь обладателем устройств, его использующих, но я не вижу каких-либо причин для того, чтобы он не работал: если мне не изменяет память, то он фигурировал в настройках ядра наравне с USB, который замечательно работает.</p>
<p>Cardreader&#8217;ов в комплекте было два &#8212; один встроенный для MemoryStick, и внешний в 34мм-слот для SD/MMC. Насчет первого не могу ничего сказать, так как карточек таких у меня не нашлось, а второй отлично определился без каких-либо дополнительных действий с моей стороны.</p>
<p>Про DVD-привод, miniJack и прочие стандартные вещи наверное и упоминать смысла нет &#8212; с ними все в порядке.</p>
<h3>Подведем итоги</h3>
<p>Как Вы уже успели заметить, в целом процесс установки этого одного из самых &#171;сложных&#187; дистрибутивов <a href="/tag/linux" target="_blank">Linux</a> на ноутбук является далеко не элементарной задачей. Когда я писал этот текст, передо мной не стояло задачи убедить как можно больше читателей последовать по тому пути, что выбрал я и стать активным пользователем операционной системы под гордым названием <em><a href="/tag/gentoo" target="_blank">Gentoo</a> <a href="/tag/linux" target="_blank">Linux</a></em>, я всеголишь хотел показать Вам выбор, который стоит перед каждым пользователем персональных компьютеров, как настольных, так и портативных.</p>
<p>На закуску я хотел бы поделиться своими впечатлениями насчет активной эксплуатации такой системы на протяжении достаточного длительного периода времени. Промолчав про несравнимую производительность и стабильность, сразу перейду к тому, как я использую свой ноутбук: в основном для меня он просто является устройством, позволяющим пользоваться всем разнообразием услуг <a href="/net" target="_blank">Сети</a>: общаться, получать разного рода информацию, делиться информацией. Помимо этого я подрабатываю программированием на некоторых языках программирования, а также удаленным администрированием. Для каждой из этих задач существует огромнейший набор вариантов воплощения их в жизнь, и выбор каким из них мне пользоваться в каждой конкретной ситуации остается за мной, за <em>пользователем</em>, а не за производителями программного обеспечения, которые навязывают своим клиентам свои решения.</p>
<p>Закончить хотелось бы той же цитатой из <em>Gentoo Handbook</em>, которую я использовал в эпиграфе к этой статье: <em>&#171;Gentoo is all about choices.&#187;</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/linux/gentoo-linux-sony-vaio/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>KDE 4 увидел свет</title>
		<link>http://www.insight-it.ru/unix-way/linux/kde-4-uvidel-svet/</link>
		<comments>http://www.insight-it.ru/unix-way/linux/kde-4-uvidel-svet/#comments</comments>
		<pubDate>Fri, 11 Jan 2008 18:37:40 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[ПО]]></category>
		<category><![CDATA[программное обеспечение]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/unix-way/linux-unix-way/kde-4-uvidel-svet/</guid>
		<description><![CDATA[Наконец-то наступил тот самый день, которого так долго ждали многие пользователи различных дистрибутивов Linux и многих других unix-like операционных систем. Да-да, сегодня вышла новая major-версия знаменитого K Desktop Environment под номером 4.0! Вкратце перескажу оффициальный пресс-релиз: Набор библиотек, лежащих в основе KDE, был кардинальным образом переделан, изменения произошли в каждой из них. Появилось два новых [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/kde.png" title="K Desktop Environment" alt="KDE Icon" style="margin: 10px; float: right;" /></p>
<p>Наконец-то наступил тот самый день, которого так долго ждали многие пользователи различных дистрибутивов Linux и многих других unix-like операционных систем. Да-да, сегодня вышла новая major-версия знаменитого K Desktop Environment под номером 4.0!</p>
<p><span id="more-24"></span></p>
<p>Вкратце перескажу <a target="_blank" href="http://www.kde.org/announcements/4.0/index.php">оффициальный пресс-релиз</a>:</p>
<p>Набор библиотек, лежащих в основе KDE, был кардинальным образом переделан, изменения произошли в каждой из них. Появилось два новых framework&#8217;а: один мультимедийный.- Phonon, а второй &#8212; Solid &#8212; для интеграции интерфейса для работы с используемым оборудованием в рабочее окружение.</p>
<p>Рабочий стол KDE приобрел новую оболочку под названием Plasma, которая поддерживает огромное количество widget&#8217;ов, эффектов и прочих украшательств.</p>
<p>Все программное обеспечение, входящее в его состав также не осталось без изменений (немного от себя: лично мне больше всего понравились изменения в Kopete &#8212; единственный icq клиент под *nix, в котором появилась возможность использования x-status, которой сильно не хватало, успел заценить его еще некоторое время назад в beta-версии KDE 4). Помимо Konqueror появился новый файловый менеджер под названием Dolphin и просмотрщик документов Okular (основанный на KPDF, но поддерживающий существенно большее количество форматов документов).</p>
<p>Тема рабочего окружения, используемая по-умолчанию также изменилась и называется она теперь Oxygen, на вкус и цвет конечно, но я думаю найдется много людей, которым она прийдется по душе.</p>
<div style="margin: 16px; text-align: center;"><img src="http://www.kde.org/announcements/4.0/screenshots/desktop_thumb.jpg" alt="KDE4 Screenshot" title="KDE 4.0 Screenshot" /></div>
<p>Вот так вот примерно выглядит новинка в стандартном варианте оформления, естественно практически безграничные возможности по модификации пользовательского интерфейса не только никуда не делись, а только преувеличились.</p>
<p>&nbsp;</p>
<p>На личном опыте новый релиз я опробовать еще не успел, но планирую этим делом заняться в ближайшем будующим, наверное сразу же как появятся ebuild&#8217;ы для Gentoo. После чего несомненно поделюсь с Вами впечатлениями.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/linux/kde-4-uvidel-svet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unix way</title>
		<link>http://www.insight-it.ru/unix-way/unix-way/</link>
		<comments>http://www.insight-it.ru/unix-way/unix-way/#comments</comments>
		<pubDate>Sun, 06 Jan 2008 16:30:16 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Unix way]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[идеология]]></category>
		<category><![CDATA[программное обеспечение]]></category>
		<category><![CDATA[философия]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/programming/unix-way/</guid>
		<description><![CDATA[На эту тему в Сети можно найти несметное количество статей и обсуждений, не удивлюсь если Вам уже доводилось читать что-либо подобное в прошлом или может быть работать в одной из множества операционных систем, разработанных с использованием этой идеологии. За этим словосочетанием скрывается целая философия разработки программного обеспечения, начавшая свое развитие в середине 90-х годов прошлого [...]]]></description>
			<content:encoded><![CDATA[<p>На эту тему в Сети можно найти несметное количество статей и обсуждений, не удивлюсь если Вам уже доводилось читать что-либо подобное в прошлом или может быть работать в одной из множества операционных систем, разработанных с использованием этой идеологии. За этим словосочетанием скрывается целая философия разработки программного обеспечения, начавшая свое развитие в середине 90-х годов прошлого века и воплощенная в огромном количестве операционных систем и в еще большем количестве <a href="/tag/opensource" target="_blank">opensource</a> проектов. В этом тексте я хочу поведать Вам свой взгляд на эту философию с двух точек зрения: программиста и пользователя.</p>
<p>Наиболее точно охарактеризовать то, о чем пойдет речь можно лишь процитировав одного из основателей традиций <a href="/tag/unix" target="_blank">Unix</a> и разработчика <a href="/tag/tekhnologiya" target="_blank">технологии</a> под названием &quot;Unix pipes&quot; &#8212; <a href="http://www.cs.dartmouth.edu/~doug/" target="_blank" rel="nofollow">Douglas&#8217;а Mcllroy&#8217;а</a>:</p>
<blockquote><p>&quot;This is the Unix philosophy:</p>
<dl>
<dd>Write programs that do one thing and do it well.</dd>
<dd>Write programs to work together.</dd>
<dd>Write programs to handle text streams, because that is a universal interface.&quot;</dd>
</dl>
</blockquote>
<p> <span id="more-15"></span></p>
<p>Для начала воспроизведу суть цитаты для тех читателей, кто возможно не знает в достаточной степени английского языка:</p>
<p><cite>Философия написания программ для <a href="/tag/unix" target="_blank">Unix</a> заключается в написании программ, качественно решающих строго одну задачу, но при этом тесно работающих вместе. В качестве стандартного универсального интерфейса между ними предлагается использование стандартных потоков текстовых данных.</cite></p>
<p>Сразу же позволю себе слегка отойти от темы, упомянув что существует также и абсолютно противоположный подход к написанию программного обеспечения, который стоит упомянуть для того, чтобы &quot;почувствовать разницу&quot;. Он используется в большинстве <abbr title="Платное программное обеспечение с закрытым кодом">проприетарных</abbr> программ и заключается в нагромождении максимального количества функционала внутри одного программного продукта, в большинстве случаев с целью получения дополнительных возможностей для построения рекламной компании и, как следствие, более выгодного ведения продаж. К сожалению, при таком подходе разработчики часто забывают о качестве ПО, о возможностях расширение, удобстве использования, возможностях модификации со стороны пользователя и многом другом, но зато в итоге получают продукт, о котором можно указать &quot;установил &#8212; и сразу что-то как-то работает&quot;, но что именно, как оно работает, и как долго еще сможет работать до тех пор пока не начнутся неполадки, и как с ними бороться в случае если они появятся &#8212; остается загадкой для  как для подавляющего большинства пользователей, так и не редко для самих разработчиков тоже.</p>
<p>Закончив лирическое отступление, хочется взглянуть на нашу философию с точки зрения программиста.</p>
<h3 style="text-align: right;">Взгляд с точки зрения программиста</h3>
<p>Философия <a href="/tag/unix" target="_blank">Unix</a> предлагает программисту набор элементарных правил, соблюдение которых не только упростит работу программиста, но и позволит расширить сферу применения получившегося программного продукта с помощью различных вариантов интеграции с другими программами.</p>
<p>Как же это выглядит?</p>
<h4>Одна задача &#8212; одна программа</h4>
<p>С помощью этого правила список действий, требуемых от программиста для написания готовой программы, резко сокращается до двух позиций, одной из которых является собственно реализация задачи. Задачи эти чаще всего элементарны до безобразия и заключается в переработки входных данных, например: вывод содержимого указанного каталога, подсчет длины указанного файла, фильтрация входных данных, отправка локального электронного письма на удаленный сервер (да-да, для приема, сортировки, хранения, чтения, редактирования и отправки электронных писем могут использоваться отдельные программы).</p>
<p>Подобное множество программ решающих элементарные задачи делает количество способов решения какой-либо комплексной задачи стремящимся к бесконечности, ведь при наличии стандартизованного интерфейса комбинировать программы можно в любой последовательности. Для расширения возможностей такого рода комбинирования используются различные скриптовые языке, которых существует достаточно много, наиболее распространенным из которых являются bash скрипты, основанные на командах одноименной оболочки командной строки, используемой по-умолчанию во всех (хотя возможно стоило не использовать громких слов и написать &quot;в большинстве&quot;) дистрибутивах <a href="/tag/linux" target="_blank">Linux</a>.</p>
<h4>Unix pipes</h4>
<p>Этот механизм является основным способом реализации столько раз упоминавшегося выше интерфейса между элементарными программами.  Реализация его поддержки является как раз второй задачей, которая ставится перед программистом, идущим по пути <a href="/tag/unix" target="_blank">Unix</a>. С использованием большинства языков программирования она является тривиальной, особенно это справедливо для C.</p>
<p>На подробностях реализации останавливаться не будем, по этому позволю себе плавно перейти к следующему разделу и продолжить эту тему уже там.</p>
<h3 style="text-align: right;">Взгляд с точки зрения пользователя</h3>
<p>Слово pipes можно переводить по-разному, мне больше нравится вариант <em>потоки</em>,  но также часто используется и дословный перевод &#8212; <em>трубы</em>. Также имеет смысл сразу сказать, что его реализация полностью основывается на командной строке и командах различных ее оболочек, а также тесно интегрирована с устройствами компьютера и файловой системой.</p>
<p>У каждой элементарной программы, соответствующей этой идеологии, должен быть входной и выходной стандартные текстовые потоки &#8212; stdin и stdout соответственно. Механизм unix pipes позволяет перенаправлять эти потоки любой программы произвольным образом с помощью трех простых операторов: |, &gt; и &lt;. Первый из них &#8212; | перенаправляет stdout команды слева от него в stdin команды справа, а &gt; и &lt; предназначены для перенаправление потоков в/из файлы по схожему принципу.</p>
<p>Предлагаю рассмотреть  этот механизм на примерах. Возьмем несколько базовых утилит, имеющихся на практически любой unix-like системе:</p>
<ul>
<li><em>cat</em> &#8212; вывод содержимого указанного первым параметром файла в stdout (по умолчанию stdout в большинстве программ направляется  в консоль)</li>
<li><em>less</em> &#8212; постраничный вывод текста, полученного в stdin в stdout (переключение страниц и некоторые другие функции производятся с клавиатуры, возможны и другие варианты использования, но они нам не нужны)</li>
<li><em>grep</em> &#8212; построчная фильтрация текста, полученного в stdin, вывод только строк, содержащих текст, указанный первым аргументом, и вывод результата в stdout.</li>
</ul>
<p>Начнем с примера, позволяющего прочитать постранично любой файл:</p>
<pre lang="bash">
cat readme.txt | less</pre>
<p>Не смотря на наличие более простых методов достижения той же цели, этот пример наглядно демонстрирует процесс перенаправления ввода-вывода, другими словами с помощью оператора | была создана так называемая pipe, которая и дала название этому механизму. Пример, демонстрирующий перенаправление в файл будет столь же элементарным, хотя может быть с первого взгляда покажется &quot;пострашнее&quot;:</p>
<pre lang="bash">
cat readme.txt | grep unix > readme.txt
</pre>
<p>Этот пример должен был бы удалить из файла все строки, где нет слова &quot;unix&quot;. <em>Маленькое замечание:</em> при использовании такого перенаправления, перед началом передачи данных файл обнуляется. В этом и заключается ошибка данного примера: файл очищается до того, как поток данных успел пройти через фильтрацию <strong>grep</strong>, что приводит к просто очистке файла. Если же Вам все же нужен отфильтрованный список строк &#8212; стоит разместить в другом файле (которым можно было бы подменить исходный при необходимости), просто поменяв его название:</p>
<pre lang="bash">
cat readme.txt | grep unix > meread.txt
</pre>
<p>Если же Вы хотите избежать очищения файла, в который производится запись, необходимо написать символ &gt; дважды, тогда новые данные припишутся в конец:</p>
<pre lang="bash">
cat readme.txt | grep unix >> readme.txt</pre>
<p>В unix-like системах есть еще одна интересная особенность, косвенно связанная с этим механизмом: <em>все устройства являются файлами</em> и соответственно, прикреплены к файловой системе, для них выделена отдельная директория, по традиции называемая /dev. Работа с ними также ведется на тех же правах что и с обычными файлами, например набрав в консоли:</p>
<pre lang="bash">
cat readme.txt > /dev/dsp</pre>
<p>в ответ от компьютера Вы услышите некоторый звук, издаваемый из колонок или наушников.</p>
<h4>Подводим итоги</h4>
<p>С точки зрения простого пользователя использование opensource решений, построенных на базе философии unix, является как минимум нетривиальной задачей &#8212; ведь от него требуется как минимум понимание насколько мощная и гибкая система попала ему/ей в руки.  Отсутствие единственного верного способа решения той или иной задачи ставит большинство людей попросту в тупик, у них начинают разбегаться глаза от десятков тысяч программ, доступа к которым есть у всех пользователей unix-like операционных систем, с помощью набора простой волшебной команды в консоли, состоящей не более чем из трех-четырех слов.</p>
<p>Но если пользователь находит в себе силы понять что за зверь попал ему в руки, он сможет превратить любой компьютер в универсальное устройство по решению любых задач именно тем способом, который удобен <em>пользователю</em>, а не который навязали ему <em>производители</em> <abbr title="Платное программное обеспечение с закрытым кодом">проприетарного</abbr> програмного обеспечения.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/unix-way/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
	</channel>
</rss>

