<?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/tag/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>Архитектура Одноклассников</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>Архитектура 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>Новое поколение 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>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>
		<item>
		<title>Архитектура Plenty of Fish</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-plenty-of-fish/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-plenty-of-fish/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 13:43:17 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Akamai CDN]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[dating]]></category>
		<category><![CDATA[Foundry]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Plenty of Fish]]></category>
		<category><![CDATA[POF]]></category>
		<category><![CDATA[ServerIron]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[Архитектура Plenty of Fish]]></category>
		<category><![CDATA[сайт знакомств]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=492</guid>
		<description><![CDATA[Plenty of Fish представляет собой очень популярный сервис онлайн знакомств, насчитывающий более 45 миллионов посетителей в месяц и 30+ миллионов просмотров страниц в сутки (что составляет около 500-600 страниц в секунду). Но это не самая интересная часть истории&#8230; Все это управляется единственным человеком при использовании нескольких серверов, при этом он тратит на работу всего пару [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.plentyoffish.com/" target="_blank" rel="external nofollow">Plenty of Fish</a> представляет собой очень популярный сервис онлайн знакомств, насчитывающий более 45 миллионов посетителей в месяц и 30+ миллионов просмотров страниц в сутки (что составляет около 500-600 страниц в секунду). Но это не самая интересная часть истории&#8230; Все это управляется единственным человеком при использовании нескольких серверов, при этом он тратит на работу всего пару часов в день и зарабатывает 6 миллионов долларов на рекламе от Google. Завидуете? Я тоже <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Как же ему удалось соединить столько влюбленных пар, используя так мало ресурсов?<span id="more-492"></span></p>
<h2>Источники информации</h2>
<p><em>Данный пост является переводом <a href="http://highscalability.com/plentyoffish-architecture" target="_blank" rel="external nofollow">англоязычной статьи</a>, автор оригинала: Todd Hoff.</em></p>
<li><a href="http://channel9.msdn.com/ShowPost.aspx?PostID=331501#331501" target="_blank" rel="external nofollow">Channel9 интервью с Markus Frind</a></li>
<li><a href="http://plentyoffish.wordpress.com/ target="_blank" rel="external nofollow"">Блог Markus Frind</a></li>
<li><a href="http://www.readwriteweb.com/archives/plentyoffish_one_billion.php" target="_blank" rel="external nofollow">Plentyoffish: компания одного человека может стоить 1 миллиард долларов</a><br />
<h2>Платформа</h2>
</li>
<li>Microsoft Windows</li>
<li>ASP.NET</li>
<li>IIS</li>
<li>Akamai CDN</li>
<li>Foundry ServerIron Load Balancer</li>
<h2>Статистика</h2>
</li>
<li>PlentyOfFish (POF) имеет 1.2 миллиарда просмотров страниц в месяц, в среднем 500 тысяч уникальных авторизованных пользователей в день. Пиковый сезон приходится на январь каждого года, когда эти цифры возрастают на 30%.</li>
<li>POF имеет единственного сотрудника: создатель и генеральный директор Markus Frind.</li>
<li>Зарабатывает до 10 миллионов долларов в год на рекламе от Google, работает при этом только около двух часов в день.</li>
<li>30+ миллионов просмотров страниц в день (500 &#8212; 600 страниц в секунду).</li>
<li>1.2 миллиарда просмотров страниц  и 45 миллионов посетителей в месяц.</li>
<li>Имеет <a href="http://ru.wikipedia.org/wiki/CTR_(%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82)" target="_blank" rel="external nofollow">CTR</a> в 5-10 раз выше, чем Facebook.</li>
<li>Находится в top 30 сайтов США по данным Competes Attention, top 10 в Канаде и top 30 в Великобритании.</li>
<li>Нагрузка балансируется между двумя веб-серверами с 2 Quad Core Intel Xeon X5355 @ 2.66Ghz, 8GB RAM (используется около 800 MB), 2 жесткими дисками, работают под управлением Windows x64 Server 2003.</li>
<li>3 сервера баз данных. Информация об их конфигурации не предоставляется.</li>
<li>Приближается к 64000 одновременных соединений и 2 миллионам просмотрам страниц в час.</li>
<li>Интернет-канал в 1Gbps, из которых используется только 200Mbps.</li>
<li>1 TB трафика от отдачи 171 миллионов изображений через Akamai.</li>
<li>6TB система хранения данных для обработки миллионов полноразмерных изображений, которые загружаются на сайт каждый месяц.<br />
<h2>Что внутри?</h2>
</li>
<li>Модель монетизации заключалась в использовании рекламы от Google. Match.com, для сравнения, получает 300 миллионов долларов в год, в основном с платных подписок. Источник дохода POF должен измениться, чтобы позволить ему получать больше выручки от имеющихся пользователей. Планируется нанять больше сотрудников, в частности людей, которые будут заниматься продажей рекламы напрямую вместо того, чтобы полностью полагаться на AdSense.</li>
<li>При 30 миллионах просмотрах страниц в день можно зарабатывать неплохие деньги на рекламе, даже если <a href="http://en.wikipedia.org/wiki/Cost_per_mille" target="_blank" rel="external nofollow">CPM</a> будет всего 5-10 центов.</li>
<li>Akamai используется для отдачи более 100 миллионов изображений в день. Если на странице 8 изображений и каждое загружается за 100 миллисекунд &#8212; их загрузка займет почти секунду, так что распределение изображений целесообразно.</li>
<li>Десятки миллионов изображений отдаются с серверов POF, но большинство из них размером меньше 2KB и практически полностью закешированы в оперативной памяти.</li>
<li>Все динамично. Практически никакой статики.</li>
<li>Все исходящие данные сжимаются с использованием Gzip, что обходится всего 30% использованием процессорного времени. Используется много вычислительных ресурсов, но зато существенно сокращается использование пропускной способности интернет-канала.</li>
<li>Кэширование ASP .NET не используется, так как данные теряют свою актуальность практически сразу же.</li>
<li>Встроенные компоненты ASP также не используется. Почти все написано с чистого листа. Ничего не может быть более сложным, чем кучка простых if-then-else и циклов. Все максимально элементарно.</li>
<li>Балансировка нагрузки:<br />
- IIS  произвольно ограничивает общее количество соединений до 64000, таким образом балансировщик нагрузки был добавлен для обработки большего количества одновременных соединений. Вариант с добавлением второго IP адреса и использованием round robin DNS также рассматривался, но вариант с балансировщиком нагрузки выглядел более избыточным и позволял более легко расширять количество серверов. Помимо этого ServerIron позволял использовать более продвинутую функциональность, вроде блокировки ботов и балансировку запросов по cookies, сессиям или IP-адресам пользователей.<br />
- Windows Network Load Balancing (NLB) функция не использовалась, так как не поддерживает привязку сессий к серверам. Обходным путем было бы хранение сессионных данных в базе данных или общей файловой системе.<br />
- 8-12 NLB серверов могут объединяться в кластер и может использоваться неограниченное количество таких кластеров. Схема DNS round robin может использоваться для распределения запросов между кластерами. Теоретически такая архитектура могла бы позволить 70 веб-серверам обрабатывать более  300 тысяч одновременных соединений.<br />
- NLB имеет опцию для отправки каждого пользователя на конкретный сервер, таким образом не используется внешнее хранилище для сессионных данных и если сервер выходит из строя &#8212; пользователи просто разлогиниваются из системы. Если это состояние включает в себя например корзину интернет-магазина или какую-то другую важную информацию, то такой подход мог бы показаться неприемлемым, но для сайта знакомств это было бы не так критично.<br />
- Было решено, что хранение и получение сессионных данных программными средствами слишком дорого. Аппаратная балансировка нагрузка проще: пользователи просто назначаются конкретным серверам и в случае сбоя сервера назначенным ему пользователям предлагается пройти процесс авторизации еще раз.<br />
- Покупка ServerIron была дешевле и проще, чем использование NLB. Многие крупные сайты используют их для создания пулов TCP соединений, автоматическому определению ботов и так далее. ServerIron может делать намного больше, чем просто балансировать нагрузку и такие функции достаточно привлекательные за эту цену.</li>
<li>Была большая проблема с выбором системы размещения рекламы. Многие из них хотели несколько сотен тысяч в год и многолетний контракт.</li>
<li>В процессе избавления от ASP.NET повторителей и использование взамен конкатенации строк или response.write. Если у вас миллионы просмотров страниц в день &#8212; просто напишите весь код для отображения на экране пользователя.</li>
<li>Большинство изначальных вложений ушло на построение SAN. Избыточность любой ценой.</li>
<li>Рост был за счет вирусного эффекта. Портал начал набирать популярность в Канаде, затем о нем узнали в Великобритании и Австралии, и только потом в США.</li>
<li>База данных:<br />
- Одна база данных является основной.<br />
- Две базы данных для поиска. Поисковые запросы распределяются по их типу.<br />
- Производительность наблюдается через диспетчер задач. Когда появляются пики &#8212; ситуация рассматривается более детально. Проблемы обычно заключались в блокировках на уровне СУБД. Собственно говоря почти всегда это были проблемы с базами данных, очень редко они возникают на уровне .NET. Так как POF не использует библиотеки .NET, отследить проблемы с производительностью оказывается достаточно просто. Если бы использовалось много уровней framework&#8217;ов, поиск мест, где скрываются проблемы, был бы трудным и утомляющим.<br />
- Если Вы делаете запрос к базе данных 20 раз при отображении одной страницы,  Вы проиграли в любом случае, вне зависимости от того, что Вы будете делать.<br />
- Разделяйте запросы чтения и записи к базе данных. Если у вас нет избыточного количества оперативной памяти не следование этому правилу может заставить систему зависнуть на несколько секунд.<br />
- Постарайтесь делать базы данных только для чтения.<br />
- Денормализуйте данные. Если Вам приходится доставать данные из 20 разных таблиц, попробуйте сделать просто одну таблицу, где будут лежать все нужные для чтения данные.<br />
- Один день может проработать почти что угодно, но когда Ваша база данных удвоится &#8212; использованные подход может внезапно перестать работать.<br />
- Если система делает только что-то одно, она будет делать это реально хорошо. Только записывайте данные и все будет нормально. Только читайте данные и все будет нормально. Делайте и то и другое &#8212; и все испортится. База данных погрязнет в проблемах с блокировками.<br />
- Если Вы полностью используете вычислительные мощности, Вы либо делаете что-то не так, либо Ваша система на самом деле очень оптимизирована. Если вы можете разместить всю базу в оперативной памяти &#8212; обязательно делайте это.</li>
<li>Процесс разработки выглядит примерно следующим образом: появляется идея, быстро реализуется и выдается пользователям в пределах 24 часов. Отклик от пользователей получается по слежению за тем, что они делают на сайте: выросло количество сообщений на пользователя? среднее время сессий выросло? Если пользователям новая фишка не пришлась по вкусу &#8212; просто уберите её.</li>
<li>При небольшом количестве серверов системные сбои достаточно редки и краткосрочны. Наибольшими сложностями были проблемы с DNS, когда некоторые интернет-провайдеры говорили, что POF больше не существует. Но так как сайт бесплатен, пользователи нормально относятся к небольшим периодам его недоступности. Люди часто не замечают простой сайта, так как думают, что это какая-то проблема у них, с интернет-соединением или еще чем-то.</li>
<li>Переход от миллиона пользователей к 12 миллионам пользователей был большим прыжком. Система может обслуживать и 60 миллионов пользователей с двумя веб-серверами.</li>
<li>Часто смотрите на конкурентов для идей новых функциональных возможностей.</li>
<li>Рассмотрите использование чего-то вроде S3, когда система начнет требовать географической балансировки.<br />
<h2>Подводим итоги</h2>
</li>
<li>Вам не нужны миллионы в финансировании, размашистая инфраструктура и целое здание сотрудников для того, чтобы создать вебсайт мирового уровня, который обслуживает кучу пользователей и приносит неплохие деньги. Все что нужно &#8212; всего лишь привлекательная идея, которая понравится большому количеству идей, сайт, который становится популярным благодаря слухам, а также опыт и видение для построения сайта, не наступая на типичные &#171;грабли&#187;. Вот и все, что Вам нужно <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>Необходимость &#8212; мать всех изменений.</li>
<li>Когда вы растете быстро, но не слишком быстро, у Вас появляется шанса расти, модифицировать и адаптироваться.</li>
<li>Максимальное использование оперативной памяти решает массу проблем. После этого рост возможен просто за счет использование более мощных серверов.</li>
<li>В начале старайтесь держать все максимально простым. Практически все дают этот же самый совет, а Markus говорит, что все что он делает &#8212; всего лишь очевидный здравый смысл. Но то что просто, не всегда означает всего лишь осмысленную вещь. Создание простых вещей является результатом многих лет практического опыта.</li>
<li>Поддерживайте время доступа к базе данных быстрым и у Вас не будет проблем.</li>
<li>Одной из основных причин, по которой POF может работать с таким небольшим количеством сотрудников и оборудования, является использование CDN для отдачи активно используемого контента. Использование CDN может оказаться секретным соусом для многих крупных сайтов. Markus считает, что в top 100 не существует ни одного сайта, не использующего CDN. Без CDN время загрузки страницы в Австралии возросло бы до 3-4 секунд только за счет изображений.</li>
<li>Реклама на Facebook принесла плохие результаты. Из 2000 кликов только 1 человек регистрировался. С CTR равным 0.04% Facebook выдавал 0.4 клика на 1000 показов рекламы (CPM). При 5 центах CPM = 12.5 центов за клик, 50 центах CPM = 1.25$ за клик. 1 доллар CPM = 2.50$ за клик. 15$ CPM = 37.50$ за клик.</li>
<li>Это просто продавать несколько миллионов просмотров страниц с высоким CPM, но НАМНОГО сложнее продавать миллиарды просмотров с высоким CPM, как это делают Myspace и Facebook.</li>
<li>Модель монетизации, основанная на рекламе, ограничивает Ваши доходы. Вам придется переходить к платной модели чтобы повышать прибыль. Генерировать 100 миллионов долларов в год за счет бесплатного сайта  практически невозможно &#8212; Вам потребуется слишком большой рынок.</li>
<li>Повышение количества просмотров за счет Facebook не работает для сайтов знакомств. Иметь посетителя на собственном сайте намного более прибыльно. Большинство просмотров страниц на Facebook находятся за пределами США и Вам придется делить 5 центов CPM с Facebook.</li>
<li>Предложение пользователям при регистрации получить информацию об ипотеке или каком-то другом продукте, может стать неплохим источником дополнительной выручки.</li>
<li>Вы не можете постоянно прислушиваться к отзывам пользователей. Кому-то всегда будут нравиться новые функции, а кто-то всегда будет их ненавидеть, но только часть из них сообщит Вам об этом. Вместо этого лучше смотреть как новые функции влияют на то, чем люди на самом деле занимаются, просто смотря на Ваш сайт и статистику его использования.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-plenty-of-fish/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Aladdin от Baidu</title>
		<link>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 21:01:12 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Aladdin]]></category>
		<category><![CDATA[Baidu.com]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[поиск]]></category>
		<category><![CDATA[поисковые системы]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=407</guid>
		<description><![CDATA[Наверняка все прекрасно знают о лидерах интернет-поиска в российской части интернета: про Google, Яндекс или Рамблер сказано уже не мало слов, все много раз о них читали, пользовались, обсуждали &#8212; ведь уже прошло больше 10 лет с момента создания каждой из этих поисковых систем и, как следствие, их конкуренции на просторах рунета. Намного меньше же [...]]]></description>
			<content:encoded><![CDATA[<p><img title="Aladdin" src="http://www.insight-it.ru/wp-content/uploads/2009/12/left01.gif" alt="Aladdin Logo" width="643" height="176" /></p>
<p>Наверняка все прекрасно знают о лидерах интернет-поиска в российской части интернета: про Google, Яндекс или Рамблер сказано уже не мало слов, все много раз о них читали, пользовались, обсуждали &#8212; ведь уже прошло больше 10 лет с момента создания каждой из этих поисковых систем и, как следствие, их конкуренции на просторах рунета. Намного меньше же внимания на российских информационных сайтах уделяется национальным проектам других стран, а ведь среди них тоже есть заслуживающие внимания экземпляры, об одном из них я бы и хотел сегодня поведать.<br />
<span id="more-407"></span></p>
<h2>Источники данных</h2>
<ul>
<li><a href="http://tech.sina.com.cn/i/2009-12-16/14423683386.shtml" target="_blank" rel="external nofollow">Baidu Aladdin Technology Guashudila</a></li>
<li><a href="http://tech.sina.com.cn/i/2009-08-18/16063362415.shtml" target="_blank" rel="external nofollow">Rachel Liao, лекция директора по архитектуре Baidu</a></li>
<li><a href="http://news.xinhuanet.com/it/2006-04/06/content_4390847.htm" target="_blank" rel="external nofollow">Baidu Chief Architect: алгоритмы на службе разработчиков Baidu</a></li>
<li><a href="http://baike.baidu.com/view/2086291.htm" target="_blank" rel="external nofollow">Aladdin Plans</a></li>
</ul>
<p><em>Если кто-то достаточно любопытен, чтобы нажать на приведенные ссылки &#8212; они все на китайском, так что статья написана на основе перевода Google Translate со всеми вытекающими последствиями. Даже за название &#171;Aladdin&#187; не ручаюсь, его тоже он придумал <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<h2>О компании Baidu</h2>
<p><a href="http://www.baidu.com" target="_blank" rel="external nofollow">Baidu.com</a> является лидером китайского рынка интернет-поиска, объем которого достаточно значителен. На данный момент Китай насчитывает около 340-360 миллионов интернет-пользователей, что превышает общую численность населения США. Не трудно представить с каким трафиком приходится сталкиваться крупнейшей китайской поисковой системе.</p>
<p>Чтобы не быть голословным, еще немного цифр о Baidu:</p>
<ul>
<li>100 миллионов поисковых запросов в день</li>
<li>Более миллиарда проиндексированных страниц</li>
<li>300-400 миллионов проиндексированных сайтов</li>
</ul>
<p>Уже на сегодняшний день размеры китайской части интернета производят впечатление и с каждым днем она расширяется все больше. Как следствие, на рынке образуются все новые и новые возможности для создания сервисов, удовлетворяющих потребности китайских пользователей Интернет. Компания <strong>Baidu Inc.</strong> пристально наблюдает за развитием ситуации и обнаружила огромную потребность среди сервис-провайдеров в удобной платформе для создания и предоставления пользователям новых сервисов. Baidu считает создание платформы для использования их технологии сторонними разработчиками и сервис-провайдерами очень важным направлением развития на пути к повышению качества пользовательского опыта в целом. Эти наблюдения стали толчком к рождению в рамках Baidu новой технологии под названием <a href="http://open.baidu.com/" target="_blank" rel="external nofollow">Aladdin</a>.</p>
<p>Как крупнейшей китайской поисковой системе, Baidu приходится быть чем-то большим, чем просто инструментом для поиска, это позволяет удовлетворять потребности потенциальных клиентов наиболее гармоничным и целесообразным образом. Помимо неустанной погони за технологическими инновациями, Baidu предпочитает придерживаться политики &#171;потребности клиентов важнее всего&#187;.</p>
<h2>Aladdin</h2>
<p>Согласно официальному сайту Baidu, эта технология представляет собой открытую поисковую платформу, позволяющую сторонним разработчикам использовать технологию Baidu в своих приложениях и сервисах. Владельцы интернет-проектов и разработчики могут предоставить Baidu данные в уже структурированном виде для того, чтобы создать еще более мощные и функционально-насыщенные приложения, позволяя интернет-сайтам получать еще более значимый трафик, а пользователям &#8212; еще больше облегчить использование сайтов и поиск в сети Интернет.</p>
<p>В декабре 2008 года Baidu объявили о высокоприоритетной программе под кодовым названием <em>&#171;Aladdin&#187;</em>, основной идеей была попытка расширить текущие рамки веб-поиска, по большей части за счет включения так называемого &#171;глубинного интернета&#187; в поисковую базу, проведения более глубокого анализа контента. Помимо этого упоминались возможность интеграции и управляемой обработки информации, направленных на минимизацию издержек поиска и времени обработки запроса при повышение общего качества поисковых результатов. В том же заявлении Baidu также описали их общую позицию по данному направлению: платформа Aladdin является надстройкой над текущей поисковой системой Baidu, позволяющей дополнение и расширение функциональных возможностей.</p>
<p>Согласно исследованиям Baidu, только 75% пользователей поисковых систем в конечном итоге удовлетворяют свои информационные потребности. В процессе анализа причин данного факта было выявлено, что в большом количестве случаев искомая информация находится на ресурсах по каким-то причинам находящимся вне доступа поисковых систем (начиная от технических ограничений, отсутствия внешних ссылок на ресурс и заканчивая искусственными барьерами вроде REP или принудительной авторизации).</p>
<p>Перед разработчиками Aladdin встают две основные проблемы с точки зрения технической реализации: &#171;как определить пользовательские потребности&#187; и &#171;как сортировать&#187;. Конечно же они очень тесно связаны между собой, это хорошо демонстрирует пример с поисковым запросом &#171;полное солнечное затмение&#187;: до затмения пользователи хотят когда оно будет и откуда лучше смотреть, а во время и после него намного актуальнее будет увидеть видео-запись или прямую трансляцию, а также прочитать и поделиться комментариями. Самым простым методом решения данного класса задач является статистический анализ &#8212; Aladdin выделяет два основных фактора, используемых для сортировки результатом в соответствии с потребностями пользователей: &#171;удовлетворенность потребностей&#187; и &#171;уровень отклика на спрос&#187;. Конечно же оценочные характеристики спроса и потребностей не означают сам спрос, то есть возможны и более сложные ситуации, когда за пользовательским запросом стоит целый комплекс более простых потребностей.</p>
<p>Алгоритмы, используемые в Aladdin для решения упомянутых проблем, основаны на машинном обучении, анализе поведения пользователей, а также обратной связи от использования технологии на практике. Конечная цель данной платформы заключается в построении целой интеллектуальной экосистемы,  которая станет новым шагом в развитии компании Baidu и китайской части интернета в целом.</p>
<h3>Возможности платформы</h3>
<p>С технической точки зрения Aladdin от Baidu представляет собой открытый API к поисковой технологии Baidu, позволяющий добавлять свои данные в структурированном виде в поисковый индекс, отмечать релевантные ключевые слова, методы отображения информации и пометки данных гео-метками.</p>
<p>Одним из важнейших направлений развития поисковых систем является повышение &#171;интеллектуальности&#187; поиска, Baidu уделяет внимание не только обнаружению более ценной информации в глубинах Интернета, но и предоставлению более удобных, точных и сообразительных поисковых сервисов.</p>
<p>На сегодняшний день, технология Aladdin была интегрирована в ряд приложений, позволив тем самым реализовать на страницах с результатами поиска множество интересных возможностей: прямой звонок клиенту для обсуждения каких-то товаров или услуг, интеграция с почтовым сервисом, прослушивание музыки с использованием встроенного flash-плеера и многие другие.</p>
<p>После обязательной процедуры подачи и рассмотрения заявки пользователям платформы Aladdin предоставляются следующие возможности:</p>
<ul>
<li>Добавление данных в индекс в структурированном виде</li>
<li>Указание ключевых слов для более точного прямого воздействия на целевую аудиторию</li>
<li>Управление сортировкой и отображением информационного контента</li>
<li>Управление стилем и внешним видом имеющихся ресурсов, причем не только текстовых</li>
<li>Выбор частоты обновления информации для синхронизации данных</li>
</ul>
<p>На первый взгляд все эти рассуждения и заявления о функциональных возможностях кажутся абсурдными, даже отчасти ироничными. Ну кому может понадобиться вручную управлять результатами поиска, добавлять и структурировать данные, возиться с сортировкой и внешним видом?</p>
<h3>Взгляд с другой стороны</h3>
<p>Да, вся платформа Aladdin по своей задумке очень искуственна: практически все делается вручную, но по сути это лишь процесс интеграции, а не работа с самим контентом. Для большинства других поисковых систем такой подход неприемлем: где найти столько людей, чтобы управлять огромными массивами данных вручную? Наоборот все поисковые системы стремятся по максимуму все автоматизировать и борятся с искуственным вмешательством в поисковый индекс (т.н. SEO), но&#8230; если вспомнить, что Baidu работает в Китае &#8212; вся затея начинает обретать здравый смысл. Как сама компания Baidu, так и большинство их потенциальных партнеров, клиентов и пользователей находится в примерно одинаковой ситуации: большое количество дешевой рабочей силы, относительно низкий уровень образования и профессиональной подготовки, а также прочие национальные особенности. В их ситуации не выгодно идти по пути Google и делать <em>основной</em> акцент на построении полностью автоматизированных систем анализа контента, добавления дополнительного материала к поисковым результатам и самим делать различные дополнительные приложения и сервисы. Намного выгоднее пойти по собственному пути, более адаптированному к ситуации в Китае, большое количество трудолюбивых людей позволяет строить сервисы коллективно, с привлечением партнеров, клиентов и заинтересованных лиц. Да, во многом вручную, за счет интеграции совершенно различных систем и сервисов, но зато более качественно и продуманно. В этом-то и заключается вся магия Китая.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Архитектура Stack Overflow</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-overflow/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-overflow/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 21:31:47 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[Beyond Compare 3]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Lenovo]]></category>
		<category><![CDATA[Lenovo ThinkServer]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Server Fault]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[Stack Overflow]]></category>
		<category><![CDATA[Subversion]]></category>
		<category><![CDATA[Super User]]></category>
		<category><![CDATA[Visual Studio 2008 Team Suite]]></category>
		<category><![CDATA[VisualSVN]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Stack Overflow]]></category>
		<category><![CDATA[архитектура высоконагруженных сайтов]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=466</guid>
		<description><![CDATA[Stack Overflow является любимым многими программистами сайтом, где можно задать профессиональный вопрос и получить ответы от коллег. Этот проект был написан двумя никому не известными парнями, о которых никто никогда раньше не слышал. Хорошо, не совсем так. Stack Overflow был создан топовыми программистами и звездами блогосферы: Jeff Atwood и Joel Spolsky. В этом отношении Stack Overflow похож [...]]]></description>
			<content:encoded><![CDATA[<p><img class="size-full wp-image-475 alignright" style="float: right; margin: 8px; border: 1px solid #aaa;" title="Stack Overflow" src="http://www.insight-it.ru/wp-content/uploads/2010/01/logo.gif" alt="Stack Overflow" width="250" height="61" /></p>
<p><a rel="external nofollow" href="http://stackoverflow.com/" target="_blank">Stack Overflow</a> является любимым многими программистами сайтом, где можно задать профессиональный вопрос и получить ответы от коллег. Этот проект был написан двумя никому не известными парнями, о которых никто никогда раньше не слышал. Хорошо, не совсем так. Stack Overflow был создан топовыми программистами и звездами блогосферы: <a rel="external nofollow" href="http://www.codinghorror.com/blog/" target="_blank">Jeff Atwood</a> и <a rel="external nofollow" href="http://www.joelonsoftware.com/" target="_blank">Joel Spolsky</a>. В этом отношении Stack Overflow похож на ресторан, владельцами которого являются знаменитости. По оценкам Joel&#8217;а около 1/3 программистов всего мира использовали этот интернет-ресурс, так что должно быть он представляет собой что-то достаточно полезное и интересное.</p>
<p>Одним из ключевых моментов в истории Stack Overflow является использование вертикального масштабирования, как достаточно работоспособного решения достаточного большого класса проблем. Не смотря на то, что публика на сегодняшний день больше склоняется к подходу с использованием горизонтальным масштабирования и не-SQL баз данных.</p>
<p>Если Вы стремитесь к масштабу Google, у Вас нет другого выхода, как двигаться в направлении не-SQL. Но Stack Overflow &#8212; это не Google, ровно как и подавляющее большинство других сайтов. Когда Вы задумываетесь о возможных вариантов дизайна Вашего проекта, попробуйте учесть и историю Stack Overflow, она тоже имеет право на жизнь. В этот век многоядерных машин с большим объемом оперативной памяти и невероятными темпами развития методов параллельного программирования, вертикальное масштабирование все еще является жизнеспособной стратегией и не должна сразу же отбрасываться в сторону просто так как это теперь больше не модно. Возможно в один прекрасный день мы получим лучшее из обоих миров, но на сегодняшний момент перед нами лежит большой болезненный выбор стратегии масштабирования, от которого определенно зависит судьба Вашего проекта.</p>
<p>Joel любит похвастаться тем, что они достигли производительности, сравнимой с другими сайтами аналогичных размеров, используя в 10 раз меньше оборудования. Он удивляется, работали над этими сайтами по-настоящему хорошие программисты. Давайте взглянем на то, как им это удалось, и дадим Вам возможность побыть судьей.</p>
<p><span id="more-466"></span></p>
<p><em>Перевод <a rel="external nofollow" href="http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html" target="_blank">статьи</a>, автор оригинала &#8212; Todd Hoff. Возможно будет еще один пост с менее формальной информацией на ту же тему.</em></p>
<h2>Статистика</h2>
<li>16 миллионов просмотров страниц в месяц</li>
<li>3 миллионов уникальных пользователей в месяц (для сравнения: Facebook насчитывает около 77 миллионов уникальных пользователей в месяц)</li>
<li>6 миллионов посещений в месяц</li>
<li>86% трафика приходит с Google</li>
<li>9 миллионов активных программистов во всем мире и 30% пользуются Stack Overflow</li>
<li>Более дешевые лицензии были получены через программу Microsoft <a rel="external nofollow" href="http://www.microsoft.com/BizSpark" target="_blank"></a>BizSpark. Скорее всего они заплатили около 11000$ за лицензии на ОС и MSSQL.</li>
<li>Стратегия монетизации: ненавязчивая реклама, вакансии, конференции DevDays, достижения других смежных ниш (Server Fault, Super User), разработка <a rel="external nofollow" href="http://stackexchange.com/" target="_blank">StackExchange</a> и возможно каких-то других систем рейтингов для программистов.<br />
<h2>Платформа</h2>
</li>
<li>Microsoft ASP.NET MVC</li>
<li>SQL Server 2008</li>
<li>C#</li>
<li>Visual Studio 2008 Team Suite</li>
<li>JQuery</li>
<li>LINQ to SQL</li>
<li>Subversion</li>
<li>Beyond Compare 3</li>
<li>VisualSVN 1.5</li>
<li>Веб уровень:<br />
- 2 x Lenovo ThinkServer RS110 1U<br />
- 4 ядра, 2.83 Ghz, 12 MB L2 cache<br />
- 500 GB жесткие диски, зеркалирование RAID1<br />
- 8 GB RAM</li>
<li>Уровень базы данных:<br />
- 1 x Lenovo ThinkServer RD120 2U<br />
- 8 ядер, 2.5 Ghz, 24 MB L2 cache<br />
- 48 GB RAM</li>
<li>Четвертый сервер был добавлен для запуска <a rel="external nofollow" href="http://superuser.com/" target="_blank">superuser.com</a>. Все сервера вместе обеспечивают работу <a rel="external nofollow" href="http://stackoverflow.com/" target="_blank">Stack Overflow</a>, <a rel="external nofollow" href="http://serverfault.com/" target="_blank">Server Fault</a>, и <a rel="external nofollow" href="http://superuser.com/" target="_blank">Super User</a>.</li>
<li>QNAP TS-409U NAS для резервного копирования данных. Было принято решение не использовать &#171;облачные&#187; решения, так как вызванные ими дополнительные 5GB трафика ежедневно были бы накладными.</li>
<li>Сервера располагаются у <a rel="external nofollow" href="http://www.peakinternet.com/" target="_blank">Peak Internet</a>. В основном из-за впечатляющей детализации технических ответов и разумных расценок.</li>
<li>Полнотекстный поиск в SQL Server активно используется для реализации поиска по сайту и выявления повторных вопросов. Lucene .NET рассматривается как достаточно заманчивая альтернатива.<br />
<h2>Подводим итоги</h2>
<p>Данный список является сборником уроков от Jeff и Joel, а также из комментариев к их записям:</li>
<li>Если Вы комфортно себя чувствуете в деле управления серверами &#8212; не бойтесь покупать их. Две основных проблемы с издержками аренды оборудования: 1) невероятные цены на дополнительную оперативную память и жесткие диски 2) хостинг-провайдеры на самом деле не могут управлять чем-либо за Вас.</li>
<li>Делайте одноразовые более крупные инвестиции в оборудование, чтобы избежать быстро растущих ежемесячных издержек по аренде, которые окажутся более высокими в долгосрочном периоде.</li>
<li>Обновляйте сетевые драйвера. Производительность запросто может удвоиться.</li>
<li>Использование 48GB RAM требует обновления до MS Enterprise edition.</li>
<li>Оперативная память невероятно дешевая. Используйте возможности по её расширению по максимуму для получения практически бесплатной производительности. У Dell, например, переход от 4GB памяти до 128GB стоит всего 4378$.</li>
<li>Stack Overflow скопировали ключевую часть структуры базы данных у Wikipedia. Это обернулось огромной ошибкой, для исправления которой потребуется большой и болезненный рефакторинг базы данных. Основным направлением изменений будет избавление от излишних операций по объединению данных в большом количестве ключевых запросов. Это ключевой урок, который стоит усвоить у гигантских много-терабайтных схем (вроде Google BigTable), которые полностью избавлены от операций объединения данных. Этот вопрос был достаточно важен для Stack Overflow, так как их база данных практически полностью располагается в оперативной памяти и операции join по прежнему требуют относительно много вычислительных ресурсов.</li>
<li>Производительность CPU оказывается на удивление важным фактором для серверов баз данных. Переход от 1.86 GHz, к 2.5 GHz, и к 3.5 GHz процессорам дает практически линейный прирост к времени выполнения типичных запросов. Исключение: запросы, которые затрагивают не только оперативную память.</li>
<li>Когда оборудование арендуется, обычно никто не платит за дополнительную оперативную память, если только вы не на помесячном контракте.</li>
<li>В 90% случаев наиболее узким местом является база данных.</li>
<li>При небольшом количестве серверов,  ключевым компонентом издержек становится не место в стойках, электроэнергия, интернет-канал, сервера или программное обеспечение, а СЕТЕВОЕ ОБОРУДОВАНИЕ. Вам потребуется как минимум гигабитное соединение между уровнями веб-серверов и баз данных. Между интернетом и веб-серверами потребуется firewall, маршрутизатор и VPN. К моменту добавления второго веб-сервера понадобится решение для балансировки нагрузки. Суммарная стоимость такого оборудования может запросто вдвое превосходить стоимость пяти серверов.</li>
<li>EC2 предназначен для горизонтального масштабирования, для того чтобы нагрузка могла быть распределена между большим количеством машин (достаточно хорошая идея, если Вы планируете расширяться). Еще больше смысла в таком подходе появляется, если вы планируете масштабироваться по необходимости (то есть добавлять и убирать машины в зависимости от уровня нагрузки).</li>
<li>Горизонтальное масштабирование может проходить относительно безболезненно только при использовании open source программного обеспечения. В противном случае вертикальное масштабирование значит сокращение издержек, связанных с лицензиями, в ущерб стоимости оборудования, а горизонтальное масштабирование &#8212; наоборот: экономия на оборудовании, но требуется существенно больше лицензий на программное обеспечение.</li>
<li>RAID-10 отлично работает для баз данных с высокой нагрузкой операций чтения и записи.</li>
<li>Разделяйте работу приложений и баз данных таким образом, чтобы они могли масштабироваться независимо друг от друга. Например, базы данных могут  масштабироваться вертикально, а сервера приложений &#8212; горизонтально.</li>
<li>Приложения должны хранить все информацию о своем состоянии в базе данных для обеспечения возможности роста путем простого добавления серверов приложений в кластер.</li>
<li>Одна из основных проблем со стратегией вертикального масштабирования &#8212; недостаток избыточности. Кластеризация добавляет надежности, но когда стоимость каждого сервера высока &#8212; это не так просто реализовать.</li>
<li>Некоторые приложения могут масштабироваться линейно относительно числа процессоров. Но зачастую будут использоваться механизмы блокировки, что приведет к сериализации вычислений и в итоге к существенному уменьшению эффективности приложения.</li>
<li>С более крупными серверами, занимающими от 7U в стойке, электроэнергия и охлаждение становятся критичными вопросами. Возможно использование чего-то среднего между 1U и 7U может облегчить Ваши взаимоотношения с датацентром.</li>
<li>С добавлением все новых и новых серверов баз данных издержки на лицензии SQL Server могут стать очень существенными. Если Вы начнете с вертикального масштабирования и постепенно начнете переходить к горизонтальному с использованием не open source продуктов, возможно это сильно ударит по Вашему финансовому состоянию. Это справедливо, что в этой заметке речь идет не совсем об архитектуре проекта. Мы знаем об их серверах, об используемом наборе инструментов, об их двухуровневой схеме, где база данных используется напрямую из кода веб-серверов. Но мы не знаем практически ничего о самой реализации, например таких мелочей как теги. Если Вам интересен этот вопрос, возможно Вам удастся получить интересующую Вас информацию из <a rel="external nofollow" href="http://sqlserverpedia.com/wiki/Understanding_the_StackOverflow_Database_Schema" target="_blank">описания их схемы базы данных</a>.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-overflow/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Terrastore</title>
		<link>http://www.insight-it.ru/masshtabiruemost/terrastore/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/terrastore/#comments</comments>
		<pubDate>Wed, 06 Jan 2010 22:22:03 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Terracotta]]></category>
		<category><![CDATA[Terrastore]]></category>
		<category><![CDATA[документы]]></category>
		<category><![CDATA[хранение]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=449</guid>
		<description><![CDATA[Terrastore является свежеиспеченной системой хранения документов, с отличными возможностями по масштабируемости и эластичной настройке, при этом без жертв со стороны консистентности данных. Вместо подробного описания несколько ключевых характеристик продукта: Легкодоступность: данные доступны посредством повсеместно используемого протокола HTTP. Распреденность: узлы могут работать и существовать на любых доступных серверах. Эластичность: имеется возможность динамического добавления и удаления узлов [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="external nofollow" href="http://code.google.com/p/terrastore/" target="_blank">Terrastore</a> является свежеиспеченной системой хранения документов, с отличными возможностями по масштабируемости и эластичной настройке, при этом без жертв со стороны консистентности данных.</p>
<p>Вместо подробного описания несколько ключевых характеристик продукта:</p>
<ul>
<li><strong>Легкодоступность:</strong> данные доступны посредством повсеместно используемого протокола HTTP.</li>
<li><strong>Распреденность:</strong> узлы могут работать и существовать на любых доступных серверах.</li>
<li><strong>Эластичность:</strong> имеется возможность динамического добавления и удаления узлов кластера на лету, без малейшего простоя системы и каких-либо изменений в конфигурации.</li>
<li><strong>Масштабируемость на уровне данных:</strong> документы разбиваются на группы и распределяются между доступными узлами с автоматической прозрачной балансировкой, в том числе и при добавлении и исключении узлов в кластере.</li>
<li><strong>Масштабируемость на вычислительном уровне:</strong> запросы и обновление данных распределяются по узлам, которые физически хранят используемые данные, тем самым минимизируется трафик и распределяется вычислительная нагрузка.</li>
<li><strong>Консистентность:</strong> система обеспечивает по-документную консистентность данных, таким образом гарантируя тот факт, что пользователь всегда получает самую свежую версию документа, обеспечивая изоляцию для параллельных модификаций документов.</li>
<li><strong>Отсутствие схемы:</strong> предоставляет JSON интерфейс, основанный на коллекциях; пользователям предоставляется возможность просто создать свою коллекцию и положить туда что угодно.</li>
<li><strong>Простота в работе:</strong> установка полностью работоспособного кластера заключается в вводе всего нескольких команд и не требует какого-либо редактирование XML-конфигов.</li>
<li><strong>Богатый функционал:</strong> поддерживаются push-down предикаты, запросы по диапазонам и серверные функции обновления.</li>
</ul>
<p>Если Вам показалось интересным, у Вас есть возможность <a rel="external nofollow" href="http://code.google.com/p/terrastore/" target="_blank">получить более подробную информацию</a>, <a rel="external nofollow" href="http://groups.google.com/group/terrastore-discussions" target="_blank">принять участие в проекте</a>, <a rel="external nofollow" href="http://code.google.com/p/terrastore/downloads/list" target="_blank">скачать дистрибутив</a> или <a rel="external nofollow" href="http://code.google.com/p/terrastore/source/createClone" target="_blank">получить копию исходного кода</a>!<br />
﻿<span id="more-449"></span><br />
<em> В очередной раз спасибо </em><a rel="external nofollow" href="http://highscalability.com/blog/2009/12/30/terrastore-scalable-elastic-consistent-document-store.html" target="_blank"><em>highscalability.com за источник информации</em></a><em>, за одно хотелось бы услышать мнения о таком формате постов. Я тут уже почти неделю копаюсь над постом-долгостроем про Baidu, а такой можно сочинить за полчаса.</em></p>
<p><em>Кстати про </em><a rel="external nofollow" href="http://www.terracotta.org" target="_blank"><em>Terracotta</em></a><em>, на основе которой работает данный продукт, тоже давно пора было уже написать, в ближайшее время займусь <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/terrastore/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Архитектура MySpace</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 13:15:56 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[MySpace]]></category>
		<category><![CDATA[myspace.com]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура MySpace]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=370</guid>
		<description><![CDATA[MySpace.com является одним из наиболее быстро набирающих популярность сайтов в Интернете с 65 миллионами пользователей и 260000 регистрациями в день. Этот сайт часто подвергается критике из-за не достаточной производительности, хотя на самом деле MySpace удалось избежать ряда проблем с масштабируемостью, с которыми большинство других сайтов неизбежно сталкивались. Как же им это удалось? Источники информации Данная [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="external nofollow" href="http://www.myspace.com" target="_blank">MySpace.com</a> является одним из наиболее быстро набирающих популярность сайтов в Интернете с 65 миллионами пользователей и 260000 регистрациями в день. Этот сайт часто подвергается критике из-за не достаточной производительности, хотя на самом деле MySpace удалось избежать ряда проблем с масштабируемостью, с которыми большинство других сайтов неизбежно сталкивались. Как же им это удалось?<br />
<span id="more-370"></span></p>
<h2>Источники информации</h2>
<p><em>Данная статья является переводом статьи <a rel="external nofollow" href="http://highscalability.com/blog/2009/2/12/myspace-architecture.html" target="_blank">MySpace Architecture</a>, автором которой является Todd Hoff. Когда-то давно один из читателей этого блога просил меня осветить и эту тему, тогда я так и не решился из-за отсутствия моего личного интереса, но сейчас снова случайно наткнулся на эту статью и подумал: а почему бы и нет?</em></p>
<ul>
<li><a rel="external nofollow" href="http://www.infoq.com/news/2009/02/MySpace-Dan-Farino" target="_blank">Презентация: за сценой MySpace.com</a></li>
<li><a rel="external nofollow" href="http://www.baselinemag.com/c/a/Projects-Networks-and-Storage/Inside-MySpacecom/" target="_blank">Внутри MySpace.com</a></li>
</ul>
<h2>Платформа</h2>
<ul>
<li>ASP .NET 2.0</li>
<li>Windows</li>
<li>IIS</li>
<li>MSSQL Server</li>
</ul>
<h2>Что внутри?</h2>
<ul>
<li>300 миллионов пользователей.</li>
<li>Отдает 100Gbps в Интернет. 10Gbps из них является HTML контентом.</li>
<li>4,500+ веб серверов со связкой: Windows 2003 / IIS 6.0 / ASP .NET.</li>
<li>1,200+ кэширующих серверов, работающих на 64-bit Windows 2003. На каждом 16GB объектов находятся в кэше в оперативной памяти.</li>
<li>500+ серверов баз данных, работающих на 64-bit Windows и SQL Server 2005.</li>
<li>MySpace обрабатывает 1.5 миллиарда просмотров страниц в день, а также 2.3 миллионов одновременно работающих пользователей в течении дня.</li>
<li>Вехи по количеству пользователей:<br />
- 500 тысяч пользователей: простая архитектура перестает справляться<br />
- 1 миллион пользователей: вертикальное партиционирование временно спасает от основных болезненных вопросов с масштабированием<br />
- 3 миллиона пользователей: горизонтальное масштабирование побеждает над вертикальным<br />
- 9 миллионов пользователей: сайт мигрирует на ASP.NET, создается виртуализированная система хранения данных (SAN)<br />
- 26 миллионов пользователей: MySpace переходит на 64-битную технологию.</li>
<li>500 тысяч учетных записей было многовато для двух веб-серверов и одного сервера баз данных.</li>
<li>На 1-2 миллионах учетных записей:<br />
- Они использовали архитектуру базы данных, построенную на концепции вертикального партиционирования, с отдельными базами данных для разных частей сайта, которые использовались для выполнения различных функций, таких как экран авторизации, профили пользователей и блоги.<br />
- Схема с вертикальным партиционированием помогала разделить нагрузку как для операций чтения, так и для операций записи, а если пользователям в друг оказывалась нужна новая функциональная возможность &#8212; достаточно было просто добавить еще один сервер баз данных для её обслуживания.<br />
- MySpace переходит от использования систем хранения, подключенных к серверам баз данных напрямую, к сетям хранения данных (SAN), при таком подходе целый массив систем хранения объединяется вместе специализированной сетью с высокой пропускной способностью, и сервера баз данных также получают доступ к хранилищам через эту сеть. Переход к SAN оказал положительное влияние как на производительность, так и на доступность и надежность системы.</li>
<li>На 3 миллионах учетных записей:<br />
- Решение с вертикальным партиционированием не протянуло долго, так как им приходилось реплицировать какую-то часть информации (например информацию об учетных записях) по всем вертикальным частям базы данных. С таким большим количеством операций репликации данных один узел даже при незначительном сбое мог существенно замедлить обновление информации во всей системе.<br />
- Индивидуальные приложения вроде блогов на под-секциях сайта достаточно быстро стали слишком большими для нормальной работы с единственным сервером базы данных<br />
- Произведена реорганизация всех ключевых данных для более логичной организации в единственную базу данных<br />
- Пользователи были разбиты на группы по миллиону в каждой и каждая такая группа была перемещена на отдельный SQL Server</li>
<li>9–17 миллионов учетных записей:<br />
- Переход на ASP .NET, который требовал меньше ресурсов по сравнению с их предыдущим вариантом архитектуры. 150 серверов, использовавших новый код могли обработать нагрузку, для которой раньше требовалось 246 серверов.<br />
- Снова пришлось столкнуться с узким местом в системе хранения данных. Реализация SAN решило какую-то часть старых проблем с производительностью, но на тот момент потребности сайта начали переодически превосходить возможности SAN по пропускной способности операций ввода-вывода &#8212; той скорости, с которой она может читать и писать данные на дисковые массивы.<br />
- Столкнулись с лимитом производительности при размещении миллиона учетных записей на одном сервере, ресурсы некоторых серверов начали исчерпываться.<br />
- Переход к виртуальному хранилищу, где весь SAN рассматривается как одно большое общее место для хранения данных, без необходимости назначать конкретные диски для хранения данных определенной части приложения. MySpace на данный момент работает со стандартизированным обородуванием от достаточно нового вендора SAN &#8212; 3PARdata</li>
<li>Был добавлен кэширующий уровень — прослойка из специализированных серверов, расположенных между веб-серверами и серверами данных, чья единственная задача была захватывать копии часто запрашиваемых объектов с данными в памяти и отдавать их веб-серверам для минимизации количества поиска данных в СУБД.</li>
<li>26 миллионов учетных записей:<br />
- Переход на 64-битные сервера с SQL Server на правах решения проблемы с недостатком оперативной памяти. С тех пор их стандартеый сервер баз данных оснащен 64 GB RAM.</li>
<li><strong>Горизонтальная федерация баз данных</strong>. Базы данных партиционируются в зависимости от своего назначения. У них есть базы данных с профилями, электронными сообщениями и так далее. Каждая партиция основана на диапазоне пользоваталей. По миллиону в каждой базе данных. Таким образом,  у них есть Profile1, Profile2 и все остальные базы данных вплоть до Profile300, если считать, что у них на данный момент зарегистрировано 300 миллионов учетных записей.</li>
<li>Кэш ASP не используется, так как он не обеспечивает достаточного процента попаданий на веб серверах. Кэш, организованный как промежуточный слой, имеет существенно более высокое значение данного показателя.</li>
<li><strong>Изоляция сбоев</strong>. Внутри веб-сервера запросы сегментируются по базам данным. Разрешено использование только 7 потоков для работы с каждуой базой данных. Таким образом, если база данных по каким-то причинам начинает работать медленно, только эти потоки замедлятся, в то время как остальные потоки будут успешно продолжать обрабатывать поток трафика.</li>
</ul>
<h2>Работа сайта</h2>
<ul>
<li><strong>Коллектор данных о производительности</strong>. Централизованная система сбора информации о производительности через UDP. Такой подход более надежен, чем стандартный механизм Windows, а также позволяет любому клиенту подключиться и увидеть статистику.</li>
<li><strong>Веб-система по просмотру дампов стеков процессов</strong>. Можно просто сделать клик правой кнопкой мыши на проблемном сервере и увидеть дамп стека процесов, управляемых .NET. И это после привычки каждой раз удаленно подключаться к серверу, влючать дебаггер и через полчаса получать свой ответ о том что же все таки происходит. Медленно, немасштабируемо и утомительно. Эта же система позволяет увидеть не просто стек процесса, но и предоставляет большое количество информации о контектсе, в котором он работает. Обнаружение проблем намного проще при таком подходе, например можно легко увидеть, что база не отвечает, так как 90 ее потоков заблокировано.</li>
<li><strong>Веб-система создания дампа heap-памяти</strong>. Создает дамп всей выделенной памяти. Очень удобно и полезно для разработчиков. Сэкономьте часы на выполнение этой работы вручную.</li>
<li><strong>Профайлер</strong>. Прослеживает запрос от начала до конца и выводит подробный отчет. В нем можно увидеть URL, методы, статус, а также все, что поможет идентифицировать медленный запрос и его причины. Обнаруживает проблемы с блокировкой потоков, непредвиденными исключениями, другими словами все, что может оказаться интересным. В то же время остается очень легковесным решением. Работает на одной машине из каждой VIP (группа из 100 серверов) в production-среде. Опрашивает 1 поток каждые 10 секунд. Постоянно следит за системой в фоновом режиме.</li>
<li><strong>Powershell</strong>. Новая программная оболочка от Microsoft, которая работает в процессе и передаем объекты между командами вместо работы с текстовыми данными. MySpace разрабатывает множество так называемых commandlets&#8217;ов для поддержки различных операций.</li>
<li>Разработана собственная технология асинхронной коммуникации для того, чтобы обойти проблемы с сетевыми проблемами Windows и работать с серверами как с группой. Например, она позволяет доставить файл .cs, скомпилировать его, запустить, и доставить результат обратно.</li>
<li><strong>Развертывание</strong>. Обновление кодовой базы происходит с помощью упомянутой выше собственной технологии. Ранее происходило до 5 таких обновлений в день, сейчас же они происходят лишь раз в неделю.</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li>С помощью стека Microsoft тоже можно делать большие веб-сайты.</li>
<li>Стоит использовать кэширование с самого начала.</li>
<li>Кэш является более подходящим местом для хранения временных данных, не требующих персистентности, например информации о пользовательских сессиях.</li>
<li>Встроенные в операционные систему возможности, например по обнаружению DDoS-атака, могут приводить к необъяснимым сбоям.</li>
<li>Храните свои данные в географически удаленных датацентрах для минимизации проблем, связанных со сбоями в электросети.</li>
<li>Рассматривайте возможности использования виртуализированных систем хранения данных или кластерных файловых систем с самого начала. Это позволит существенно параллелизировать операции ввода-вывода, а также увеличивать дисковое пространство без необходимости какой-либо реорганизации.</li>
<li>Разрабатывайте утилиты для работы с production окружением. Невозможно смоделировать все ситуации в тестовой среде. Масштабируемость и все различные варианты использования API не могут быть симулированы в процессе тестирования качества программного обеспечения.  Обычные пользователи и хакеры обязательно найдут такие способы использования вашего продукта, о которых вы даже никогда и не подумаете в процессе тестирования, хотя конечно большая часть все же обнаружима в процессе QA тестирования.</li>
<li>Когда это возможно &#8212; лучше просто использовать дополнительное оборудование для решения проблем. Это намного проще, чем изменять поведение программного обеспечения для того чтобы решать задачи как-то по-другому. Примером может служить добавление нового сервера на каждый миллион пользователей. Возможно было бы более эффективным изменить подход к самой работе с СУБД, но на практике все же проще и дешевле добавлять все новые и новые сервера. По крайней мере на данный момент.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Django в гостях у Google</title>
		<link>http://www.insight-it.ru/masshtabiruemost/django-v-gostyakh-u-google/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/django-v-gostyakh-u-google/#comments</comments>
		<pubDate>Mon, 19 Oct 2009 20:53:28 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[app engine patch]]></category>
		<category><![CDATA[BigTable]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[gae]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[google app engine]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[платформа]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=213</guid>
		<description><![CDATA[Давным-давно, в далекой-предалекой галактике&#8230; Хотя да, достаточно давно уже Google выпустили в свет платформу Google App Engine. Описание этого продукта меня заинтересовало еще до открытия публичного доступа к системе и я даже записался на полу-закрытое тестирование. Вскоре пришло подтверждение, что мол &#171;мы рады сообщить, что Ваша учетная запись активирована и теперь у Вас есть возможность [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/appengine.jpg" title="Google App Engine" alt="Google App Engine" style="float:left;" /><br />
<span style="text-decoration: line-through;">Давным-давно, в далекой-предалекой галактике&#8230;</span></p>
<p>Хотя да, достаточно давно уже Google выпустили в свет платформу <a id="ix89" title="Google App Engine" href="http://www.appspot.com/" target="_blank" rel="external nofollow">Google App Engine</a>. Описание этого продукта меня заинтересовало еще до открытия публичного доступа к системе и я даже записался на полу-закрытое тестирование. Вскоре пришло подтверждение, что мол &#171;мы рады сообщить, что Ваша учетная запись активирована и теперь у Вас есть возможность попробовать наш новый продукт, для этого нажмите ссылку такую-то&#187;. Но пришло оно как-то не очень удачно, когда ни лишнего свободного времени не было, да и идеи подходящей для создания чего-нибудь эдакого на новой платформе тоже на горизонте не наблюдалось. В общем зашел на их сайт, посмотрел админку, поставил демо-приложение, поигрался чуток и забросил. Но с тех пор руки так и не прекращали чесаться от желания попробовать GAE на каком-нибудь более приближенном к реальности приложении, что мне совсем недавно и довелось сделать. Спешу поделиться впечатлениями.<br />
<span id="more-213"></span><br />
Если Вы даже краем уха не слышали о платформе <span style="font-family: Courier New;">Google App Engine</span> и после прочтения вступления не удосужились скопировать это название в свою любимую поисковую систему, чтобы почитать по-подробнее, то Вам повезло: для порядка я все-таки расскажу чуть-чуть о тех вкусностях, которые так долго поддерживали мой интерес к данному проекту.</p>
<p>Если взглянуть издалека, то GAE представляет собой условно-бесплатный хостинг для веб-приложений, для разработчиков предоставляется все необходимое: начиная от минимально-необходимого <a id="t39e" title="SDK" href="http://code.google.com/appengine/downloads.html" target="_blank" rel="external nofollow">SDK</a> со встроенным веб-сервером, локально эмулирующим саму платформу, заканчивая неплохой документацией по самой системе и доступным из нее API от Google. Почему условно-бесплатный? Бесплатно приложениям выделяется лишь ограниченное количество вычислительных ресурсов, при превышении которых по выбору владельца приложения либо взимается вполне <a id="ly53" title="скромная плата" href="http://code.google.com/appengine/docs/quotas.html" target="_blank" rel="external nofollow">скромная плата</a>, либо всем пользователям начинают показывать &#171;извиняйте, заходите завтра&#187; (в прямом смысле, счетчики потребления ресурсов сбрасываются ежедневно).</p>
<p>Но финансовый вопрос далеко не самый интересный, давайте взглянем на техническую сторону медали. Написанное с использованием SDK приложение загружается в production-окружение, которое физически размещается на тех самых известных кластерах Google, о которых у меня даже <a id="t6li" title="есть пост" href="../net/scalability/arkhitektura-google/" target="_blank" rel="external nofollow">есть пост</a> (конечно же под GAE используется только очень небольшая часть их вычислительных можностей). Причем все заботы о распределенной работе приложения на большом количестве машин платформа берет на себя: разработчику не нужно думать ни о балансировке нагрузки, ни о партиционировании данных, ни о других аспектах. Сразу же после окончания процессов загрузки и развертывания приложение готово становится готово к работе и доступно по домену третьего уровня на <span style="font-family: Courier New;">*.appspot.com</span>, либо можно подключить свой отдельный домен.</p>
<p>Технические ограничения тоже имеют быть: для разработки под GAE можно использовать лишь небольшой набор языков программирования, в частности Python 2.5, а также Java и все остальные языки, компилируемые или интерпретируемые под JVM (JRuby, Scala, Rhino, etc.). Все приложения исполняются в песочнице, ограничивающей доступ к окружающему миру, то есть определенные подмножества языков становятся недоступны, например: доступ к файловым системам, встроенные средства обработки изображений, доступ к сторонним ресурсам по HTTP, отправка почты. Про реляционные базы данных, memcached и библиотеки, использующие нативный, платформозависимый код, также стоит забыть. Но не все так плохо, как кажется: для реализации всех &#171;отобранных&#187; у разработчиков функциональных компонент Google предоставляет собственные сервисы-заменители, доступные через хорошо документированный API или вовсе замаскированные под стандартные методы языка. В качестве дополнительных бонусов предоставляются и возможности по интеграции с другими продуктами Google, скажем можно легко сделать авторизацию пользователей в приложении по учетным записям от <em>GMail</em> или нотификацию пользователей по Jabber через <em>GTalk</em>.</p>
<p>Отдельного внимания заслуживает используемая в данной платформе система хранения данных, основанная на <strong>BigTable</strong>, о которой более подробно можно почитать в уже упомянутом <a id="j:55" title="посте об архитектуре Google" href="../net/scalability/arkhitektura-google/" target="_blank">посте об архитектуре Google</a>. Если в двух словах, то она представляет собой распределенное <strong>не</strong>реляционное хранилище данных, автоматически обеспечивающее репликацию и кеширование данных, а также практически гарантирующее постоянную доступность данных вне зависимости от сбоев низлежащего оборудования. Для доступа к нему разработчикам предоставляется специальный API и язык доступа к данным <em>GQL</em>, слегка напоминающий упрощенный диалект <em>SQL</em> (лишь отдаленно). Продукт в обращении достаточно своеобразен, как оказалось самый простой способ привыкнуть к работе с ним &#8212; выкинуть из головы все знания о традиционных СУБД и взглянуть на процесс хранения данных с чистого листа. Разномастные JOIN&#8217;ы и прочие изыски лишь мешают думать в терминах подобных систем.</p>
<p>Закончив тему с рекламой GAE, позвольте перейти к моим личным впечатлениям. Попробовал я данную платформу на вполне конкретном примере (в конце поста дам ссылочку на частично-готовый результат, если кому интересно), надо же в конце-концов на что-то с пользой убивать внезапно появившееся свободное время. ОтJava и прочей компании языков, основанных на JVM, я невероятно устал на теперь уже &#171;прошлой&#187; работе, так что взор мой упал на Python и давно находящийся у меня на слуху (в основном благодаря  <a id="vdse" title="Ивану Сагалаеву" href="http://www.softwaremaniacs.org/" target="_blank" rel="external nofollow">Ивану Сагалаеву</a>) фреймворк <a id="mnk8" title="Django" href="http://www.djangoproject.com/" target="_blank" rel="external nofollow">Django</a>. Ни с тем, ни с другим я ранее почти не был знаком на практике, разве что когда-то пытался помогать своим очень хорошим подругам с прохождением Python в университете (пользуясь случаем, передаю привет Полине, Кате и Юле, очень по вам скучаю <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Стоит упомянуть, что существует несколько сборок Django, адаптированных под GAE, наиболее продуманным и готовым к эксплуатации мне показался проект под названием  <a id="u899" title="app engine patch" href="http://code.google.com/p/app-engine-patch/" target="_blank">app engine patch</a>, которым я и воспользовался для экспериментов.</p>
<p>Django, как известно, является вполне традиционным веб-фрейморком, пропагандирующим свою вариацию на тему MVC (именуемую <strong>MVT</strong> &#8212; <span style="font-family: Courier New;">Model-View-Template</span>, но по сути абсолютно то же самое), а также целый ряд философских верований (вроде <em>DRY, Don&#8217;t repeat yourself</em>), которым даже отведена <a id="m71-" title="отдельная страница на сайте" href="http://docs.djangoproject.com/en/dev/misc/design-philosophies/" target="_blank" rel="external nofollow">отдельная страница на официальном сайте</a>. Адаптированная под GAE версия фреймворка отличается от стандартной по большому счету лишь замененной частью <span style="font-family: Courier New;">Model</span>, в которую очень неплохо вписался предоставляемый API к уже упоминавшемуся хранилищу данных. По всем остальным компонентам системы официальная документация по Django практически полностью актуальна и сильно помогла понять всю картину разработки веб-приложений с использованием данных технологий.</p>
<p>Пересказывать функциональные возможности Django как-то не входило в мои планы, все кому интересно и так уже в курсе или знают где посмотреть. Хочу лишь сказать, что со своей задачей упрощения и ускорения процесса разработки веб-приложений он полностью справляется: все основные функциональные компоненты реализуются просто, легко и быстро, при этом особой необходимости (да и желания) вникать в то, как оно в итоге работает не возникает. Если же взглянуть на Django в совокупности с возможностями GAE &#8212; вопросы масштабируемости также по большей части с плеч разработчика снимаются (если не забыть прочитать документацию по хранилищу и не творить глупостей). В общем что-что, а количество человекочасов, требуемых на создание качественного масштабируемого веб-приложения, эта парочка способна сократить изрядно.</p>
<p>Предложение Google по использованию платформы GAE выглядит очень заманчиво, не смотря на все ограничения под нее можно как портировать существующие приложения, так и легко создавать новые. Бесплатное использование до превышения квот также не может не радовать (кстати квоты там рассчитаны на мировой рынок, превысить большинство из них в рамках рунета &#8212; надо постараться, мне кажется). Но закончить данное повествование мне всетаки хотелось парой недокументированных или вкратце официально упоминавшихся &#171;ложек дегтя&#187;. Первая неприятная особенность: процессы, обрабатывающие пользовательские запросы приложений, умирают после очень небольшого времени простоя (таймаут судя по всему секунд 20-30). По истечении таймаута система освобождает использующиеся приложением ресурсы и когда после перерыва приходит очередной пользователь система вынуждена заново инициализироваться (чуть ли не заново компилировать байткод, хотя не уверен), что занимает около 5 секунд, а то и больше, во время которых пользователю ничего не остается кроме как терпеливо ждать. Сделали данный механизм видимо в связи с тем фактом, что подавляющее большинство развернутых приложений были сделаны просто чтобы побаловаться и были сразу же заброшены, что делает неэффективным постоянное держание в готовом состоянии даже одного процесса для каждого приложения. Таким образом использование GAE для тяжелых веб-приложений с небольшой целевой аудиторией не очень эффективно.  Минус второй: существуют некоторые жесткие ограничения, которые не разрешают увеличивать даже за деньги (по крайней мере расценок не видно). В их число входят максимальное время обработки одного запроса (30 секунд, правда не ясно распространяется ли это на выполнение задач в Task Queue и местном аналоге Cron&#8217;а), 30 активных процессов, обрабатывающих запросы приложения (что влечет за собой достаточно жесткое ограничение на количество запросов в секунду в районе нескольких сотен), максимальный размер HTTP запроса/ответа в 10 мегабайт и некоторые другие. В итоге &#171;тяжелые&#187; вычисления на GAE не погоняешь (хотя есть варианты с применением AJAX и, соответственно, большого количества запросов к GAE), от Digg-эффекта или DDOS&#8217;а есть шанс не уберечься, хостинг файлов не соорудить, но&#8230; разве это ограничения? Есть масса более интересных типов веб-приложений, способных прекрасно существовать в такой среде. Да и в крайнем случае всегда можно связаться с представителями Google с просьбой в виде исключение для Вашего приложения, судя по их заявлениям все ограничения носят искусственный характер и служат лишь для защиты от потребления неоправданно большого количества вычислительных ресурсов плохо спроектированных приложениями.</p>
<p>Этот пост написан по мотивам истории сайта <a id="csyo" title="CargoBook" href="http://www.cargobook.ru/" target="_blank">CargoBook</a>, который задумывался как сообщество для логистов, с плавным выходом на корпоративный рынок с продуктом в виде логистической информационной системы, предоставляемой по принципу SaaS. Сходив по ссылке можно заценить, что можно сделать средствами сладкой парочки Django+GAE и одного студента с почти гуманитарным образованием за часов эдак 20 работы в свободное время. Сейчас в задумке кроме меня участвует всего еще один человек: на правах автора идеи, но  если Вас заинтересовал данный проект и может быть Вы хотите присоединиться в каком-либо амплуа &#8212; пишите об этом в комментариях или <a id="hvgv" title="по другим контактным данным" href="../author" target="_blank">по другим контактным данным</a>.</p>
<p>Кстати в американской части Интернета о GAE ходят в основном негативные мнения, мол тормозит, большое время отклика, сплошные таймауты и ошибки. На практике пока не удалось столкнуться с чем-то подобным, но реально работающего приложения с активной пользовательской базой у меня пока нет для того, чтобы делать какие-то относительно объективные выводы. Может быть со временем что-нибудь изменится и более тонкие нюансы станут выползать на поверхность &#8212; время покажет. Как раз будет повод написать еще один пост на эту же тему <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/django-v-gostyakh-u-google/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>РИТ: Высокие нагрузки</title>
		<link>http://www.insight-it.ru/masshtabiruemost/rit-vysokie-nagruzki/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/rit-vysokie-nagruzki/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 22:49:46 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[ProfyClub]]></category>
		<category><![CDATA[высокие нагрузки]]></category>
		<category><![CDATA[конференция]]></category>
		<category><![CDATA[РИТ]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=93</guid>
		<description><![CDATA[Если кто не в курсе, 22 и 23 сентября в Москве проходила конференция для разработчиков высоконагруженных систем. Не знаю могу ли я себя полноценно отнести к этой категории людей, но тем не менее данной мероприятие я сегодня посетил, пост будет опубликован скорее всего несколько позже, но начинаю писать прямо с ходу в первый же день [...]]]></description>
			<content:encoded><![CDATA[<p>Если кто не в курсе, 22 и 23 сентября в Москве проходила конференция для разработчиков высоконагруженных систем. Не знаю могу ли я себя полноценно отнести к этой категории людей, но тем не менее данной мероприятие я сегодня посетил, пост будет опубликован скорее всего несколько позже, но начинаю писать прямо с ходу в первый же день конференции. Всю официальную информацию можно получить на <a href="http://highload.info" target="_blank" rel="nofollow">не менее официальном сайте конференции</a> или, может быть, на сайте <a href="http://profyclub.org" target="_blank" rel="nofollow">ProfyClub</a>&#8216;а, здесь же будут лишь мои личные впечатления вперемешку с кратким пересказом происходившего. Что ж, приступим.<br />
<span id="more-93"></span></p>
<h3>Предистория</h3>
<p>Попал я на данное мероприятие достаточно тривиально: благодаря акции для студентов, предоставляющей бесплатное участие по результатам online-тестирования (не знаю заплатил ли бы я недельную зарплату за участие, если бы ее не было, хотя впринципе со скидками тоже не так уж и много получилось бы), а также стратежно добавленной в RSS-агрегатор нужной ленте новостей.</p>
<p>Само же тестирование меня несколько позабавило. Не знаю кто его составлял, но суть его была примерно в следующем: за полтора часа предлагплось ответить на 10 вопросов, семь из которых формулировалось примерно как &#171;какой результат будет получен после выполнения программы <код на перле>&#171;. Основной прикол был в том, что этот код написан на Perl там сказано не было, если честно с первого вопроса я его даже не признал, приняв за какой-то псевдо-код. На втором вопросе до меня дошла-таки истина, благодаря не столь отдаленному во времени посещению <a href="/life/yapcrussia-2008-may-perl/" target="_blank">YAPC::Russia 2008 &#171;May Perl&#187;</a> и, в частности, проходившему там мастер-классу <em>Ивана Сережкина</em>. Дальнейшее тестированме проходило с открытым <strong>vim</strong>&#8216;ом и <strong>/bin/perl</strong> под рукой, лишь один или два вопроса пришлось неторопливо погуглить&#8230;</p>
<p>За пару дней до конференции на почту пришло-таки поздравление с успешным прохождением тестирования и приглашением. В планы на эти два дня входило как минимум посещение ВУЗа и работы, но особого труда их освободить не составило. Так я и оказался сегодня утром в &#171;Инфопространстве&#187;.</p>
<h3>День первый</h3>
<p>Добравшись-таки до точки назначения на 20 минут позже запланированного открытия регистрация я как раз успел к ее началу. В нагрузку к бэйджику девушки выдали пакетик с программкой и кучей макулатуры, а также адский круглый девайс, на проверку оказавшийся шлепанцами.</p>
<p>Оставшееся до открытия время пришлось коротать по большей части изучая программку и здороваясь с тем очень скромным количеством лично знакомых мне людей, которые тоже посетили данное мероприятие. На удивление с ходу увидел много каким-то непонятным образом виртуально-знакомых лиц, с которыми лично определенно никогда не общался. Конференция проходила в два потока, так что в процессе ознакомления с программкой пришлось и определяться с более полезными для себя докладами; на практике дело оказалось непростым, так как даже прилагавшаяся книжечка с тезисами не позволяла заранее оценить качество доклада. В итоге в этом нелегком деле даже пришлось припомнить пару когда-то давно прочитанных статей по эвристике &#8212; очень помогло.</p>
<p>После непродолжительно-формального открытия начался первый доклад от Анатолия Орлова из Яндекс. Доклад был, как ни странно, вводно-обзорным, и посвящен он был по большей части взгляду на потенциальную нагрузку на веб-сервера с точки зрения оборудования и операционной системы. Никаких деталей, достаточно тривиально, но напомнить никогда не помешает, да и со своей задачей &#8212; задать соответствующий настрой в аудитории он определенно справился.</p>
<p>После непродолжительного перерыва на кофе слово перешло еще одному представителю компании Яндекс &#8212; Филиппу Дельгядо. На этот раз речь пошла о веб-проектах средних размеров, которым необходимо справляться с серьезной нагрузкой (наравне с прочими нефункциональными требованиями) но с несколько другой точки зрения, программиста. Выступление также носило обзорный характер и содержало в себе повествования о достаточно большом количестве граблей, на которые могут натыкаться те или иные проекты. На самом деле по затрагиваемым темам мне в свое время довелось прочитать достаточно много материалов, пару раз споткнуться на практике и даже написать пару постов, так что лично я рассматривал этот доклад как закрепление знакомых тем. Разве что затронутый вопрос горизонтального масштабирования хранения данных меня несколько смутил: не знаю, может быть я несколько не в теме или еще что, но суть была примерно такова, что под partitioning&#8217;ом рассматривались только псевдо-универсальные решения, входящие в комплект некоторых СУБД, в то время как sharding&#8217;ом было предложено понимать все остальные, &#171;самопальные&#187;, решения, специфичные для конкретного проекта. Я же почему-то всегда рассматривал такой подход как нечто концептуально-общее, так как конкретика реализации не важна, а важна сама идея данного подхода, и считаю эти два слова достаточно близкими синонимами (ровно как и многочисленные их русские аналоги), хотя может быть я и не прав&#8230;</p>
<p>Следующее выступление было, пожалуй, лучшим из увиденных мной в первый день. В программке оно значилось как: &#171;Как писать высокопроизводительные веб-сервера&#187;, Антон Самохвалов (Яндекс). Были рассмотрен ряд возможных подходов к написанию веб-серверов: начиная банальными неработоспособными однопоточными вариантами и заканчивая противопоставлению вполне рабочих вариантов: threads, <abbr title="Finite State Machine">FSM</abbr> и co-routine. Докладчик оказался убежденным сторонником подхода с использованием co-routine или на худой конец thread&#8217;ов, а также использующего схожую идеологию веб-сервера от <abbr title="Apache Software Foundation">ASF</abbr>. Презентация сыграла лишь роль детонатора для последующей бурной дискуссии с участием многих слушателей, а также ведущего этой секции &#8212; Игоря Сысоева, по совместительству разработчика известного в &#171;узких&#187; кругах проекта nginx. Ничего удивительного, что обсуждение плавно перетекло в Holy War: Threads vs FSM, но в отличии от знаменитых войн анонимусов на linux.org.ru, шоу выдалось захватывающим и информационно-полезным. Основными аргументами были даже не цифры о производительности, полученные ребятами из Яндекса в полу-синтетических тестах (Антон активно упоминал тот факт, что на примере базового поиска Яндекса использованние thread&#8217;ы давало примерно 10% прирост производительности по сравнению с FSM), а скорее споры о maintenability кода и его простоте, а также теоретических пределах использования этих подходов в разных условиях (речь даже дошла до гипотетических ситуаций с использованием более чем четырехядерных процессоров). Довелось выслушать мнения профессионалов по обе стороны &#171;баррикад&#187; и самостоятельно сделать все требуемые выводы, самый банальный и немаловажный из которых заключается просто в том факте, что оба подхода имеют право на жизнь в реальных проектах и какой из них использовать очень во многом зависит от личных предпочтений разработчиков и специфики проекта.</p>
<p>Далее по расписанию был запланировал обеденный перерыв, на котором я решил заглянуть в аудиторию параллельного потока (где весь день рассказывали о различных системах хранения данных). В это время там как раз проходил доклад Павла Уварова из Рамблер о их собственной разработке для хранения и передачи данных под названием HCS (читается почему-то как &#171;хикс&#187;). Самое начало доклада я, к сожалению, пропустил, но почти с первых же увиденных мной слайдов проект меня заинтересовал. Суть данной технологии примерно характеризуется ее названием: Hierarchically Compressed Stream. С одной стороны это формат хранения иерархически структурированных данных, с другой же &#8212; данные в нем представляют обычный файл, который легко обернуть в произвольный протокол передачи потоковых данных (т.е. например просто раздавать через любой HTTP-сервер). По представленным в презентации benchmark&#8217;ам запись и линейный доступ к данным в этом формате происходит в разы, а то и порядки быстрее по сравнению с РСУБД, а для ускорения случайного доступа, на сколько я понял, имеется возможность построения индекса по верхнему уровню иерархии. Помимо всего прочего, Павел обрадовал аудиторию, что данная технология в ближайшем времени будет опубликована в opensource, обязательно надо будет попробовать ее в деле как только появится возможность.</p>
<p>Вернувшись после обеда в аудиторию первого потока я сверился с программкой и обнаружил, что сейчас будут рассказывать про архитектуру сервиса SpyLog. Выступление Сергея Скворцова было очень общим и не углублялось в какие-либо детали, если априори представлять себе как работают сервисы веб-аналитики в целом, то становилось и вовсе скучно. Единственной конкретикой было разве что упоминание о том, что для сбора первичных данных используется nginx (модифицированный, если я правильно понял)</p>
<p>После этого доклада можно было стать свидетелем повествования работников mail.ru сначала об их собственной разработке под названием Imagine Framework, которая тоже вполне соответствует своему названию: ее можно разве что представить &#8212; ни одного примера кода, закрыт для использования только в рамках mail.ru, много слов ни о чем и общий стиль изложения в духе &#171;вот какую клевую штуку мы придумали, но никому не дадим и не покажем&#187;. В общем я даже, если честно, не понял для какого он языка программирования предназначен и чем он лучше (или хотябы просто отличается) от opensource аналогов (упоминались собственные системы кэширования, мониторинга и бинарный протокол). В итоге я до конца так и не дослушал и ушел снова в соседний поток слушать про хранение слабосвязанных данных.</p>
<p>Илья Космодемьянцев из SUP Fabrik вел рассказ о том, как могут развиваться события, если тот или иной проект сталкивается с хранением данных, плохо вписывающихся в модель РСУБД. Разработчикам приходят мысли о создании собственного специфического формата хранения данных, о том с какими проблемами могут столкнуться в процессе. Возможные варианты решения проблем также рассматривались, например в виде написания не формата хранения данных, а собственного хранилища для, например, MySQL &#8212; это может помочь избежать части проблем. Помимо этого выдвигалось очень спорное предложение о создании некого &#171;UseCase API&#187;, которое могло бы позволить инкапсулировать для бэкэнда все особенности хранения данных в случае их нетрадиционности. Хотя на практике подобные методики применяются достаточно давно, особенно в объектно-ориентированных языках программирования в виде data-access objects.</p>
<p>После еще одного кофе-брейка оставалось лишь два заключительных доклада первого дня, из которых я решил посетить нечто под названием &#171;Масштабный Jaabber-кластер, IM и не только&#187; от Андрея Федоровского из РБК. Начало доклада было достаточно примитивным &#8212; что такое Jabber и с чем его едят, всем это и без того было известно, так что было достаточно скучно. Даже обзор доступных расширений не открыл ничего нового &#8212; все те же давно знакомые вещи, разве что некий интерес вызвал процесс отправки бинарных данных (т.е. произвольных файлов): было заявлено что отправка файла временно обрывает поток XML-данных и отправляет вместо него бинарный поток, но не заставил себя ждать очевидный вопрос: а как же тогда происходит общение в этот момент. Вокруг этого образовалась небольшая дискуссия, но к консенсусу прийти так и не удалось. Далее пошел рассказ собственно о том как на сегодняшний день можно построить Jabber-кластер &#8212; подробностей повествованию явно не хватало, но суть была примерно такова: единственным более-менее сносным Jabber-сервером является ejabberd, написанный на до сих пор экзотическом языке Erlang (что впоследствии подтвердили сотрудники Яндекс: в своем проекте Я.Онлайн они используют тоже его). По-умолчанию он использует нативное для Erlang хранилище данных под названием Mnesia, но в том проекте РБК, на основе которого и строился весь доклад (правда я так и не понял как он называется), почему-то побоялись его использовать (видимо из-за нежелания разбираться в том как оно функционирует) и использовали имеющуюся возможность интеграции с более традиционной СУБД &#8212; PostgreSQL. В дискуссии после доклада речь шла скорее о самом ejabberd, Erlang&#8217;е, острой нехватке программистов на нем и тому подобных вещах, чем о самом докладе.</p>
<p>Подошедший к концу первый день конференции оставил массу положительных впечатлений и тем для размышления. Практическая полезность конференции не вызывает никаких сомнений, чего-то подобное невозможно увидеть и услышать в интернете или где-либо еще. Были конечно же и негативные моменты в виде абсолютно бестолковых докладов, но обычно это удавалось с ходу обнаружить и вовремя ретироваться в соседний поток.</p>
<h3>День второй</h3>
<p>Вот уже почти как неделю никак не могу найти времени дописать этот пост, в связи с жесткой нехваткой свободного времени, благодаря работе и учебе, так что позволю себе опубликовать пока в недописанном варианте. Как дойдут руки &#8212; обязательно допишу, благо во второй день тоже было несколько интересных выступлений, из которых особенно запомнилось выступление Тимура Хайруллина из Яндекс о методиках нагрузочного тестирования.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/rit-vysokie-nagruzki/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Архитектура LinkedIn</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-linkedin/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-linkedin/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 01:00:05 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ActiveMQ]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[EHcache]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jetty]]></category>
		<category><![CDATA[LinkedIn]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Solaris]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура LinkedIn]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=91</guid>
		<description><![CDATA[LinkedIn является крупнейшей в мире социальной сетью для профессионалов. Популярность этого проекта может быть далека, от более общетематических социальных сетей, таких как, скажем Facebook, но, тем не менее, нагрузка на серверную часть проекта создается пользователями серьезная. О том как этот проект с ней справляется и пойдет речь далее. Предисловие Сообщение о публикации двух презентаций c [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.linkedin.com" target="_blank" rel="nofollow">LinkedIn</a> является крупнейшей в мире социальной сетью для профессионалов. Популярность этого проекта может быть далека, от более общетематических социальных сетей, таких как, скажем Facebook, но, тем не менее, нагрузка на серверную часть проекта создается пользователями серьезная. О том как этот проект с ней справляется и пойдет речь далее.<br />
<span id="more-91"></span></p>
<h3>Предисловие</h3>
<p><em><br />
Сообщение о публикации двух презентаций c JavaOne 2008 о LinkedIn и их <a href="http://hurvitz.org/blog/2008/06/linkedin-architecture" target="_blank" rel="nofollow">обобщении</a> от Overn Hurvitz пронеслось по русскоязычным новостным ресурсам уже достаточно давно, но время черкнуть пару строк обо всем этом нашлось у меня только сейчас.</p>
<ul>
<li><a href="http://www.slideshare.net/linkedin/linkedins-communication-architecture" target="_blank" rel="nofollow">LinkedIn &#8212; A Professional Social Network Built with Java™ Technologies and Agile Practices</a></li>
<li><a href="http://www.slideshare.net/linkedin/linked-in-javaone-2008-tech-session-comm" target="_blank" rel="nofollow">LinkedIn Communication Architecture</a></li>
</ul>
<p></em></p>
<h3>Статистика</h3>
<ul>
<li>22 миллиона пользователей;</li>
<li>4+ миллиона уникальных посетителей в день;</li>
<li>40 миллионов просмотров страниц в день;</li>
<li>2 миллиона поисковых запросов в день;</li>
<li>ежедневно отправляются 250 тысяч приглашений;</li>
<li>1 миллион ответов в день;</li>
<li>2 миллиона электронных сообщений ежедневно.</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/solaris" target="_blank">Solaris</a> (как x86, так и SPARC)</li>
<li><a href="/tag/tomcat" target="_blank">Tomcat</a> и <a href="/tag/jetty" target="_blank">Jetty</a></li>
<li><a href="/tag/oracle" target="_blank">Oracle</a> и <a href="/tag/mysql" target="_blank">MySQL</a></li>
<li>Никакого ORM</li>
<li><a href="/tag/activemq" target="_blank">ActiveMQ</a> для JMS</li>
<li><a href="/tag/lucene" target="_blank">Lucene</a> в качестве основы для поиска</li>
<li><a href="/tag/spring" target="_blank">Spring</a> в роли &#171;клея&#187;</li>
</ul>
<h3>Серверная архитектура</h3>
<h4>2003-2005</h4>
<ul>
<li>одно монолитное веб-приложение;</li>
<li>одна общая база данных;</li>
<li>сетевой граф кэшируется в памяти в &#171;Облаке&#187;;</li>
<li>поиск пользователей реализован с помощью <a href="/tag/lucene" target="_blank">Lucene</a>, он работал на той же машине, что и &#171;Облако&#187;, так как поиск был отфильтрован в соответствии с сетью пользователя, таким образом было удобно совмещать эти две функции на одной машине;</li>
<li>веб-приложение напрямую обновляет базу данных, а она, в свою очередь, обновляет &#171;Облако&#187;.</li>
</ul>
<h4>2006</h4>
<ul>
<li>Добавлена репликация для уменьшения нагрузки на основную базу данных. Реплики предоставляют данные в режиме &#171;только для чтения&#187;, а репликация ведется в асинхронном режиме с помощью дополнительного компонента под названием Databus, с его появлением обновление данных стало выглядеть следующим образом:
<dl>
<dd>&ndash; сначала какие-либо изменения происходят в веб-приложении;</dd>
<dd>&ndash; веб-приложение обновляет основную базу данных;</dd>
<dd>&ndash; она, в свою очередь, отправляет обновления на Databus;</dd>
<dd>&ndash; далее уже Databus обновляет: реплики, Облако и поисковый индекс.</dd>
</dl>
</li>
<li>Поиск был вынесен на отдельный сервер.</li>
</ul>
<h4>2008</h4>
<ul>
<li>веб-приложение само по себе практически ничего не делает: бизнес логика распределена по отдельным сервисам;</li>
<li>веб-приложение все так же предоставляет пользователям графический интерфейс, но для его генерации она теперь вызывает сервисы;</li>
<li>каждый сервис имеет свою специфическую базу данных (т.е. вертикальное сегментирование);</li>
<li>такой подход позволяет другим приложениям (помимо основного) получать доступ к LinkedIn, такие приложения были созданы для работодателей, рекламных служб, и так далее.</li>
</ul>
<h3>Облако</h3>
<ul>
<li>&#171;Облаком&#187; в LinkedIn называют сервер, который кэширует весь граф социальной сети в памяти;</li>
<li>его размеры: 22 миллиона вершин и 120 миллионов ребер;</li>
<li>занимает 12GB оперативной памяти;</li>
<li>одновременно держится в памяти в 40 экземплярах;</li>
<li>построение Облака из данных, в дисковой системе, занимает 8 часов;</li>
<li>обновления происходят в режиме реального времени с помощью Databus;</li>
<li>во время остановки данные записываются на диск;</li>
<li>кэш реализован с помощью C++, а доступ предоставляется по JNI;</li>
<li>они выбрали именно C++ так как требовалось использовать минимум оперативной памяти, а также, задержки, связанные с Garbage Collection, были неприемлемыми.</li>
<li>размещение всех данных в памяти является ограничением, но, как удалось выяснить в LinkedIn, разбиение графов на части &#8212; не самая тривиальная задача.</li>
</ul>
<p>Облако кэширует целиком весь граф социальной сети LinkedIn, но на практике же пользователям требуется видеть его со своей точки зрения. Данная задача является вычислительно сложной, по-этому она выполняется лишь один раз при создании новой сессии, а затем система поддерживает результат в кэше. Такой подход требует 2 MB оперативной памяти на каждого активного пользователя. В течении сессии такой кэш обновляется только если сам пользователь сделал какие-либо изменения в нем, если же изменение вызвано другими пользователями &#8212; владелец сессии не заметит изменений.</p>
<p>Помимо этого используется кэширование профилей пользователей средствами <a href="/tag/ehcache" target="_blank">EHcache</a>. Одновременно в памяти хранится до 2 миллионов профилей (из 22 миллионов). Изначально планировалось использовать алгоритм <abbr title="Least Frequently Used">LFU</abbr>, но оказалось, что иногда <a href="/tag/ehcache" target="_blank">EHcache</a> зависал секунд на 30 во время перерасчета <abbr title="Least Frequently Used">LFU</abbr>, таким образом было принято решение о использовании вместо него алгоритма <abbr title="Least Recently Used">LRU</abbr>.</p>
<h3>Архитектура коммуникации</h3>
<p>Как известно, пользователи практически любой социальной сети генерируют огромное количество сообщений в единицу времени, причем каждый тип сообщений обычно требует индивидуального подхода, но в целом их можно разделить на две категории: постоянные и временные. В LinkedIn разработчики построили по отдельному сервису, для обработки каждой из этих категорий. Каждый из них определенно заслуживает отдельного внимания, так как общего в них мало.</p>
<h4>Сервис постоянных сообщений</h4>
<p>Этот коммуникационный сервис выполняет все операции, связанные с постоянными сообщениями: приватными сообщениями и электронной почтой. Перед ним ставится вполне тривиальный ряд задач: доставлять сообщения получателям и сохранять их на постоянной основе, но на самом деле этим все не ограничивается: должны также поддерживаться, скажем, доставка сообщений с задержкой, массовые рассылки, отмена отправки сообщения, возможность добавления в сообщения какого-либо интерактивного контента. Реализован он был примерно следующим образом:</p>
<ul>
<li>вся система работает асинхронно и активно использует JMS;</li>
<li>клиенты отправляют сообщения так же через JMS;</li>
<li>далее сообщения перенаправляются с помощью сервиса маршрутизации в соответствующий почтовый ящик или напрямую в обработку электронной почты;</li>
<li>доставка сообщений происходит как с помощью Pull (клиенты запрашивают свои сообщения), так и с использованием Push (т.е. отправки сообщений);</li>
<li>помимо этого используется <a href="/tag/spring" target="_blank">Spring</a> с их собственными закрытыми расширениями, использующими HTTP-RPC.</li>
</ul>
<h5>Приемы, способствующие масштабируемости</h5>
<ul>
<li><strong>Функциональное сегментирование:</strong> отправленные, полученные, архивные сообщения. <em>(т.е. вертикальное сегментирование)</em></li>
<li><strong>Классовое сегментирование:</strong> пользовательские, гостевые, корпоративные почтовые ящики.</li>
<li><strong>Сегментирование по диапазонам:</strong> по идентификаторам пользователей или по лексикографическим диапазонам самих сообщений. <em>(т.е. горизонтальное сегментирование)</em></li>
<li><strong>Асинхронное выполнение операций</strong>.</li>
</ul>
<h4>Сервис сетевых обновлений</h4>
<p>Этот сервис обеспечивает работу любых временных уведомлений, например, вызванных изменением статуса пользователей в контакт-листах. Такие сообщения должны с течением времени удаляться из-за быстрой потери актуальности, а также должна поддерживаться группировка и приоритезация сообщений. Функционирование этого сервиса оказалось не настолько очевидно, по сравнению с предыдущим, так что до итогового варианта было перепробовано масса менее удачных решений, но обо всем по порядку.</p>
<h5>Изначальная архитектура (до 2007 года)</h5>
<ul>
<li>используется много серверов, которые могут содержать обновления;</li>
<li>клиенты отправляют запросы на каждый сервис отдельно: вопросы, обновления профилей и т.д.</li>
<li>на сбор всех данных требовалось относительно много времени.</li>
</ul>
<p>В 2008 году вся эта система поэтапно эволюционировала собственно в сам сервис сетевых обновлений:</p>
<dl>
<dt><strong>Первая итерация</strong></dt>
<dd>
<ul>
<li>клиент отправляет единственный запрос сервису сетевых обновлений;</li>
<li>этот сервис в свою очередь параллельно отправляет всем остальным сервисам соответствующие запросы.</li>
<li>результаты аггрегируются и все вместе возвращаются клиенту;</li>
<li>весь процесс основывается на Pull.</li>
</ul>
</dd>
<dt><strong>Вторая итерация</strong></dt>
<dd>
<ul>
<li>стал использоваться метод Push: каждый раз, когда происходит какое-либо событие, они помещаются в пользовательский &#171;почтовый ящик&#187;, в момент запроса пользователя ему возвращается просто содержимое, уже ожидающее своего звездного часа в специально том самом &#171;ящике&#187;;</li>
<li>такой подход сильно ускоряет процесс чтения, так как на тот момент данные уже готовы;</li>
<li>с другой стороны, какая-то часть данных может так никогда и не понадобиться, что приводит к бесполезным передвижениям данных и лишнему используемому дисковому пространству;</li>
<li>небольшая часть обработки данных все же производится уже в момент запроса пользователя (например, объединение нескольких обновлений от определенного пользователя в одно);</li>
<li>обновления хранятся в <abbr title="Character Large OBject">CLOB</abbr>&#8216;ах: по одному <abbr title="Character Large OBject">CLOB</abbr>&#8216;у на каждый тип обновления для каждого пользователя (то есть в сумму около 15 <abbr title="Character Large OBject">CLOB</abbr>&#8216;ов на каждого пользователя);</li>
<li>сначала использовался размер <abbr title="Character Large OBject">CLOB</abbr>&#8216;ов равный 8 KB, что было явно больше требуемого и приводило к существенному количеству неиспользуемого дискового пространства.</li>
<li>вместо <abbr title="Character Large OBject">CLOB</abbr>&#8216;ов можно было бы использовать дополнительные таблици по одной на каждый тип обновлений, но в этом случае пришлось бы постоянно удалять из них устаревшие записи, что было бы чрезвычайно неэффективно. </li>
<li>в дополнение к этому использовался <abbr title="Java Management eXtensions">JMX</abbr> для мониторинга и изменения конфигурации в реальном времени, что оказалось очень удобным и полезным.</li>
</ul>
</dd>
<dt><strong>Третья итерация</strong></dt>
<dd>
<ul>
<li>Цель: повысить производительность путем сокращения количества обновлений <abbr title="Character Large OBject">CLOB</abbr>&#8216;ов, так как они требуют много вычислительных ресурсов.</li>
<li>Был добавлен буфер: колонки в таблицах типа <strong>varchar(4000)</strong>, в которых данные помещались изначально. При полном заполнении ячейки данные перемещаются в <abbr title="Character Large OBject">CLOB</abbr>; это позволило на порядок сократить количество их обновлений.</li>
<li>Уменьшен размер самих сообщений об обновлениях.</li>
</ul>
</dd>
</dl>
<h3>И напоследок пару советов от LinkedIn</h3>
<ul>
<li>нельзя бесконечно долго ограничиваться одной базой данных: используйте много баз данных как с вертикальным, так и с горизонтальным сегментированием данных;</li>
<li>забудьте о ссылочной целостности и кросс-серверных JOIN&#8217;ах;</li>
<li>забудьте о 100% целостности данных;</li>
<li>при большом масштабе издержки могут стать проблемой: оборудование, базы данных, лицензии, системы хранения данных, электроэнергия и так далее;</li>
<li>как только вы станете достаточно крупны и популярны, спаммеры и прочие злые люди не заставят себя долго ждать;</li>
<li>не забывайте про кэширование!!!</li>
<li>используйте асинхронные потоки данных;</li>
<li>аналитика и построение отчетов может стать непростой задачей, постарайтесь задуматься о них заранее в процессе планирования системы;</li>
<li>имейте всегда ввиду, что Ваша система может упасть в любой момент;</li>
<li>не стоит недооценивать траекторию своего роста.</li>
</ul>
<h3>P.S.</h3>
<p>Когда уже закончил переводить в голову пришла мысль, что если читателям будет интересно взглянуть на оригинальные презентации (хотябы ради иллюстрационного материала, который там вполне нагляден), то было бы проще сделать это прямо здесь, так что вот, для Вашего же удобства:</p>
<div style="width:425px;text-align:left;margin:20px 0;" id="__ss_416060"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/linkedin/linkedins-communication-architecture?type=powerpoint" title="LinkedIn - A Professional Network built with Java Technologies and Agile Practices" rel="nofollow">LinkedIn &#8212; A Professional Network built with Java Technologies and Agile Practices</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=linkedinbofjavaone2008-1210975769299886-8&#038;stripped_title=linkedins-communication-architecture" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=linkedinbofjavaone2008-1210975769299886-8&#038;stripped_title=linkedins-communication-architecture" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<div style="width:425px;text-align:left;margin:20px 0;" id="__ss_416059"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/linkedin/linked-in-javaone-2008-tech-session-comm?type=powerpoint" title="LinkedIn Communication Architecture" rel="nofollow">LinkedIn Communication Architecture</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=linkedinjavaone2008techsessioncomm-1211223608637383-9&#038;stripped_title=linked-in-javaone-2008-tech-session-comm" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=linkedinjavaone2008techsessioncomm-1211223608637383-9&#038;stripped_title=linked-in-javaone-2008-tech-session-comm" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p><strong><em>Кстати если Вы еще не успели подписаться на <a href="/feed" target="_blank">RSS</a> &#8212; сейчас самое время!</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-linkedin/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>ProfyСlub</title>
		<link>http://www.insight-it.ru/masshtabiruemost/profyclub/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/profyclub/#comments</comments>
		<pubDate>Tue, 19 Aug 2008 17:00:18 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ProfyClub]]></category>
		<category><![CDATA[информационные технологии]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=86</guid>
		<description><![CDATA[В некотором царстве, в некотором государстве&#8230; Хм, не то начало&#8230; Некоторое время назад достаточно изестная в определенных кругах организация (угадайте, как она называется?) предложила мне своего рода сотрудничество, направленное на заполнение их портала контентом. Как же это повлияло на этот блог? Если Вы уже успели заметить (хотябы по разделу, в котором опубликован данный пост, вернее [...]]]></description>
			<content:encoded><![CDATA[<p><strike>В некотором царстве, в некотором государстве&#8230;</strike> Хм, не то начало&#8230;</p>
<p>Некоторое время назад достаточно изестная в определенных кругах организация (угадайте, как она называется?) предложила мне своего рода сотрудничество, направленное на заполнение их портала контентом. Как же это повлияло на этот блог?<br />
<span id="more-86"></span><br />
Если Вы уже успели заметить (хотябы по разделу, в котором опубликован данный пост, вернее некоторое его подобие), то тематика моего блога и деятельности <noindex><a href="http://profyclub.org" rel="nofollow">ProfyClub</a></noindex> (и, как следствие, портала) очень сильно пересекаются (высокие нагрузки, масштабируемость &#8212; знакомые слова, не правда ли?), так что у меня не нашлось особых причин, чтобы отказываться.</p>
<p>На практике же ничего особенного за этим всем не стоит, я всего лишь перевел(жу) для них некоторое количество статей и презентаций, которые публикуются, как не трудно догадаться, все там же, на их портале. Они определенно были против такого явления, которое в блогосфере называется &#171;кросс-пост&#187;, да и даже обратной ссылки на мой блог из переведенных статей они пожалели <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  , так что никакой &#171;отдачи&#187; я от этих текстов не получаю, в отличии от материалов, размещенных исключительно здесь.</p>
<p>Данный пост, как раз, является попыткой несколько исправить эту ситуацию. Я просто-напросто хочу попробовать размещать здесь ссылки на эти материалы, хотябы так как считаю, что они могут показаться интересными читателям моего блога:<br />
<noindex></p>
<blockquote><p>
<a href="http://www.profyclub.org/articles/292/3261" rel="nofollow" target="_blank">Еще более быстрые веб-сайты</a><br />
<a href="http://www.profyclub.org/articles/290/3341" rel="nofollow" target="_blank">7 этапов построения масштабируемых веб-приложений. Стратегии для системных архитекторов</a>
</p></blockquote>
<p></noindex></p>
<div style="text-align:right;margin-bottom:16px;t"><em>(список будет пополняться)</em></div>
<p>По соседству там публикуется масса других материалов по данной тематике, имеет смысл взглянуть и <noindex><a href="http://www.profyclub.org/articles/" rel="nofollow" target="_blank">на них</a></noindex>, возможно и они придутся Вам по душе. Если после прочтения переведенных мной материалов появилось что сказать, не стесняйтесь, оставляйте комментарии к этому посту или пишите мне куда-нибудь еще, <a href="/author" target="_blank">контактные данные можно найти здесь</a>.</p>
<p>Что же касается моего блога, то я вовсе не собираюсь переставать писать и исключительно для него, уже пару идей для новых постов имеется, осталось лишь найти время на их написание (с этим, правда, пока туговато). Так что тем, кто еще не успел подписаться, настоятельно рекомендую <a href="/feed" target="_blank">это сделать</a>.</p>
<p><strong>UPDATE:</strong> Хм, да, судя по всему, доступ к ним закрыли только для зарегистрированных пользователей, что делает этот пост несколько бессмысленным. Но я надеюсь, что тем, кому интересно, не составит труда зарегистрироваться.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/profyclub/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Архитектура 37signals</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-37signals/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-37signals/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 15:49:48 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Amazon S3]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Xen]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура 37signals]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=82</guid>
		<description><![CDATA[37signals больше всего известны благодаря выпуску в свет Ruby on Rails грамотному его использованию для запуска их очень популярных продуктов: Basecamp, Highrise, Backpack и Campfire. RoR как обычно пытаются винить во всех проблемах с производительностью, но 37signals казалось бы справляется с большой нагрузкой, используя вполне разумное количество вычислительных ресурсов. Источники информации Этот текст является переводом [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.37signals.com" target="_blank" rel="nofollow">37signals</a> больше всего известны благодаря выпуску в свет <a href="/tag/ruby-on-rails" target="_blank">Ruby on Rails</a> грамотному его использованию для запуска их очень популярных продуктов: Basecamp, Highrise, Backpack и Campfire. RoR как обычно пытаются винить во всех проблемах с производительностью, но 37signals казалось бы справляется с большой нагрузкой, используя вполне разумное количество вычислительных ресурсов.<br />
<span id="more-82"></span></p>
<h3>Источники информации</h3>
<p><em>Этот текст является переводом <a href="http://highscalability.com/37signals-architecture" target="_blank" rel="nofollow">статьи</a>, автор &#8212; <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd Hoff</a>. Извиняюсь за не сильно оригинальный контент (да и, как выяснилось, практически не технической направленности), но на написание своих полноценных текстов у меня последнее время все никак не хватает то креатива, то времени <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  .</em></p>
<ul>
<li><a href="http://www.37signals.com/svn/posts/749-ask-37signals-numbers" target="_blank" rel="nofollow">Спросите 37signals: цифры?</a></li>
<li><a href="http://www.37signals.com/svn/posts/753-ask-37signals-how-do-you-process-credit-cards" target="_blank" rel="nofollow">Спросите 37signals: как вы работаете с кредитными картами?</a></li>
<li><a href="http://www.37signals.com/svn/posts/759-behind-the-scenes-at-37signals-support" target="_blank" rel="nofollow">За сценой 37signals: поддержка.</a></li>
<li><a href="http://www.37signals.com/svn/posts/772-ask-37signals-why-did-you-restart-highrise" target="_blank" rel="nofollow">Спросите 37signals: почему вы перезапустили Highrise?</a></li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/ruby-on-rails" target="_blank" rel="nofollow">Ruby on Rails</a></li>
<li><a href="/tag/memcached" target="_blank" rel="nofollow">Memcached</a></li>
<li><a href="/tag/xen" target="_blank" rel="nofollow">Xen</a></li>
<li><a href="/tag/mysql" target="_blank" rel="nofollow">MySQL</a></li>
<li><a href="/tag/amazon-s3" target="_blank" rel="nofollow">Amazon S3</a> для хранения изображений</li>
</ul>
<h3>Статистика</h3>
<ul>
<li>30 серверов: от простых однопроцессорных файловых серверов до восьмипроцессорных серверов приложений, в сумме около 100 процессоров и 200 GB оперативной памяти.</li>
<li>В планах диагональное масштабирование: уменьшение количества серверов до 16, но более производительных &#8212; в сумме 92 процессоров и 230 GB RAM.</li>
<li>Виртуализация средствами <a href="/tag/xen" target="_blank">Xen</a> для более гибкого управления системой.</li>
<li>Basecamp (управление проектами)
<dl>
<dd>2000000 пользователей с учетными записями</dd>
<dd>13200000 задач</dd>
<dd>9200000 сообщений</dd>
<dd>12200000 комментариев</dd>
<dd>5500000 записей о распределении времени</dd>
</dl>
</li>
<li>Backpack (управление информацией для личного использования и малого бизнеса)
<dl>
<dd>Около миллиона страниц</dd>
<dd>6800000 задач</dd>
<dd>1500000 записей</dd>
<dd>829000 фотографий</dd>
<dd>370000 файлов</dd>
</dl>
</li>
<li>Общая статистика проектов (на ноябрь 2007 г.)
<dl>
<dd>5.9 TB загруженных пользователями данных</dd>
<dd>888 GB загружено (upload)</dd>
<dd>2 TB скачано (download)</dd>
</dl>
</li>
</ul>
<h3>Архитектура</h3>
<ul>
<li>Кэширование средствами <a href="/tag/memcached" target="_blank">memcached</a> уже используется, но они ищут способы более активно его применять. Позволяет достичь впечатляющих результатов в плане производительности.</li>
<li>Методы для составления URL используются вместо ручного их составления.</li>
<li>Используются стандартные ActiveRecord запросы,  но при необходимости они используют и ручную настройку.</li>
<li>Иногда они дорабатывают Rails, если сталкиваются с проблемами с производительностью.</li>
<li>Amazon S3 используется для хранения данных, загруженных пользователями. Разработчики очень довольны результатами.</li>
</ul>
<h3>Работа с кредитными картами</h3>
<ul>
<li><em>Ежемесячное выписывание счетов.</em> Это позволяет компаниям, занимающимся кредитными картами, чувствовать себя более комфортно, так как им не придется столкнуться с огромным количеством работы, если ваша фирма вдруг выйдет из бизнеса. Пользователям такой подход также по душе, так как издержки в итоге оказываются относительно невелики, а также не требуется подписание контракта, имеется возможность пользоваться сервисами необходимый промежуток времени и оплачивать именно ту сумму, которую потратили.</li>
<li><em>Получение учетной записи продавца услуг.</em> Кто-то определенно должен обрабатывать операции с кредитными картами. Они используют Chase Bank. Воспользуйтесь услугами кого-нибудь, кому вы доверяете, а когда масштаб ваших сделок станет существенным &#8212; будет возможность получить более выгодные условия контракта.</li>
<li>Они используют authorize.net в роли шлюза для процессинга операций с кредитными картами.</li>
<li>Ежемесячным выписыванием счетов занимается специально написанная для этого проекта система. Она запускается каждую ночь, отправляет счета нужным людям и записывает результаты выполненных операций.</li>
<li>В случае успеха счет-фактура высылается по электронной почте.</li>
<li>В случае каких-либо сбоев &#8212; пользователю отправляется объяснение причин.</li>
<li>Если три раза с помощью кредитной карты не удается оплатить счет &#8212; учетная запись замораживается до тех пор, пока не будет предоставлен платежеспособный номер кредитной карты.</li>
<li>Обработка ошибок является критичным моментом, так как проблемы с оплатой возникают достаточно часто.</li>
<li>Все продукты конвертируются для использования централизованным биллинговым сервисом.</li>
<li>Необходимо быть совместимыми с <a href="http://en.wikipedia.org/wiki/PCI_DSS" rel="nofollow" target="_blank">PCI DSS (Payment Card Industry Data Security Standard)</a>.</li>
<li>Пользуйтесь услугами шлюзов, это позволит не хранить номера кредитных карт на своем сайте, что сильно упрощает жизнь в плане безопасности. Некоторые из них предоставляют и биллинговые услуги, что позволяет также не заниматься этим самостоятельно.</li>
</ul>
<h3>Поддержка пользователей</h3>
<ul>
<li>Campfire используется для работы с клиентами. По сути эта система представляет собой групповой веб-чат с расширенными возможностями в виде опциональной защиты паролем, личных сообщений, обмена файлами, предпросмотра изображений, а также коллективного принятия решений.</li>
<li>Поднимаемые вопросы используются для поиска ошибок в коде, а обновление данных в SVN отображается прямо в процессе общения. Bugtracking система обходится стороной, что казалось бы должно лишь усложнять испровление неполадок, например из-за отсутствия возможности проследить связь между конкретным изменением в коде и вызвавшей его неполадкой.</li>
<li>Зато служба поддержки может решать проблемы клиентов с помощью общения в чате в реальном времени, с возможностью обмена изображениями и снимками экранов, демонстрирующими неисправность.</li>
<li>Разработчики также всегда доступны с помощью Campfire для помощи в решении проблем клиентов.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Возьмите пример с <a href="/tag/amazon" rel="nofollow" target="_blank">Amazon</a> и постройте все внутрение функции в виде сервисов с самого начала. Это позволит более легко использовать их в разных продуктах и прозрачно обновлять предоставляемые возможности.</li>
<li>Не храните номера кредитных карт внутри своей базы данных &#8212; это существенно снижает риски, связанные с безопасностью.</li>
<li>Разработчики и пользователи должны иметь возможность легко общаться друг с другом публично. Пользователи получают сервис намного более высокого качества, если общаются напрямую с разработчиками, которые решают все проблемы прямо в рамках нормального хода процесса разработки. Это позволяет избежать нескольких излишних промежуточных этапов при обработке заявок о неиспраности. Помимо этого разработчикам предоставляется возможность узнать пользовательское мнение об их продукте, что делает дальнейшее развитие проекта более эффективным. Потенциальные клиенты могут убедиться в отзывчивости компании, просто посмотрев на такое общение, что подталкивает их к более охотной регистрации.</li>
<li>Развивайте свой продукт добавлением новых функций, которые нужны конкретным клиентам, а не тех, которые когда-нибудь может быть кому-нибудь понадобятся.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-37signals/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>GlusterFS</title>
		<link>http://www.insight-it.ru/masshtabiruemost/glusterfs/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/glusterfs/#comments</comments>
		<pubDate>Sun, 18 May 2008 18:16:17 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[GlusterFS]]></category>
		<category><![CDATA[GPL]]></category>
		<category><![CDATA[Infiniband]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[файловая система]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=77</guid>
		<description><![CDATA[GlusterFS представляет собой кластерную файловую систему, способную масштабироваться для хранения далеко не одного петабайта данных. Как и многие другие кластерные файловые системы, GlusterFS аггрегирует дисковое пространство большого количества машин в одну общую параллельную сетевую файловую систему через Infiniband RDMA или TCP/IP соединение. Обычно в качестве аппаратной основы для этой файловой системы используется ничем не выдающееся [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/glusterfs-logo.gif" alt="GlusterFS Logo" title="GlusterFS" style="float:right; margin:2px 6px;" /><br />
<a href="http://www.gluster.org/glusterfs.php" target="_blank" rel="nofollow">GlusterFS</a> представляет собой кластерную файловую систему, способную масштабироваться для хранения далеко не одного петабайта данных. Как и многие другие кластерные файловые системы, GlusterFS аггрегирует дисковое пространство большого количества машин в одну общую параллельную сетевую файловую систему через Infiniband RDMA или TCP/IP соединение. Обычно в качестве аппаратной основы для этой файловой системы используется ничем не выдающееся недорогое серверное оборудование, в полной мере реализуя принцип программного построения стабильности при использовании на ненадежном оборудовании.<br />
<span id="more-77"></span></p>
<p>Кластерные файловые системы еще не достаточно приспособлены для использования на крупных предприятиях: обычно процесс их развертывания и поддержания в работающем состоянии не так уж прост. Но зато они отлично масштабируются и достаточно дешевы, ведь для них достаточно самого простого серверного оборудования и opensource операционных систем и програмного обеспечения. Основной целью разработчиков <a href="/tag/glusterfs" target="_blank">GlusterFS</a> как  раз и является построение кластерной файловой системы, адаптированной для использования в рамках серьезных компаний.</p>
<p>Список основных ее особенностей по большей части мало чем отличается от других кластерных файловых систем:</p>
<ul>
<li>Состоит из клиентской и серверной частей. Клиентская часть позволяет монтировать файловую систему, а серверная &#8212; <strong>glusterfsd</strong> &#8212; экспортировать в нее локальное дисковое пространство.</li>
<li>Масштабируемость близка к <em>O(1)</em>.</li>
<li>Широкий спектр возможностей за счет использования модульной архитектуры.</li>
<li>Имеется возможность восстановления файлов и директорий из файловой системы даже без ее инициализации.</li>
<li>Отсутствие централизованного сервера метаданных, что делает ее более устойчивой к потенциальным сбоям.</li>
<li>Расширяемый интерфейс выполнения задач, с поддержкой загрузки модулей в зависимости от особенностей выполнения пользователями операций по работе с данными.</li>
<li>Расширяющий функциональность механизм трансляторов.</li>
<li>Поддержка <em>Infiniband RDMA</em> и <em>TCP/IP</em>.</li>
<li>Возможность автоматического восстановления в случае сбоев.</li>
<li>Полностью реализована на уровне приложений, что упрощает ее поддержание в рабочем состоянии, портирование и дальнейшую разработку.</li>
</ul>
<p>Но некоторые моменты все же заслуживают отдельного внимания:</p>
<dl>
<dt><strong>Совместимость</strong></dt>
<dd>Как уже упоминалось, файловая система реализована полностью на уровне пользовательских приложений, что делает возможным ее монтирование без каких-либо дополнительных патчей в ядре операционной системы, единственное требование к нему: поддержка FUSE. Серверная часть <a href="/tag/glusterfs" target="_blank">GlusterFS</a> может функционировать на любой POSIX-совместимой операционной системе и протестирована на <a href="/tag/linux" target="_blank">Linux</a>, <a href="/tag/freebsd" target="_blank">FreeBSD</a>, <a href="/tag/solaris" target="_blank">OpenSolaris</a>, в отличии от клиентской части, которая может работать только в <a href="/tag/linux" target="_blank">Linux</a>.</dd>
<dt><strong>Модули</strong></dt>
<dd>В виде модулей реализованы различные варианты выполнения основополагающих операций: передачи данных и балансировки нагрузки в рамках кластера. Транспортные модули обеспечивают передачу данных по различным типам соединений:
<ul>
<li><strong>TCP/IP</strong>;</li>
<li><strong>Infiniband-verbs</strong>;</li>
<li><strong>Infiniband-<abbr title="socket direct protocol">SDP</abbr></strong>.</li>
</ul>
<p>Балансировка нагрузки может выполняться по следующим алгоритмам:
<ul>
<li><strong><abbr title="adaptive least usage">ALU</abbr></strong> &#8212; использует целый ряд факторов, включающий объем свободного локального дискового пространства, активность операций чтения и записи, количество одновременно открытых файлов, скорость физического вращения дисков. Значимость, придаваемая каждому из показателей, может достаточно гибко настраиваться.</li>
<li><strong><abbr title="round robin">RR</abbr></strong> &#8212; по очереди размещает файлы последовательно на каждом узле, после чего начинает процесс заново, образуя своеобразный цикл. Этот метод эффективен если файлы имеют примерно одинаковый размер, а узлы кластера &#8212; одинаковый размер экспортированного локального дискового пространства.</li>
<li><strong>Random</strong> &#8212; распределяют файлы случайным образом.</li>
<li><strong><abbr title="non-uniform file access">NUFA</abbr></strong> &#8212; приоритет отдается созданию файлов локально, а не на других узлах кластера.</li>
<li><strong>Switch</strong> &#8212; располагает файлы по определенным указанным особенностям имен файлов, по аналогии со <strong>switch(filename)</strong> в программировании, обычно в качестве критерия распределения файлов имеет смысл использовать их расширение.</li>
</ul>
</dd>
<dt><strong>Трансляторы</strong></dt>
<dd>Они представляют собой очень мощный механизм для расширения возможностей GlusterFS, сама идея трансляторов бала позаимствована у <a href="http://hurd.gnu.org" target="_blank" rel="nofollow">GNU/Hurd</a> и заключается она в загрузке бинарных библиотек (.so) в процессе работы системы в зависимости от использованных настроек и использовании их в виде своеобразной цепочки обработчиков при работе с файлами как на серверной, так и на клиентской стороне. В <a href="/tag/glusterfs" target="_blank">GlusterFS</a> практически все дополнительные возможности реализованы именно виде трансляторов, начиная от дополнений, увеличивающих производительность, заканчивая средствами отладки. Вкратце перечислю основные из них:</p>
<ul>
<li><strong><abbr title="automatic file replication">AFR</abbr></strong> &#8212; автоматическая репликация файлов.</li>
<li><strong>Stripe</strong> &#8212; разбивает файлы на блоки фиксированного размера.</li>
<li><strong>Unify</strong> &#8212; объединяет несколько узлов кластера в один большой виртуальный узел, один узел выделяется для обеспечения внутреннего namespace. Директории создаются на всех узлах, составляющих unify, а каждый файл &#8212; лишь на одном (если не используется AFR).</li>
<li><strong>Trace</strong> &#8212; предоставляют информацию для отладки в виде дополнительных записей в лог.</li>
<li><strong>Filter</strong> &#8212; фильтрация файлов на основании их имен и/или атрибутов.</li>
<li><strong>Posix-locks</strong> &#8212; обеспечивает POSIX блокировку записей независимую от используемой системы хранения.</li>
<li><strong>Trash</strong> &#8212; предоставляет функциональность сопоставимую с libtrash (или &#171;корзиной&#187; &#8212; если так понятнее).</li>
<li><strong>Fixed-id</strong> &#8212; обеспечивает доступ только для пользователей с определенными UID и GUID.</li>
<li><strong>Posix</strong> &#8212; соединяет GlusterFS с низлежащей локальной файловой системой.</li>
<li><strong>rot-13</strong> &#8212; транслятор обеспечивает возможность шифрования и дешифрования данных по примитивному одноименному алгоритму.</li>
</ul>
</dd>
</dl>
<p>Список возможностей, обеспечиваемых широким набором модулей и транслятором, впечатляет, большинство других opensource кластерных файловых систем не могут похвастаться подобной функциональностью (<a href="/tag/glusterfs" target="_blank">GlusterFS</a> выпускается под GPL). Благодаря возможности работы через Infiniband производительность передачи данных также достаточно высока &#8212; она может достигать десятков гигабит в секунду. Обработка сбоев в отдельных узлах также осуществляется достаточно эффективно, так как может быть автоматизирована. Из потенциальных недостатков можно назвать некоторое количество редко проявляющих себя багов в коде, а также достаточно большой размер заголовков в используемом протоколе (несколько сотен байт). В целом эта система вполне работоспособна и полноценно выдерживает конкуренцию со стороны своих opensource &#171;коллег&#187;.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/glusterfs/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>

