<?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; Масштабируемость</title>
	<atom:link href="http://www.insight-it.ru/category/masshtabiruemost/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>Архитектура Google 2011</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-google-2011/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-google-2011/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 22:32:04 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[архитектура Google]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1426</guid>
		<description><![CDATA[Архитектура Google была одной из первых статьей на Insight IT. Именно она дала толчок развитию проекта: после её публикации посещаемость блога увеличилась в десятки раз и появились первые сотни подписчиков. Прошли годы, информация устаревает стремительно, так что пришло время взглянуть на Google еще раз, теперь уже с позиции конца 2011 года. Что мы увидим нового [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1428" title="Архитектура Google" src="http://www.insight-it.ru/wp-content/uploads/2011/11/google-logo.jpg" alt="Архитектура Google" width="630" height="244" /><br />
<a href="http://www.insight-it.ru/masshtabiruemost/arkhitektura-google/">Архитектура Google</a> была одной из первых статьей на <strong>Insight IT</strong>. Именно она дала толчок развитию проекта: после её публикации посещаемость блога увеличилась в десятки раз и появились первые сотни подписчиков. Прошли годы, информация устаревает стремительно, так что пришло время взглянуть на Google еще раз, теперь уже с позиции конца 2011 года. Что мы увидим нового в архитектуре интернет-гиганта?<span id="more-1426"></span></p>
<h2>Статистика</h2>
<ul>
<li><strong>Общее</strong>
<ul>
<li><em>Ежедневная аудитория Google составляет около 1 миллиарда человек</em>
<ul>
<li>По данным Alexa больше половины каждый день Google пользуются более половины аудитории интернета</li>
<li>По данным IWS аудитория интернета составляет 2.1 миллиарда человек</li>
</ul>
</li>
<li><em>Используется более 900 тысяч серверов</em>
<ul>
<li>Планируется расширение до 10 миллионов серверов в обозримом будущем</li>
</ul>
</li>
<li><a href="http://www.google.com/about/datacenters/locations/index.html" target="_blank">12 основных датацентров в США</a>, присутствие в большом количестве точек по всему миру (более 38)</li>
<li>Около 32 тысяч сотрудников в 76 офисах по всему миру</li>
</ul>
</li>
<li><strong>Поиск</strong>
<ul>
<li>За последние 14 лет среднее время обработки одного поискового запроса уменьшилось с 3 секунд до менее 100 миллисекунд, то есть в 30 раз</li>
<li>Более 40 миллиардов страниц в индексе, если приравнять каждую к листу А4 они бы покрыли территорию США в 5 слоев</li>
<li>Более 1 квинтиллиона уникальных URL (10 в 18 степени); если распечатать их в одну строку, её длина составит 51 миллион километров, треть расстояния от Земли до Солнца</li>
<li>В интернете встречается примерно 100 квинтиллионов слов, чтобы набрать их на клавиатуре одному человеку потребовалось бы примерно 5 миллионов лет</li>
<li>Проиндексировано более 1.5 миллиардов изображений, чтобы их сохранить потребовалось бы 112 миллионов дискет, которые можно сложить в стопку высотой 391 километр</li>
</ul>
</li>
<li><strong>Gmail</strong>
<ul>
<li>Активных пользователей более 170 миллионов</li>
<li>Второй по популярности почтовый сервис в США, третий в мире (по данным comScore)</li>
<li>При текущем темпе роста аудтории GMail и конкурентов, он станет лидером рынка через 2-3 года</li>
</ul>
</li>
<li><strong>Google+</strong>
<ul>
<li>Более 40 миллионов пользователей на октябрь 2011, при запуске в июне 2011</li>
<li>25 миллионов пользователей за первый месяц</li>
<li>70:30 примерное соотношение мужчин и женщин</li>
<li>Себестоимость разработки больше полумиллиарда долларов</li>
</ul>
</li>
<li><strong>YouTube</strong>
<ul>
<li>Загружается более 13 миллионов часов видео в год</li>
<li>Каждую минуту загружается 48 часов видео, что соответствует почти 8 годам контента или 52 тысячам полнометражных фильмов в день</li>
<li>Более 700 миллиардов просмотров видео в год</li>
<li>Месячная аудитория составляет 800 миллионов уникальных посетителей</li>
<li>Несколько тысяч полнометражных фильмов в <a href="http://www.youtube.com/movies" target="_blank">YouTube Movies</a></li>
<li>Более 10% всех видео в формате HD</li>
<li>13% просмотров (400 миллионов в день) происходит с мобильных устройств</li>
<li>До сих пор работает в убыток, лишь 14% просмотров видео приносят выручку с рекламы</li>
</ul>
</li>
<li><strong>Финансы</strong>
<ul>
<li>Выручка порядка 36 миллиардов долларов в год</li>
<li>Прибыль после налогов порядка 10 миллиардов долларов в год</li>
<li>Капитализация порядка 55 миллиардов долларов</li>
</ul>
</li>
</ul>
<h2>Архитектура</h2>
<p><strong>Google</strong> &#8212; огромная интернет-компания, неоспоримый лидер на рынке поиска в Интернет и владелец большого количества продуктов, многие из которых также добились определенного успеха в своей нише.</p>
<p>В отличии от большинства интернет-компаний, которые занимаются лишь одним продуктом (проектом), архитектура Google не может быть представлена как единое конкретное техническое решение. Сегодня мы скорее будем рассматривать общую стратегию технической реализации интернет-проектов в Google, возможно слегка затрагивая и другие аспекты ведения бизнеса в Интернет.</p>
<p>Все продукты Google основываются на постоянно развивающейся программной платформе, которая спроектирована с учетом работы на миллионах серверов, находящихся в разных датацентрах по всему миру.</p>
<h3>Оборудование</h3>
<p>Обеспечение работы миллиона серверов и расширение их парка &#8212; одна из ключевых статей расходов Google. Для минимизации этих издержек очень большое внимание уделяется эффективности используемого серверного, сетевого и инфраструктурного оборудования.</p>
<div class="frame alignright"><img class="alignnone size-medium wp-image-1435" title="dc-home-energy-use" src="http://www.insight-it.ru/wp-content/uploads/2011/11/dc-home-energy-use-300x211.png" alt="" width="300" height="211" /></div>
<p>В традиционных датацентрах потребление электричества серверами примерно равно его потреблению остальной инфраструктурой, Google же удалось снизить процент использования дополнительной электроэнергии до 14%. Таким образом суммарное энергопотребление датацентром Google сравнимо с потреблением только серверов в типичном датацентре и вдвое меньше его общего энергопотребления. Основные концепции, которые используются для достижения этого результата:</p>
<ul>
<li>Точное измерение потребления электроэнергии всеми компонентами позволяет определить возможности по его уменьшению;</li>
<li>В датацентрах Google тепло, что позволяет экономить на охлаждении;</li>
<li>При проектировании датацентра уделяется внимание даже незначительным деталям, позволяющим сэкономить даже немного &#8212; при таком масштабе это окупается;</li>
<li>Google умеет охлаждать датацентры практически без кондиционеров, с использованием воды и её испарения<em> (см.<a href="http://www.youtube.com/watch?v=VChOEvKicQQ" target="_blank"> как это реализовано</a> в Финляндии)</em>.</li>
</ul>
<p>В Google активно пропагандируют максимальное использование возобновляемой энергии. Для этогоe заключаются долгосрочные соглашения с её поставщиками (на 20 и более лет), что позволяет отрасли активно развиваться и наращивать мощности. Проекты по генерации возобновляемой энергии, спонсируемые Google, имеют суммарную мощность более 1.7 гигаватт, что существенно больше, чем используется для работы Google. Этой мощности хватило бы для обеспечения электричеством 350 тысяч домов.</p>
<p>Если говорить о жизненном цикле оборудования, то используются следующие принципы:</p>
<ul>
<li><strong>Уменьшение транспортировки:</strong> там, где это возможно, тяжелые компоненты (вроде серверных стоек) закупаются у местных поставщиков, даже если в других местах аналогичный товар можно было бы купить дешевле.</li>
<li><strong>Повторное использование: </strong> прежде, чем покупать новое оборудование и материалы, рассматриваются возможности по использованию уже имеющихся. Этот принцип помог избежать покупки более 90 тысяч новых серверов.</li>
<li><strong>Утилизация</strong>: в тех случаях, когда повторное использование невозможно, оборудование полностью очищается от данных и продается на вторичном рынке. То, что не удается продать, разбирается на материалы (медь, сталь, алюминий, пластик и.т.п.) для последующей правильной утилизации специализированными компаниями.</li>
</ul>
<p>Google известны за свои эксперименты и необычные решения в области серверного оборудования и инфраструктуры. Некоторые запатентованы; какие-то прижились, какие-то &#8212; нет. Подробно останавливаться на них не буду, лишь вкратце о некоторых:</p>
<ul>
<li>Резервное питание, интегрированное в блок питания <a href="http://www.youtube.com/watch?v=xgRWURIxgbU" target="_blank">сервера</a>, обеспеченное стандартными 12V батарейками;</li>
<li><a href="http://www.datacenterknowledge.com/closer-look-googles-server-sandwich-design/" target="_blank">&#171;Серверный сендвич&#187;</a>, где материнские платы с двух сторон окружают водяную систему теплоотвода в центре стойки;</li>
<li><a href="http://www.youtube.com/watch?v=zRwPSFpLX8I" target="_blank">Датацентр из контейнеров</a>.</li>
</ul>
<p>В заключении этого раздела хотелось бы взглянуть правде в глаза: <strong>идеального оборудования не бывает</strong>. У любого современного устройства, будь то сервер, коммутатор или маршрутизатор, есть шанс прийти в негодность из-за производственного брака, случайного стечения обстоятельств или других внешних факторов. Если умножить этот, казалось бы, небольшой шанс на количество оборудования, которое используется в Google, то окажется, что чуть ли не каждую минуту из строя выходит одно, или несколько, устройств в системе. На оборудование полагаться нельзя, по-этому вопрос отказоустойчивости переносится на плечи программной платформы, которую мы сейчас и рассмотрим.</p>
<h3>Платформа</h3>
<p>В Google очень рано столкнулись с проблемами ненадежности оборудования и работы с огромными массивами данных. Программная платформа, спроектированная для работы на многих недорогих серверах, позволила им абстрагироваться от сбоев и ограничений одного сервера.</p>
<p>Основными задачами в ранние годы была минимизация точек отказа и обработка больших объемов слабоструктурированных данных. Решением этих задач стали три основных слоя платформы Google, работающие один поверх другого:</p>
<ul>
<li><strong><a href="http://research.google.com/archive/gfs.html" target="_blank">Google File System</a>: </strong>распределенная файловая система, состоящая из сервера с метаданными и теоретически неограниченного количества серверов, хранящих произвольные данные в блоках фиксированного размера.</li>
<li><strong><a href="http://research.google.com/archive/bigtable.html" target="_blank">BigTable</a>: </strong>распределенная база данных, использующая для доступа к данным две произвольных байтовых строки-ключа (обозначающие строку и столбец) и дату/время (обеспечивающие версионность).</li>
<li><strong><a href="http://research.google.com/archive/mapreduce.html" target="_blank">MapReduce</a>: </strong>механизм распределенной обработки больших объемов данных, оперирующий парами ключ-значение для получения требуемой информации.</li>
</ul>
<p>Такая комбинация, дополненная другими технологиями, довольно долгое время позволяла справляться с индексацией Интернета, пока&#8230; скорость появления информации в Интернете не начала расти огромными темпами из-за &#171;бума социальных сетей&#187;. Информация, добавленная в индекс даже через полчаса, уже зачастую становилась устаревшей. В дополнение к этому в рамках самого Google стало появляться все больше продуктов, предназначенных для работы в реальном времени.</p>
<p>Спроектированные с учетом совершенно других требований Интернета пятилетней давности компоненты, составляющие ядро платформы Google, потребовали фундаментальной смены архитектуры индексации и поиска, который около года назад был представлен публике под кодовым названием <strong>Google Caffeine</strong>. Новые, переработанные, версии старых &#171;слоев&#187; также окрестили броскими именами, но резонанса у технической публики они вызвали намного меньше, чем новый поисковый алгоритм в SEO-индустрии.</p>
<h4>Google Colossus</h4>
<p>Новая архитектура GFS была спроектирована для минимизации задержек при доступе к данным (что критично для приложений вроде GMail и YouTube), не в ущерб основным свойствам старой версии: отказоустойчивости и прозрачной масштабируемости.</p>
<p>В оригинальной же реализации упор был сделан на повышение общей пропускной способности: операции объединялись в очереди и выполнялись разом, при таком подходе можно было прождать пару секунд еще до того, как первая операция в очереди начнет выполняться. Помимо этого в старой версии было большое слабое место в виде единственно мастер-сервера с метаданными, сбой в котором грозил недоступностью всей файловой системы в течении небольшого промежутка времени (пока другой сервер не подхватит его функции, изначально это занимало около 5 минут, в последних версиях порядка 10 секунд) &#8212; это также было вполне допустимо при отсутствии требования работы в реальном времени, но для приложений, напрямую взаимодействующих с пользователями, это было неприемлемо с точки зрения возможных задержек.</p>
<p>Основным нововведением в Colossus стали распределенные мастер-сервера, что позволило избавиться не только от единственной точки отказа, но и существенно уменьшить размер одного блока с данными (с 64 до 1 мегабайта), что в целом очень положительно сказалось на работе с небольшими объемами данных. В качестве бонуса исчез теоретический предел количества файлов в одной системе.</p>
<p>Детали распределения ответственности между мастер-серверами, сценариев реакции на сбои, а также сравнение  по задержкам и пропускной способности обоих версий, к сожалению, по-прежнему конфиденциальны. Могу предположить, что используется вариация на тему хэш-кольца с репликацией метаданных на ~3 мастер-серверах, с созданием дополнительной копии на следующем по кругу сервере в случае в случае сбоев, но это лишь догадки. Если у кого-то есть относительно официальная информация на этот счет &#8212; буду рад увидеть в комментариях.</p>
<p>По прогнозам Google текущий вариант реализации распределенной файловой системы &#171;уйдет на пенсию&#187; в 2014 году из-за популяризации твердотельных накопителей и существенного скачка в области вычислительных технологий (процессоров).</p>
<h4>Google Percolator</h4>
<p>MapReduce отлично справлялся с задачей полной перестройки поискового индекса, но не предусматривал небольшие изменения, затрагивающие лишь часть страниц. Из-за потоковой, последовательной природы MapReduce для внесения изменений в небольшую часть документов все равно пришлось бы обновлять весь индекс, так как новые страницы непременно будут каким-то образом связаны со старыми. Таким образом задержка между появлением страницы в Интернете и в поисковом индексе при использовании MapReduce была пропорциональна общему размеру индекса (а значит и Интернета, который постоянно растет), а не размеру набора измененных документов.</p>
<p>Ключевые архитектурные решения, лежащие в основе MapReduce, не позволяли повлиять на эту особенность и в итоге система индексации была построена заново с нуля, а MapReduce продолжает использоваться в других проектах Google для аналитики и прочих задач, по прежнему не связанных с реальным временем.</p>
<p>Новая система получила довольно своеобразное название <strong>Percolator</strong>, попытки узнать что оно значит приводит к различным устройствам по фильтрации дыма, кофеваркам и непойми чему еще. Но наиболее адекватное объяснение мне пришло в голову, когда я прочитал его по слогам: per col &#8212; <em>по колонкам</em>.</p>
<p>Percolator представляет собой надстройку над BigTable, позволяющую выполнять комплексные вычисления на основе имеющихся данных, затрагивающие много строк и даже таблиц одновременно (в стандартном API BigTable это не предусмотрено).</p>
<p>Веб-документы или любые другие данные изменяются/добавляются в систему посредством модифицированного API BigTable, а дальнейшие изменения  в остальной базе осуществляются посредством механизма &#187;обозревателей&#187;. Если говорить в терминах реляционных СУБД, то обозреватели &#8212; что-то среднее между триггерами и хранимыми процедурами. Обозреватели представляют собой подключаемый к базе данных код (на <a href="/tag/c/" target="_blank">C++</a>), который исполняется в случае возникновении изменений в определенных <em>колонках</em> BigTable (откуда, видимо, и пошло название). Все используемые системой метаданные также хранятся в специальных колонках BigTable. При использовании Percolator все изменения происходят в транзакциях, удовлетворяющих принципу ACID, каждая из которых затрагивает именно те сервера в кластере, на которых необходимо внести изменения. Механизм транзакций на основе BigTable разрабатывался в рамках отдельного проекта под названием <a href="http://www.insight-it.ru/masshtabiruemost/google-megastore/" target="_blank">Google Megastore</a>.</p>
<p>Таким образом, при добавлении нового документа (или его версии) в поисковый индекс, вызывается цепная реакция изменений в старых документах, скорее всего ограниченная по своей рекурсивности. Эта система при осуществлении случайного доступа поддерживает индекс в актуальном состоянии.</p>
<p>В качестве бонуса в этой схеме удалось избежать еще двух недостатков MapReduce:</p>
<ul>
<li><strong>Проблемы &#171;отстающих&#187;:</strong> когда один из серверов (или одна из конкретных подзадач) оказывался существенно медленнее остальных, что также значительно задерживало общее время завершения работы кластера.</li>
<li><strong>Пиковая нагрузка:</strong> MapReduce не является непрерывным процессом, а разделяется на работы с ограниченной целью и временем исполнения. Таким образом помимо необходимости ручной настройки работ и их типов, кластер имеет очевидные периоды простоя и пиковой нагрузки, что ведет к неэффективному использованию вычислительных ресурсов.</li>
</ul>
<p>Но все это оказалось не бесплатно: при переходе на новую систему удалось достичь той же скорости индексации, но при этом использовалось <em>вдвое</em> больше вычислительных ресурсов. Производительность Percolator находится где-то между производительностью MapReduce и производительностью традиционных СУБД. Так как Percolator является распределенной системой, для обработки фиксированного небольшого количества данных ей приходится использовать существенно больше ресурсов, чем традиционной СУБД; такова цена масштабируемости. По сравнению с MapReduce также пришлось платить дополнительными потребляемыми вычислительными ресурсами за возможность случайного доступа с низкой задержкой.</p>
<p><img class="alignnone size-full wp-image-1473" title="google_percolator_benchmark" src="http://www.insight-it.ru/wp-content/uploads/2011/11/google_percolator_benchmark.png" alt="" width="546" height="335" /></p>
<p>Тем не менее, при выбранной архитектуре Google удалось достичь практически линейного масштабирования при увеличении вычислительных мощностей на много порядков <em>(см. график, основан на тесте TPC-E)</em>. Дополнительные накладные расходы, связанные с распределенной природой решения, в некоторых случаях до 30 раз превосходят аналогичный показатель традиционных СУБД, но у данной системы есть солидный простор для оптимизации в этом направлении, чем Google активно и занимается.</p>
<h4>Google Spanner</h4>
<p>Spanner представляет собой единую систему автоматического управления ресурсами<strong> всего парка серверов </strong>Google.</p>
<p>Основные особенности:</p>
<ul>
<li>Единое пространство имен:
<ul>
<li>Иерархия каталогов</li>
<li>Независимость от физического расположения данных</li>
</ul>
</li>
<li>Поддержка слабой и сильной целостности данных между датацентрами</li>
<li>Автоматизация:
<ul>
<li>Перемещение и добавление реплик данных</li>
<li>Выполнение вычислений с учетом ограничений и способов использования</li>
<li>Выделение ресурсов на всех доступных серверах</li>
</ul>
</li>
<li>Зоны полу-автономного управления</li>
<li>Восстановление целостности после потерь соединения между датацентрами</li>
<li>Возможность указания пользователями высокоуровневых требований, например:
<ul>
<li>99% задержек при доступе к этим данным должны быть до 50 мс</li>
<li>Расположи эти данные на как минимум 2 жестких дисках в Европе, 2 в США и 1 в Азии</li>
</ul>
</li>
<li>Интеграция не только с серверами, но и с сетевым оборудованием, а также системами охлаждения в датацентрах</li>
</ul>
<p>Проектировалась из расчета на:</p>
<ul>
<li>1-10 миллионов серверов</li>
<li>~10 триллионов директорий</li>
<li>~1000 петабайт данных</li>
<li>100-1000 датацентров по всему миру</li>
<li>~1 миллиард клиентских машин</li>
</ul>
<p>Об этом проекте Google известно очень мало, официально он был представлен публике лишь однажды в 2009 году, с тех пор лишь местами упоминался сотрудниками без особой конкретики. Точно не известно развернута ли эта система на сегодняшний день и если да, то в какой части датацентров, а также каков статус реализации заявленного функционала.</p>
<h4>Прочие компоненты платформы</h4>
<p>Платформа Google в конечном итоге сводится к набору сетевых сервисов и библиотек для доступа к ним из различных языков программирования (в основном используются <a href="/tag/c/" target="_blank">C/C++</a>, <a href="/tag/java/" target="_blank">Java</a>, <a href="/tag/python/" target="_blank">Python</a> и <a href="/tag/perl/" target="_blank">Perl</a>). Каждый продукт, разрабатываемый Google, в большинстве случаев использует эти библиотеки для осуществления доступа к данным, выполнения комплексных вычислений и других задач, вместо стандартных механизмов, предоставляемых операционной системой, языком программирования или opensource библиотеками.</p>
<p>Вышеизложенные проекты составляют лишь основу платформы Google, хотя она включает в себя куда больше готовых решений и библиотек, несколько примеров из публично доступных проектов:</p>
<ul>
<li><a href="http://code.google.com/webtoolkit/" target="_blank">GWT</a> для реализации пользовательских интерфейсов на <a href="/tag/java/" target="_blank">Java</a>;</li>
<li><a href="http://code.google.com/closure/" target="_blank">Closure</a> &#8212; набор инструментов для работы с <a href="/tag/javascript/" target="_blank">JavaScript</a>;</li>
<li><a href="http://code.google.com/apis/protocolbuffers/" target="_blank">Protocol Buffers</a> &#8212; не зависящий от языка программирования и платформы формат бинарной сериализации структурированных данных, используется при взаимодействии большинства компонентов системы внутри Google;</li>
<li><a href="http://code.google.com/p/snappy/" target="_blank">Snappy</a> &#8212; быстрая компрессия данных, используется при хранении данных в GFS.</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li><strong>Стабильные, проработанные и повторно используемые базовые компоненты проекта</strong><em> &#8212; залог её стремительного развития, а также создания новых проектов на той же кодовой базе</em>.</li>
<li>Если задачи и обстоятельства, с учетом которых проектировалась система, существенно изменились <em>- не бойтесь вернуться на стадию проектирования и реализовать новое решение</em>.</li>
<li><em>Используйте инструменты, подходящие для решения каждой конкретной задачи</em>, а не те, которые навязывает мода или привычки участников команды.</li>
<li>Даже, казалось бы, незначительные недоработки и допущения на большом масштабе могут вылиться в огромные потери <em>- уделяйте максимум внимания деталям при реализации проекта.</em></li>
<li>Нельзя полагаться даже на очень дорогое оборудование <em>- все ключевые сервисы должны работать минимум на двух серверах, в том числе и базы данных.</em></li>
<li>Распределенная платформа, общая для всех проектов, позволит новым разработчикам легко вливаться в работу над конкретными продуктами, с минимумом представления о внутренней архитектуре компонентов платформы.</li>
<li>Прозрачная работа приложений в нескольких датацентрах &#8212; одна из самых тяжелых задач, с которыми сталкиваются интернет-компании. Сегодня каждая из них решает её по-своему и держит подробности в секрете, что сильно замедляет развитие opensource решений.</li>
</ul>
<h2>Источники информации</h2>
<p>Не гарантирую достоверность всех нижеизложенных источников информации, ставших основой для данной статьи, но ввиду конфиденциальности подобной информации на большее рассчитывать не приходится.</p>
<p>Поправки и уточнения приветствуются <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<ul>
<li><em><a href="http://www.google.com/about/datacenters/index.html" target="_blank">Official Google Data Centers Site</a></em></li>
<li><a href="http://research.google.com/people/jeff/WSDM09-keynote.pdf" target="_blank">Challenges in Building Large-Scale Information Retrieval Systems</a> (Jeff Dean, WCDMA &#8217;09)</li>
<li><a href="http://www.odbms.org/download/dean-keynote-ladis2009.pdf" target="_blank">Designs, Lessons and Advice from Building Large Distributed Systems</a> (Jeff Dean, Ladis &#8217;09)</li>
<li><em><a href="http://research.google.com/pubs/pub36726.html" target="_blank">Google Percolator official paper</a></em></li>
<li><a href="http://research.google.com/pubs/pub36971.html" target="_blank"><em>Google Megastore official paper</em></a></li>
<li><em><a href="http://www.theregister.co.uk/2010/09/24/google_percolator/" target="_blank">Google Percolator</a> </em></li>
<li><em><a href="http://www.theregister.co.uk/2010/09/09/google_caffeine_explained/" target="_blank">Google Caffeine Explained</a></em></li>
<li><a href="http://www.theregister.co.uk/2009/10/23/google_spanner/" target="_blank">Google Spanner</a></li>
<li><a href="http://www.theregister.co.uk/2011/06/08/google_software_infrastructure_dubbed_obsolete_by_ex_employee/" target="_blank">Google Software Infrastructure Dubbed Obsolete by ex-Employee</a></li>
<li><em><a href="http://www.theregister.co.uk/2011/06/23/google_moves_off_the_google_file_system/" target="_blank">Google Moves Off the Google File System</a></em></li>
<li><em><a href="http://www.google.co.uk/intl/en/landing/internetstats/" target="_blank">Google Internet Stats</a></em></li>
<li><em><a href="http://www.businessblogshub.com/2010/10/google-statistics-yes-they-are-very-big/" target="_blank">Google Statistics</a></em></li>
<li><em><a href="http://www.splashnology.com/article/google-plus-killer-facts-and-statistics-inforgaphics/2689/" target="_blank">Google Plus &#8212; Killer Facts and Statistics</a></em></li>
<li><em><a href="http://www.youtube.com/t/press_statistics" target="_blank">YouTube statistics</a></em></li>
<li><a href="http://www.alexa.com/siteinfo/google.com" target="_blank"><em>Alexa on Google</em></a></li>
<li><a href="http://www.internetworldstats.com/stats.htm" target="_blank"><em>Internet World Stats</em></a></li>
<li><em><a href="http://www.google.com/finance?fstype=bi&amp;cid=694653" target="_blank">Google Inc. financials</a></em></li>
<li><em><a href="http://www.geekwire.com/2011/stats-hotmail-top-worldwide-gmail-posts-big-gains" target="_blank">Hotmail still on top worldwide; Gmail gets bigger</a></em></li>
<li><a href="http://www.datacenterknowledge.com/archives/2011/08/01/report-google-uses-about-900000-servers/" target="_blank"><em>Google Server Count</em></a></li>
<li><em><a href="http://www.datacenterknowledge.com/archives/2009/10/20/google-envisions-10-million-servers/" target="_blank">Google Envisions 10 Million Servers</a></em></li>
<li><a href="http://www.datacenterknowledge.com/archives/2008/03/27/google-data-center-faq/" target="_blank"><em>Google Data Center FAQ</em></a></li>
</ul>
<h3>Бонус: типичный первый год кластера в Google</h3>
<ul>
<li>~1/2 перегрева (большинство серверов выключаются в течении 5 минут, 1-2 дня на восстановление)</li>
<li>~1 отказ распределителя питания (~500-1000 резко пропадают, ~6 часов на восстановление)</li>
<li>~1 передвижение стойки (много передвижений, 500-100 машин, 6 часов)</li>
<li>~1 перепрокладка сети (последовательной отключение ~5% серверов на протяжении 2 дней)</li>
<li>~20 отказов стоек (40-80 машин мгновенно исчезают, 1-6 часов на восстановление)</li>
<li>~5 стоек становится нестабильными (40-80 машин сталкиваются с 50% потерей пакетов)</li>
<li>~8 запланированных технических работ с сетью (при четырех могут случаться случайные получасовые потери соединения)</li>
<li>~12 перезагрузок маршрутизаторов (потеря DNS и внешних виртуальных IP на несколько минут)</li>
<li>~3 сбоя маршрутизаторов (восстановление в течении часа)</li>
<li>Десятки небольших 30-секундных пропаданий DNS</li>
<li>~1000 сбоев конкретных серверов (~3 в день)</li>
<li>Много тысяч сбоев жестких дисков, проблем с памятью, ошибок конфигурации и т.п.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-google-2011/feed/</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>Есть вопросы?</title>
		<link>http://www.insight-it.ru/masshtabiruemost/est-voprosy/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/est-voprosy/#comments</comments>
		<pubDate>Fri, 25 Nov 2011 22:54:10 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[Вопросы и ответы]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1453</guid>
		<description><![CDATA[Недавно несколько человек довольно независимо друг от друга подтолкнули меня к новой странице-рубрике на Insight IT. Как не трудно догадаться по заголовку, это F.A.Q. по высоконагруженным проектам и связанным темам. Я не считаю себя истиной в последней инстанции, так что публикую этот анонс, чтобы попросить Вас, лояльных читателей, помочь мне в составлении данного несомненно полезного [...]]]></description>
			<content:encoded><![CDATA[<div class="frame"><img class="alignnone size-full wp-image-1463" title="FAQ" src="http://www.insight-it.ru/wp-content/uploads/2011/11/FAQ.jpg" alt="" width="630" height="208" /></div>
<p>Недавно несколько человек довольно независимо друг от друга подтолкнули меня к новой странице-рубрике на Insight IT. Как не трудно догадаться по заголовку, это <strong><a href="http://www.insight-it.ru/highload/voprosy-i-otvety/">F.A.Q. по высоконагруженным проектам</a></strong> и связанным темам.</p>
<p><em>Я не считаю себя истиной в последней инстанции, так что публикую этот анонс, чтобы попросить Вас, лояльных читателей, помочь мне в составлении данного несомненно полезного для общества материала. Очень хотелось бы увидеть дополнения, поправки и комментарии к моим ответам, а также предложения по поводу новых вопросов и под-тем, которые стоило бы осветить.</em></p>
<p>Текущая версия состоит из тех вопросов, которые мне задавали в последнее время. В дальнейшем я постараюсь дополнить её более старыми вопросами от читателей и клиентов, но в большей степени я все же надеюсь на вашу поддержку <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<div class="frame">Еще раз ссылка на основной материал: <strong><a href="http://www.insight-it.ru/highload/voprosy-i-otvety/" target="_blank">Вопросы и ответы</a></strong></p>
<p>Комментарии здесь закрываю, все обсуждение этой темы по ссылке.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/est-voprosy/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>10 известных масштабируемых архитектурных шаблонов</title>
		<link>http://www.insight-it.ru/masshtabiruemost/10-izvestnykh-masshtabiruemykh-arkhitekturnykh-shablonov/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/10-izvestnykh-masshtabiruemykh-arkhitekturnykh-shablonov/#comments</comments>
		<pubDate>Wed, 23 Nov 2011 20:42:22 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1410</guid>
		<description><![CDATA[&#171;Масштабируемость&#187; &#8212; одна из самых трудно достижимых характеристик при построении архитектуры современных программных продуктов. Что не удивительно, ведь не существует единого рецепта масштабируемости, который работал бы для всех возможных сценариев. Как же быть? Тем не менее, список наиболее распространенных рецептов или &#171;шаблонов&#187;, применяемых на практике, вполне реалистичен. Пост написан на основе списка из статьи Srinath, помимо простого [...]]]></description>
			<content:encoded><![CDATA[<p><strong>&#171;Масштабируемость&#187;</strong> &#8212; одна из самых трудно достижимых характеристик при построении архитектуры современных программных продуктов. Что не удивительно, ведь не существует единого рецепта масштабируемости, который работал бы для всех возможных сценариев. Как же быть?</p>
<p><span id="more-1410"></span> Тем не менее, список наиболее распространенных рецептов или &#171;шаблонов&#187;, применяемых на практике, вполне реалистичен. Пост написан на основе списка из <a href="http://srinathsview.blogspot.com/2011/10/list-of-known-scalable-architecture.html">статьи Srinath</a>, помимо простого перевода названий я постараюсь своими словами изложить &#171;на пальцах&#187; в чем заключается каждый подход и с чем его едят. В оригинале можно найти ссылки на большие многостраничные работы на английском по практически каждому из шаблонов.</p>
<p>Все нижеизложенные подходы основываются на трех основных принципах: распределении задач, кэшировании промежуточных результатов и отложенном (асинхронном) выполнении части работы.  Пройдемся по порядку:</p>
<ol>
<li><strong>Балансировщики нагрузки + не имеющие ничего общего исполнители:</strong> в данной модели существует некий входящий поток запросов или заявок, которые поступают через балансировщик(и) нагрузки на один из ряда равноправных узлов-исполнителей, которые каким-то образом генерируют результат запроса и отправляют обратно через балансировщик нагрузки или напрямую. В роли балансировщика нагрузки может использоваться DNS round-robin, различные программные или аппаратные решения, а также их комбинации (иерархии).</li>
<li><strong>Балансировщики нагрузки + узлы без состояний + масштабируемое хранилище:</strong> для большинства веб-приложений необходимо сохранять некое состояние, и тогда по сравнению с предыдущей моделью вводят в действие систему хранения данных, также приспособленную для горизонтального масштабирования, зачастую ценой отказа от реляционных и прочих комплексных операций, что сводит её интерфейс к простому взять-положить.</li>
<li><strong>Принцип &#171;равный-равному&#187; (<a href="http://en.wikipedia.org/wiki/Peer-to-peer" target="_blank">P2P</a>):</strong> заключается в самостоятельном распределении данных и/или задач между равнозначными узлами на основе заранее определенного алгоритма; причем клиент зачастую сам является узлом системы (<a href="http://ru.wikipedia.org/wiki/BitTorrent" target="_blank">BitTorrent</a>), либо обращается к произвольному узлу, который становится &#171;агентом&#187; для поиска и делегации конкретного запроса исполнителю (<a href="/tag/cassandra/" target="_blank">Cassandra</a>).</li>
<li><strong>Распределенные очереди:</strong> эта модель основывается на выделении очередей, как отдельных сетевых сервисов; используются либо для передачи произвольных данных между компонентами системы, либо для создания очереди выполнения длительных операций (например конвертации фото/видео/аудио).</li>
<li><strong>Парадигма подписка/публикация:</strong> в системе определяется набор типов событий, одни компоненты системы создают эти события (публикуют сообщения), а другие &#8212; хотят узнавать когда произошло событие определенного типа (подписка на сообщения) и каким-то образом реагировать; реализуется обычно в виде отдельного сетевого сервиса, иногда совмещенного с распределенными очередями.</li>
<li><strong>&#171;Молва&#187; и прочие похожие на жизнь архитектуры:</strong> основная идея заключается в том, что компонентам системы не нужно знать об общей структуре всей сети; узлу достаточно лишь знать о нескольких &#171;соседях&#187;, с которыми он будет напрямую взаимодействовать, а распространение информации внутри системы возможно по принципу &#171;молвы&#187;, то есть цепного распространения через &#171;соседей&#187;; используется, например, для развертывания кода или упрощения конфигурации в больших кластерах.</li>
<li><strong>MapReduce и потоки данных:</strong> изначально MapReduce был предложен <a href="/tag/google/">Google</a> для обработки огромных массивов данных, с которыми они сталкиваются, алгоритм вкратце следующий:
<ul>
<li>Каждый узел в системе считывает с дисков свою часть данных и образует из них пары &#171;ключ-значение&#187;;</li>
<li>Эти пары преобразуются в новые промежуточные пары &#171;ключ-значение&#187; по определенному алгоритму (стадия Map);</li>
<li>Промежуточные пары сортируются и группируются по ключу и для каждого ключа вычисляется новое значение на основе группы промежуточных значений (стадия Reduce);</li>
<li>Результат стадии Reduce обычно и является желаемой информацией, полученной из массива данных, и обычно сохраняется в распределенную файловую систему, либо каким-то образом импортируется в другое хранилище.</li>
</ul>
<p>MapReduce по сути лишь распространенный частный случай обработки потоков данных, который способен решить большую часть аналитических задач. В общем случае процесс обработки потоков данных может иметь любое количество этапов, преобразований и сортировок данных, необходимых для получения результата.</li>
<li><strong>Дерево ответственности:</strong> заключается в разложение общей задачи на подзадачи и рекурсивной делегации их выполнения другим узлам системы, что в итоге и образует дерево; используется как часть некоторых других моделей.</li>
<li><strong>Обработка входящих потоков:</strong> скорее класс задач, чем шаблон, но тем не менее&#8230; есть некие внешние события (например сбои в клиентском ПО), обладающие какими-то характеристиками, информация о которых постоянно и непрерывно поступает в систему, которая должна в реальном времени обрабатывать события и получать на основе этих данных требуемую информацию. Реализуется посредством сети обрабатывающих узлов с общем хранилищем информации.</li>
<li><strong>Масштабируемое хранилище:</strong> их можно рассматривать как отдельный субъект, обладающий свойством масштабируемости; по типам можно выделить базы данных (зачастую не структурированных) и файловые системы.</li>
<li><strong>Разделение ответственности запросов на чтение и на запись (<a href="http://martinfowler.com/bliki/CQRS.html">СQRS</a>):</strong> звучит страшно, на деле еще страшнее, если по-простому, то&#8230; модель основывается на обмене сообщениями между равноправными компонентами, хранении, обработке данных в оперативной памяти, асинхронном масштабируемом хранилище данных для их сохранности и репликации компонент для надежности и отказоустойчивости.</li>
</ol>
<p>Хотелось бы обсудить в комментариях какие из перечисленных моделей Вы чаще всего используете на практике и почему? В чем видите перспективы, преимущества и недостатки каждого? Может быть вспомните еще шаблоны, которые не попали в список?</p>
<p><em>P.S.: Я недавно участвовал в <a href="http://www.igoreremenko.com/vysokonagruzhennye-internet-sajty-voprosy-i-otvety.html" target="_blank">сессии вопросов-ответов</a> про высоконагруженные и не очень интернет проекты, возможно Вам будет интересно почитать. </em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/10-izvestnykh-masshtabiruemykh-arkhitekturnykh-shablonov/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>HighLoad++ 2011</title>
		<link>http://www.insight-it.ru/life/highload-2011/</link>
		<comments>http://www.insight-it.ru/life/highload-2011/#comments</comments>
		<pubDate>Thu, 20 Oct 2011 11:16:46 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[конференции]]></category>
		<category><![CDATA[мероприятия]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1375</guid>
		<description><![CDATA[В этом году я почти до последнего момента не знал попаду ли на HighLoad++, но благодаря поговорке &#171;не имей сто рублей, а имей сто друзей&#187; все же попал в список участников (огромное спасибо Аксане и ВШБИ). По ходу мероприятия написать традиционный отчет не получилось, но лучше поздно, чем никогда Начну, как обычно, с организационных моментов [...]]]></description>
			<content:encoded><![CDATA[<p><div class="frame"><img src="http://www.insight-it.ru/wp-content/uploads/2011/10/highload.jpg" alt="HighLoad++" title="HighLoad++" width="630" height="208" class="alignnone size-full wp-image-1353" /></div><!-- .frame (end) --></p>
<p>В этом году я почти до последнего момента не знал попаду ли на <a href="http://www.highload.ru" target="_blank">HighLoad++</a>, но благодаря поговорке &#171;не имей сто рублей, а имей сто друзей&#187; все же попал в список участников (огромное спасибо <a href="http://www.facebook.com/pruttskova">Аксане</a> и <a href="http://hsbi.ru" target="_blank">ВШБИ</a>). По ходу мероприятия написать традиционный отчет не получилось, но лучше поздно, чем никогда <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> <span id="more-1375"></span></p>
<p>Начну, как обычно, с организационных моментов и прочих вещей не по делу. Регистрация заняла ровно 30 секунд, никаких очередей. Удивило, что поленились хоть капельку поменять раздаточные материалы и их дизайн с прошлого года &#8212; выдали абсолютно идентичные прошлогодним пакетик, блокнот и ручку. На входе стоял стенд с ходящей по беговой дорожке топлесс девушкой с бодиартом, которую потом все кому не лень выкладывали в твиттер с соответствующим хэштегом. На том же стенде разыгрывали Mac Pro между теми, кто оставит контакты. К слову, владельцы стенда оказались разработчиками ужасно работающего под Android 3.1 покерного сервиса, ничего более примечательного о них сказать не могу. Стендов, как обычно, было по пальцам пересчитать: пару хостинг-провайдеров и Битрикс ничем особым не выделались, а в Google тоже разыгрывали технику, один из последних смартфонов Samsung, а еще за прохождение теста в Google Docs дарили футболки с надписью <em>&#171;I&#8217;m&nbsp;feeling&nbsp;lucky&#187; </em>на спине &#8212; очень актуально на экзаменах и в казино <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>С WiFi традиционные проблемы почти весь первый день, планшет с 3G спасал ситуацию. Кормили вполне приемлемо, правда ассортимент скудный &#8212; я, наверное, за весь год меньше жареной рыбы съел, чем за эти два дня. Первые три ряда мест в залах были &#171;только для VIP&#187;, которые, как я понял, включали в себя докладчиков и возможно личных знакомых организаторов, причем таких человек было на вскидку меньше 5% участников и в итоге 95% мест пустовали до тех пор, пока все не забили на эту схему. Определенно не самый удачный ход, если уж и бронировать места, то не в таком количестве. Трансляция одного из залов в коридоре &#8212; спорное решение, с одной стороны можно послушать пока ешь, с другой &#8212; общаться мешает капитально, особенно когда собираются &#171;тусовки&#187; вокруг докладчика, например во второй день нужно было сильно напрягаться, чтобы услышать Олега Илларионова в кулуарах.</p>
<p>Перейдем, собственно, к основной тематике конференции, то есть к докладам. В первый день один зал практически полностью был выделен для англоязычных спикеров, что в целом хорошая тенденция. Если бы такое было возможно, то вообще всю конференцию стоило бы перевести на английский &#8212; терминология в родном её варианте звучит намного приятнее и лаконичнее. Оба русскоговорящих докладчика, выступавших в &#171;англоязычном&#187; зале, были тихим ужасом &#8212; даже комментировать их не хочу, просто двум не заслуживающим этого людям дали покрасоваться перед публикой. Английские же доклады были в основном на достаточно высоком уровне.</p>
<p>Швейцарец <strong>Alvaro Videla</strong> делился своим опытом работы с RabbitMQ, я, признаюсь, не особо следил за этим проектом, но подал он его достаточно вкусно и судя по обозначенным векторам развития внимания RabbitMQ все же стоит.</p>
<p>Второй докладчик, <strong>Buddy Brewer</strong>, повествовал о тестировании скорости отрисовки страниц в браузерах как искусственно (посредством диаграммы загрузки компонентов страницы в виде водопада), так и вживую на пользователях (посредством window.performance.timing, о котором я почему-то раньше не слышал, и различных Javascript-библиотек). </p>
<p><strong>Robert Treat</strong> из OmniTI выступил намного хуже, чем в прошлом году, довольно скучно рассказывал про PostgreSQL и мало кому нужные ньюансы работы с ним, хотя доклад назывался совсем по-другому.</p>
<p>После обеда шел доклад <strong>Domas Mituzas</strong>, простого DBA из Facebook, хотя в прошлом году выступал более высокопоставленный представитель. Речь шла на этот раз про MySQL, в частности про основные проблемы и доработки, сделанные в форке от Facebook, также затрагивался вопрос грядущего в следующем году MySQL 5.6.</p>
<div class="frame alignleft"><img src="http://www.insight-it.ru/wp-content/uploads/2011/10/berkus.jpg" alt="Josh Berkus" title="Josh Berkus" width="150" height="150" class="alignnone size-full wp-image-1359" /></div>
<p><strong>Josh Berkus</strong> в этом году выступил более удачно, не зря ему дали выступить дважды. Первый был довольно специфичным, но от этого не менее интересным, основной темой был довольно узкий класс приложений, который он называл firehose applications (пожарный шланг). Они представляют собой сборщики данных в реальном времени для последующей аналитики, было два примера: обработчик отчетов о критических сбоях в Mozilla Firefox и анализ работы ферм ветряных мельниц. Забавно оказалось их сравнение с традиционными сайтами:</p>
<ul>
<li>в сайтах главное, чтобы данные из базы всегда можно было хотя бы прочитать, и в случае сбоев или плановых работ её делают доступной только для чтения;</li>
<li>в обсуждаемых же приложениех главное записать все поступающие данные, а пользовательский интерфейс в целом можно запланированно и не очень отключать &#8212; кому какое дело, если интерфейс для аналитических отчетов не работал 8 часов в ночь с субботы на воскресенье?</li>
</ul>
<p>В его решениях обычно использовался та или иная форма NoSQL хранилищ, для сбора текущих данных и PostgreSQL для хранения уже обработанных отчетов и предоставления их пользователям. Второй доклад Josh&#8217;а был менее формальным и был посвящен вопросам SQL vs NoSQL, что по сути свелось к тому, что наличие SQL-интерфейса &#8212; дело десятое при выборе СУБД для конкретного проекта, важнее понимать другие особенности каждого конкретного хранилища данных.</p>
<p>Mi***ft в этом году, как и Facebook, сменил докладчика, но это не уберегло их от очередного провала. Хоть и после доклада появилось-таки несколько вопросов от аудитории, но разработчиков по-прежнему в целом мало интересует тематика проприетарного ПО, даже при поддержке PHP и Hyper-V. Продавать простым смертным у них получается намного лучше, чем продавать специалистам.</p>
<div class="frame alignright"><img src="http://www.insight-it.ru/wp-content/uploads/2011/10/virding.jpg" alt="Robert Virding" title="Robert Virding" width="150" height="150" class="alignnone size-full wp-image-1357" /></div>
<p><strong>Robert Virding</strong> был, пожалуй, одним из лучших докладчиков первого дня. Хоть я и неплохо знаком с Erlang, но послушать о нем из уст одного из создателей &#8212; невероятно увлекательно, как-будто переживаешь на своей шкуре историю целого языка программирования. Robert очень подробно объяснил чуть ли не каждое ключевое решение, принятое при проектировании и разработке Beam, основной реализации виртуальной машины Erlang, а также освятил несколько альтернативных воплощений этого языка в жизнь.</p>
<p>После чего были как раз два русских доклада, о которых я решил не рассказывать и второй доклад Josh&#8217;а, о котором я уже написал чуть выше. Первый день завершал фуршет от одного из спонсоров конференции: пиво я принципиально не пью, а на виски настроения особо не было, так что слегка перекусил и даже не стал дожидаться выступления приглашенной группы.</p>
<p>Второй день был полностью &#171;на русском&#187;. Первый зал на 100% состоял из размусоливаний различных систем хранения данных &#8212; не знаю хорошо это или плоха, вопрос актуальный, но то что очень однообразно и об одном и том же &#8212; факт. Второй зал был по-разнообразнее, но я там был всего на двух с половиной докладах.</p>
<p>Я немного опоздал на первый доклад от <strong>mail.ru</strong>, но, судя по всему, не много потерял &#8212; они снова пропагандировали свое детище, Tarantool, на этот раз в сравнении с Redis. Штука довольно интересная, но каких-то особых преимуществ перед последним я так и не увидел или, может быть, не хотел увидеть.</p>
<p>Представители <strong>Skype</strong> рассказывали о своем опыте работы с Redis и, в частности, о конкретном кейсе с решардингом &#171;на живую&#187; &#8212; довольно увлекательно, красивое решение с фильтрующим replication proxy, которое правда скорее всего скоро потеряет актуальность при текущем направлении развития проекта Redis. Сам активно им пользуюсь, но что-то подобное проделывать пока не приходилось.</p>
<p><strong>Владимир Климонтович</strong> рассказал довольно подробно о проекте Apache Cassandra, правда ничего нового я не услышал &#8212; все что было сказано легко можно найти на официальном сайте проекта, что я в свое время и сделал.</p>
<p>На докладе <strong>OpenStat</strong> я тупо сидел в Интернете, особо не вслушиваясь &#8212; после их же доклада в прошлом году слушать еще раз примерно о тех же заморочках с Apache Hadoop было не особо интересно, особенно если учесть, что я в 2008-м с ним очень плотно работал.</p>
<p>После обеда произошел мой &#171;трансфер&#187; во второй зал. <strong>Комсомольская правда</strong> прямо-таки ужаснула совковостью своей реализации и служила скорее анти-примером, а упоминавшиеся проблемы и их решения были очень спорными.</p>
<p><div class="frame alignleft"><img src="http://www.insight-it.ru/wp-content/uploads/2011/10/illarionov.jpg" alt="Олег Илларионов" title="Олег Илларионов" width="150" height="150" class="alignnone size-full wp-image-1358" /></div><!-- .frame (end) -->Выступление <strong>Вконтакте</strong> стало снова лучшим на конференции, не смотря на отсутствие Павла Дурова. <strong>Олег Илларионов</strong>, хоть и является, как я понял, просто разработчиком, но хорошо ориентируется в технической реализации проекта и очень доходчиво рассказывает &#8212; представлять компанию на HL++ его отправляют совершенно оправданно. Основная тема доклада звучала как <strong>AJAX Layout</strong> и по сути отражала основное техническое изменение на Вконтакте за последний год: навигация через # плюс обновления и чат в реальном времени. Опять же, не могу похвастаться реализацией чего-то подобного на своей практике, как-то не приходилось, но давно хотелось выделить на это время, так что информация оказалась невероятно актуальной. Про серверную часть было сказано очень мало: чистый C и epoll, мол при их нагрузках по-другому никак. Хотя мне кажется Erlang справился бы лучше, правда не факт, что у них есть соответствующие разработчики. Основной ад данной задачи находится на клиентской стороне:
<ul>
<li>кроссбраузерное сохранение работы кнопок вперед/назад/перезагрузить без полной перезагрузки страниц,</li>
<li>кроссбраузерное же постоянное соединение браузера с сервером (используют long polling, websocket по очевидным причинам пока практически не применим),</li>
<li>сохранение корректной работы с выключенным JavaScript и в &#171;необычных&#187; браузерах,</li>
<li>выдача нового контента частями через скрытый iframe для улучшения визуальной скорости загрузки страницы,</li>
<li>эмуляция процесса загрузки страницы через динамический favicon,</li>
<li>очистка памяти при переходах между страницами,</li>
<li>использование одного постоянного соединения для нескольких вкладок посредством локального хранилища из HTML5</li>
</ul>
<p>&#8230;и многие другие проблемы и задачи &#8212; все это довольно подробно Олег разложил по полочкам. Помимо этого он рассказал как реализован поиск по друзьям внутри браузера через выгрузку списка друзей в JSON, а также целая куча вопросов о том о сем, например про почту и все ту же &#171;волшебную&#187; базу данных на C. Новую <a href="/masshtabiruemost/arkhitektura-vkontakte/">статью про Вконтакте</a> я в этом году не планировал, так что особо не записывал, хотя возможно и зря. Выступление Олега слегка продлили, так как следующий докладчик куда-то пропал, но по факту когда он нашелся выступление про новомодный Node.js оказалось не очень и большая часть зала перекочевала &#171;в кулуары&#187; дальше слушать Олега и задавать ему вопросы.</p>
<p>После кофе-брейка я вернулся в первый зал, где продолжалась эпопея с хранением данных. <strong>Одноклассники</strong> наконец-то поняли, что их старинное решение на BerkleyDB + Java RMI &#8212; не панацея от всех болезней, и перешли на другое решение для одной из задач, хранения изображений, не менее самопальное. Задумка была в основном в замене BerkleyDB на традиционные блобы фиксированного размера, аналогично решению в Facebook, при этом остальная схема работы изменилась не сильно &#8212; доступ к системе через HTTP посредствам Tomcat, внутри правда отказались от RMI в пользу сокетов и собственного протокола, для хранения конфигурации &#8212; Apache Zookeper, типичный для Java-мира наборчик. Из интересных решений &#8212; использование JBOD с созданием уникального идентификатора винчестера и возможностью переткнуть любой из них в другой сервер. В остальном ничего особенного: лог транзакций, репликация, индекс в памяти посредством собственной реализации HashMap и т.п.</p>
<p>Последний доклад, который я послушал, был слегка похож на предыдущий, с той лишь разницей, что хостинг-провайдер <strong>Clodo</strong> не стал изобретать велосипед и воспользовался &#171;полуфабрикатом&#187; под названием Openstack Swift &#8212; хранилище бинарных объектов с HTTP интерфейсом, которыми вполне могут быть и изображения. Доклад был о том как они его допиливали, в основном посредством использования nginx и его модулей. К слову, посмотрел их цены (возможно скоро <strong>Insight IT</strong> придется снова переезжать, приглядываюсь к вариантам) и был разочарован, очень существенно выше рынка не смотря на неизвестность компании, в такой ситуации наоборот логичнее было бы демпинговать&#8230;</p>
<p>В целом впечатления от конференции положительные, процент стоящих докладов близок к 20-30%, что для технических конференций очень прилично. Организация и контингент тоже на уровне. Но нельзя не сказать про ценник (21к за живое участие и 11к за онлайн-трансляцию) &#8212; он явно рассчитан на оплату работодателями и посещение конференции за собственный счет определенно того не стоит. Альтернативные варианты попасть на мероприятие хоть и есть, но довольно ограничены &#8212; каждый раз приходится изворачиваться, чтобы попасть бесплатно при отсутствии работодателя. Хотя может быть надо было просто заморочиться и попасть в список &#171;информационной поддержки&#187;&#8230;</p>
<p><em>Кстати, в этом году в первый раз ко мне начали подходить незнакомые люди и благодарить за блог &#8212; очень приятно <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<p>До встречи на GDD через пару дней!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/life/highload-2011/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>6 способов порадовать инвестора</title>
		<link>http://www.insight-it.ru/masshtabiruemost/6-sposobov-poradovat-investora/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/6-sposobov-poradovat-investora/#comments</comments>
		<pubDate>Fri, 29 Apr 2011 21:27:00 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1310</guid>
		<description><![CDATA[&#8230;или как не надо масштабировать интернет-проекты Недавно наткнулся на полу-поучительный и полу-юмористический материал по масштабируемости интернет-проектов. Кому-то он может показаться, как и мне, забавным, а кому-то &#8212; в таком формате может оказаться легче воспринимать информацию. Надеюсь тебе тоже понравится, так что спешу поделиться как переводом, так и оригинальным видео =) На конференции O&#8217;Reilly MySQL CE 2011 [...]]]></description>
			<content:encoded><![CDATA[<h2 style="text-align: right;">&#8230;или как не надо масштабировать интернет-проекты</h2>
<p>Недавно наткнулся на полу-поучительный и полу-юмористический материал по масштабируемости интернет-проектов. Кому-то он может показаться, как и мне, забавным, а кому-то &#8212; в таком формате может оказаться легче воспринимать информацию. Надеюсь тебе тоже понравится, так что спешу поделиться как переводом, так и оригинальным видео =)<span id="more-1310"></span></p>
<p><div class="frame"><img src="http://www.insight-it.ru/wp-content/uploads/2011/04/scale-fails.jpeg" alt="" title="Scale Fails" width="628" height="250" class="alignnone size-full wp-image-1318" /></div><!-- .frame (end) --></p>
<p>На конференции <a href="http://en.oreilly.com/mysql2011/" target="_blank">O&#8217;Reilly MySQL CE 2011</a> выступил <a href="http://it.toolbox.com/people/josh_berkus/">Josh Berkus</a> c пламенной речью о том, как быть уважаемым и известным, при этом не уделяя ни капли внимания масштабируемости. Его очень сильно удивляет, почему самыми популярными, известными и инвестиционно-привлекательными интернет-компаниями становятся именно те, чей интерфейс неработающего состояния (в частности &#171;киты&#187; и &#171;роботы&#187; у <a href="/tag/twitter/" target="_blank">Twitter</a>), известен больше, чем когда они работают. Так что Josh предлагает всем придерживаться следующей стратегии:</p>
<ul>
<li><strong>Всегда следуй трендам:</strong> используй только те технологии, которые навели больше всего шумихи в Интернете: NoSQL, &#171;облака&#187;, MapReduce,Rails,RabbitMQ. Основным инструментом для выбора технологий должен быть Reddit (или Хабр, если адаптировать к российским реалиям). За что больше голосуют &#8212; то и используйте.</li>
<li><strong>Не следите за текущей ситуацией:</strong> математика и статистика &#8212; абсолютно бесполезны. Мониторинг использования ресурсов, нагрузочное тестирование, отслеживание трафика, тестирование производительности и тонкая настройка &#8212; да кому оно надо? Лучше доверять интуиции &#8212; с какими проблемами мы сталкивались на предыдущей работе, с такими же столкнемся и в этот раз</li>
<li><strong>Ни о чем не беспокойтесь:</strong> параллельное программирование не в моде, даже не смотря на то, что <a href="/tag/erlang/" target="_blank">Erlang</a> позволяет приложениям работать на кластере из тысяч серверов. Крутые ребята не заботятся об оперативной памяти и управлении потоками. Нужно не париться и использовать однопоточные приложения с кучей блокировок, игнорируя области видимости и контексты памяти. Часто обновляющиеся таблицы из одной строки и мастер-очередь, в которую попадают все задания &#8212; лучшие паттерны из всех существующих.</li>
<li><strong>Каждый запрос должен попадать напрямик в базу данных:</strong> кэширование &#8212; твой смертный враг. Каждый запрос должен идти напрямую к СУБД, ни шага в сторону!</li>
<li><strong>Масштабировать нужно невозможные вещи:</strong> масштабирование простых и очевидных вещей &#8212; для слабаков! Это совершенно не круто заниматься масштабированием веб-серверов, кэшей (хотя ими пользоваться и так категорически запрещено) и серверов предложений.</li>
<li><strong>Создавайте точки отказа:</strong> вне зависимости от того, насколько большой ваш проект, в нем обязательно должно быть место, при отказе которого перестанет работать вся система. Лучшие кандидаты на эту роль: балансировщик нагрузки, очередь задач и мастер база данных.</li>
</ul>
<p>Если следовать этим правилам, то ты станешь самым крутым и уважаемым техническим специалистом в команде: ведь у тебя всегда будут истории, где ты как настоящий герой, несмотря на все преграды, проработав все выходные напролет решил-таки поставленную задачу! В противном же случае, если твой код всегда работает и позволяет легко масштабироваться, то, парадоксально, ты будешь просто старым-добрым Васей или Петей, который просто работает и на которого никто не обращает внимания до тех пор, пока он в один прекрасный день не уволится.</p>
<p>Если все нормально с устным восприятием английского, очень рекомендую посмотреть видео &#8212; с эмоциями и более лаконичным техническим английским выглядит намного более впечатляюще:<br />
<object style="height: 390px; width: 640px"><param name="movie" value="http://www.youtube.com/v/nPG4sK_glls?version=3"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed src="http://www.youtube.com/v/nPG4sK_glls?version=3" type="application/x-shockwave-flash" allowfullscreen="true" allowScriptAccess="always" width="640" height="390"></object></p>
<p><strong>Если вы еще не читаете Insight IT регулярно, настоятельно <a href="/feed" target="_blank">рекомендую подписаться на RSS</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/6-sposobov-poradovat-investora/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Кардинальный переворот в архитектуре поиска Twitter</title>
		<link>http://www.insight-it.ru/masshtabiruemost/kardinalnyjj-perevorot-v-arkhitekture-poiska-twitter/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/kardinalnyjj-perevorot-v-arkhitekture-poiska-twitter/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 19:03:13 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Blender]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[netty]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1149</guid>
		<description><![CDATA[Не успел я опубликовать обновление об архитектуре Twitter, как они снова перекроили половину проекта =) На этот раз к паре Ruby+Scala активно вплелись технологии из мира Java. Наибольшим изменениям подверглась подсистема поиска твитов , о которой сегодня и пойдет речь. Новая архитектура поиска твитов Backend Поиск осуществляется теперь не с помощью MySQL-кластера, а посредством версии Lucene, [...]]]></description>
			<content:encoded><![CDATA[<p>Не успел я опубликовать <a href="/masshtabiruemost/arkhitektura-twitter-dva-goda-spustya/" target="_blank">обновление об архитектуре Twitter</a>, как они снова перекроили половину проекта =) На этот раз к паре <a href="/tag/ruby/" target="_blank">Ruby</a>+<a href="/tag/scala/" target="_blank">Scala</a> активно вплелись технологии из мира <a href="/tag/java/" target="_blank">Java</a>. Наибольшим изменениям подверглась подсистема поиска твитов , о которой сегодня и пойдет речь.<span id="more-1149"></span><br />
<div class="frame"><a href="http://www.insight-it.ru/wp-content/uploads/2011/04/twits.jpg"><img title="twits" src="http://www.insight-it.ru/wp-content/uploads/2011/04/twits.jpg" alt="Twitter" width="628" height="350" /></a></div><!-- .frame (end) --></p>
<h2>Новая архитектура поиска твитов</h2>
<h3>Backend</h3>
<h2><span style="font-size: 13px; font-weight: normal;">Поиск осуществляется теперь не с помощью <a href="/tag/mysql/" target="_blank">MySQL</a>-кластера, а посредством версии <a href="/tag/lucene/" target="_blank">Lucene</a>, адаптированной для работы в реальном времени.  Разработка этой подсистемы началась весной прошлого года, но полноценно использоваться она начала лишь недавно. </span></h2>
<p><span style="font-size: 13px; font-weight: normal;">Так как поиск в Twitter является одной из самых часто используемых поисковых систем в мире (более миллиарда поисковых запросов в день), то требования к новой системе поиска были сопоставимо строгими:</span></p>
<ul>
<li>Обработка более 12000 запросов в секунду</li>
<li>Индексация потока в 1000 новых твитов в секунду</li>
<li>Задержка между написанием твита и его появлением в индексе должна быть менее 10 секунд</li>
</ul>
<p>Lucene была взята за основу, так как на сегодняшний день это одно из лучших решений для реализации поиска в мире opensource. Но в текущей ее реализации она не была приспособлена к поиску в реальном времени. Команде Twitter пришлось переписать существенную часть основных структур в памяти, особенно списки записей. При этом внешний API Lucene остался неизменным, что позволило использовать поисковые алгоритмы в практически неизменном виде. Среди основных изменений в Lucene можно выделить:</p>
<ul>
<li>значительно улучшена производительность сбора мусора;</li>
<li>структуры и алгоритмы более не используют блокировки;</li>
<li>списки записей с поддержкой обхода в обратном направлении;</li>
<li>эффективное раннее прекращение обработки запроса.</li>
</ul>
<p>Все вышеперечисленные изменения находятся в процессе публикации обратно в Lucene, какие-то прямо в основную ветку, какие-то в отдельную для поиска в реальном времени.</p>
<p>После внедрения этой системы поиск стал потреблять лишь 5% доступных ему ресурсов, что оставило приличный запас для роста даже по меркам невероятно быстро развивающегося Twitter. Новая подсистема индексации способна обрабатывать в 50 раз больше твитов в секунду, чем они получали на момент запуска, что также является очень позитивным показателем. Помимо улучшения производительности, Lucene повысила и качество поиска,  а также открыла простор для новых улучшений в этом направлении.</p>
<h3>Frontend</h3>
<p>Кардинальный переворот в этой части системы можно описать одной фразой: <a href="/tag/ror/" target="_blank">Ruby on Rails</a> заменен на Java-сервер, который они назвали <a href="/tag/blender/" target="_blank">Blender</a>.</p>
<p>За неделю до развертывания Blender, количество поисков по твитам существенно возрасло из-за #tsunami в Японии. Среднее время поиска достигало 800-900мс.</p>
<p><div class="frame alignleft"><img class="alignnone size-full wp-image-1173" title="Blender_Tsunami" src="http://www.insight-it.ru/wp-content/uploads/2011/04/Blender_Tsunami.jpg" alt="" width="400" height="234" /></div><!-- .frame (end) --></p>
<p>После введения Blender в эксплуатацию среднее время отклика 95% запросов упало втрое: до 250мс, при этом уровень использования вычислительных ресурсов на frontend серверах упал вдвое. Тот же поток запросов стало возможным обрабатывать меньшим количеством серверов.</p>
<p>Чтобы понять, откуда взялся такой прирост производительности, необходимо показать в чем были слабые стороны старого поиска на Ruby on Rails. На каждом frontend сервере было запущено фиксированное количество однопоточных Rails процессов, каждый из которых занимался следующим:<br />
<div class="icon-list icon-crank"></p>
<ul>
<li>обработкой поисковых запросов</li>
<li>синхронным обращением к серверам с индексами</li>
<li>агрегацией и составлением результатов</li>
</ul>
<p></div><!-- .icon-list (end) --></p>
<p>Они давно понимали, что синхронные запросы ведут к неэффективному использованию вычислительных ресурсов. Со временем накопилось много технически неудачных моментов, что делало все сложнее введение нового функционала и поддержание надежности системы. Blender позволил преодолеть эти функции следующим образом:<br />
<div class="icon-list icon-check"></p>
<ul>
<li><strong>Создание полностью асинхронного сервиса агрегации.</strong> Ни один поток не ждет пока осуществятся сетевые операции.</li>
<li><strong>Агрегация результатов с различных сервисов:</strong> индексы поиска в реальном времени, топа твитов и гео-информации, а также базы данных пользователей и твитов.</li>
<li><strong>Элегантная работа с зависимостями сервисов. </strong>Алгоритм обработки запросов автоматически обрабатывает зависимости между используемыми сервисами.</li>
</ul>
<p></div><!-- .icon-list (end) --></p>
<p><strong>Что же, собственно, представляет собой Blender?</strong> Это HTTP и <a href="/tag/thrift/" target="_blank">Thrift</a> сервер, разработанный на основе <a href="/tag/netty/" target="_blank">Netty</a>, масштабируемой неблокирующей клиент-серверной библиотеки на Java, позволяющей легко и быстро разрабатывать клиенты и серверы для различных протоколов. Выбор пал именно на неё, а не на аналоги (например Jetty или Mina) из-за более чистого API, детальной документации и, что более важно, так как некоторые другие сервисы в Twitter уже используют её. Интеграции с Thrift у нее не было, но этот вопрос решился написанием простого кодека, обрабатывающего сообщения на низком уровне.</p>
<p>Обработка  поисковых запросов представляет собой цепочку запросов к внутренним сервисами, обработку ответов и генерацию результата. Внутренние сервисы имеют зависимости, которые можно представить в виде ацикличного направленного графа. После топологической сортировки графа Blender получает последовательность выполнения запросов, которые назначаются к выполнению в поток Netty, что в совокупности с обработчиками событий и образует workflow обработки поисковых запросов.</p>
<h2>Заключение</h2>
<p><div class="frame alignleft"><img title="Blender_workflow" src="http://www.insight-it.ru/wp-content/uploads/2011/04/Blender_workflow.jpg" alt="Blender - схема работы" width="400" height="259" /></div><!-- .frame (end) --><br />
Эта диаграмма демонстрирует текущую архитектуру поиска с использованием Blender и Lucene: все входящие поисковые запросы проходят через аппаратный балансировщик нагрузки и попадают в Blender, где они анализируются и перераспределяются между внутренними сервисами с использованием workflow для обработки зависимостей и генерации результатов.</p>
<p>На моей памяти эти нововведения в Twitter &#8212; практически единственный случай, когда крупный успешный проект настолько кардинально поменял основную часть стека используемых технологий. Да, они получили существенный выигрыш в производительности не в ущерб масштабируемости, но не поменяли же они большую часть команды разработчиков с Ruby-программистов на Java-программистов&#8230; Понятно, что это лишь инструменты, но довольно приличная часть людей, особенно те, кто в возрасте, не способны резко переключиться с привычных технологий на что-то совершенно новое. Хотя, скорее всего, в команде Twitter особо не было разработчиков &#171;за 40&#8243;, так что для них это не было особой проблемой.</p>
<h2>Источник информации</h2>
<ul>
<li><a href="http://engineering.twitter.com/2011/04/twitter-search-is-now-3x-faster_1656.html" target="_blank">Twitter Search 3x Faster</a> (cпасибо Сергею Гуляеву за предоставленную ссылку)</li>
<li><a href="http://engineering.twitter.com/2010/10/twitters-new-search-architecture.html" target="_blank">Twitter&#8217;s New Search Architecture</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/kardinalnyjj-perevorot-v-arkhitekture-poiska-twitter/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Google в цифрах</title>
		<link>http://www.insight-it.ru/masshtabiruemost/google-v-cifrakh/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/google-v-cifrakh/#comments</comments>
		<pubDate>Sun, 03 Apr 2011 17:59:54 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[инфографика]]></category>
		<category><![CDATA[статистика]]></category>
		<category><![CDATA[цифры]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1087</guid>
		<description><![CDATA[Я уже давно ищу информацию для новой версии статьи про Google, которая была первым успешным постом на Insight IT &#8212; скачок в посещаемости был примерно в 50 раз. Не смотря на устаревшую статистику она по-прежнему представляет собой большую практическую пользу, рекомендую прочитать или перечитать. В процессе перерывания зарубежной части интернета в поисках более свежей информации [...]]]></description>
			<content:encoded><![CDATA[<p>Я уже давно ищу информацию для новой версии <a href="/masshtabiruemost/arkhitektura-google/" target="_blank">статьи про Google</a>, которая была первым успешным постом на <strong>Insight IT</strong> &#8212; скачок в посещаемости был примерно в 50 раз. Не смотря на устаревшую статистику она по-прежнему представляет собой большую практическую пользу, рекомендую прочитать или перечитать.</p>
<p>В процессе перерывания зарубежной части интернета в поисках более свежей информации о том, как устроен Google, наткнулся на любопытную инфографику с цифрами, которой и решил с Вами поделиться, чтобы скрасить ожидание нового поста <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<span id="more-1087"></span></p>
<p><a href="/wp-content/uploads/google-by-the-numbers.jpg" target="_blank"><img src="/wp-content/uploads/google-by-the-numbers.small.jpg" width="660" height="3183" alt="Google в цифрах" title="Google в цифрах" /></a></p>
<p><a href="http://www.infographicsshowcase.com/google-by-the-numbers-infographic/" target="_blank">Оригинал</a></p>
<p>Не забываем подписываться на <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/google-v-cifrakh/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Архитектура Stack Exchange Network</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-exchange-network/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-exchange-network/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 12:05:57 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[ASP .NET MVC]]></category>
		<category><![CDATA[Bacula]]></category>
		<category><![CDATA[Beyond Compare 3]]></category>
		<category><![CDATA[Bind]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[CruiseControl.NET]]></category>
		<category><![CDATA[DotNetOpenId]]></category>
		<category><![CDATA[Flot]]></category>
		<category><![CDATA[Google Analytics]]></category>
		<category><![CDATA[HAProxy]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Kiln]]></category>
		<category><![CDATA[LINQ to SQL]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[MarkdownSharp]]></category>
		<category><![CDATA[Mercurial]]></category>
		<category><![CDATA[MS SQL Server 2008]]></category>
		<category><![CDATA[Nagios]]></category>
		<category><![CDATA[Pingdom]]></category>
		<category><![CDATA[Prettify]]></category>
		<category><![CDATA[Razor]]></category>
		<category><![CDATA[reCAPTCHA]]></category>
		<category><![CDATA[Redis]]></category>
		<category><![CDATA[Splunk]]></category>
		<category><![CDATA[SQL Monitor]]></category>
		<category><![CDATA[Ubuntu Server]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[Windows Server 2008]]></category>
		<category><![CDATA[WMD]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1075</guid>
		<description><![CDATA[Stack Exchange Network представляет собой сеть из 46 сайтов вопросов-ответов на совершенно разные темы от программирования до кулинарии. Проект вырос из известной в узких кругах тусовки программистов Stack Overflow, об архитектуре которой я уже рассказывал чуть больше года назад. Проект активно развивается и уже появилось приличное количество новой информации, которой я и спешу с Вами [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://stackexchange.com/" target="_blank">Stack Exchange Network</a> представляет собой сеть из 46 сайтов вопросов-ответов на совершенно разные темы от программирования до кулинарии. Проект вырос из известной в узких кругах тусовки программистов <a href="http://stackoverflow.com/" target="_blank">Stack Overflow</a>, об архитектуре которой <a href="/masshtabiruemost/arkhitektura-stack-overflow/" target="_blank">я уже рассказывал</a> чуть больше года назад. Проект активно развивается и уже появилось приличное количество новой информации, которой я и спешу с Вами поделиться.<br />
<span id="more-1075"></span></p>
<h2>Статистика</h2>
<ul>
<li>95 миллионов просмотров страниц в месяц</li>
<li>800 HTTP запросов в секунду</li>
<li>180 DNS запросов в секунду</li>
<li>Загруженность интернет-канала в 55 Мбит/с</li>
<li>16 миллионов уникальных пользователей в месяц</li>
</ul>
<h2>Технологии</h2>
<h3>Разработка</h3>
<ul>
<li><a href="/tag/c/" target="_blank">C#</a> &#8212; основной язык программирования</li>
<li><a href="/tag/visual-studio/">Visual Studio 2010 Team Suite</a> - IDE</li>
<li><a href="/tag/asp-net/" target="_blank">Microsoft ASP.NET 4.0</a> &#8212; framework</li>
<li><a href="/tag/asp-net-mvc/" target="_blank">ASP.NET MVC 3</a> - web Framework</li>
<li><a href="/tag/razor/" target="_blank">Razor</a> &#8212; генератор шаблонов</li>
<li><a href="/tag/jquery/" target="_blank">jQuery 1.4.2</a> &#8212; JavaScript framework</li>
<li><a href="/tag/linq-to-sql/" target="_blank">LINQ to SQL</a> и немного чистого SQL &#8212; доступ к данным</li>
<li><a href="/tag/mercurial/" target="_blank">Mercurial</a> и <a href="/tag/kiln/" target="_blank">Kiln</a> &#8212; контроль версий исходного кода</li>
<li><a href="/tag/beyond-compare/" target="_blank">Beyond Compare 3</a> &#8212; инструмент для сравнения</li>
</ul>
<h3>Программное обеспечение</h3>
<ul>
<li><a href="http://stackoverflow.com/questions/177901/what-does-wisc-stack-mean">WISC</a> стек получен условно-бесплатно с помощью <a href="http://blog.stackoverflow.com/2009/03/stack-overflow-and-bizspark/">BizSpark</a></li>
<li><a href="/tag/windows-server/" target="_blank">Windows Server</a><a href="/tag/windows-server-2008/" target="_blank">2008 R2 x64</a> &#8212; основная операционная система</li>
<li><a href="/tag/ms-sql-server-2008/" target="_blank">MS SQL Server 2008 R2</a> на <a href="/tag/windows-server-2008/" target="_blank">Windows Server 2008 Enterprise Edition x64</a> &#8212; база данных</li>
<li><a href="/tag/ubuntu-server/" target="_blank">Ubuntu Server</a></li>
<li><a href="/tag/centos/" target="_blank">CentOS</a></li>
<li><a href="/tag/iis/" target="_blank">IIS 7.0</a> &#8212; веб-сервер</li>
<li><a href="/tag/haproxy/" target="_blank">HAProxy</a> &#8212; балансировка нагрузки</li>
<li><a href="/tag/redis/" target="_blank">Redis</a> &#8212; используется как распределенная система кэширования</li>
<li><a href="/tag/cruisecontrol-net/" target="_blank">CruiseControl.NET</a> &#8212; сборки и автоматическая система развертывания кода</li>
<li><a href="/tag/lucene/" target="_blank">Lucene.NET</a> &#8212; полнотекстный поиск</li>
<li><a href="/tag/bacula/" target="_blank">Bacula</a> &#8212; резервное копирование</li>
<li><a href="/tag/nagios/" target="_blank">Nagios</a> (с плагинами <a href="http://n2rrd.diglinks.com/cgi-bin/trac.fcgi" target="_blank">n2rrd</a> и <a href="http://web.taranis.org/drraw/" target="_blank">drraw</a>) для мониторинга</li>
<li><a href="/tag/splunk/" target="_blank">Splunk</a> &#8212; сбор и агрегация логов</li>
<li><a href="/tag/sql-monitor/" target="_blank">SQL Monitor</a> от Red Gate &#8212; мониторинг SQL Server</li>
<li><a href="/tag/bind/" target="_blank">Bind</a> - DNS</li>
<li><a href="/tag/dotnetopenid/" target="_blank">DotNetOpenId</a> &#8212; реализация OpenID на .NET</li>
<li><a href="/tag/wmd/" target="_blank">WMD</a> &#8212; текстовый редактор</li>
<li><a href="/tag/prettify/" target="_blank">Prettify</a> &#8212; подсветка синтаксиса</li>
<li><a href="/tag/markdownsharp/" target="_blank">MarkdownSharp</a> &#8212; обработчик разметки Markdown на C#</li>
<li><a href="/tag/flot/" target="_blank">Flot</a> &#8212; построение графиков на JavaScript</li>
</ul>
<h3>Внешние сервисы</h3>
<ul>
<li><a href="/tag/recaptcha/" target="_blank">reCAPTCHA</a> &#8212; защита от спама</li>
<li><a href="/tag/google/analytics/" target="_blank">Google Analytics</a> &#8212; веб-аналитика</li>
<li><a href="/tag/kiln/" target="_blank">Kiln</a> &#8212; Mercurial хостинг</li>
<li><a href="/tag/pingdom/" target="_blank">Pingdom</a> &#8212; внешний мониторинг и уведомления</li>
<li>CDN не используется, его роль выполняет <a href="http://sstatic.net/">sstatic.net</a>, отдельный домен для статичных файлов SEN без cookie</li>
</ul>
<h2>Оборудование</h2>
<h3>Датацентры</h3>
<ul>
<li>1 стойка в Peak Internet, штат Орегон (чат и обнаружение данных)</li>
<li>2 стойки в Peer 1, Нью-Йорк (остальная часть SEN)</li>
</ul>
<h3>Серверы</h3>
<ul>
<li>10 веб-серверов:
<ul>
<li>Dell R610</li>
<li>1x Intel Xeon Processor E5640 @ 2.66 GHz</li>
<li>16 GB RAM</li>
<li>Windows Server 2008 R2</li>
<li>IIS</li>
</ul>
</li>
<li>2 сервера баз данных:
<ul>
<li>Dell R710</li>
<li>2x Intel Xeon Processor X5680 @ 3.33 GHz</li>
<li>64 GB RAM</li>
<li>8 жестких дисков</li>
<li>MS SQL Server 2008 R2</li>
</ul>
</li>
<li>2 виртуальных сервера для балансировки нагрузки:
<ul>
<li>1x Intel Xeon Processor E5640 @ 2.66 GHz</li>
<li>4 GB RAM</li>
<li>Ubuntu Server</li>
<li>HAProxy</li>
</ul>
</li>
<li>2 сервера для кэша:
<ul>
<li>Dell R610</li>
<li>2x Intel Xeon Processor E5640 @ 2.66 GHz</li>
<li>16 GB RAM</li>
<li>CentOS</li>
<li>Redis</li>
</ul>
</li>
<li>1 сервер для резервного копирования:
<ul>
<li>Dell R610</li>
<li>1x Intel Xeon Processor E5640 @ 2.66 GHz</li>
<li>32 GB RAM</li>
<li>Linux</li>
<li>Bacula</li>
</ul>
</li>
<li>1 сервер для мониторинга, управления и сбора логов:
<ul>
<li>Dell R610</li>
<li>1x Intel Xeon Processor E5640 @ 2.66 GHz</li>
<li>32 GB RAM</li>
<li>Linux</li>
<li>Nagios</li>
</ul>
</li>
<li>2 сервера для виртуализации:
<ul>
<li>Dell R610</li>
<li>1x Intel Xeon Processor E5640 @ 2.66 GHz</li>
<li>16 GB RAM</li>
<li>VMWare ESXi</li>
</ul>
</li>
</ul>
<h3>Сетевое оборудование</h3>
<ul>
<li>2 маршрутизатора на Linux</li>
<li>5 свитчей  Dell PowerConnect</li>
</ul>
<h3>Прочее</h3>
<ul>
<li><a href="http://www.wowwee.com/en/products/tech/telepresence/rovio/rovio">Rovio</a> &#8212; маленький робот, позволяющий удаленным разработчиком посетить офис &#171;виртуально&#187;</li>
</ul>
<h2>Команда</h2>
<ul>
<li>14 разработчиков</li>
<li>2 системных администратора</li>
</ul>
<h2>Что нового?</h2>
<ul>
<li>HAProxy стал использоваться вместо Windows NLB так как HAProxy является быстрым, нересурсоемким, бесплатным решением, которое работает. Полностью прозрачен для серверов, легче обслуживать по сравнению со старым решением, располагается на виртуальных машинах.</li>
<li>CDN не используется, так как даже &#171;недорогие&#187; решения обходятся в очень приличную сумму по сравнению с тем трафиком, который входит в тарифный план хостинг-провайдера. Самое дешевой решение CDN от Amazon обошлось бы как минимум на тысячу долларов в месяц дороже при текущем уровне использования трафика.</li>
<li>Резервное копирование на диски для быстрого восстановления и на кассеты для &#171;истории&#187;.</li>
<li>Полнотекстный поиск в SQL Server плохо интегрируется, нестабилен и обладает низким качеством результатов, так что они перешли на Lucene.</li>
<li>Все сайты в SEN теперь работают на общей платформе: используется общее оборудование и программное обеспечение.</li>
<li>Проект разделен на разные сайты для разных ниш, чтобы полностью изолировать группы аудитории, специализирующиеся в каждой конкретной области.</li>
<li>Используется агрессивное кэширование, большинство страниц кэшируются в виде HTML для анонимных пользователей средствами IIS.</li>
<li>Используется три уровня кэширования: локальный, относящийся к каждому сайту и глобальный.</li>
<li>Локальный кэш доступен только для каждой пары сайт/сервер:
<ul>
<li>Используется для уменьшения сетевых задержек, по сути просто через HttpRuntime.Cache.</li>
<li>Содержит такие вещи как пользовательские сессии, будущие обновления счетчиков просмотров страниц.</li>
<li>Располагается полностью в оперативной памяти веб-сервера.</li>
</ul>
</li>
<li>Кэш сайта доступен для каждого сервера, обрабатывающий запрос к конкретному сайту:
<ul>
<li>Большинство кэшируемых данных располагаются здесь.</li>
<li>Располагается в Redis.</li>
<li>Redis настолько быстр, что большую часть времени доступа к кэшу занимает передача данных по сети.</li>
<li>Данные сжимаются перед отправкой в Redis, так как большинство данных являются строками и у них есть масса свободных вычислительных ресурсов.</li>
<li>Использование процессорных ресурсов на серверах с Redis стремится к нулю.</li>
</ul>
</li>
<li>Глобальный кэш является общим для всех серверов и сайтов:
<ul>
<li>Личные сообщения, квоты по API и несколько других по-настоящему глобальных вещей располагаются здесь.</li>
<li>Также используется Redis.</li>
</ul>
</li>
<li>Большинство данных в кэше удаляются через заданный период времени (обычно в районе нескольких минут) и практически никогда явно не удаляются.</li>
<li>Когда требуется инвалидация кэша на уровне готовых страниц, используется система подписки внутри Redis для отправки сообщений в соответствующую часть системы кэширования.</li>
<li>Для системы ввода-вывода они выбрали Intel X25 SSD в RAID10. RAID решил многие вопросы с надежностью, а SSD показывают отличную производительностью по сравнению с FusionIO при существенно более низкой цене.</li>
<li>Стоимость лицензий используемых продуктов Microsoft составила бы 242 тысячи долларов. Но так как они используют программу BizSpark, им не пришлось платить большую часть этой суммы.</li>
<li>Сетевые карты от Broadcom заменяются на сетевые карты от Intel на основных production серверах. Это решило большинство проблем с потерями соединений, пакетов и таблицами ARP.</li>
</ul>
<h2>Источники информации</h2>
<ul>
<li><a href="http://highscalability.com/blog/2011/3/3/stack-overflow-architecture-update-now-at-95-million-page-vi.html">Stack Overflow Architecture Update &#8212; Now At 95 Million Page Views A Month</a></li>
<li><a href="http://blog.stackoverflow.com/">Stack Overflow Blog</a></li>
<li><a href="http://blog.serverfault.com/post/1432571770/">Stack Overflow’s New York Data Center</a></li>
<li><a href="http://blog.serverfault.com/post/1097492931/">Designing For Scalability of Management and Fault Tolerance</a></li>
<li><a href="http://blog.stackoverflow.com/2011/01/stack-overflow-search-now-81-less-crappy/">Stack Overflow Search — Now 81% Less Crappy</a></li>
<li><a href="http://blog.stackoverflow.com/2011/01/state-of-the-stack-2010-a-message-from-your-ceo/">State of the Stack 2010 (a message from your CEO)</a></li>
<li><a href="http://blog.stackoverflow.com/2010/01/stack-overflow-network-configuration/">Stack Overflow Network Configuration</a></li>
<li><a href="http://meta.stackoverflow.com/questions/69164/does-stackoverflow-use-caching-and-if-so-how">Does StackOverflow use caching and if so, how?</a></li>
<li><a href="http://meta.stackoverflow.com/questions/6435/how-does-stackoverflow-handle-cache-invalidation">How does StackOverflow handle cache invalidation?</a></li>
<li><a href="http://meta.stackoverflow.com/questions/10369/which-tools-and-technologies-build-the-stack-exchange-network">Which tools and technologies build the Stack Exchange Network?</a></li>
<li><a href="http://meta.stackoverflow.com/questions/2765/how-does-stack-overflow-handle-spam">How does Stack Overflow handle spam?</a></li>
<li><a href="http://blog.serverfault.com/post/our-storage-decision/">Our Storage Decision</a></li>
<li><a href="http://meta.stackoverflow.com/questions/4766/how-are-hot-questions-selected">How are “Hot” Questions Selected?</a></li>
<li><a href="http://blog.stackoverflow.com/2010/04/stack-overflow-and-dvcs/">Stack Overflow and DVCS</a></li>
<li><a href="http://chat.stackexchange.com/rooms/127/the-comms-room">Server Fault Chat Room</a></li>
</ul>
<p><strong>Спасибо за внимание! Для оперативного получения свежей информации о <a href="/highload" target="_blank">высоконагруженных интернет-проектах</a> рекомендую <a href="/feed" target="_blank">подписаться на RSS</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-exchange-network/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Архитектура Одноклассников</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-odnoklassnikov/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-odnoklassnikov/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 21:17:30 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[BerkleyDB]]></category>
		<category><![CDATA[C. GWT]]></category>
		<category><![CDATA[IPVS]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jboss]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[LVS]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[openSUSE]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Архитектура Одноклассников]]></category>
		<category><![CDATA[Одноклассники]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1048</guid>
		<description><![CDATA[Сегодня представители Одноклассников расскали о накопленном за 5 лет опыте по поддержанию высоконагруженного проекта. Была опубликована довольно детальная информация о том, как устроена эта социальная сеть для аудитории &#171;постарше&#187;. Далее можно прочитать мою версию материала, либо перейти на оригинал по сссылке. &#160; Платформа Windows и openSUSE &#8212; основные операционные системы Java &#8212; основной язык программирования [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1199" title="odnoklassniki" src="http://www.insight-it.ru/wp-content/uploads/2011/03/odnoklassniki.jpeg" alt="" width="628" height="451" /><br />
Сегодня представители <a href="http://www.odnoklassniki.ru" target="_blank">Одноклассников</a> расскали о накопленном за 5 лет опыте по поддержанию высоконагруженного проекта. Была опубликована довольно детальная информация о том, как устроена эта социальная сеть для аудитории &#171;постарше&#187;. Далее можно прочитать мою версию материала, либо перейти на оригинал <a href="http://habrahabr.ru/company/odnoklassniki/blog/115881/" target="_blank">по сссылке</a>.</p>
<p>&nbsp;<br />
<span id="more-1048"></span></p>
<h2>Платформа</h2>
<ul>
<li><a href="/tag/windows/" target="_blank">Windows</a> и <a href="/tag/opensuse/" target="_blank">openSUSE</a> &#8212; основные операционные системы</li>
<li><a href="/tag/java/" target="_blank">Java</a> &#8212; основной язык программирования</li>
<li><a href="/tag/c/" target="_blank">С/С++</a> &#8212; для некоторых модулей</li>
<li><a href="/tag/gwt/" target="_blank">GWT</a> &#8212; реализация динамического веб-интерфейса</li>
<li><a href="/tag/tomcat/" target="_blank">Apache Tomcat</a> &#8212; сервера приложений</li>
<li><a href="/tag/jboss/" target="_blank">JBoss 4</a> &#8212; сервера бизнес-логики</li>
<li><a href="/tag/lvs/" target="_blank">LVS</a> и <a href="/tag/ipvs/" target="_blank">IPVS</a> &#8212; балансировка нагрузки</li>
<li><a href="/tag/mssql/" target="_blank">MS SQL 2005 и 2008</a> &#8212; основная СУБД</li>
<li><a href="/tag/berkleydb/" target="_blank">BerkleyDB</a> &#8212; дополнительная СУБД</li>
<li><a href="/tag/lucene/" target="_blank">Apache Lucene</a> &#8212; индексация и поиск текстовой информации</li>
</ul>
<h2>Статистика</h2>
<ul>
<li>До 2.8 млн. пользователей онлайн в часы пик</li>
<li>7,5 миллиардов запросов в день (150 000 запросов в секунду в часы пик)</li>
<li>2 400 серверов и систем хранения данных, из которых 150 являются веб-серверами</li>
<li>Сетевой трафик в час пик: 32 Gb/s</li>
</ul>
<h2>Оборудование</h2>
<p>Сервера используются двухпроцессорные с 4 ядрами, объемом памяти от 4 до 48 Гб. В зависимости от роли сервера данные хранятся либо в памяти, либо на дисках, либо на внешних системах хранения данных.</p>
<p>Все оборудование размещено в 3 датацентрах, объединенных в оптическое кольцо. На данный момент на каждом из маршрутов пропускная способность составляет 30Гбит/с. Каждый из маршрутов состоит из физически независимых друг от друга оптоволоконных пар, которые агрегируются в общую “трубу” на корневых маршрутизаторах.</p>
<p>Сеть физически разделена на внутреннюю и внешнюю, разные интерфейсы серверов подключены в разные коммутаторы и работают в разных сетях. По внешней сети HTTP сервера, общаются с Интернетом, по внутренней сети все сервера общаются между собой. Топология внутренней сети – звезда. Сервера подключены в L2 коммутаторы (access switches), которые, в свою очередь, подключены как минимум двумя гигабитными линками к aggregation стеку маршрутизаторов. Каждый линк идет к отдельному коммутатору в стеке. Для того, чтобы эта схема работала, используеться протокол <a href="http://ru.wikipedia.org/wiki/RSTP">RSTP</a>. При необходимости, подключения access коммутаторов к agregation стеку осуществляются более чем двумя линками с использованием link aggregation портов. Aggregation коммутаторы подключены 10Гб линками в корневые маршрутизаторы, которые обеспечивают как связь между датацентрами, так и связь с внешним миром. Используются коммутаторы и маршрутизаторы от компании Cisco.</p>
<p>Для связи с внешним миром используются прямые подключения с несколькими крупнейшими операторами связи, общий сетевой трафик в часы пик доходит до 32Гбит/с.</p>
<h2>Архитектура</h2>
<p>Архитектура проекта имеет традиционную многоуровневую структуру:</p>
<ul>
<li>презентационный уровень;</li>
<li>уровень бизнес-логики;</li>
<li>уровень кэширования;</li>
<li>уровень баз данных;</li>
<li>уровень инфраструктуры (логирование, конфигурация и мониторинг).</li>
</ul>
<p>Код проекта в целом написан на Java, но есть исключения в виде модулей для кэширования на C и C++.<br />
Java был выбран так как он является удобным языком для разработки, доступно множество наработок в различных сферах, библиотек и opensource проектов.</p>
<h3>Презентационный уровень</h3>
<ul>
<li>Используем собственный фреймворк, позволяющий строить композицию страниц на языке Jаvа, с использованием собственные GUI фабрик (для оформления текста, списков, таблиц и портлетов).</li>
<li>Страницы состоят из независимых блоков (обычно портлетов), что позволяет обновлять информацию на них частями с помощью AJAX запросов.</li>
<li>При данном подходе одновременно обеспечивается минимум перезагрузок страниц для пользователей с включенным JavaScript, так и полная работоспособность сайта для пользователей, у которых он отключен.</li>
<li>Google Web Toolkit используется для реальзации функциональные компонент, таких как Сообщения, Обсуждения и Оповещения, а также все динамических элементов (меню шорткатов, метки на фотографиях, сортировка фотографий, ротация подарков и.т.д.). В GWT используются UIBinder и HTMLPanel для создания интерфейсов.</li>
<li>Кешируются все внешние ресурсы (Expires и Cache-Control заголовки). CSS и JavaScript файлы минимизируются и сжимаются (gzip).</li>
<li>Для уменьшения количества HTTP запросов с браузера, все JavaScript и CSS файлы объединяются в один. Маленькие графические изображения объединяются в спрайты.</li>
<li>При загрузке страницы скачиваются только те ресурсы, которые на самом деле необходимы для начала работы.</li>
<li>Никаких универсальных CSS селекторов. Стараются не использовать типовые селекторы (по имени тэга), что повышает скорость отрисовки страниц внутри браузера.</li>
<li>Если необходимы CSS expressions, то пишутся «одноразовые». По возможности избегаются фильтры.</li>
<li>Кешируется обращения к DOM дереву, а так же свойства элементов, приводящие к reflow. Обновляется DOM дерево в «оффлайне».</li>
</ul>
<h2>Уровень бизнес-логики</h2>
<p>На уровне бизнес логики располагаются около 25 типов серверов и компонентов, общающихся между собой через удаленные интерфейсы. Каждую секунду происходит около 3 миллионов удаленных запросов между этими модулями.<br />
Сервера на уровне бизнес логики разбиты на группы. Каждая группа обрабатывает различные события. Есть механизм маршрутизации событий, то есть любое событие или группу событий можно выделить и направить на обработку на определенную группу серверов. При общении серверов между собой используется свое решение, основанное на <a href="http://www.jboss.org/jbossremoting">JBoss Remoting</a>.</p>
<h2>Уровень кэширования</h2>
<p>Для кэширования данных используется самописный модуль odnoklassniki-cache. Он предоставляет возможность хранения данных в памяти средствами Java Unsafe. Кэшируются все данные, к которым происходит частое обращение, например: профили пользователей, списки участников сообществ, информация о самих сообществах, граф связей пользователей и групп, праздники, мета информация о фотографиях и многое другое.Для хранения больших объемов данных в памяти используется память Java off heap memory для снятия ненужной нагрузки с сборщика мусора. Кеши могут использовать локальный диск для хранения данных, что превращает их в высокопроизводительный сервер БД. Кеш сервера, кроме обычных операций ключ-значение, могут выполнять запросы по данным, хранящимся в памяти, минимизируют таким образом передачу данных по сети. Используется map-reduce для выполнения запросов и операций на кластере. В особо сложных случаях, например для реализации запросов по социальному графу, используется язык C. Это помогает повысить производительность.</p>
<p>Данные распределяются между кластерами кеш серверов, а также используется репликация партиций для обеспечения надежности. Иногда требования к быстродействию настолько велики, что используются локальные короткоживущие кеши данных полученных с кеш серверов, расположенные непосредственно в памяти серверов бизнес логики.</p>
<p>Для примера, один сервер, кэширующий граф связей пользователей, в час пик может обработать около 16 600 запросов в секунду. Процессоры при этом заняты до 7%, максимальный load average за 5 минут — 1.2. Количество вершин графа &#8212; более 85 миллионов, связей 2.5 миллиарда. В памяти граф занимает 30 GB.</p>
<h2>Уровень баз данных</h2>
<p>Суммарный объем данных без резервирования составляет 160Тб. Используются два решения для хранения данных: MS SQL и BerkeleyDB. Данные хранятся в нескольких копиях, в зависимости от их типа от двух до четырех. Полное резервное копирование всех данных осуществляется раз в сутки, плюс каждые 15 минут делаются резервные копии новых данных. В результате максимально возможная потеря данных составляет 15 минут.</p>
<p>Сервера с MS SQL объединены в failover кластера, при выходе из строя одного из серверов, находящийся в режиме ожидания сервер берет на себя его функции. Общение с MS SQL происходит посредством JDBC драйверов.</p>
<p>Используются как вертикальное, так и горизонтальное разбиение данных, т.е. разные группы таблиц располагаются на разных серверах (вертикальное партиционирование), а данные больших таблицы дополнительно распределяются между серверами (горизонтальное партиционирование). Встроенный в СУБД аппарат партиционирования не используется — весь процесс реализован на уровне бизнес-логики. Распределенные транзакции не используются — всё только в пределах одного сервера. Для обеспечения целостности, связанные данные помещаются на один сервер или, если это невозможно, дополнительно разработывается логика обеспечения целостности данных. В запросах к БД не используются JOIN даже среди локальных таблиц для минимизации нагрузки на CPU. Вместо этого используется денормализация данных или JOIN происходят на уровне бизнес сервисов, что позволяет осуществлять JOIN как с данными из баз данных, так и с данными из кэша. При проектировании структуры данных не используются внешние ключи, хранимые процедуры и триггеры. Опять же для снижения потребления вычислительных ресурсов на серверах баз данных.<br />
SQL операторы DELETE также используются с осторожностью — это самая тяжелая операция. Данные удаляются чаще всего через маркер: запись сначала отмечается как удаленная, а потом удаляется окончательно с помощью фонового процесса. Широко используются индексы, как обычные, так и кластерные. Последние для оптимизации наиболее высокочастотных запросов в таблицу.</p>
<p>Используется C реализация BerkleyDB версии 4.5. Для работы с BerkleydDB используется своя библиотека, позволяющая организовывать двухнодовые master-slave кластера с использованием родной BDB репликация. Запись происходит только в master, чтение происходит с обеих нод. Данные хранятся в tmpfs, transaction логи сохраняются на дисках. Резервная копия логов делается каждые 15 минут. Сервера одного кластера размещены на разных лучах питания дабы не потерять обе копии одновременно. Помимо прочего, BerkleyDB используется и в роли очереди заданий.</p>
<p>Внутри системы используется взвешенный round robin, а также вертикальное и горизонтальное разбиение данных как на уровне СУБД, так и на уровне кэширования.</p>
<p>В разработке новое решение для хранения данных, так как необходим еще более быстрый и надежный доступ к данным.</p>
<h2>Уровень инфраструктуры</h2>
<p>Для агрегации статистики используется собственная библиотека, основанная на log4j. Сохраняется такая информация, как количество вызовов, среднее, максимальное и минимальное время выполнения, количество ошибок. Данные сохраняются во временные базы, но раз в минуту данные переносятся из них в общий склад данных (data warehouse), а временные базы очищаются. Сам склад реализован на базе решений от Microsoft: MS SQL 2008 и сиситема генерации отчетов Reporting Services. Он расположен на 13 серверах, находящихся в отдельной от production среде. Некоторые из них отвечают за статистику в реальном времени, а некоторые за ведение и предоставление доступа к архиву. Общий объем статистических данных составляет 13Тб. Планируется внедрение многомерного анализа статистики на основе OLAP.</p>
<p>Управление сервисами происходит через самописную централизованную систему конфигурации. Через веб-интерфейс доступно изменение расположения портлетов, конфигурацим кластеров, измениние логики сервисов и прочее. Вся конфигурация сохраняется в базе данных. Каждый из серверов периодически проверяет, есть ли обновления для приложений, которые на нем запущены, и, если есть, применяет их.</p>
<p>Мониторинг логически разделен на две части:</p>
<ul>
<li>Мониторинг сервисов и компонентов</li>
<li>Мониторинг ресурсов, оборудования и сети</li>
</ul>
<p>Система мониторинга сервисов также самописная и основывается на оперативных данных с упомянутого выше склада. Мониторинг ресурсов и здоровья оборудования же онован на Zabbix, а статстистика по использованию ресурсов серверов и сети накапливаетя в Cacti. Для предпринятия мер по устранению чрезвычайных ситуаций работают дежурные, которые следят за всеми основными параметрами. Оповещения о наиболее критичных аномалиях приходят по смс, остальные оповещения отсылаются по емейлу.</p>
<h2>Команда</h2>
<p>Над проектом работают около 70 технических специалистов:</p>
<ul>
<li>40 разработчиков;</li>
<li>20 системных администраторов и инженеров;</li>
<li>8 тестеров.</li>
</ul>
<p>Все разработчики разделены на небольшие команды до 3х человек. Каждая из команд работает автономно и разрабатывает либо какой-то новый сервис, либо работает над улучшением существующих. В каждой команде есть технический лидер или архитектор, который ответственен за архитектуру сервиса, выбор технологий и подходов. На разных этапах к команде могут примыкать дизайнеры, тестеры и системные администраторы.</p>
<p>Разработка ведется итерациями в несколько недель. Как пример жизненного цикла разработки можно привести 3х недельный цикл:</p>
<ol>
<li>определение архитектуры;</li>
<li>разработка, тестирование на компьютерах разработчиков;</li>
<li>тестирование на pre-production среде, релиз на production среду.</li>
</ol>
<p>Практически весь новый функционал делается «отключаемым», типичный процесс запуска новой функциональной возможности:</p>
<ul>
<li>Функционал разрабатывается и попадает в production релиз;</li>
<li>Через централизованную систему конфигурации функционал включается для небольшой части пользователей;</li>
<li>Анализируется статистика активности пользователей, нагрузка на инфраструктуру;</li>
<li>Если предыдущий этап прошел успешно, функционал включается постепенно для все большей аудитории;</li>
<li>Если в процессе запуска собранная статистика выглядет неудовлетворительно, либо непозволительно вырастает нагрузка на инфраструктуру, то функционал отключается, анализируются причины, исправляются ошибки, происходит оптимизация и все повторяется с начала.</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li>В отличии от остальных популярных социальных сетей в Одноклассниках используются технологии, рассчитанные в первую очередь на корпоративный рынок, начиная от обоих СУБД и заканчивая операционными системами.</li>
<li>Во многом этот факт обсулавливает комплексный подход к генерации пользовательского интерфейса, не слишком высокую производительность и многие другие особенности этой социальной сети.</li>
<li>Использование &#171;тяжелых&#187; технологий с самого начала оставило Одноклассники с большим количеством доставшегося по наследству от ранних версий устаревшего кода и купленных давно лицензий на проприетарный софт, которые выступают в роли оков, от которых довольно сложно избавиться.</li>
<li>Возможно эти факторы и являются одними из основных препятствий на пути к завоеванию большей доли рынка и быстрому развитию платформы как в функциональном, так и техническом плане.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-odnoklassnikov/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Архитектура Dropbox</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-dropbox/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-dropbox/#comments</comments>
		<pubDate>Fri, 18 Mar 2011 15:57:55 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ctypes]]></category>
		<category><![CDATA[Dropbox]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[py2app]]></category>
		<category><![CDATA[py2exe]]></category>
		<category><![CDATA[PyObjC]]></category>
		<category><![CDATA[PyWin32]]></category>
		<category><![CDATA[Twisted]]></category>
		<category><![CDATA[wxPython]]></category>
		<category><![CDATA[Архитектура Dropbox]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=1017</guid>
		<description><![CDATA[Совсем недавно я написал практически совсем не технический пост про Dropbox, а тут совершенно случайно наткнулся-таки на техническое выступление их сотрудника на PyCon 2011, которая прошла меньше недели назад. Как не трудно догадаться, залогом успеха Dropbox с технической точки зрения оказался Python. Как же Python оказался в сердце бизнес-модели Dropbox? Dropbox &#8212; это самый простой [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-1018" style="float: left; margin: 2em 1em;" title="Dropbox Logo" src="http://www.insight-it.ru/wp-content/uploads/2011/03/logo.png" alt="Dropbox" width="231" height="60" />Совсем недавно я написал практически совсем не технический пост <a href="/masshtabiruemost/dropbox/" target="_blank">про Dropbox</a>, а тут совершенно случайно наткнулся-таки на техническое выступление их сотрудника на PyCon 2011, которая прошла меньше недели назад. Как не трудно догадаться, залогом успеха Dropbox с технической точки зрения оказался <a href="/tag/python/" target="_blank">Python</a>. Как же Python оказался в сердце бизнес-модели Dropbox? <span id="more-1017"></span> <strong><a href="http://db.tt/4TDAr1L" target="_blank"></a></strong></p>
<h2><strong><a href="http://db.tt/4TDAr1L" target="_blank">Dropbox</a> &#8212; это самый простой способ&#8230;</strong></h2>
<ul>
<li>Хранить файлы в безопасном месте</li>
<li>Делиться файлами с другими людьми</li>
<li>Постоянно иметь к ним доступ вне зависимости от своего месторасположения</li>
</ul>
<h2><strong>Взрывной рост</strong></h2>
<ul>
<li>1 миллион файлов сохраняются в Dropbox каждые 15 минут (по презентации это больше, чем твитов в Twitter за тот же период времени, но это <a href="http://www.insight-it.ru/masshtabiruemost/arkhitektura-twitter-dva-goda-spustya/" target="_blank">несколько преувеличено</a>)</li>
<li>Одно из самых скачиваемых приложений, уступает лишь Skype</li>
<li>Важная часть жизни многих пользователей: &#171;не могу жить без этого&#187;</li>
<li>Рост обеспечен &#171;сарафанным радио&#187;, практически без рекламы</li>
</ul>
<h2>Команда в начале проекта</h2>
<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>Эти качества хорошо сочетаются с итеративной методологией разработки на Python</li>
</ul>
<h2>Ранние достижения</h2>
<ul>
<li>Reverse engineering приложения Finder для Mac OSX 10.4/5 для отображения иконок статуса синхронизации (&#171;в процессе&#187;, &#171;все готово&#187;)</li>
<li>Сложная инфраструктура HTTP нотификаций для избежания регулярного опроса серверов на каждом клиенте, основанная на <a href="/tag/twisted/">Twisted</a></li>
<li> Общая кодовая база, работающая на всех основных операционных системах: Windows, Mac OS, Linux (на основе PyObjC, wxPython, ctypes, py2exe, py2app, PyWin32)</li>
<li>Горизонтально масштабируемое хранилище для информации о файлах на основе <a href="/tag/mysql/" target="_blank">MySQL</a></li>
<li>Собственная инфраструктура для аналитики в реальном времени</li>
<li>Собственный механизм выделения памяти для Python, позволивший сократить её потребление на 90%</li>
</ul>
<h2>Сферы применения Python</h2>
<p>По сути он используется во всех частях проекта:</p>
<ul>
<li>логика backend синхронизации;</li>
<li>клиенты для основных ОС (Windows, Mac, Linux);</li>
<li>контроллер основного сайта;</li>
<li>обработка API запросов;</li>
<li>аналитика.</li>
</ul>
<p>Исключения из-за ограничений по доступной оперативной памяти:</p>
<ul>
<li>Android (мог бы быть Jython)</li>
<li>iPhone (мог бы быть Cpython)</li>
</ul>
<h2>Почему именно Python?</h2>
<ul>
<li><strong>Легок в изучении и понимании:</strong>
<ul>
<li>новые люди легко втягиваются в процесс;</li>
<li>позволяет людям переключаться с проекта на проект.</li>
</ul>
</li>
<li><strong>Легок в написании:</strong> важно для быстрой реализации функционала и выпуска новых версий.</li>
<li><strong>Легок в изменении:</strong>
<ul>
<li>нет необходимости в перекомпиляции;</li>
<li>высокая скорость итерации;</li>
<li>динамическая типизация:
<ul>
<li>рефакторинг очень прост;</li>
<li>уменьшение прямых зависимостей модулей;</li>
<li>динамические инструменты.</li>
</ul>
</li>
</ul>
</li>
<li><strong>Позволяет обеспечивать качество</strong> путем создания более-менее работающей версии продукта и доведения её до качественного уровня путем быстрых итераций.</li>
</ul>
<h2>Не без трудностей</h2>
<blockquote><p>Аргх!!! Python потребляет слишком много оперативной памяти и о-о-очень медленный!</p></blockquote>
<p>На серверной стороне можно вообще не заморачиваться и купить больше оборудования &#8212; всегда помогает. Но для клиентской части такой подход не прокатит, если только Вы не собираетесь купить новые компьютеры и телефоны всем своим клиентам.</p>
<p>Как с этим бороться?</p>
<ul>
<li>Убедитесь, что все длинные внутренние циклы выполняются в C (может сэкономить до 44% процессорного времени)</li>
<li>С оптимизацией потребления вычислительных ресурсов все просто:
<ul>
<li>есть много готовых решений для профайлинга;</li>
<li>проблемный код чаще всего не раскидан по всей кодовой базе.</li>
</ul>
</li>
<li>С оптимизацией потребляемой памяти все сложнее:
<ul>
<li>нет готовых решений для профайлинга память (одновременно в Python и C);</li>
<li>много потенциальных причин для повышенного потребления памяти:
<ul>
<li>утечки в Python и C;</li>
<li>фрагментация памяти;</li>
<li>неэффективное её использование.</li>
</ul>
</li>
<li>Как исправить? Однозначного решения нет &#8212; чаще всего приходится перерывать всю кодовую базу в поисках неоптимальных мест и источников утечек.</li>
<li>Почему память фрагментируется?
<ul>
<li>Большинство объектов расположены в heap памяти (большой последовательный кусок, выделенный приложению);</li>
<li>Много маленьких объектов вперемешку с большими;</li>
<li>Много временных объектов вперемешку с постоянными;</li>
<li>В CPython нет сборщика мусора, позволяющего собрать объекты компактно в одной части heap&#8217;а.</li>
</ul>
</li>
<li>Решением проблемы с фрагментацией стал собственный аллокатор памяти (механизм её выделения под определенные типы объектов):
<ul>
<li>В Dropbox обнаружили, что большая часть heap-памяти захламляется контейнерами с метаданными файлов, которые синхронизируется;</li>
<li>Было решено вынести их куда-нибудь еще;</li>
<li>CPython позволяет управлять процессом выделения памяти для типов данных расширений;</li>
<li>Делается это с помощью простых структур на C;</li>
<li>&#171;Not Rocket Science, just C code&#187;;</li>
<li>Выделяются области памяти по 4Мб, состоящие из заголовка и буфферов фиксированной длины.</li>
<li>Что насчет внутренней фрагментации?
<ul>
<li>по идее же даже в одном буффере останутся данные, весь блок нельзя будет освободить&#8230;</li>
<li>потенциально этот факт может привести к еще большему расходу оперативной памяти;</li>
<li>но это оказывается не так, если учесть, что все объекты являются временными, то есть живут не долго!</li>
<li>в результате Dropbox редко использует более 100Мб памяти для больших синхронизаций (раньше эта цифра могла достигать 1.5Гб)</li>
</ul>
</li>
<li>Но писать C расширение для каждой структуры данных, которую может понадобиться вынести в отдельный аллокатор &#8212; дело неблагодарное: в результате эта история закончилась изменением type_new() в Objects/typeobject.c для того, чтобы можно было указывать <strong>__use_region_allocator__ = True</strong> для тех классов, которым требуется такой механизм выделения памяти.</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li>Python стал ключом к технической реализации обоих сторон Dropbox: серверной и клиентской.</li>
<li>Залогом успеха является максимальная простота с пользовательской точки зрения: &#171;положил файл в папку и он становится доступен отовсюду&#187;</li>
<li>Dropbox не брали на себя реализацию стороннего функционала, вроде собственно создания хранилища файлов &#8212; используется <a href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a>, что позволило им запуститься очень быстро и стремительно.</li>
<li><em>Лучше решать одну задачу, но качественно, чем много, но так себе!</em></li>
</ul>
<h2>Пользуясь случаем</h2>
<p>Если в процессе прочтения этой статьи у Вас появилось ощущение, что Вам в жизни очень бы пригодилось знание Python для быстрого создания прототипов своих проектов или, может быть, работы в стремительно развивающемся интернет-проекте вроде <a href="http://db.tt/4TDAr1L" target="_blank">Dropbox</a>, могу порекомендовать Вам записаться на <a href="/ustali-ot-figurnykh-skobochek-i-tochek-s-zapyatojj/" target="_blank">мои курсы по Python</a>. Как раз скоро начнется следующий поток <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h2>Источники информации</h2>
<ul>
<li><a href="http://pycon.blip.tv/file/4878722/" target="_blank">Видео</a></li>
<li><a href="https://www.dropbox.com/s/mwxsyxtu9qieboo/pycon%20talk%20minus%20video.pptx" target="_blank">Презентация</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-dropbox/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>HBase в Facebook: 135 миллиардов сообщений в месяц</title>
		<link>http://www.insight-it.ru/masshtabiruemost/hbase-v-facebook-135-milliardov-soobshhenijj-v-mesyac/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/hbase-v-facebook-135-milliardov-soobshhenijj-v-mesyac/#comments</comments>
		<pubDate>Thu, 10 Mar 2011 17:49:07 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[HBase]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=988</guid>
		<description><![CDATA[С тех пор, как я написал пост про Архитектуру Facebook, я как-то перестал активно следить за развитием событий и, как оказалось, зря.  В Facebook ввели новый функционал &#171;социального почтового ящика&#187;, агрегирующий входящие сообщения из электронной почты, мессенджеров, SMS и сообщений на сайте Facebook. Изначально они разрабатывали Cassandra именно для использования в этом проекте, но в [...]]]></description>
			<content:encoded><![CDATA[<p>С тех пор, как я написал пост про<a href="/masshtabiruemost/arkhitektura-facebook/" target="_blank"> Архитектуру Facebook</a>, я как-то перестал активно следить за развитием событий и, как оказалось, зря.  В <a href="/tag/facebook/" target="_blank">Facebook</a> ввели новый функционал <a href="http://blog.facebook.com/blog.php?post=452288242130" target="_blank">&#171;социального почтового ящика&#187;</a>, агрегирующий входящие сообщения из электронной почты, мессенджеров, SMS и сообщений на сайте Facebook. Изначально они разрабатывали <a href="/tag/cassandra/" target="_blank">Cassandra</a> именно для использования в этом проекте, но в итоге этот пост заняла достаточно противоречивая технология: <a href="/tag/hbase/" target="_blank">HBase</a>. HBase одержала вверх над Cassandra, MySQL и многими другими решениями. Как так получилось?</p>
<p><span id="more-988"></span></p>
<p>Используемая в Cassandra логика целостности данных оказалась не достаточно строгой для использования в этом продукте. В Facebook широко используется <a href="/tag/mysql/" target="_blank">MySQL</a>, но производительность существенно снижается с ростом массива данных и увеличением размеров индексов. Возможно они взялись бы за разработку нового решения для этой задачи, но их выбор пал на HBase.</p>
<p>HBase представляет собой горизонтально масштабируемую систему хранения таблиц, поддерживающую высокую частоту обновления строк в массивных наборах данных. Звучит как то что надо, для построения новой системы сообщений в Facebook. В основе модели данных HBase лежит концепция BigTable от <a href="/tag/google/" target="_blank">Google</a>, которая хорошо подходит для поиска строк по идентификаторам, фильтрации и сканированию наборов строк. Из слабых сторон можно назвать отсутствию поддержки сложных запросов, но этот факт компенсируется широким спектром инструментов по аналитике, в том числе и <a href="/tag/hive/" target="_blank">Hive</a>, разработанном в самом Facebook для работы с их многопетабайтным хранилищем данных. Помимо прочего HBase основана на <a href="/tag/apache/" target="_blank">Apache</a> <a href="/tag/hadoop/" target="_blank">Hadoop</a> и <a href="/tag/hdfs/">HDFS</a>, с которыми Facebook и так активно работает для анализа данных.</p>
<p>Это решение было принято не на пустом месте, а так как они <em>отслеживали</em> как используется данный функционал и пришли к выводу, что это то, что им нужно. Им нужна была система, справляющаяся с двумя типичными ситуациями:</p>
<ul>
<li>Небольшой нестабильный набор временных данных</li>
<li>Постоянно растущий архив информации, который очень редко используется</li>
</ul>
<p>Звучит правдоподобно. Обычно входящие сообщения читаются один раз, и очень редко к ним возвращаются снова. Напрашивается использование двух разных систем для каждого случая, но на практике оказалось, что HBase отлично справляется с обоими. Полнотекстный поиск же, скорее всего, переложен на одну из сторонних систем вроде Lucene.</p>
<p>HBase:</p>
<ul>
<li>имеет более подходящую модель консистентности, чем Cassandra;</li>
<li>отлично масштабируется и показывает неплохую производительность при паттернах использования в FB;</li>
<li>имеет ряд преимуществ благодаря использованию HDFS для хранения данных: репликация, проверка целостности, автоматическая перебалансировка;</li>
<li>легко поддерживать в Facebook, так как их системные администраторы уже имеют большой опыт со смежными проектами &#8212; Hadoop и HDFS.</li>
</ul>
<p>Для хранения прикрепленных файлов используется Haystack, их собственная система, изначально разработанная для хранения изображений.</p>
<p>Для сбора сообщений из различных источников используется собственный сервер приложений.</p>
<p>Поиск новых пользователей основан на <a href="/tag/zookeper/" target="_blank">ZooKeeper</a>.</p>
<p>Продукт тесно с другими сервисами Facebook для:</p>
<ul>
<li>Проверка адресов электронной почты</li>
<li>Определения отношений дружбы</li>
<li>Настроек приватности</li>
<li>Решений о транспорте для отправки сообщения (e-mail, SMS, внутреннее сообщение)</li>
</ul>
<p>Использование смежных проектов Hadoop и Hive стало одним из ключевых факторов, повлиявших на то, что эта технология прижилась как часть экосистемы в таком крупном проекте, как Facebook. Это идеальный сценарий для практически любого продукта: стать партнером успешного популярного продукта в надежде на то, что пользователь воспользуется обоими за компанию &#8212; именно по такому пути развивается HBase.</p>
<p>Хочется добавить пару слов от себя: я имел довольно приличный опыт работы с HBase в (уже) далеком 2008 году, на тот момент HBase был самым нестабильным из всех проектов, составляющих экосистему Hadoop. На бумаге HBase и правда выглядит идеальным решением для многих задач, но малейший сбой в метаданных делал всю базу данных неработоспособной, а таковое случалось достаточно часто, обычно по вине HDFS. В том проекте было убито массу времени на попытки &#171;нормализовать&#187; работу связки Hadoop+HBase, но в итоге от последней пришлось отказаться. Очень рад, что этот проект развивается такими семимильными шагами, задумка у проекта изначально была и правда очень стоящая. HBase буквально за пару лет стал пригоден для production использования, да еще и на таком масштабе.  Пройдет еще год-другой, кардинально изменится архитектура Hadoop в лучшую сторону, и HBase наверняка станет лучшей из распределенных систем хранения структурированных данных, доступных на рынке. Если, конечно, Google к тому времени не успеет опубликовать в opensource её прародителя, BigTable <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>А Вы как относитесь к HBase? Использовали ли на практике? Какие впечатления?</strong></p>
<h2>Источники информации</h2>
<ul>
<li><a href="http://highscalability.com/blog/2010/11/16/facebooks-new-real-time-messaging-system-hbase-to-store-135.html" target="_blank">Facebook&#8217;s New Real-Time Messaging System: HBase To Store 135+ Billion Messages A Month</a></li>
<li><a href="http://www.facebook.com/notes/facebook-engineering/the-underlying-technology-of-messages/454991608919" target="_blank">The Underlying Technology of Messages</a></li>
<li><a href="http://blog.facebook.com/blog.php?post=452288242130" target="_blank">See The Messages That Matter</a></li>
<li><a href="http://facility9.com/2010/11/18/facebook-messaging-hbase-comes-of-age" target="_blank">Facebook Messaging &#8212; HBase Comes of Ag</a>о</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/hbase-v-facebook-135-milliardov-soobshhenijj-v-mesyac/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Dropbox</title>
		<link>http://www.insight-it.ru/masshtabiruemost/dropbox/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/dropbox/#comments</comments>
		<pubDate>Sun, 06 Mar 2011 21:31:01 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=969</guid>
		<description><![CDATA[Dropbox &#8212; самый простой способ синхронизации файлов между компьютерами и людьми. Очень давно хотел написать пост про Dropbox, наверное с тех пор как начал пользоваться этим сервисом. Хоть они и у всех на слуху, но сами ведут себя довольно скрытно в плане публикации информации о себе. Я даже писал им на почту, чтобы выяснить более [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://db.tt/CrYxGYr" target="_blank"><img class="alignleft size-full wp-image-977" style="float: left; margin: 2em 1em;" title="Dropbox" src="http://www.insight-it.ru/wp-content/uploads/2011/03/dropbox_logo.gif" alt="Dropbox" width="200" height="206" /></a><a href="http://db.tt/CrYxGYr" target="_blank">Dropbox</a> &#8212; самый простой способ синхронизации файлов между компьютерами и людьми.</p>
<p>Очень давно хотел написать пост про <a href="http://db.tt/CrYxGYr" target="_blank">Dropbox</a>, наверное с тех пор как начал пользоваться этим сервисом. Хоть они и у всех на слуху, но сами ведут себя довольно скрытно в плане публикации информации о себе. Я даже писал им на почту, чтобы выяснить более подробно про технические вопросы, но меня тупо игнорят <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' /> </p>
<p>В итоге не смотря на недостаток информации я решил все же кратенько написать про этот стартап, так как он на самом деле заслуживает внимания. У Вас будет возможность отдохнуть от массы технических деталей <a href="/masshtabiruemost/arkhitektura-twitter-dva-goda-spustya/" target="_blank">после предыдущего поста про Twitter</a> <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<span id="more-969"></span></p>
<h2>Статистика</h2>
<ul>
<li>Прыжок от ста тысяч на момент запуска до 4 миллионов занял всего 15 месяцев:
<ul>
<li>35% регистраций с реферальной программы</li>
<li>20% от разшаренных папок и других виральных возможностей</li>
</ul>
</li>
<li>Первый миллион пользователей был набран за 7 месяцев</li>
<li>На рекламу потрачено 1149$</li>
<li>За первые 30 дней реферальной программы пользователи отправили 2.8 миллионов прямых приглашений</li>
</ul>
<h2>Как они получили инвестиции?</h2>
<p>Эту историю наверняка все уже слышали, но мне кажется нельзя писать об этом проекте не упомянув её. Предыстория такова: Dropbox стартовал в 2007 году, когда на рынке было уже несколько десятков решений для хранения данных в &#171;облаках&#187;.</p>
<p>Приходит будущий генеральный директор (<a href="http://www.slideshare.net/gueste94e4c/dropbox-startup-lessons-learned-3836587" target="_blank">Drew</a>) в венчурный фонд (VC):</p>
<ul>
<li>VC: Существуют миллионы стартапов, занимающихся хранением данных в облаках!</li>
<li>Drew: Вы пользуетесь хоть одним из них?</li>
<li>VC: Нет</li>
<li>Drew: &#8230;</li>
</ul>
<p>Основным залогом успеха Dropbox является тот факт, что он представляет собой &#171;minimum viable product&#187;, то есть самым простым продуктом, из тех, которые имеют смысл. Конкуренты были слишком сложны в использовании, имели массу настроек, когда Dropbox просто создает на компьютере папку и все, любые файлы, которые там находятся будут безопасно зарезервированы и синхронизированы со всеми подключенными компьютерами.</p>
<h2>Когда &#171;лучшие практики&#187; не являются лучшими</h2>
<p>После публичного запуска в сентябре 2008го было запланировано:</p>
<ul>
<li>Попасть в TechCrunch50</li>
<li>Купить контекстной рекламы в Google AdWords</li>
<li>Нанять PR-агенство</li>
</ul>
<p>Собственно они пошли по этому пути, наняли опытного человека, разбирающегося в контексте, заменили бесплатную учетную запись на бесплатный ограниченный триал для тех, кто придет по рекламе и запустили рекламную кампанию.</p>
<p>По результатам посчитали стоимость привлеченного клиента, которых было в районе 4, и получилось что-то в районе 250-300$ за продукт, который стоит 100$ в год. <strong>Epic fail.</strong></p>
<p>Почему так получилось?</p>
<ul>
<li>На самых очевидных ключевых словах высокая конкуренция со стороны аналогичных стартапов, спонсируемых венчурными фондами.</li>
<li>Длинный хвост имел небольшой объем на тот момент</li>
<li>Скрытие возможности бесплатного использования сводило людей с толку</li>
<li>Партнерские программы, баннеры и прочее тоже толком не работали</li>
</ul>
<p>На самом деле проблема не в AdWords:</p>
<ul>
<li>Никто не просыпается утром с мыслями вроде &#171;как бы было здорово не таскать с собой флешку или отправлять самому себе письма с приложенными файлами&#187;</li>
<li>Подобные проекты существовали и раньше, но никто не ищет специально решения таких незначительных проблем</li>
<li>Поиск &#8212; это способ удовлетворения потребности, а не её создания</li>
</ul>
<h2>Как они получают клиентов без вложений в рекламу?</h2>
<p>Например, новость об открытии регистрации на закрытую бету в марте 2008го набрала 12000 голосов на Digg, что повысило число зарегистрировавшихся с 5000 до 75000 буквально за один день</p>
<p>Типичный пользователь Dropbox:</p>
<ul>
<li>Узнает о Dropbox от друзей, знакомых, в блоге или на форуме</li>
<li>Устанавливает и пробует его</li>
<li>&#171;Я и не знал, что мне это может быть нужно&#187;</li>
<li>&#171;И правда работает!&#187;</li>
<li>Неожиданно для себя оказывается доволен и рассказывает об этом друзьям</li>
</ul>
<p>Я, наверное, типичный представитель <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Как только Dropbox поняли, как это происходит на самом деле, они кардинально поменяли маркетинговую стратегию:</p>
<ul>
<li>Они дали пользователям механизмы, чтобы проще распространять &#171;любовь&#187; к сервису</li>
<li>Реферальная программа с бонусами обоим сторонам увеличила количество регистраций на 60%</li>
<li>Опросы, сплит-тестирование, оптимизация процесса регистрации и главной страницы</li>
<li>Большие инвестиции в аналитику</li>
</ul>
<h2>Техническая сторона медали</h2>
<p>Команда Dropbox практически полностью состоит из разработчиков. При этом они не стали разрабатывать даже собственную систему хранения файлов, обеспечения, биллинга.</p>
<p>Dropbox технически так же прост, как и идеологически:</p>
<ul>
<li>Примитивный сайт из нескольких страниц с минимальными возможностями для зарегистрированных пользователей</li>
<li><a href="https://www.dropbox.com/developers" target="_blank">API</a> представляет собой минимальный функционал по управлению файлами + аутентификация и информация об аккаунте</li>
<li>Физически файлы хранятся в <a href="http://aws.amazon.com/s3/" target="_blank">Amazon S3</a></li>
<li>Безопасность обеспечивается за счет AES-256 шифрования и повсеместного использования HTTPS</li>
<li>Основной упор в разработке делается на простоту и качество работы клиентских программ, которых разработано уже достаточно много как для всех основных операционных систем, так и для большинства распространенных мобильных платформ</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li>Самый большой риск &#8212; сделать что-то, что никому не нужно</li>
<li>Долго не запускать проект &#8212; больно, но не узнать нужен ли он пользователям &#8212; фатально</li>
<li>Как можно скорее дайте что-то пользователям (не обязательно код) и получите отклик максимально быстро</li>
<li>Узнайте где тусуется Ваша аудитория и постарайтесь общаться с ней в естественной среде обитания</li>
<li>Много стимулов развивать проект &#171;традиционным путем&#187;, но далеко не всегда то, что работает для большинства, сработает и в Вашем случае</li>
<li><em>Основная суть проекта должна оставаться таковой вне зависимости от обстоятельств</em></li>
</ul>
<p><em>Спасибо за внимание, подписывайтесь на <a href="/feed" target="_blank">RSS</a> или <a href="http://twitter.com/blinkov" target="_blank">Twitter</a> &#8212; будете всегда в курсе новых материалов!</em></p>
<p><sub>P.S.: Этот пост посвящается Анечке)</sub></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/dropbox/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Архитектура Twitter. Два года спустя.</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-twitter-dva-goda-spustya/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-twitter-dva-goda-spustya/#comments</comments>
		<pubDate>Sat, 05 Mar 2011 17:47:27 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[featured]]></category>
		<category><![CDATA[Flock]]></category>
		<category><![CDATA[FlockDB]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HBase]]></category>
		<category><![CDATA[Kestrel]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Pig]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Scribe]]></category>
		<category><![CDATA[Twitter]]></category>
		<category><![CDATA[Unicorn]]></category>
		<category><![CDATA[архитектура Twitter]]></category>
		<category><![CDATA[интернет-проекты]]></category>
		<category><![CDATA[социальная сеть]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=942</guid>
		<description><![CDATA[В далеком 2008м я уже публиковал статью про архитектуру Twitter, но время летит стремительно и она уже абсолютно устарела. За это время аудитория Twitter росла просто фантастическими темпами и многое поменялось и с технической точки зрения. Интересно что новенького у одного из самых популярных социальных интернет-проектов? Статистика 3 год, 2 месяца и 1 день потребовалось [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.insight-it.ru/wp-content/uploads/2011/03/twitter.png"><img class="aligncenter size-full wp-image-959" title="Twitter" src="http://www.insight-it.ru/wp-content/uploads/2011/03/twitter.png" alt="Twitter" width="430" height="126" /></a></p>
<p>В далеком 2008м я уже публиковал статью про <a href="/net/scalability/arkhitektura-twitter/" target="_blank">архитектуру Twitter</a>, но время летит стремительно и она уже абсолютно устарела. За это время аудитория Twitter росла просто фантастическими темпами и многое поменялось и с технической точки зрения. Интересно что новенького у одного из самых популярных социальных интернет-проектов?<span id="more-942"></span></p>
<h2>Статистика</h2>
<ul>
<li>3 год, 2 месяца и 1 день потребовалось Twitter, чтобы набрать 1 миллиард твитов</li>
<li>На сегодняшний день, чтобы отправить миллиард твитов пользователям нужна всего одна неделя</li>
<li>752% рост аудитории за 2008 год</li>
<li>1358% рост аудитории за 2009 год (без учета API, по данным comScore)</li>
<li>175 миллионов зарегистрированных пользователей на сентябрь 2010 года</li>
<li>460 тысяч регистраций пользователей в день</li>
<li>9й сайт в мире по популярности (по данным Alexa, год назад был на 12 месте)</li>
<li>50 миллионов твитов в день год назад, 140 миллионов твитов в день месяц назад, 177 миллионов твитов в день на 11 марта 2011г.</li>
<li>Рекорд по количеству твитов за секунду 6939, установлен через минуту после того, как Новый Год 2011 наступил в Японии</li>
<li>600 миллионов поисков в день</li>
<li>Лишь 25% трафика приходится на веб сайт, остальное идет через API</li>
<li>Росто числа мобильных пользователей за последний год 182%</li>
<li><strong>6 миллиардов</strong> запросов к API в день, около 70 тысяч в секунду</li>
<li>8, 29, 130, 350, 400 &#8212; это количество сотрудников Twitter на январь 2008, январь 2009, январь 2010, январь и март 2011, соответственно</li>
</ul>
<p>Самая свежая <a href="http://blog.twitter.com/2011/03/numbers.html" target="_blank">статистика про Twitter</a>.</p>
<h2>Платформа</h2>
<ul>
<li><a href="/tag/apache/" target="_blank">Apache</a> + mod_proxy</li>
<li><a href="/tag/unicorn/" target="_blank">Unicorn</a></li>
<li><a href="/tag/ruby/" target="_blank">Ruby</a> + <a href="/tag/ror/" target="_blank">Ruby on Rails</a></li>
<li><a href="/tag/scala/" target="_blank">Scala</a></li>
<li><a href="/tag/flock/" target="_blank">Flock</a></li>
<li><a href="/tag/memcached/" target="_blank">memcached</a></li>
<li><a href="/tag/kestrel/" target="_blank">Kestrel</a></li>
<li><a href="/tag/mysql/" target="_blank">MySQL</a></li>
<li><a href="/tag/cassandra/" target="_blank">Cassandra</a></li>
<li><a href="/tag/scribe/" target="_blank">Scribe</a></li>
<li><a href="/tag/hadoop/" target="_blank">Hadoop</a>, <a href="/tag/hbase/" target="_blank">HBase</a> и <a href="/tag/pig/" target="_blank">Pig</a></li>
</ul>
<p>Сравните с аналогичным разделом предыдущей статьи о Twitter &#8212; увидите много новых лиц, подробнее ниже.</p>
<h2>Оборудование</h2>
<ul>
<li>Сервера расположены в NTT America</li>
<li>Никаких облаков и виртуализации, существующие решения страдают слишком высокими задержками</li>
<li>Более тысячи серверов</li>
<li>Планируется переезд в собственный датацентр</li>
</ul>
<h2>Что такое твит?</h2>
<ul>
<li>Сообщение длиной до 140 символов + метаданные</li>
<li>Типичные запросы:
<ul>
<li>по идентификатору</li>
<li>по автору</li>
<li>по @упоминаниям пользователей</li>
</ul>
</li>
</ul>
<h2>Архитектура</h2>
<h3><a href="http://www.insight-it.ru/wp-content/uploads/2011/03/twitter-request-flow.jpeg"><img class="aligncenter size-medium wp-image-953" title="Процесс обработки запроса в Twitter" src="http://www.insight-it.ru/wp-content/uploads/2011/03/twitter-request-flow-293x300.jpg" alt="Процесс обработки запроса в Twitter" width="293" height="300" /></a></h3>
<h3>Unicorn</h3>
<p>Сервер приложений для Rails:</p>
<ul>
<li>Развертывание новых версий кода <strong>без простоя</strong></li>
<li>На 30% меньше расход вычислительных ресурсов и оперативной памяти, по сравнению с другими решениями</li>
<li>Перешли с mod_proxy_balancer на mod_proxy_pass</li>
</ul>
<h3>Rails</h3>
<p>Используется в основном для генерации страниц, работа за сценой реализована на чистом Ruby или Scala.</p>
<p>Столкнулись со следующими проблемами:</p>
<ul>
<li>Проблемы с кэшированием, особенно по части инвалидации</li>
<li>ActiveRecord генерирует не самые удачные SQL-запросы, что замедляло время отклика</li>
<li>Высокие задержки в очереди и при репликации</li>
</ul>
<h3>memcached</h3>
<ul>
<li>memcached не идеален. Twitter начал сталкиваться с Segmentation Fault в нем очень рано.</li>
<li>Большинство стратегий кэширования основываются на длинных TTL (боллее минуты).</li>
<li>Вытеснение данных делает его непригодным для важных конфигурационных данных (например флагов &#171;темного режима&#187;, о котором пойдет речь ниже).</li>
<li>Разбивается на несколько пулов для улучшения производительности и снижения риска вытеснения.</li>
<li>Оптимизированная библиотека для доступа к memcached из Ruby на основе libmemcached + FNV hash, вместо чистого Ruby и md5.</li>
<li>Twitter является одним их наиболее активных проектов, участвующих в разработке libmemcached.</li>
</ul>
<h3>MySQL</h3>
<ul>
<li>Разбиение больших объемов данных является тяжелой задачей.</li>
<li>Задержки в репликации и вытеснение данных из кэша является причиной нарушения целостности данных с точки зрения конечного пользователя.</li>
<li>Блокировки создают борьбу за ресурсы для популярных данных.</li>
<li>Репликация однопоточна и происходит недостаточно быстро.</li>
<li>Данные социальных сетей плохо подходят для реляционных СУБД:
<ul>
<li>NxN отношения, социальный граф и обход деревьев &#8212; не самые подходящие задачи для таких баз данных</li>
<li>Проблемы с дисковой подсистемой (выбор файловой системы, noatime, алгоритм планирования)</li>
<li>ACID практически не требуется</li>
<li>Для очередей также практически непригодны</li>
</ul>
</li>
<li>Twitter сталкивался с большими проблемами касательно таблиц пользователей и их статусов</li>
<li>Читать данные с мастера при Master/Slave репликации = медленная смерть</li>
</ul>
<h3>FlockDB</h3>
<p>Масштабируемое хранилище для данных социального графа:</p>
<ul>
<li>Разбиение данных через Gizzard</li>
<li>Множество серверов MySQL в качестве низлежащей системы хранения</li>
<li>В Twitter содержит 13 миллиардов ребер графа и обеспечивает 20 тысяч операций записи и 100 тысяч операций чтения в секунду</li>
<li>Грани хранятся и индексируются в обоих направлениях</li>
<li>Поддерживает распределенный подсчет количества строк</li>
<li><a href="https://github.com/twitter/flockdb" target="_blank">Open source!</a></li>
</ul>
<p>Среднее время на выполнение операций:</p>
<ul>
<li>Подсчет количества строк: 1мс</li>
<li>Временные запросы: 2мс</li>
<li>Запись: 1мс для журнала, 16мс для надежной записи</li>
<li>Обход дерева: 100 граней/мс</li>
</ul>
<p>Подробнее про эволюцию систем хранения данных в Twitter <a href="http://www.slideshare.net/nkallen/q-con-3770885" target="_blank">в презентации Nick Kallen</a>.</p>
<h3>Cassandra</h3>
<p>Распределенная система хранения данных, ориентированная на работу в реальном времени:</p>
<ul>
<li>Изначально разработана в <a href="/tag/facebook/" target="_blank">Facebook</a></li>
<li>Очень высокая производительность на  запись</li>
<li>Из слабых сторон: высокая задержка при случайном доступе</li>
<li>Децентрализованная, способна переносить сбои оборудования</li>
<li>Гибкая схема данных</li>
<li><span style="color: #000000;"><del>Планируется полный переход на нее по следующему алгоритму: </del></span>
<ul>
<li><span style="color: #000000;"><del>Все твиты пишутся и в Cassandra и в MySQL</del></span></li>
<li><span style="color: #000000;"><del>Динамически часть операций чтения переводится на Cassandra</del></span></li>
<li><span style="color: #000000;"><del>Анализируется реакция системы, что сломалось</del></span></li>
<li><span style="color: #000000;"><del>Полностью отключаем чтение из Cassandra, чиним неисправности</del></span></li>
<li><span style="color: #000000;"><del>Начинаем сначала</del></span></li>
</ul>
</li>
<li><strong><a href="http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html" target="_blank">Обновление:</a> </strong>стратегия по поводу использования Cassandra изменилась, попытки использовать её в роли основного хранилища для твитов прекратились, но она продолжает использоваться для аналитики и географической информации.</li>
</ul>
<p>Подробнее почему Twitter пришел к решению использовать Cassandra можно прочитать <a href="http://www.slideshare.net/ryansking/scaling-twitter-with-cassandra" target="_blank">в отдельной презентации</a>.</p>
<p>Помимо всего прочего Cassandra <span style="color: #000000;"><del>планируется использовать</del></span> используется для аналитики в реальном времени.</p>
<h3>Scribe</h3>
<p>Пользователи Twitter генерируют огромное количество данных, около 15-25 Гб  в минуту, более 12 Тб в день, и эта цифра удваивается несколько раз в год.</p>
<p>Изначально для сбора логов использовали syslog-ng, но он очень быстро перестал справляться с нагрузкой.</p>
<p>Решение нашлось очень просто: <a href="/tag/facebook/" target="_blank">Facebook</a> столкнулся с аналогичной проблемой и разработал проект Scribe, который был опубликован в opensource.</p>
<p>По сути это фреймворк для сбора и агрегации логов, основанный на <a href="/tag/thrift/" target="_blank">Thrift</a>. Вы пишете текст для логов и указываете категорию, остальное он берет на себя.</p>
<p>Работает локально, надежен даже в случае потери сетевого соединения, каждый узел знает только на какой сервер передавать логи, что позволяет создавать масштабируемую иерархию для сбора логов.</p>
<p>Поддерживаются различные системы для записи в данным,  в том числе обычные файлы и HDFS (о ней ниже).</p>
<p>Этот продукт полностью решил проблему Twitter со сбором логов, используется около 30 различных категорий. В процессе использования была создана и опубликована масса доработок. Активно сотрудничают с командой Facebook в развитии проекта.</p>
<h3>Hadoop</h3>
<p>Как Вы обычно сохраняете 12Тб новых данных, поступающих каждый день?</p>
<p>Если считать, что средняя скорость записи современного жесткого диска составляет 80Мбайт в секунду, запись 12Тб данных заняла бы почти 48 часов.</p>
<p>На одном даже очень большом сервере данную задачу не решить, логичным решением задачи стало использование кластера для хранения и анализа таких объемов данных.</p>
<p>Использование кластерной файловой системы добавляет сложности, но позволяет меньше заботиться о деталях.</p>
<p>Hadoop Distributed File System (HDFS) предоставляет возможность автоматической репликации и помогает справляться со сбоями оборудования.</p>
<p>MapReduce framework позволяет обрабатывать огромные объемы данных, анализируя пары ключ-значение.</p>
<p>Типичные вычислительные задачи, которые решаются с помощью Hadoop в Twitter:</p>
<ul>
<li>Вычисление связей дружбы в социальном графе (grep и awk не справились бы, self join в MySQL на таблицах с миллиардами строк &#8212; тоже)</li>
<li>Подсчет статистики (количество пользователей и твитов, например подсчет количества твитов занимает 5 минут при 12 миллиардах записей)</li>
<li>Подсчет PageRank между пользователями для вычисления репутации.</li>
</ul>
<p>В твиттер используется бесплатный дистрибутив от Cloudera, версия Hadoop 0.20.1, данные храняться <a href="https://github.com/kevinweil/hadoop-lzo" target="_blank">в сжатом по алгоритму LZO виде</a>, библиотеки для работы с данными опубликованы под названием <a href="https://github.com/kevinweil/elephant-bird" target="_blank">elephant-bird</a>.</p>
<h3>Pig</h3>
<p>Для того чтобы анализировать данные с помощью MapReduce обычно необходимо разрабатывать код на Java, что далеко не все умеют делать, да и трудоемко это.</p>
<p>Pig представляет собой высокоуровневый язык, позволяющий трансформировать огромные наборы данных шаг за шагом.</p>
<p>Немного напоминает SQL, но намного проще. Это позволяет писать в 20 раз меньше кода, чем при анализе данных с помощью обычных MapReduce работ.  Большая часть работы по анализу данных в Twitter осуществляется с помощью Pig.</p>
<h3>Данные</h3>
<p>Полу-структурированные данные:</p>
<ul>
<li>логи Apache, RoR, MySQL, A/B тестирования, процесса регистрации</li>
<li>поисковые запросы</li>
</ul>
<p>Структурированные данные:</p>
<ul>
<li>Твиты</li>
<li>Пользователи</li>
<li>Блок-листы</li>
<li>Номера телефонов</li>
<li>Любимые твиты</li>
<li>Сохраненные поиски</li>
<li>Ретвиты</li>
<li>Авторизации</li>
<li>Подписки</li>
<li>Сторонние клиенты</li>
<li>География</li>
</ul>
<p>Запутанные данные:</p>
<ul>
<li>Социальный граф</li>
</ul>
<p><strong>Что же они делают с этим всем?</strong></p>
<ul>
<li>Подсчет математического ожидания, минимума, максимума и дисперсии следующих показателей:
<ul>
<li>Количество запросов за сутки</li>
<li>Средняя задержка, 95% задержка</li>
<li>Распределение кодов HTTP-ответов (по часам)</li>
<li>Количество поисков осуществляется каждый день</li>
<li>Количество уникальных запросов и пользователей</li>
<li>Географическое распределение запросов и пользователей</li>
</ul>
</li>
<li>Подсчет вероятности, ковариации, влияния:
<ul>
<li>Как отличается использование через мобильные устройства?</li>
<li>Как влияет использование клиентов сторонних разработчиков?</li>
<li>Когортный анализ</li>
<li>Проблемы с сайтом (киты и роботы, подробнее ниже)</li>
<li>Какие функциональные возможности цепляют пользователей?</li>
<li>Какие функциональные возможности чаще используются популярными пользователями?</li>
<li>Корректировка и предложение поисковых запросов</li>
<li>A/B тестирование</li>
</ul>
</li>
<li>Предсказания, анализ графов, естественные языки:
<ul>
<li>Анализ пользователей по их твитам, твитов, на которые они подписаны, твитам их фоловеров</li>
<li>Какая структура графа ведет к успешным популярным сетям</li>
<li>Пользовательская репутация</li>
<li>Анализ эмоциональной окраски</li>
<li>Какие особенности заставляют людей ретвитнуть твит?</li>
<li>Что влияет на глубину дерева ретвитов ?</li>
<li>Долгосрочное обнаружение дубликатов</li>
<li>Машинное обучение</li>
<li>Обнаружения языка</li>
</ul>
</li>
</ul>
<p>Подробнее про обработку данных <a href="http://www.slideshare.net/kevinweil/nosql-at-twitter-nosql-eu-2010" target="_blank">в презентации Kevin Weil</a>.</p>
<h3>HBase</h3>
<p>Twitter начинают строить настоящие сервисы на основе Hadoop, например поиск людей:</p>
<ul>
<li>HBase используется как изменяемая прослойка над HDFS</li>
<li>Данные экспортируются из HBase c помощью периодической MapReduce работы:
<ul>
<li>На этапе Map использются также данные из FlockDB и нескольких внутренних сервисов</li>
<li>Собственная схема разбиения данных</li>
<li>Данные подтягиваются через высокопроизводительный, горизонтально масштабируемый сервис на Scala (<a href="http://www.slideshare.net/al3x/building-distributed-systems-in-scala" target="_blank">подробнее о построении распределенных сервисов на Scala</a>)</li>
</ul>
</li>
</ul>
<p>На основе HBase разрабатываются и другие продукты внутри Twitter.</p>
<p>Основными её достоинствами являются гибкость и легкая интеграция с Hadoop и Pig.</p>
<p>По сравнению с Cassandra:</p>
<ul>
<li>&#171;Их происхождение объясняет их сильные и слабые стороны&#187;</li>
<li>HBase построен на основе системы по пакетной обработке данных, высокие задержки, работает далеко не в реальном времени</li>
<li>Cassandra построена с нуля для работы с низкими задержками</li>
<li>HBase легко использовать при анализе данных как источник или место сохранения результатов, Cassandra для этого подходит меньше, но они работают над этим</li>
<li>HBase на данный момент единственную точку отказа в виде мастер-узла</li>
<li>В твиттере HBase используется для аналитики, анализа и создания наборов данных, а Cassandra &#8212; для онлайн систем</li>
</ul>
<h3>Loony</h3>
<p>Централизованная система управления оборудованием.</p>
<p>Реализована с использованием:</p>
<ul>
<li><a href="/tag/python/" target="_blank">Python</a></li>
<li><a href="/tag/django/" target="_blank">Django</a></li>
<li><a href="/tag/mysql/" target="_blank">MySQL</a></li>
<li><a href="http://www.lag.net/paramiko/" target="_blank">Paraminko</a> (реализация протокола SSH на Python, разработана и опубликована в opensource в Twitter)</li>
</ul>
<p>Интегрирована с LDAP, анализирует входящую почту от датацентра и автоматически вносит изменения в базу.</p>
<h3>Murder</h3>
<p>Система развертывания кода и ПО, основанная на протоколе BitTorrent.</p>
<p>Благодаря своей P2P природе позволяет обновить более тысячи серверов за 30-60 секунд.</p>
<h3>Kestrel</h3>
<p>Распределенная очередь, работающая по протоколу memcache:</p>
<ul>
<li>set &#8212; поставить в очередь</li>
<li>get &#8212; взять из очереди</li>
</ul>
<p>Особенности:</p>
<ul>
<li>Отсутствие строгого порядка выполнения заданий</li>
<li>Отсутствие общего состояния между серверами</li>
<li>Разработана на <a href="/tag/scala/" target="_blank">Scala</a></li>
</ul>
<h3>Daemon&#8217;ы</h3>
<p>Каждый твит обрабатывается с помощью daemon&#8217;ов.</p>
<p>В unicorn обрабатываются только HTTP запросы, вся работа за сценой реализована в виде отдельных daemon&#8217;ов.</p>
<p>Раньше использовалось много разных демонов, по одному на каждую задачу (Rails), но перешли к меньшему их количеству, способному решать несколько задач одновременно.</p>
<h3>Как они справляются с такими темпами роста?</h3>
<p>Рецепт прост, но эффективен, подходит практически для любого интернет-проекта:</p>
<ul>
<li><em>обнаружить самое слабое место в системе;</em></li>
<li><em>принять меры по его устранению;</em></li>
<li><em>перейти к следующему самому слабому месту.</em></li>
</ul>
<p>На словах звучит и правда примитивно, но на практике нужно предпринять ряд мер, чтобы такой подход был бы реализуем:</p>
<ul>
<li>Автоматический сбор метрик (причем в агрегированном виде)</li>
<li>Построение графиков (RRD, Ganglia)</li>
<li>Сбор и анализ логов</li>
<li>Все данные должны получаться с минимальной задержкой, как можно более близко к реальному времени</li>
<li>Анализ:
<ul>
<li>Из данных необходимо получать <em>информацию</em></li>
<li>Следить за динамикой показателей: стало лучше или хуже?</li>
<li>Особенно при развертывании новых версий кода</li>
<li>Планирование использования ресурсов намного проще, чем решение экстренных ситуаций, когда они на исходу</li>
</ul>
</li>
</ul>
<p>Примерами агрегированных метрик в Twitter являются &#171;киты&#187; и &#171;роботы&#187;, вернее их количество в единицу времени.</p>
<p><strong>Что такое &#171;робот&#187;?</strong></p>
<p><strong><a href="http://www.insight-it.ru/wp-content/uploads/2011/03/twitter-Bot.png"><img class="aligncenter size-full wp-image-943" title="Twitter Робот" src="http://www.insight-it.ru/wp-content/uploads/2011/03/twitter-Bot.png" alt="Twitter Робот" width="400" height="273" /></a><br />
</strong></p>
<ul>
<li>Ошибка внутри Rails (HTTP 500)</li>
<li>Непойманное исключение</li>
<li>Проблема в коде или нулевой результат</li>
</ul>
<p><strong>Что такое &#171;кит&#187;?</strong></p>
<p><strong><a href="http://www.insight-it.ru/wp-content/uploads/2011/03/whale.png"><img class="aligncenter size-full wp-image-944" title="Twitter Кит" src="http://www.insight-it.ru/wp-content/uploads/2011/03/whale.png" alt="Twitter Кит" width="530" height="398" /></a><br />
</strong></p>
<ul>
<li>HTTP ошибка 502 или 503</li>
<li>В твиттер используется фиксированный таймаут в 5 секунд (лучше кому-то показать ошибку, чем захлебнуться в запросах)</li>
<li>Убитый слишком длинный запрос к базе данных (mkill)</li>
</ul>
<p>Значительное превышение нормального количества китов или роботов в минуту является поводом для беспокойством.</p>
<p>Реализован этот механизм простым bash-скриптом, который просматривает агрегированные логи за последние 60 секунд, подсчитывает количество китов/роботов и рассылает уведомления, если значение оказалось выше порогового значения. Подробнее про работу команды оперативного реагирования <a href="http://www.slideshare.net/netik/billions-of-hits-scaling-twitter" target="_blank">в презентации John Adams</a>.</p>
<h3>&#171;Темный режим&#187;</h3>
<p>Для экстренных ситуаций в Twitter предусмотрен так называемый &#171;темный режим&#187;, который представляет собой набор механизмов для отключения тяжелых по вычислительным ресурсам или вводу-выводу функциональных частей сайта. Что-то вроде стоп-крана для сайта.</p>
<p>Имеется около 60 выключателей, в том числе и полный режим &#171;только для чтения&#187;.</p>
<p>Все изменения в настройках этого режима фиксируются в логах и сообщаются руководству, чтобы никто не баловался.</p>
<h2>Подводим итоги</h2>
<ul>
<li>Не бросайте систему на самотек, начинайте собирать метрики и их визуализировать как можно раньше</li>
<li>Заранее планируйте рост требуемых ресурсов и свои действия в случае экстренных ситуаций</li>
<li>Кэшируйте по максимуму все, что возможно</li>
<li>Все инженерные решения не вечны, ни одно из решений не идеально, но многие будут нормально работать в течение какого-то периода времени</li>
<li>Заранее начинайте задумываться о плане масштабирования</li>
<li>Не полагайтесь полностью на memcached и базу данных &#8212; они могут Вас подвести в самый неподходящий момент</li>
<li>Все данные для запросов в реальном времени должны находиться в памяти, диски в основном для записи</li>
<li>Убивайте медленные запросы (mkill) прежде, чем они убьют всю систему</li>
<li>Некоторые задачи могут решаться путем предварительного подсчета и анализа, но далеко не все</li>
<li>Приближайте вычисления к данным по возможности</li>
<li>Используйте не mongrel, а unicorn для RoR</li>
</ul>
<p><strong>Спасибо за внимание, <a href="/feed/" target="_blank">жду Вас снова</a>! Буду рад, если Вы <a href="http://twitter.com/blinkov" target="_blank">подпишитесь на меня в Twitter</a>, с удовольствием пообщаюсь со всеми читателями <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-twitter-dva-goda-spustya/feed/</wfw:commentRss>
		<slash:comments>60</slash:comments>
		</item>
		<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>Google Megastore</title>
		<link>http://www.insight-it.ru/masshtabiruemost/google-megastore/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/google-megastore/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 17:18:48 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ACID]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[google app engine]]></category>
		<category><![CDATA[Google Megastore]]></category>
		<category><![CDATA[консистентность]]></category>
		<category><![CDATA[репликация]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=826</guid>
		<description><![CDATA[Гигантский шаг в сторону распределенного будущего был предпринят командой Google App Engine в момент их релиза системы хранения данных с повышенным уровнем репликации. Она направленна на критичные для бизнеса приложения, которые требуют расположения копий данных как минимум в трех датацентрах, полной семантики ACID для групп сущностей и ограниченных гарантий консистентности между группами сущностей. Это было [...]]]></description>
			<content:encoded><![CDATA[<p>Гигантский шаг в сторону распределенного будущего был предпринят командой <a href="http://www.appspot.com" target="_blank">Google App Engine</a> в момент их релиза системы хранения данных с повышенным уровнем репликации. Она направленна на критичные для бизнеса приложения, которые требуют расположения копий данных как минимум в трех датацентрах, полной семантики ACID для групп сущностей и ограниченных гарантий консистентности между группами сущностей.<br />
<span id="more-826"></span></p>
<p>Это было большим достижением, ведь всего несколько компаний во всем мире способны на реализацию по-настоящему меж-датацентровой системы хранения данных. Помимо SimpleDB, как много других публично-доступных сервисов баз данных могут хранить информацию в нескольких датацентрах одновременно? Теперь эта возможность доступна каждому. Но всему есть цена: так как Megastore использует втрое больше ресурсов, чем обычное Master-Slave хранилище в GAE, стоимость так же увеличивается в три раза. Помимо этого стоит учитывать, что с ростом надежности и издержек, понижается производительность. Именно из-за этого, новая система хранения является альтернативой обычному хранилищу GAE для критичных задач, а не полной заменой.</p>
<h2>Основные особенности Megastore</h2>
<ul>
<li>Megastore совмещает масштабируемость NoSQL систем хранения данных с удобством традиционных СУБД. Оно использовалось для внутренних проектов Google на протяжении нескольких лет. Более 100 приложений, 3 миллиардов транзакций на запись и 20 миллиардов на чтение, более петабайта данных распределены по множеству датацентров по всему миру.</li>
<li>Megastore &#8212; хранилище, разработанное для удовлетворения требований современных интерактивных онлайн сервисов. Используется синхронная репликация для достижения высокого уровня доступности и консистентности. Вкратце, оно предоставляет полную ACID семантику для удаленных реплик с достаточно низкой задержкой, чтобы использоваться в интерактивных приложениях. Хранилище партиционируется и каждая часть реплицируется отдельно, позволяя достичь полного соответствия ACID внутри партиции, но консистентность между ними гарантируется лишь ограниченно. Предоставляются некоторый функционал традиционных СУБД, такой как вторичные индексы, но только те из них, которые масштабируются без сильного негативного влияния на задержки и которые укладываются в семантику используемой схемы партиционирования.</li>
<li><a href="http://labs.google.com/papers/paxos_made_live.html" target="_blank">Paxos</a> используется для управлением синхронной репликацией между датацентрами. Это позволяет достичь очень высокого уровня надежности ценой повышения времени выполнения операций записи. Обычно Paxos используется только для координации, но в Megastore он также используются и для управления записью данных.</li>
<li>Поддерживается три уровня консистентности при чтении: текущий, снимок и неконсистентный.</li>
<li><a href="http://code.google.com/appengine/docs/python/datastore/entities.html" target="_blank">Группы сущностей</a> являются единицей консистентности и транзакционности. Они рассматриваются как маленькие независимые базы данных. Сами же данные внутри каждого датацентра хранятся в масштабируемом NoSQL хранилище.</li>
<li>Megastore, как и обычное хранилище в GAE, не поддерживает транзакции с использованием нескольких групп сущностей, это существенно повысило бы время их выполнения.</li>
<li>Группы сущностей &#8212; основной механизм группировки данных для быстрого осуществления операций. Их размер и композиция должны быть сбалансированы. В каждом приложении должен найтись способ естественным образом очертить границы групп сущностей. При оптимальном выборе групп сущностей ресурсоемкие кросс-групповые операции будут сведены к минимуму. По сути этот процесс чем-то напоминает нормализацию в реляционных СУБД.</li>
<li>Запросы с высокими требованиями по консистентности должны быть ограничены одной группой сущностей. Кросс-групповые запросу могут вернуть устаревшие результаты. Это является серьезным отличием в поведении от обычного хранилища GAE, где по-умолчанию используется высокий уровень консистентности для всех запросов, так как операции записи и чтения по-умолчанию происходят с мастера.</li>
<li>В обычном хранилище GAE иногда отключается в связи с запланированными техническими работами, а также вовремя непредвиденных проблем с инфраструктурой. Megastore в большинстве случаев не страдает этими проблемами.</li>
<li>Резервирование данных и избыточность достигаются посредством синхронной репликации, снимков и инкрементального лога транзакций.</li>
<li>API для доступа к данным остался прежним.</li>
<li>Операции записи могут достигать секунды для каждой группы сущностей, так что для приложений с высокой нагрузкой на запись оно подходит не так хорошо.</li>
<li>Только новые приложения могут воспользоваться опцией Megastore, существующие приложения необходимо пересоздать, чтобы использовать эту возможность. Впоследствии изменить тип хранилища невозможно.</li>
<li>
<div id="_mcePaste">Одно приложение не может использовать одновременно обычное хранилище и Megastore. Напрашивается использование одного приложения с Google Megastore для критически важных данных, а другое приложение с обычным хранилищем для всего остального, но такая схема противоречит правилам использования сервиса.</div>
</li>
<li>Автоматической миграции данных между Master/Slave хранилищем и Megastore не существует, разработчики приложения должны сами позаботиться об этом. Google предоставляют лишь набор инструментов и примеров кода, чтобы облегчить процесс миграции.</li>
<li>В приложениях, использующих Megastore, еще большее  значение приобретает эффективное кэширование данных.</li>
</ul>
<h2>Материалы по теме</h2>
<ul>
<li><a href="http://highscalability.com/blog/2011/1/11/google-megastore-3-billion-writes-and-20-billion-read-transa.html" target="_blank">Google Megastore &#8212; 3 Billion Writes And 20 Billion Read Transactions Daily</a></li>
<li><a href="http://www.cidrdb.org/cidr2011/Papers/CIDR11_Paper32.pdf" target="_blank">Megastore: Providing Scalable, Highly Available Storage for Interactive Services</a></li>
<li><a href="https://groups.google.com/group/google-appengine-downtime-notify/msg/e9414ee6493da6fb?pli=1" target="_blank">May 25th Datastore Outage Post-mortem</a></li>
<li><a href="http://labs.google.com/papers/paxos_made_live.html" target="_blank">Paxos Made Live – An Engineering Perspective</a></li>
<li><a href="http://code.google.com/appengine/docs/python/datastore/hr/" target="_blank">Choosing a Datastore</a></li>
<li><a href="http://code.google.com/appengine/docs/python/datastore/hr/overview.html" target="_blank">Using the High Replication Datastore</a></li>
<li><a href="http://labs.google.com/papers/bigtable.html" target="_blank">Bigtable: A Distributed Storage System for Structured Data</a></li>
<li><a href="http://highscalability.com/blog/2009/8/24/how-google-serves-data-from-multiple-datacenters.html" target="_blank">How Google Serves Data From Multiple Datacenters</a></li>
<li><a href="http://highscalability.com/blog/2009/3/10/paper-consensus-protocols-paxos.html" target="_blank">Consensus Protocols: Paxos</a></li>
<li><a href="http://groups.google.com/group/google-appengine/browse_thread/thread/5fc3b6a4366de62f/4b4d23e924b7b136?lnk=gst&amp;q=High+Replication+Datastore+for+App+Engine#">Performance comparison</a></li>
</ul>
<hr />
Еще не все возможности Google Megastore полностью доступны пользователям App Engine в виде High Replication Storage, но я думаю это вопрос времени. Хотелось бы пообсуждать в комментариях области применения новинки на практике: какие приложения, критичные к доступности и сохранности данных, можно позволить себе отдать в PaaS, пускай даже от Google?</p>
<p><strong>P.S.: По традиции хочу напомнить, что читать Insight IT удобнее всего <a href="/feed" target="_blank">через RSS-reader</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/google-megastore/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Facebook за 20 минут</title>
		<link>http://www.insight-it.ru/masshtabiruemost/facebook-za-20-minut/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/facebook-za-20-minut/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 04:37:42 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[статистика]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=822</guid>
		<description><![CDATA[Facebook поделились новыми цифрами в конце прошлого года. Что обычно происходит за 20 минут на Facebook? Люди делятся миллионом ссылок Отмечают друзей на 1323 тысячах фотографий Приглашают 1 484 000 знакомых на мероприятиях Отправляют 1 587 000 сообщений на стену Пишут 1 851 000 новых статусов 2 миллиона пар людей становятся друзьями Загружается 2.7 миллиона фотографий [...]]]></description>
			<content:encoded><![CDATA[<p>Facebook <a href="http://www.facebook.com/notes/democracy-uk-on-facebook/a-snapshot-of-facebook-in-2010/172769082761603">поделились новыми цифрами</a> в конце прошлого года.</p>
<h2>Что обычно происходит за 20 минут на Facebook?</h2>
<ul>
<li>Люди делятся миллионом ссылок</li>
<li>Отмечают друзей на 1323 тысячах фотографий</li>
<li>Приглашают 1 484 000 знакомых на мероприятиях</li>
<li>Отправляют 1 587 000 сообщений на стену</li>
<li>Пишут 1 851 000 новых статусов</li>
<li>2 миллиона пар людей становятся друзьями</li>
<li>Загружается 2.7 миллиона фотографий</li>
<li>Появляется 10.2 миллиона комментариев 10,208,000</li>
<li>Отправляется 4 632 000 личных сообщения</li>
</ul>
<h2>За 2010 год:</h2>
<ul>
<li>43 869 800 изменили свой статус на &#171;не женат / не замужем&#187;</li>
<li>3 025 791 изменили свой статус на &#171;все сложно&#187;</li>
<li>28 460 516 изменили свой статус на &#171;есть парень / девушка&#187;</li>
<li>5 974 574 изменили свой статус на &#171;помолвлен&#187;</li>
<li>36 774 801 изменили свой статус на &#171;женат /замужем&#187;</li>
</ul>
<p>Хочется узнать больше? <a href="/masshtabiruemost/arkhitektura-facebook/">Прочитайте статью про архитектуру Facebook</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/facebook-za-20-minut/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Новое поколение MapReduce в Apache Hadoop</title>
		<link>http://www.insight-it.ru/masshtabiruemost/novoe-pokolenie-mapreduce-v-apache-hadoop/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/novoe-pokolenie-mapreduce-v-apache-hadoop/#comments</comments>
		<pubDate>Sat, 19 Feb 2011 18:23:00 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Apache Hadoop]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[кластеризация]]></category>
		<category><![CDATA[кластерные вычисления]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[технологии]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=811</guid>
		<description><![CDATA[В большом бизнесе использование нескольких больших кластеров с финансовой точки зрения более эффективно, чем много маленьких. Чем больше машин в кластере, тем большими наборами данных он может оперировать, больше задач могут выполняться одновременно. Реализация MapReduce в Apache Hadoop столкнулась с потолком масштабируемости на уровне около 4000 машин в кластере. Разрабатывается следующее поколение Apaсhe Hadoop MapReduce,  в [...]]]></description>
			<content:encoded><![CDATA[<div>
<p>В большом бизнесе использование нескольких больших кластеров с финансовой точки зрения более эффективно, чем много маленьких. Чем больше машин в кластере, тем большими наборами данных он может оперировать, больше задач могут выполняться одновременно. Реализация <a href="/tag/mapreduce/" target="_blank">MapReduce</a> в <a href="/tag/apache/" target="_blank">Apache</a> <a href="/tag/hadoop/" target="_blank">Hadoop</a> столкнулась с потолком масштабируемости на уровне около 4000 машин в кластере. Разрабатывается следующее поколение Apaсhe Hadoop MapReduce,  в котором появится общий планировщик ресурсов и отдельный мастер для каждой отдельной задач, управляющий выполнением программного кода. Так как простой оборудования по техническим причинам обходится дорого на таком масштабе, высокий уровень доступности проектируется с самого начала, ровно как и безопасность и многозадачность, необходимые для поддержки одновременного использования большого кластера многими пользователями. Новая архитектура также будет более инновационной, гибкой и эффективной с точки зрения использования вычислительных ресурсов.</p>
<p><span id="more-811"></span></p>
<h2>Предыстория</h2>
<p>Текущая реализация Hadoop MapReduce устаревает на глазах. Основываясь на текущих тенденциях в размерах кластеров и нагрузок на них, JobTracker требует кардинальных доработок, чтобы исправить его дефекты в области масштабируемости, потребления памяти, многопоточности, надежности и производительности. С точки зрения работы с Hadoop при каждом обновлении кластера (даже если это просто багфикс), абсолютно все компоненты кластера, так и приложений, которые на нем работают, должны быть обновлены одновременно. Это так же очень неудобно, так как каждый раз необходимо тестировать все приложения на совместимость с новой версией.</p>
<h2>Требования</h2>
<p>Прежде чем кардинально что-то менять в Hadoop mapreduce, необходимо понять какие же основные требования предъявляются к вычислительным кластерам на практике. Наиболее значительными требованиями к Hadoop следующего поколения являются:</p>
<ul>
<li>Надежность</li>
<li>Доступность</li>
<li>Масштабируемость &#8212; кластеры из как минимум 10 тысяч машин, 200 тысяч вычислительных ядер и даже больше</li>
<li>Обратная и прямая совместимость &#8212; возможность быть уверенным, что приложение будет работать на новой версии так же, как оно работало на старой</li>
<li>Контроль над обновлениями</li>
<li>Предсказуемые задержки</li>
<li>Эффективное использование ресурсов</li>
</ul>
<p>Среди менее значительных требований:</p>
<ul>
<li>Поддержка альтернативных парадигм разработки (помимо MapReduce)</li>
<li>Поддержка сервисов с коротким жизненным циклом</li>
</ul>
<p>Если учесть перечисленные выше требования, то становится очевидно, что инфраструктура обработки данных в Hadoop должна быть кардинальным образом изменена. В сообществе Hadoop люди в целом приходят к общему мнению, что текущая архитектура MapReduce не способна решить текущие задачи, которые перед ней ставится, и что требуется кардинальный рефакторинг кодовой базы.</p>
<h2>MapReduce следующего поколения</h2>
<p>Фундаментальной идеей смены архитектуры является разделение двух основных функций JobTracker&#8217;а на два отдельных части:</p>
<ul>
<li>управление ресурсами;</li>
<li>планирования и мониторинга задач.</li>
</ul>
<div>В итоге появляется несколько новых ролей:</div>
<div>
<ul>
<li><strong>ResourceManager</strong> управляет глобальным распределением вычислительных ресурсов между приложениями;</li>
<li><strong>ApplicationMaster</strong> управляет планированием и координацией внутри приложения;</li>
<li><strong>NodeManager</strong> управляет процессами в рамках одной машины.</li>
</ul>
</div>
<div>ApplicationMaster представляет собой библиотеку, с помощью которой можно получить у ResourceManager квоту на вычислительные ресурсы и работать с NodeManager(ами) для выполнения и мониторинга задач.</div>
<div>ResourceManager поддерживает иерархическим очереди приложений, которым может гарантированно выделяться некоторый процент ресурсов кластера. Его функционал ограничивается планированием, никакого мониторинга и отслеживания задач не происходит, а также нет никаких гарантий перезапуска задач, провалившихся из-за проблем с оборудованием или кодом. Планирование основывается на требованиях, которые выставляет приложение с помощью ряда запросов ресурсов (среди них: запросы на вычислительные ресурсы, память, дисковое пространство, сетевой доступ и т.п.). Обратите внимание, что это значительное изменение по сравнению с текущей моделью слотов фиксированного размера, которая является одной из основных причин неэффективного использования ресурсов кластера на данный момент.</div>
<p>NodeManager &#8212; это агент, который работает на каждой машине и несет ответственность за запуск контейнеров приложений, мониторинг используемых ими ресурсов (плюс отчет планировщику).</p>
<p>По одному ApplicationMaster запускается для каждого приложения, они ответственны за запрос необходимых ресурсов у планировщика, запуск задач, отслеживание статусов, мониторинг прогресса и обработку сбоев.</p>
<h2>Архитектура</h2>
<p><a href="http://www.insight-it.ru/wp-content/uploads/2011/02/MapReduce_NextGen.jpg"><img class="aligncenter size-full wp-image-814" title="Следующее поколение MapReduce " src="http://www.insight-it.ru/wp-content/uploads/2011/02/MapReduce_NextGen.jpg" alt="Следующее поколение MapReduce " width="624" height="386" /></a></p>
<h2>Улучшения по сравнению с текущей реализацией MapReduce</h2>
<h3>Масштабируемость</h3>
<p>Разделение управления ресурсами и прикладными задачами позволяет горизонтально расширять кластер более просто и эффективно. JobTracker проводит значительную часть времени пытаясь управлять жизненным циклом каждого приложения, что часто может приводить к различным происшествиям &#8212; переход к отдельному менеджеру для каждого приложения является значительным шагом вперед.</p>
<p>Масштабируемость особенно важна в свете текущих трендов в оборудовании &#8212; на данный момент Hadoop может быть развернут на кластере из 4000 машин. Но 4000 средних машин 2009го года (т.е. по 8 ядер, 16Гб памяти, 4Тб дискового пространства) только вдвое менее  ресурсоемки, чем 4000 машин 2011го года (16 ядер, 48гб памяти, 24Тб дискового пространства). Помимо этого с точки зрения операционных издержек было выгоднее работать в еще больших кластере от 6000 машин и выше.</p>
<h3>Доступность</h3>
<ul>
<li>ResourceManager использует <a href="http://hadoop.apache.org/zookeeper/" target="_blank">Apache ZooKeeper</a> для обработки сбоев. Когда ResourceManager перестает работать, аналогичный процесс может быстро запуститься на другой машине благодаря тому, что состояние кластера было сохранено в ZooKeeper. При таком сценарии все запланированные и выполняющиеся приложения максимум лишь перезапустятся.</li>
<li>ApplicationMaster &#8212; поддерживается создание точек восстановления на уровне приложений. ApplicationMaster может восстановить работу из состояния, сохраненного в HDFS, в случае сбоя.</li>
</ul>
<h3>Совместимость протокола</h3>
<p>Это позволит различным версиям клиентов и серверов Hadoop общаться между собой. Помимо решения многих существующих проблем с обновлением, в будующих релизах появится возможность последовательного обновления кода без простоя системы в целом &#8212; очень большое достижения с точки зрения системного администрирования.</p>
<h3>Инновационность и гибкость</h3>
<p>Основным плюсом предложенной архитектуры является тот факт, что MapReduce по сути становится просто пользовательской библиотекой. Вычислительная же система (ResourceManager и NodeManager) становятся полностью независимыми от специфики MapReduce.</p>
<p>Клиенты получат возможность одновременного использования разных версий MapReduce в одном и том же кластере. Это становится тривиальным, так как отдельная копия ApplicationMaster&#8217;а запускается для каждого приложения. Это дает гибкость в исправлении багов, улучшений и новых возможностей, так как полное обновление кластер перестает быть обязательной процедурой. Это позволяет клиентам обновлять их приложения до новых версий MapReduce вне зависимости от обновлений кластера.</p>
<p><strong>Эффективность использования вычислительных ресурсов</strong></p>
<p>ResourceManager использует общую концепцию для управления ресурсами и планирования по отношению к каждому конкретному приложению. Каждая машина в кластере на концептуальном уровне рассматривается просто как набор ресурсов: память, процессор, ввод-вывод и др. Все машины взаимозаменяемы и приложение может быть назначено на любую из них, основываясь на доступных и запрашиваемых ресурсах. При этом приложения работают в контейнерах, изолированно от других приложений, что дает сильную поддержку многозадачности.</p>
<p>Таким образом эта схема избавляет от текущего механизма map и reduce слотов в Hadoop, который негативно влияет на эффективную утилизацию вычислительных ресурсов.</p>
<h3>Поддержка других парадигм программирования помимо MapReduce</h3>
<p>В предложенной архитектуре используется общий механизм вычислений, не привязанный конкретно к MapReduce, что позволит использовать и другие парадигмы. Имеется возможность реализовать собственный ApplicationMaster, способный запрашивать ресурсы у ResourceManager и использовать их в соответствии с задачей, при этом сохраняются общие принципы изоляции и гарантированного наличия полученных ресурсов. Среди потенциально поддерживаемых парадигм можно назвать MapReduce, MPI, Мaster-Worker, итеративные модели. Все они могут одновременно работать на одном и том же кластере. Это особенно актуально для приложений (например К-средний или Page Rank), где <a href="/masshtabiruemost/piccolo-postroenie-raspredelennykh-sistem-v-11-raz-bystree-hadoop/" target="_blank">другие подходы более чем на порядок эффективнее</a> MapReduce.</p>
<h2>Выводы</h2>
<p>Apache Hadoop, и в частности Hadoop MapReduce &#8212; очень успешный opensource проект по обработке больших объемов данных. Предложенный Yahoo путь его переработки направлен на исправление недостатков архитектуры текущей реализации, при этом повышая доступность, эффективность использования ресурсов и предоставляя поддержку других парадигм распределенных вычислений.</p>
<p>Осталось дело за малым &#8212; собственно реализовать задуманное! <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><em>Источник информации: <a href="http://developer.yahoo.com/blogs/hadoop/posts/2011/02/mapreduce-nextgen/" target="_blank">http://developer.yahoo.com/blogs/hadoop/posts/2011/02/mapreduce-nextgen/</a></em></p>
<p><em><a href="/feed" target="_blank">Подписаться на RSS можно здесь.</a></em></p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/novoe-pokolenie-mapreduce-v-apache-hadoop/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Архитектура Mollom</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mollom/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mollom/#comments</comments>
		<pubDate>Tue, 15 Feb 2011 16:19:59 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[Drupal]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[Hudson]]></category>
		<category><![CDATA[Intel]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Mollom]]></category>
		<category><![CDATA[Munin]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Pingdom]]></category>
		<category><![CDATA[saas]]></category>
		<category><![CDATA[SoftLayer]]></category>
		<category><![CDATA[Unfuddle]]></category>
		<category><![CDATA[Xeon]]></category>
		<category><![CDATA[Zendesk]]></category>
		<category><![CDATA[Архитектура Mollom]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=755</guid>
		<description><![CDATA[Mollom &#8212; это прибыльный SaaS сервис по фильтрации различных форм спама из контента, сгенерированного пользователями: комментариев, постов на форумах и блогах, опросов, контактных и регистрационных форм. Определение спама основано не только на контенте, но и репутации и прошлой активности разместившего его пользователя. Алгоритм машинного обучения Mollom выполняет роль цифрового модератора 24х7 для более 40 тысяч [...]]]></description>
			<content:encoded><![CDATA[<p><img style="float: right; margin: 1em 2em;" title="Mollom" src="http://www.insight-it.ru/wp-content/uploads/2011/02/5426183775_6b4d1eb673_m.jpg" alt="Mollom" width="240" height="66" /><a href="http://mollom.com/" target="_blank">Mollom</a> &#8212; это прибыльный SaaS сервис по фильтрации различных форм спама из контента, сгенерированного пользователями: комментариев, постов на форумах и блогах, опросов, контактных и регистрационных форм. Определение спама основано не только на контенте, но и репутации и прошлой активности разместившего его пользователя. Алгоритм машинного обучения Mollom выполняет роль цифрового модератора 24х7 для более 40 тысяч сайтов, в том числе и очень крупных компаний.</p>
<p>С того момента, как Mollom запустили систему анализа цифрового контента, они выявили более 373 миллионов спам сообщений, обнаружив в процессе что впечатляющие 90% всех прошедших через них сообщений оказались спамом. Весь этот поток спама в 100 сообщений в секунду обрабатывается всего двумя географически распределенными серверами. На каждом из них работает сервер Java-приложений и Cassandra. Так мало ресурсов требуется лишь из-за того, что они создали очень эффективную систему машинного обучения. Разве не круто? Так как же они это делают?<span id="more-755"></span><br />
<img src="http://www.insight-it.ru/wp-content/uploads/2011/02/mollom.jpeg" alt="" title="Mollom" width="628" height="250" class="alignnone size-full wp-image-1225" /></p>
<h2>Статистика</h2>
<ul>
<li>Обслуживаются 40000 активных веб-сайтов, многие их которых принадлежат крупным клиентам, таким как Adobe, Sony BMG, Warner Brothers, Fox News и The Economist. Много крупных брендов, с крупными сайтами, масса комментариев.</li>
<li>Обнаруживают пол-миллиона спам-сообщений ежедневно.</li>
<li>Обрабатывается около 100 запросов к API в секунду.</li>
<li>Проверка сообщения на спам занимает очень мало времени, обычно около 30-50 миллисекунд, 95% запросов укладывается в 250 миллисекунд, когда самые медленные обрабатываются пол секунды.</li>
<li>Эффективность определения спама составляет 99.95%. Это означает, что из 10000 спам-сообщений Mollom пропустит только 5.</li>
<li><a href="http://mollom.com/blog/netlog-using-mollom" target="_blank">Netlog</a>, европейская социальная сеть, имеет отдельный Mollom-сервер в своем датацентре. Netlog проверяют на спам около 4 миллионов сообщений каждый день на классификаторах, специально натренированных на их данных.</li>
</ul>
<h2>Платформа</h2>
<ul>
<li><a href="/tag/java/" target="_blank">Java</a> &#8212; исторически сложилось, что Mollom был с самого начала был разработан на Java.</li>
<li>Два сервера обслуживают основную часть клиентов:
<ul>
<li>Один сервер на восточном побережье США, другой &#8212; на западном</li>
<li>В случае сбоя один сервер может полностью подменить другой</li>
<li>Конфигурация обоих: Intel Xeon Quad core, 2.8GHz, 16GB RAM, 4 диска по 300 GB, RAID 10.</li>
</ul>
</li>
<li><a href="http://www.softlayer.com/" target="_blank">SoftLayer</a> &#8212; хостинг-провайдер.</li>
<li><a href="http://cassandra.apache.org/" target="_blank">Cassandra</a> &#8212; NoSQL база данных, выбранная из-за высокой производительности на запись и способности работать на серверах, располагающихся в разных датацентрах (была разработана в <a href="/masshtabiruemost/arkhitektura-facebook/" target="_blank">Facebook</a>, но там практически не используется).</li>
<li><a href="http://www.mysql.com/" target="_blank">MySQL</a> &#8212; Java Persistence API используется для обычных наборов данных, когда Cassandra используется для больших объемов данных.</li>
<li><a href="http://en.wikipedia.org/wiki/GlassFish" target="_blank">Glassfish</a> &#8212; open source сервер приложений для платформы Java EE. Они выбрали именно Glassfish за его возможности корпоративного уровня, такие как репликация и обработка сбоев.</li>
<li><a href="http://hudson-ci.org/" target="_blank">Hudson</a> &#8212; предоставляет непрерывное тестирование и развертывание кода серверной части на всех используемых машинах.</li>
<li><a href="http://munin-monitoring.org/" target="_blank">Munin</a> &#8212; измерение и построение графиков, касающихся здоровья серверов.</li>
<li><a href="http://www.pingdom.com/" target="_blank">Pingdom</a> &#8212; внешний мониторинг.</li>
<li><a href="http://www.zendesk.com/" target="_blank">Zendesk</a> &#8212; используется для оказания поддержки клиентам.</li>
<li><a href="http://drupal.org/" target="_blank">Drupal</a> &#8212; используется для основного сайта со специализированным модулем интернет-магазина.</li>
<li><a href="http://unfuddle.com/" target="_blank">Unfuddle</a> &#8212; хостинг Subversion для взаимодействия удаленной команды разработчиков.</li>
</ul>
<h2>Как это работает?</h2>
<p>Процесс выглядит следующим образом:</p>
<ul>
<li>Когда пользователь отправляет комментарий на сайт, происходит запрос к API Mollom.</li>
<li>Контент анализируется, если он оказывается спамом, то сайту сообщается, что необходимо его заблокировать, если же алгоритм не уверен на 100% &#8212; сайту советуют показать CAPTCHA, которую сервис также предоставляет.</li>
<li>После того, как CAPTCHA будет успешно заполнена, контент принимается. В большинстве случаев пользователи не будут ее видеть и контент будет приниматься сразу же.</li>
</ul>
<p>Обнаружение спама является сложным балансом между отказом нормальному контенту и принятию спама.</p>
<h2>Бизнес-модель</h2>
<ul>
<li>Основным залогом популярности Mollom является бесплатная возможность попробовать сервис, ограничение составляет 100 нормальных (не спам) сообщений в день. Небольшие сайты могут никогда и не достичь этого ограничения.</li>
<li>Далее есть два тарифа: 1 евро в день и 3600 евро с возможностями вполне соответствующими этим суммам</li>
<li>Сайты, использующие бесплатный тариф, вовсе не зря тратят ресурсы системы, как кажется на первый взгляд, а являются жизненно-важным источником данных для тренировки системы. Без этих данных алгоритмы были бы существенно менее точны.</li>
</ul>
<h2>Архитектура</h2>
<ul>
<li>Разработчики Mollom уделяют максимум внимания времени отклика, эффективности кода и использования серверных ресурсов.</li>
<li>Физически каждый сервер может справиться со всеми запросами, два сервера нужны для избежания перерывов в работе системы. Когда оба сервера в строю &#8212; работа распределяется между ними, когда один падает &#8212; второй перехватывает его запросы.</li>
<li>Mollom прошел через несколько этапов развития:
<ol>
<li>Изначально маленькая команда из двух человек работала вечерами над основными алгоритмами, классификаторами и реальными бизнес-задачами, которые они пытались решить. Для построения инфраструктуры серверной части они использовали свои реализации базовых механизмов по управлению ресурсами, соединениями и потоками. В итоге они обнаружили, что тратят слишком много времени на эти вещи. После этого они переключились на Glassfish, что позволило им намного меньше беспокоится об управлении памятью, REST-запросах, парсинге XML и поддержании пула соединений с базой данных.</li>
<li>В прошлом основной проблемой была пропускная способность дисковой подсистемы. Они должны хранить информацию о репутации всех IP-адресов и URL по всему Интернету, что привело к массивному набору данных с большим количеством случайных обращений.</li>
<li>Поначалу они использовали MySQL на недорогой виртуальной машине, что в итоге не смогло масштабироваться.</li>
<li>Они перенесли данные на твердотельные жесткие диски (SSD) и стали все хранить в файлах. Этот шаг решил проблемы с записью, но возникли новые проблемы:
<ol>
<li>Это правда дорого.</li>
<li>Очень чувствительно к типу используемой файловой системы</li>
<li>Запись стала происходить быстрой, но итерация по большим наборам данным (что они делали довольно часто для очистки данных и обучения классификаторов) по-прежнему была очень медленным процессом.</li>
</ol>
</li>
<li>В итоге они отказались от твердотельных накопителей и стали использовать Cassandra.</li>
</ol>
</li>
<li>Cassandra сейчас используется для обработки интенсивного потока запросов на запись и в роли кэша:
<ul>
<li>Работает на RAID10, что хорошо подходит для высоких смешанных нагрузок на запись/чтение.</li>
<li>Cassandra оптимизирована для записи, а в Mollom запись как раз происходит намного чаще, чем чтение.</li>
<li>Разработана для распределенной работы как внутри датацентра, так и между датацентрами.</li>
<li>Обратной стороной медали является отсутствие стандартного NoSQL интерфейса, что усложняет реализацию приложений.</li>
<li>Механизм кэширования строк в Cassandra позволяет им не использовать отдельную систему для кэширования, что существенно упростило код приложения.</li>
<li>Cassandra имеет функцию удаления устаревшей информации после определенного периода времени. В Европе существуют строгие законы о приватности личных данных, согласно которым они должны храниться не более определенного срока (штаб-квартира Mollom находится в  Бельгии). В этом плане эта функция очень удобна. Эта функция опять же избавляет от необходимости реализовывать данный функционал вручную.</li>
</ul>
</li>
<li>Типичный путь одного комментария внутри системы:
<ul>
<li>Балансировка нагрузки между серверами лежит на клиентской библиотеке, в роли типичного клиента может выступать сайт на Drupal, осуществляющий запрос к API через XML-RPC или REST.</li>
<li>Запросы обрабатываются сервером приложений Glassfish и проходят стандартный процесс обработки с помощью сервлетов и специфичных классов.</li>
<li>Платящие клиенты обслуживаются в первую очередь, что приводит к тому, что клиенты на бесплатном тарифе могут ожидать результата несколько дольше.</li>
<li>Запрос анализируется и оценка вероятности спама возвращается пользователю. Помимо этого отдельная часть кода Mollom отвечает за генерацию, выдачу и проверку CAPTCHA.</li>
<li>Классификаторы полностью располагаются в оперативной памяти. Небольшой кусок контента разбивается на тысячи и тысячи крошечных частей, которые могут быть идентифицированы как спам. Такие классификаторы хранят в памяти до нескольких миллионов признаков, характерных для спама. Анализ должен выполняться очень быстро, так что никаких других вариантов кроме расположения всех требуемых данных в оперативной памяти просто не было.</li>
<li>В Cassandra хранятся очки репутации, частоты, URL и IP-адреса.</li>
<li>Струтуры данных в памяти не реплицируются напрямую. Они записываются в Cassandra, которая и передает их на второй сервер. Промежуток времени, когда данные не консистентны, очень невелик, так что это не сказывается негативно на алгоритмах.</li>
</ul>
</li>
<li>Балансировка нагрузки с помощью клиента:
<ul>
<li>Mollom использует такой подход к балансировке, так как стартап не может себе позволить дорогой железный балансировщий нагрузки. Если учесть, что им нужна балансировка между датацентрами, решение от любого из вендоров было бы комплексным и дорогим.</li>
<li>У каждого клиента есть индивидуальный список серверов, которыми он может воспользоваться. Этот список изменяется через API.</li>
<li>Каждый клиент может использовать разный список, платящим клиентам могут предоставлять отдельные сервера для уменьшения задержек.</li>
<li>Если сервер упал &#8212; клиент пытается подключиться к следующему серверу в списке.</li>
<li>С другой стороны такой подход усложняет разработку неофициальных клиентов: авторам проекта приходится тесно работать с разработчиками сторонних клиентов для обеспечения правильной реализации в них балансировки нагрузки.</li>
</ul>
</li>
<li>Машинное обучение:
<ul>
<li>Mollom &#8212; это набор самообучающихся систем. Отдельные CAPTCHA-решения, не учитывают ни пользовательское поведение, ни источник контента, заставляя каждого пользователя вводить проверочный код при каждом сообщении. В случае с Mollom это происходит только когда система анализа контента не уверена в конкретном решении.</li>
<li>Средняя длина сообщения &#8212; 500 символов, обычно оно разбивается на 3000 характеристик. Принадлежность контента к спаму определяется путем оценки репутации IP адреса или Open ID, пользовательского идентификатора, эмоциональной окраски, языка, профанации, проверки на наличие специфичных слов и фраз, также учитывается качество написания текста и многие другие факторы. Все эти данные основываются на классификаторах. Некоторые из них статистические по природе, так что обучение происходит автоматически. Другие же основываются на правилах для того, чтобы быть уверенными, что они никогда не могут быть настроены неверно. Комбинация результатов всех тестов после нормализации и образует финальный рейтинг принадлежности к спаму каждого конкретного сообщения.</li>
<li>Классификаторы и внутренние метрики обучаются с каждым новым сообщением и обновляются в реальном времени.</li>
</ul>
</li>
<li>Glassfish берет на себя планировку нагрузки, учитывая многоядерность системы:
<ul>
<li>Ключ к дизайну системы в многопроцессорном окружении заключается в максимальном параллелизации работы при минимальном простое из-за блокировок.</li>
<li>Они используют 16 thread&#8217;ов на сервер.</li>
<li>Большинство запросов обрабатываются сессионными объектами (Java Bean), не имеющими состояний. Они хорошо подходят для управления параллельными запросами.</li>
<li>Они держат пул из нескольких cессионных объектов, но определение их количества делегируется Glassfish. В пиковую нагрузку это число увеличивается для более эффективной обработки запросов, порой оно достигает 32.</li>
<li>Все классификаторы реализованы как раз как такие объекты, повторно использующиеся различными thread&#8217;ами.</li>
<li>У каждого объекта есть свое клиентское соединение с Cassandra, чтобы гарантировать отсутствие блокировок.</li>
<li>Когда пользователь не отвечает на CAPTCHA сессия очищается и Mollom узнает что это скорее всего был спам.</li>
<li>На каждом сервере запущено по одной копии каждого классификатора.</li>
<li>В момент очистки сессии происходит небольшая блокировка, когда происходит обновление классификаторов.</li>
<li>Обновленные классификаторы записываются в Cassandra каждые пол часа.</li>
</ul>
</li>
<li>Интеграция приложений:
<ul>
<li>Mollom использует открытый API, который может быть интегрирован в любую систему.</li>
<li>Библиотеки: Java, PHP, Ruby и другие.</li>
<li>Готовые модули: Drupal, Joomla, WordPress и прочие системы управления контентом.</li>
<li>Решения от сторонних разработчиков, основанные на примерах кода от  Mollom.</li>
</ul>
</li>
<li>Для мониторинга здоровья серверов они используют Munin:
<ul>
<li>Каков размер heap памяти после сбора мусора?</li>
<li>Каково количество доступных соединений?</li>
<li>Каково количество thread&#8217;ов в пуле?</li>
<li>Оценка времени блокировок в каждом thread&#8217;е.</li>
</ul>
</li>
<li>Если взглянуть в целом на архитектуру Mollom, можно увидеть, что они стараются построить систему, способную прозрачно работать в нескольких датацентрах, чтобы позволить горизонтально расширить систему, когда они перерастут текущую двухсерверную конфигурацию:
<ul>
<li>Балансировка нагрузки на клиенте позволяет выбирать оптимальный сервер и справляться со сбоями одного из них.</li>
<li>Кластеризация Glassfish облегчает добавление/удаление новых машин и позволяет перехватывать запросы, когда один из серверов выходит из строя.</li>
<li>Cassandra используется для управления данными между серверами в нескольких датацентрах.</li>
</ul>
</li>
<li>Инсталляция Mollom в Netlog обладает некоторыми интересными характеристиками. Она обрабатывает больше сообщений, чем основные сервера Mollom, но распределение спама в ней совершенно другое, так как люди в ней общаются в рамках социальной сети. Внутри Netlog лишь 10% сообщений является спамом, когда в суровом мире информационных порталов распределение обратно. Интересным следствием является тот факт, что обработка нормальных сообщений требует меньше вычислительных ресурсов, так что на аналогичном оборудовании удается обрабатывать больший поток сообщений.</li>
<li>Изначально они думали о виртуализированных серверах, в частности об Amazon EC2, но в итоге обнаружилось, что наиболее узким местом являются операции ввода-вывода &#8212; низкая производительность дисковой подсистемы в виртуальных машинах создавали реальные проблемы, так что они решили воспользоваться вертикальным масштабированием и переехали на более дорогие физические машины с большим объемом дискового пространства:
<ul>
<li>На удивление они не упираются в вычислительные ресурсы: лишь два ядра из 8 занимаются вычислениями, когда остальные же работают над операциями ввода-вывода.</li>
<li>Трафик Mollom практически постоянен, так что физические сервера более эффективны с финансовой точки зрения. Они рассматривают Amazon лишь как запасной вариант для обработки непредвиденных пиков нагрузки.</li>
</ul>
</li>
<li>Процесс разработки:
<ul>
<li>Команда распределена: трое в Бельгии, остальные в Техасе, Бостоне и Германии.</li>
<li>Scrum используется в процессе разработки и они довольны этой методологией. Scrum-собрание проходит через Skype в два часа дня по Бельгии.</li>
<li>Разработчики работают локально и отправляют код на Unfuddle.</li>
<li>Hudson используется для непрерывного интеграционного тестирования. Hudson позволил облегчить миграцию, так как перед развертыванием все тесты должны быть пройдены. Они не теряли лишнего времени на проблемах, обнаруженных уже в развернутом приложении.</li>
<li>Они активно используют автоматическое тестирование: юнит-тесты, системные тесты, тесты Drupal.</li>
<li>Развертывание по-прежнему делается вручную для минимизации риска простоя (что правда спорный момент).</li>
<li>Для обнаружения утечек памяти они используют анализ дампов оперативной памяти. Анализ дампа сервера с 16Гб памяти &#8212; дело непростое, практически невозможное на обычном компьютере, так что они арендуют большую виртуальную машину на Amazon для проведения анализа. Весь процесс занимает всего около 2 часов. Они сравнивают два дампа: через 10 и 20 часов после запуска сервера. Если обнаруживаются значительные отличия, то скорее всего дело в утечке памяти.</li>
</ul>
</li>
</ul>
<h2>Пути развития</h2>
<ul>
<li>Mollom API основано на XML-RPC, REST-интерфейс находится на стадии тестирования для облегчения интеграции других сервисов.</li>
<li>Они мигрировали на Cassandra, чтобы облегчить процесс горизонтального масштабирования, когда нагрузка достигнет соответствующего уровня.</li>
<li>Скоро будут выпущены корпоративные возможности, которые позволят работать с сотнями сайтов как с единым целым. Появится возможность легко модерировать несколько сайтов одновременно по эмоциональной окраске сообщений, рейтингу спама или удалить все сообщения с определенного IP-адреса.</li>
<li>Они думали над участием в бизнесе потоковых данных вроде Twitter, но они сильно ограничены европейскими более строгими требованиями по приватности.</li>
<li>Планируются эксперименты по использованию Glassfish для балансировки нагрузки в рамках каждого датацентра.</li>
<li>Если нагрузка увеличится десятикратно им придется добавить больше серверов в Cassandra. Дисковый ввод-вывод является узким местом. Дополнительные сервера приложения понадобятся только если нагрузка вырастет более, чем на порядок.</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li><strong>Mollom очень серьезно относится к разработке высокопроизводительной системы.</strong> Они гордятся тем, что Mollom очень эффективно использует вычислительные и финансовые ресурсы. Множество запросов может обрабатываться одним сервером с низкой задержкой, что очень радует как клиентов, так и владельцев проекта, так как издержки очень низки. Этот вопрос был выбран приоритетным с самого начала и они выбрали подходящие технологии для реализации своих целей. Это позволило им вкладывать средства в маркетинг, построить базу клиентов и создавать новые продукты на основе Mollom.</li>
<li><strong>Машинное обучение требует много исходных данных для успешного обнаружение спама.</strong> Для сбора этих данных предлагает бесплатные услуги. Крупные клиенты обеспечивают доход и получают выгоду от данных, полученных от более мелких клиентов. Эта модель очень хорошо себя проявила в машинном обучении, за которым как известно будущее.</li>
<li><strong>Старайтесь избавиться от проблем, не связанных напрямую с продуктом.</strong> Большие системы требуют серьезных усилий на разработку инфраструктуры. Можно убить все время на построение инфраструктуры, вместо создания по-настоящему ценного продукта (классификаторов, системы репутации, клиентских библиотек). Mollom постоянно пытались максимально избавляться от лишних проблем, именно по-этому они выбрали Cassandra и Glassfish.</li>
<li><strong>Будьте осторожны с клиентским кодом.</strong> Выполнение кода на клиентской части привлекательно тем, что он тратит чужие ресурсы, а не серверные. Проблемы начинаются когда сторонние библиотеки разрабатываются некачественно, что заставляет систему в целом работать плохо. Плотно работайте с разработчиками клиентских библиотек для повышения качества их продукции.</li>
<li><strong>Отдавайте приоритет платящим клиентам.</strong> Платящие клиенты получают более высокое качество услуг, обрабатываются вне очереди, получают меньше задержек и получают доступ к запасному серверу когда основной дал сбой. Этого вполне достаточно, чтобы подтолкнуть клиентов платить.</li>
<li><strong>Уменьшайте объем кода, позволяя используемым сторонним продуктам брать на себя грязную работу</strong>. Поначалу код Mollom был существенно большим по объему, чем сейчас. Использование Cassandra и Glassfish позволило убрать массу кода, связанного с кэшированием, кластеризацией, репликацией и обработкой сбоев. Упрощайте систему со временем.</li>
<li><strong>Минимизируйте блокировки.</strong> Mollom потратили много времени на устранение блокировок внутри Glassfish, так как это начинало становиться узким местом. Минимизируйте простой от блокировок для достижения полного параллелизма.</li>
</ul>
<h2>Источники информации и дополнительные материалы</h2>
<ul>
<li><a href="http://highscalability.com/blog/2011/2/8/mollom-architecture-killing-over-373-million-spams-at-100-re.html" target="_blank">Mollom Architecture &#8212; Killing Over 373 Million Spams At 100 Request Per Second</a> (основной источник информации)</li>
<li><a href="http://mollom.com/files/mollom-technical-whitepaper.pdf" target="_blank">Mollom Technical Whitepaper</a></li>
<li><a href="http://blogs.sun.com/glassfishpodcast/entry/episode_072_mollom_com_s" target="_blank">Episode #072 &#8212; Mollom.com&#8217;s GlassFish backend with Dries and Johan</a></li>
<li><a href="http://buytaert.net/mollom-gets-a-new-backend" target="_blank">Mollom gets a new backend</a></li>
<li><a href="http://blogs.lodgon.com/johan/" target="_blank">Fighting spam with Mollom on Glassfish</a></li>
<li><a href="http://mollom.com/api">Mollom API</a></li>
</ul>
<p><strong><em>Если Вам понравилась данная статья, можете ознакомиться с другими <a href="/highload">материалами по архитектуре высоконагруженных систем</a> и <a href="/feed">подписаться на RSS</a>.</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mollom/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Piccolo &#8212; построение распределенных систем в 11 раз быстрее Hadoop</title>
		<link>http://www.insight-it.ru/masshtabiruemost/piccolo-postroenie-raspredelennykh-sistem-v-11-raz-bystree-hadoop/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/piccolo-postroenie-raspredelennykh-sistem-v-11-raz-bystree-hadoop/#comments</comments>
		<pubDate>Sat, 12 Feb 2011 20:49:46 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[piccolo]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[вычисления]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[распределенные вычисления]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=731</guid>
		<description><![CDATA[Piccolo &#8212; это система для распределенных вычислений, использующая новую ориентированную на данные модель программирования для разработки приложений по параллельным вычислениям в памяти в масштабах дата-центров. В отличии от существующих моделей, основывающихся на потоках данных, Piccolo позволяет вычислениям выполняться на различных машинах, при этом имея общее изменяющееся состояния через интерфейс таблиц пар &#171;ключ-значение&#187;. Традиционные ориентированные на [...]]]></description>
			<content:encoded><![CDATA[<div id="_mcePaste">
<p><a href="http://piccolo.news.cs.nyu.edu/" target="_blank">Piccolo</a> &#8212; это система для распределенных вычислений, использующая новую ориентированную на данные модель программирования для разработки приложений по параллельным вычислениям в памяти в масштабах дата-центров. В отличии от существующих моделей, основывающихся на <em>потоках</em> данных, Piccolo позволяет вычислениям выполняться на различных машинах, при этом имея общее изменяющееся состояния через интерфейс таблиц пар &#171;ключ-значение&#187;. Традиционные ориентированные на данные модели (такие как используются в <a href="/tag/hadoop/" target="_blank">Apache Hadoop</a>) предоставляют пользователю для работы лишь единственный объект в определенный момент времени, когда в Piccolo используется глобальная таблица состояний, одновременно доступная для всех частей вычисления. Это позволяет пользователям указывать алгоритм вычисления в интуитивно-понятной манере, очень похожей на разработку программ для одного компьютера.<span id="more-731"></span></p>
<p style="margin-bottom: 1em; margin-top: 0em;">Использование хранилища, позволяющего хранить в памяти пары &#171;ключ-значение&#187;, сильно отличается от канонического подхода <a href="/tag/mapreduce/" target="_blank">map-reduce</a>, который основан на распределенных файловых системах. Результаты впечатляют:</p>
<blockquote style="font-family: Georgia, 'Times New Roman', serif; font-style: italic;">
<p style="margin-bottom: 1em; margin-top: 0em;">Эксперименты показали, что Piccolo очень быстр и отличные возможности по масштабируемости для многих прикладных задач. Производительность вычисления PageRank и k-средних выросла в 11 и 4 раза, соответственно, по сравнению с Hadoop. Вычисление PageRank для связанного графа из 1 миллиарда страниц заняло лишь 70 секунд на 100 машинах в <a href="/tag/ec2/" target="_blank">Amazon EC2</a>. Распределенная система по скачиванию веб-страниц легко может полностью загрузить 100Мбит интернет-канал при работе на 12 машинах.</p>
</blockquote>
<div id="_mcePaste">При разработке на Piccolo программисты создают наборы прикладных функций, которые принято называть ядром. Функции ядра запускаются параллельно на нескольких вычислительных узлах, при этом у них есть доступ к общему изменяемому состоянию, которое реализовано в виде набора таблиц, располагающихся в оперативной памяти различных узлов системы. Для доступа к этому состоянию используется примитивный интерфейс, позволяющий узнать <em>(get)</em> и изменить <em>(put)</em> то или иное состояние. Процесс отправки сообщений удаленным узлам, непосредственно имеющим в памяти требуемые данные, полностью берет на себя сам код Piccolo.</div>
<div>Предоставляя разработчикам доступ к глобальному общему состоянию, Piccolo предлагает несколько привлекательных возможностей:</div>
<div>
<ul>
<li>Алгоритмы, основанные на общем промежуточном состоянии, могут быть реализованы естественным, логичным и эффективным образом</li>
<li>Асинхронные online приложения получают возможность иметь <em>оперативный</em> доступ к новым и изменившимся данным, расположенным на других узлах системы</li>
</ul>
</div>
<div>В Piccolo используется ряд оптимизаций, обеспечивающий не только удобное использование интерфейса к таблице состояний, но и его быстроту:</div>
<div id="_mcePaste">
<ul style="list-style-type: square; margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 2em;">
<li><strong>Локальность</strong> &#8212; для обеспечения выполнения локальности исполнения, таблицы явным образом разбиваются на части, располагающиеся на разных машинах. В пользовательском коде при взаимодействии с таблицами доступна настройка локальности, обеспечивающая выполнение кода на том же узле, где располагаются даннын.</li>
<li><strong>Балансировка нагрузки</strong> &#8212; далеко не вся нагрузка равномерна, часто какая-то часть вычислений требует намного больше ресурсов, чем все остальные. Ожидание без дела пока такая задача будет выполнена впустую тратит ценное время и ресурсы. Для решения данной проблемы Piccolo может мигрировать часть задач с загруженных машин на простаивающие, при этом сохраняя настройки локальности и корректность выполнения программы.</li>
<li><strong>Обработка сбоев </strong>- сбои оборудования неизбежны и обычно они случаются в самые критические моменты. Piccolo делает создание контрольных точек и восстановление простым и быстрым, обеспечивая быстрое восстановление в случае сбоев.</li>
<li><strong>Синхронизация </strong>- управление корректной синхронизацией и обновлениями в условиях распределенной системы может быть сложным и медленным. Piccolo позволяет пользователям поручить реализацию логики синхронизации системе. Вместо явной блокировки таблиц при выполнении обновлении данных, пользователи могут присоединять аккумулирующие функции к таблицам: они используются автоматически системой для корректного комбинирования параллельных обновлений ячеек таблиц.</li>
</ul>
</div>
<p>Проект реализован в виде библиотеки для <a href="/tag/python/" target="_blank">Python</a> и <a href="/tag/c/" target="_blank">C++</a>. Более детально примеры использования и принципы работы системы разбираются в источниках информации (правда на английском), не поленитесь &#8212; загляните. Вместо заключения хотелось бы по традиции порекомендовать подписаться на <a href="/feed" target="_blank">RSS блога</a>, если Вы еще этого не сделали.</p>
<h2><strong>Источники информации</strong></h2>
<ul style="list-style-type: square; margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 2em;">
<li><a href="http://www.cs.nyu.edu/~power/" target="_blank">Russell Power</a> &#8212; автор проекта Piccolo</li>
<li><a href="http://www.usenix.org/event/osdi10/tech/full_papers/Power.pdf" target="_blank">Piccolo: Building Fast, Distributed Programs with Partitioned Tables</a></li>
<li>
<p style="margin-bottom: 1em; margin-top: 0em;">Проект был презентован на <a href="http://www.usenix.org/event/osdi10/tech/" target="_blank">OSDI10</a>: <a href="https://docs.google.com/viewer?url=http%3A%2F%2Fwww.usenix.org%2Fevent%2Fosdi10%2Ftech%2Fslides%2Fpower.pdf" target="_blank">презентация</a> и <a href="http://piccolo.news.cs.nyu.edu/osditalk.mp4" target="_blank">видео</a></p>
</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/piccolo-postroenie-raspredelennykh-sistem-v-11-raz-bystree-hadoop/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
<enclosure url="http://piccolo.news.cs.nyu.edu/osditalk.mp4" length="118199420" type="video/mp4" />
		</item>
		<item>
		<title>HighLoad++ 2010</title>
		<link>http://www.insight-it.ru/life/highload-2010/</link>
		<comments>http://www.insight-it.ru/life/highload-2010/#comments</comments>
		<pubDate>Sun, 31 Oct 2010 20:24:02 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[высоконагруженные системы]]></category>
		<category><![CDATA[конференции]]></category>
		<category><![CDATA[мероприятия]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=669</guid>
		<description><![CDATA[25-26 октября прошла конференция HighLoad++ 2010, посвященная разработке высоконагруженных систем. После конференции у меня сразу родились планы на два поста: типичный отчет и описание архитектуры Вконтакте. С порядком написания я, видимо, не прогадал &#8212; получился один из самых успешных постов на Insight IT. Остальные доклады на мероприятии были, пожалуй, существенно менее животрепещущими для общественности, но [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-690" title="HighLoad++ Logo" src="http://www.insight-it.ru/wp-content/uploads/2010/10/highload_logo.png" alt="HighLoad++ Logo" width="151" height="113" style="float: left; margin:0 8px;" />25-26 октября прошла конференция <a href="http://www.highload.ru" target="_blank">HighLoad++ 2010</a>, посвященная разработке высоконагруженных систем.  После конференции у меня сразу родились планы на два поста: типичный отчет и описание архитектуры Вконтакте. С порядком написания я, видимо, не прогадал &#8212; получился один из самых успешных постов на <strong>Insight IT</strong>. Остальные доклады на мероприятии были, пожалуй, существенно менее животрепещущими для общественности, но все же не менее интересными. Приступим.<span id="more-669"></span></p>
<h2>Организационные моменты</h2>
<p>Прежде чем переходить собственно к рассказу о докладах, хочется сразу высказаться по организационным вопросам, чтобы далее не отвлекаться. Возможно организаторы учтут при проведении последующих мероприятий.</p>
<p>Во-первых, участие в конференции: цены конечно не самые высокие для двухдневных конференций, но все равно слегка зашкаливают &#8212; лично я бы не пошел на данное мероприятие за такие деньги, даже не смотря на то что тематика полностью совпадает со сферой моих профессиональных интересов. За кого-то заплатил работодатель, а мне вот пришлось доставать бесплатное участие через знакомых знакомых&#8230;<em> (спасибо добрым людям, если вдруг читают <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</em></p>
<p>Во-вторых, удивила ситуация со связью со внешним миром: интернет был на очень хорошем для конференций уровне &#8212; тупил местами, но в целом стабильно работал, а вот мобильная связь не работала практически совсем &#8212; уезжал домой с почти севшим телефоном.</p>
<p>Политика организовывать не ставить два потенциально интересных доклада параллельно меня очень порадовал &#8212; послушал в живую все, что хотел. А небольшая давка в первом зале в начале первого дня мне кажется была очень даже справедливой платой за отсутствие необходимости разрываться на части.</p>
<p>С едой все было в порядке, очереди конечно великоваты не смотря на два обеда в разное время, но всегда можно было обойти данное неудобство (перейти в другой &#171;раздаточный пункт&#187; или залезть на сцену, хоть и не разрешали).</p>
<p>Еще очень порадовало, что презентации первого дня конференции были уже доступны участникам еще за пару часов до окончания первого дня. Но вот с оставшимися презентациями и видео с мероприятия видимо произошла какая-то заминка и я так и не получил ссылку на них до сих пор, судя по всему они так и не доступны.</p>
<h2>День первый</h2>
<p>Основной особенностью первого дня было выделение целого зала под англоязычные доклады зарубежных коллег. Как я уже писал, желающих послушать иностранцев, было очень много &#8212; и в первой половине дня люди толпились чуть ли не в коридоре, но ближе к вечеру ситуация стабилизировалась.</p>
<p>После приветственного слова Олега Бунина (одного из основных организаторов конференции) слово взял <a href="http://www.timetobleed.com" target="_blank">Joe Damato</a>, которого позиционировали как известного хакера, активно работающего над развитием <a href="/tag/Ruby" target="_blank">Ruby</a>. Темой выступления был обзор различных инструментов и приемов для анализа ситуации в серверном <a href="/tag/linux" target="_blank">Linux</a>-окружении. Некоторые моменты были мне известны и ранее, но в целом больше половины доклада было для меня очень интересно и ново. Перечислять упомянутые им приемы я, честно говоря, не вижу смысла &#8212; будет просто дублирование презентации. Если ранжировать доклады первого дня по интересу лично для меня, то это выступление заняло бы, пожалуй, второе место.</p>
<p>Вторым докладчиком был также приверженец секты Рубистов, <a href="http://jamesgolick.com/" target="_blank">James Golick</a>, один из основателей социальной сети для фетишистов (простите за отсутствие ссылки). Основной фишкой доклада было &#171;разоблачение мифов&#187;, в частности об облачных вычислениях и NoSQL. Количество пользователей этой социальной сети, но они очень активны и генерируют достаточно много контента (особенно по Российским меркам). Проект изначально располагался в компании, которая предоставляла услуги managed hosting (хостинг на арендуемых серверах + за тебя администрируют), но они посчитали, что слишком много переплачивают за этот самый &#171;managed&#187;, и решили поддаться тренду и переехать в облако (<a href="/tag/amazon" target="_blank">Amazon</a> <a href="/tag/ec2" target="_blank">EC2</a>). По деньгам получилось не сильно дешевле, но больше всего из расстроила производительность виртуальных машин (кажется, был слайд со скоростью доступа к дисковой подсистеме, выставляющий облако не в лучшем свете). Второй эпопеей в их проекте были попытки оптимизировать подсистему хранения данных путем перенесения ее части в NoSQL хранилище: пробовали <a href="/tag/mongodb">MongoDB</a> (выкинули из-за блокировок на операциях удаления) и <a href="/tag/cassandra" target="_blank">Cassandra</a> (выкинули из-за медленного случайного чтения). Финальным решением стал <a href="/tag/redis" target="_blank">Redis</a> + <a href="/tag/mysql">MySQL</a>, просто и со вкусом &#8212; их всецело устраивает на данный момент, как я понял.</p>
<p>Третьим выступал <a href="http://www.facebook.com/robert" target="_blank">Robert Johnson</a> из <a href="/tag/facebook" target="_blank">Facebook</a>, доклад был практически таким же, как и в ГУ-ВШЭ за несколько дней до этого &#8212; о нем <a href="/life/facebook-how-we-scaled-to-500-000-000-users-by-robert-johnson/" target="_blank">я уже писал</a>, так что подробно останавливаться не буду. Основным отличием были дополнительные технические детали, но подавляющее большинство из них и так уже были описаны в статье <a href="/masshtabiruemost/arkhitektura-facebook/" target="_blank">&#171;Архитектура Facebook&#187;</a>.</p>
<p>После обеда выступал Patrice Pelland из <a href="/tag/microsoft">Microsoft</a>, доклад  был о том, как работают их облачные сервисы (видимо live, skydrive и прочие). Естественно все на их же продуктах, большинство названий я даже не слышал. Единственное, что запомнил из выступления &#8212; у мелкомягких есть даже клон <a href="/tag/memcached">memcached</a>, но с какими-то дополнительными плюшками. Это был единственный доклад, после которого никто не захотел задать даже одного вопроса, что в целом наглядно продемонстрировало незаинтересованность аудитории в платных решениях. В твиттере после этого выступления проскользнула обиженная фраза докладчика, что-то в духе: &#171;До них просто не дошло, о чем я говорил&#187;.</p>
<p>После этого недоразумения от MS началась длинная серия докладов от людей, причастных к созданию <a href="/tag/postgresql" target="_blank">PostgreSQL</a>:</p>
<ul>
<li>Simon Riggs из <a href="http://www.2ndquadrant.com/">2nd Quadrant</a></li>
<li>Robert Treat из <a href="http://www.omniti.com">Omni TI</a></li>
<li>Bruce Momjian из <a href="http://www.enterprisedb.com/">EnterpriseDB</a></li>
</ul>
<p>Было 5 выступлений о PostgreSQL подряд:</p>
<ul>
<li>Повышение производительности</li>
<li>Управление репликацией</li>
<li>Масштабирование</li>
<li>Быстрая смена версии средствами pg_update</li>
<li>Потоковая репликация</li>
</ul>
<p>В целом очень актуальные доклады, если Вы плотно работаете с PostgreSQL в своем проекте или на своей работе. Я вообще тоже когда стоит выбор между доступными реляционными СУБД чаще всего склоняюсь к PostgreSQL, но доклады были детализированными не там, где нужно, и было скучновато. В этой секции порадовали три вещи:</p>
<ul>
<li>очень качественный английский у докладчиков</li>
<li>забавная манера выступления Роберта, особенно про красные кроки (что-то типа галош)</li>
<li>активная реклама новых вкусностей PostgreSQL 9.0, релиз которой я по каким-то причинам проворонил &#8212; надо будет обязательно попробовать ее в деле</li>
</ul>
<p>После кофе-брейка я пошел на больше всего понравившийся мне доклад (за первый день) &#8212; выступал <a href="http://www.phpied.com/" target="_blank">Stoyan Stefanov</a> из Yahoo! Темой доклада была заявлена неочевидная формулировка &#171;Progressive Downloads and Rendering&#187;, хотя на самом деле все свелось к грамотно построенному докладу о клиентской оптимизации: несколько вводных картинок, один слайд с базовыми приемами и много-много примеров очевидных и не очень случаев, когда с точки зрения пользователя сайт начинает тупить, даже если серверная часть проекта написано грамотно и работает достаточно быстро. По некоторым аспектам, в частности про кроссбраузерному использованию data:URL+MHTML, он ссылался на русские источники, а также очень позитивно отзывался о <a href="http://sunnybear.moikrug.ru/">Николае Мациевском</a>.</p>
<p>Последним, что я посетил в первый день, была &#171;открытая встреча&#187; c James Golick и Joe Damato про сам <a href="/tag/ruby" target="_blank">Ruby</a>. Ожидал большего: в итоге Joe вообще не выступил, а большая часть времени ушла на разжёвывание базовых возможностей языка и несколько мелких холиваров.</p>
<h2>День второй</h2>
<p>На второй день я немного проспал и приехал ближе к концу первого доклада: оказалось, что я не один такой &#8212; людей было раза в три меньше, чем за день до этого. Выбор потока куда пойти был легок: в первом зале все утро было посвящено <a href="/tag/python" target="_blank">Python</a>, с которым я последнее время довольно плотненько работал.</p>
<p>После докладов на английском &#171;отечественные&#187; выступления смотрелись совсем блекло. Конец выступления Андрея Смирнова про <a href="/tag/twisted" target="_blank">Twisted</a> не принес мне хоть какой-либо полезной информации, тем более мне все равно больше по душе <a href="/tag/tornado">Tornado</a>. Вопрос про их сравнение от одного из слушателей вызвал у докладчика рассказать историю о том, как будущий автор Tornado тусовался в сообществе Twisted, а потом взял и сделал свой продукт.</p>
<p>Следующий доклад был про профилирование памяти в <a href="/tag/python">Python</a> от Антона Грицая &#8212; начал он историю очень издалека, с того что такое утечки памяти, какие бывают &#171;сборщики мусора&#187;, какие есть варианты искать утечки в <a href="/tag/python" target="_blank">Python</a> и чем они плохи, собственно до &#171;дела&#187; он дошел лишь к концу доклада. Было предложено пользоваться продуктом под названием <a href="http://guppy-pe.sourceforge.net/" target="_blank">heapy</a>, который обладает широким спектром возможности, но при этом документация сильно хромает.</p>
<p>Последним докладом в секции про <a href="/tag/python" target="_blank">Python</a> было выступление трех бравых ребят из HeadHunter, которые рассказывали про их внутренний продукт под названием Frontik, представляющий собой надстройку над <a href="/tag/tornado" target="_blank">Tornado</a>, аггрегирующую данные с нескольких HTTP-сервисов. В целом идея мне понравилась, но ввиду исторических причин реализация у них накручена очень муторно:</p>
<ul>
<li>основной формат передачи данных &#8212; <a href="/tag/html" target="_blank">XML</a> по HTTP</li>
<li>генерация HTML посредством <a href="/tag/xslt">XSLT</a></li>
<li>регулярные выражения где надо и где не надо (для повышения производительности)</li>
</ul>
<p>Основным событием оставшейся части второго дня, как Вы уже наверное поняли, был аншлаг с участием Вконтакте и лично Павлом Дуровым в главной роли. Результаты подробно расписаны в статье <a href="http://www.insight-it.ru/masshtabiruemost/arkhitektura-vkontakte/" target="_blank">&#171;Архитектура Вконтакте&#187;</a>, повторяться не буду, с Вашего позволения.</p>
<p>Остальные доклады я застал лишь частями, так как блуждал по залам без особого энтузиазма, да и в толпе вокруг Павла чуток потусовался. Расскажу вкратце запомнившиеся моменты:</p>
<ul>
<li>Юрий Востриков из Mail.ru рассказывал про <a href="http://opensource.mail.ru" target="_blank">Tarantool/Silverbox</a> &#8212; еще после их технологического форума подумываю попробовать этот продукт в деле, но после этого выступления понял, что пока рановато: не известно ни об одном успешном применении вне компании-разработчика, да и библиотеки с реализацией полноценного протокола есть далеко не под все языки программирования.</li>
<li>На доклад про реализацию одного из топовых приложений Вконтакте на <a href="/tag/rails">Rails</a> я попал почти к самой сессии вопросов-ответов, запомнился только тот факт, что после того как компания, в которой работал докладчик, передала приложение заказчику &#8212; они почти сразу же переписали его на <a href="/tag/php" target="_blank">PHP</a>. Заставляет задуматься.</li>
<li>В третьем, дополнительном, зале во второй половине дня расположился тренинг Start in Garage для людей, планирующих сделать свой стартап; ребята рассказывали весело и непринужденно, но по сути все было очень примитивно &#8212; ушел минут через 20 после начала на аншлаг вконтакте.</li>
<li>Про <a href="http://www.scalaxy.ru" target="_blank">Scalaxy</a> было бы интересно написать отдельную статью, больно часто они всплывают на конференциях и в онлайн-сообществах. На этот раз рассказывали о том, как они выделяют избыточные дисковые массивы для виртуальных машин (которые они собственно в аренду сдают). Технология называется Vast Sky, родом откуда-то из Азии, позволяет легко выделять заданное количество блоковых устройств на разных дисковых системах и подключать их к виртуальной машине в виде софтверного RAID. В сочетании с их QDR Infiniband от Voltaire работает очень даже шустро (по крайней мере если верить их бенчмаркам по сравнению с альтернативными технологиями).</li>
<li>Scalaxy же запускает сервис ddosme, предназначенный для нагрузочного тестирования интернет-проектов. Попал опять только на вопросы-ответы, из них понял, что они предлагают через прокси походить по своему ресурсу, затем на основе логов составляются маршруты движения ботов по сайту и тестирование запускается на нужных мощностях. Сколько стоит не понял.</li>
<li>Последним докладом, который я застал краем глаза, было обсуждение основных косяков, мешающих 1С-Битрикс обслуживать пристойное количество пользователей &#8212; для меня совершенно не актуальный вопрос, так что после этого я начал собираться в сторону выхода и отправился смотреть <a href="/life/socialnaya-set/" target="_blank">&#171;Социальная сеть&#187;</a>.</li>
</ul>
<h2>Заключение</h2>
<p>Впечатления от конференции очень положительные: большинство докладов хотя бы немного полезны, рекламы вообще минимум, организация на уровне. По-прежнему не знаю стоит ли она своих денег, но потраченного времени точно стоит.  Надеюсь в следующем году будет по-проще попасть.</p>
<p>Хотелось бы видеть больше докладов не о конкретных инструментах и технологиях, а о их применении в рамках построения общей архитектуры проекта или решения конкретных нетривиальных задач. Доклады в духе &#171;у нас вот такая классная штука есть, но стоит денег&#187; и &#171;приходите к нам работать, чтобы попробовать в деле эту технологию&#187; как обычно скучны, но вроде их было довольно мало (надеюсь докладчики хотябы платят организатором за возможность порекламироваться?). Приглашенные иностранные гости &#8212; ход очень классный, мне кажется основной ключ успеха прошедшего мероприятия, в этом направлении определенно стоит двигаться &#8212; хотелось бы увидеть представителей известных проектов (Google, Ebay, Amazon, Flickr, Twitter, Baidu, QQ и.т.д.) и людей, решающих реально нетривиальные задачи, вроде Joe Damato.</p>
<p>В любом случае спасибо организаторам за два с толком проведенных дня <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Да, думаю Вы уже заметили, что блог Insight IT снова потихоньку возвращается к жизни, так что <a href="/feed" target="_blank">подписываться на RSS никогда не поздно</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/life/highload-2010/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
	</channel>
</rss>

