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

<channel>
	<title>Insight IT &#187; Масштабируемость</title>
	<atom:link href="http://www.insight-it.ru/category/masshtabiruemost/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Sun, 25 Apr 2010 14:19:58 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<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 страниц в секунду). Но это не самая интересная часть истории... Все это управляется единственным человеком при использовании нескольких серверов, при этом он тратит на работу всего пару [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.plentyoffish.com/"  target="_blank" rel="external nofollow">Plenty of Fish</a></noindex> представляет собой очень популярный сервис онлайн знакомств, насчитывающий более 45 миллионов посетителей в месяц и 30+ миллионов просмотров страниц в сутки (что составляет около 500-600 страниц в секунду). Но это не самая интересная часть истории... Все это управляется единственным человеком при использовании нескольких серверов, при этом он тратит на работу всего пару часов в день и зарабатывает 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>Данный пост является переводом <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highscalability.com/plentyoffish-architecture"  target="_blank" rel="external nofollow">англоязычной статьи</a></noindex>, автор оригинала: Todd Hoff.</em></p>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://channel9.msdn.com/ShowPost.aspx?PostID=331501#331501"  target="_blank" rel="external nofollow">Channel9 интервью с Markus Frind</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://plentyoffish.wordpress.com/ target=" _blank" rel="external nofollow"">Блог Markus Frind</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.readwriteweb.com/archives/plentyoffish_one_billion.php"  target="_blank" rel="external nofollow">Plentyoffish: компания одного человека может стоить 1 миллиард долларов</a></noindex><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&nbsp;&mdash; 600 страниц в секунду).</li>
<li>1.2 миллиарда просмотров страниц  и 45 миллионов посетителей в месяц.</li>
<li>Имеет <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/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></noindex> в 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 миллионах просмотрах страниц в день можно зарабатывать неплохие деньги на рекламе, даже если <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://en.wikipedia.org/wiki/Cost_per_mille"  target="_blank" rel="external nofollow">CPM</a></noindex> будет всего 5-10 центов.</li>
<li>Akamai используется для отдачи более 100 миллионов изображений в день. Если на странице 8 изображений и каждое загружается за 100 миллисекунд&nbsp;&mdash; их загрузка займет почти секунду, так что распределение изображений целесообразно.</li>
<li>Десятки миллионов изображений отдаются с серверов POF, но большинство из них размером меньше 2KB и практически полностью закешированы в оперативной памяти.</li>
<li>Все динамично. Практически никакой статики.</li>
<li>Все исходящие данные сжимаются с использованием Gzip, что обходится всего 30% использованием процессорного времени. Используется много вычислительных ресурсов, но зато существенно сокращается использование пропускной способности интернет-канала.</li>
<li>Кэширование ASP .NET не используется, так как данные теряют свою актуальность практически сразу же.</li>
<li>Встроенные компоненты ASP также не используется. Почти все написано с чистого листа. Ничего не может быть более сложным, чем кучка простых if-then-else и циклов. Все максимально элементарно.</li>
<li>Балансировка нагрузки:<br />
&mdash; IIS  произвольно ограничивает общее количество соединений до 64000, таким образом балансировщик нагрузки был добавлен для обработки большего количества одновременных соединений. Вариант с добавлением второго IP адреса и использованием round robin DNS также рассматривался, но вариант с балансировщиком нагрузки выглядел более избыточным и позволял более легко расширять количество серверов. Помимо этого ServerIron позволял использовать более продвинутую функциональность, вроде блокировки ботов и балансировку запросов по cookies, сессиям или IP-адресам пользователей.<br />
&mdash; Windows Network Load Balancing (NLB) функция не использовалась, так как не поддерживает привязку сессий к серверам. Обходным путем было бы хранение сессионных данных в базе данных или общей файловой системе.<br />
&mdash; 8-12 NLB серверов могут объединяться в кластер и может использоваться неограниченное количество таких кластеров. Схема DNS round robin может использоваться для распределения запросов между кластерами. Теоретически такая архитектура могла бы позволить 70 веб-серверам обрабатывать более  300 тысяч одновременных соединений.<br />
&mdash; NLB имеет опцию для отправки каждого пользователя на конкретный сервер, таким образом не используется внешнее хранилище для сессионных данных и если сервер выходит из строя&nbsp;&mdash; пользователи просто разлогиниваются из системы. Если это состояние включает в себя например корзину интернет-магазина или какую-то другую важную информацию, то такой подход мог бы показаться неприемлемым, но для сайта знакомств это было бы не так критично.<br />
&mdash; Было решено, что хранение и получение сессионных данных программными средствами слишком дорого. Аппаратная балансировка нагрузка проще: пользователи просто назначаются конкретным серверам и в случае сбоя сервера назначенным ему пользователям предлагается пройти процесс авторизации еще раз.<br />
&mdash; Покупка ServerIron была дешевле и проще, чем использование NLB. Многие крупные сайты используют их для создания пулов TCP соединений, автоматическому определению ботов и так далее. ServerIron может делать намного больше, чем просто балансировать нагрузку и такие функции достаточно привлекательные за эту цену.</li>
<li>Была большая проблема с выбором системы размещения рекламы. Многие из них хотели несколько сотен тысяч в год и многолетний контракт.</li>
<li>В процессе избавления от ASP.NET повторителей и использование взамен конкатенации строк или response.write. Если у вас миллионы просмотров страниц в день&nbsp;&mdash; просто напишите весь код для отображения на экране пользователя.</li>
<li>Большинство изначальных вложений ушло на построение SAN. Избыточность любой ценой.</li>
<li>Рост был за счет вирусного эффекта. Портал начал набирать популярность в Канаде, затем о нем узнали в Великобритании и Австралии, и только потом в США.</li>
<li>База данных:<br />
&mdash; Одна база данных является основной.<br />
&mdash; Две базы данных для поиска. Поисковые запросы распределяются по их типу.<br />
&mdash; Производительность наблюдается через диспетчер задач. Когда появляются пики&nbsp;&mdash; ситуация рассматривается более детально. Проблемы обычно заключались в блокировках на уровне СУБД. Собственно говоря почти всегда это были проблемы с базами данных, очень редко они возникают на уровне .NET. Так как POF не использует библиотеки .NET, отследить проблемы с производительностью оказывается достаточно просто. Если бы использовалось много уровней framework&#39;ов, поиск мест, где скрываются проблемы, был бы трудным и утомляющим.<br />
&mdash; Если Вы делаете запрос к базе данных 20 раз при отображении одной страницы,  Вы проиграли в любом случае, вне зависимости от того, что Вы будете делать.<br />
&mdash; Разделяйте запросы чтения и записи к базе данных. Если у вас нет избыточного количества оперативной памяти не следование этому правилу может заставить систему зависнуть на несколько секунд.<br />
&mdash; Постарайтесь делать базы данных только для чтения.<br />
&mdash; Денормализуйте данные. Если Вам приходится доставать данные из 20 разных таблиц, попробуйте сделать просто одну таблицу, где будут лежать все нужные для чтения данные.<br />
&mdash; Один день может проработать почти что угодно, но когда Ваша база данных удвоится&nbsp;&mdash; использованные подход может внезапно перестать работать.<br />
&mdash; Если система делает только что-то одно, она будет делать это реально хорошо. Только записывайте данные и все будет нормально. Только читайте данные и все будет нормально. Делайте и то и другое&nbsp;&mdash; и все испортится. База данных погрязнет в проблемах с блокировками.<br />
&mdash; Если Вы полностью используете вычислительные мощности, Вы либо делаете что-то не так, либо Ваша система на самом деле очень оптимизирована. Если вы можете разместить всю базу в оперативной памяти&nbsp;&mdash; обязательно делайте это.</li>
<li>Процесс разработки выглядит примерно следующим образом: появляется идея, быстро реализуется и выдается пользователям в пределах 24 часов. Отклик от пользователей получается по слежению за тем, что они делают на сайте: выросло количество сообщений на пользователя? среднее время сессий выросло? Если пользователям новая фишка не пришлась по вкусу&nbsp;&mdash; просто уберите её.</li>
<li>При небольшом количестве серверов системные сбои достаточно редки и краткосрочны. Наибольшими сложностями были проблемы с DNS, когда некоторые интернет-провайдеры говорили, что POF больше не существует. Но так как сайт бесплатен, пользователи нормально относятся к небольшим периодам его недоступности. Люди часто не замечают простой сайта, так как думают, что это какая-то проблема у них, с интернет-соединением или еще чем-то.</li>
<li>Переход от миллиона пользователей к 12 миллионам пользователей был большим прыжком. Система может обслуживать и 60 миллионов пользователей с двумя веб-серверами.</li>
<li>Часто смотрите на конкурентов для идей новых функциональных возможностей.</li>
<li>Рассмотрите использование чего-то вроде S3, когда система начнет требовать географической балансировки.<br />
<h2>Подводим итоги</h2>
</li>
<li>Вам не нужны миллионы в финансировании, размашистая инфраструктура и целое здание сотрудников для того, чтобы создать вебсайт мирового уровня, который обслуживает кучу пользователей и приносит неплохие деньги. Все что нужно&nbsp;&mdash; всего лишь привлекательная идея, которая понравится большому количеству идей, сайт, который становится популярным благодаря слухам, а также опыт и видение для построения сайта, не наступая на типичные &laquo;грабли&raquo;. Вот и все, что Вам нужно <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>Необходимость&nbsp;&mdash; мать всех изменений.</li>
<li>Когда вы растете быстро, но не слишком быстро, у Вас появляется шанса расти, модифицировать и адаптироваться.</li>
<li>Максимальное использование оперативной памяти решает массу проблем. После этого рост возможен просто за счет использование более мощных серверов.</li>
<li>В начале старайтесь держать все максимально простым. Практически все дают этот же самый совет, а Markus говорит, что все что он делает&nbsp;&mdash; всего лишь очевидный здравый смысл. Но то что просто, не всегда означает всего лишь осмысленную вещь. Создание простых вещей является результатом многих лет практического опыта.</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 миллионов долларов в год за счет бесплатного сайта  практически невозможно&nbsp;&mdash; Вам потребуется слишком большой рынок.</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>7</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, Яндекс или Рамблер сказано уже не мало слов, все много раз о них читали, пользовались, обсуждали&#160;&#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, Яндекс или Рамблер сказано уже не мало слов, все много раз о них читали, пользовались, обсуждали&nbsp;&mdash; ведь уже прошло больше 10 лет с момента создания каждой из этих поисковых систем и, как следствие, их конкуренции на просторах рунета. Намного меньше же внимания на российских информационных сайтах уделяется национальным проектам других стран, а ведь среди них тоже есть заслуживающие внимания экземпляры, об одном из них я бы и хотел сегодня поведать.<br />
<span id="more-407"></span></p>
<h2>Источники данных</h2>
<ul>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://tech.sina.com.cn/i/2009-12-16/14423683386.shtml"  target="_blank" rel="external nofollow">Baidu Aladdin Technology Guashudila</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://tech.sina.com.cn/i/2009-08-18/16063362415.shtml"  target="_blank" rel="external nofollow">Rachel Liao, лекция директора по архитектуре Baidu</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://news.xinhuanet.com/it/2006-04/06/content_4390847.htm"  target="_blank" rel="external nofollow">Baidu Chief Architect: алгоритмы на службе разработчиков Baidu</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://baike.baidu.com/view/2086291.htm"  target="_blank" rel="external nofollow">Aladdin Plans</a></noindex></li>
</ul>
<p><em>Если кто-то достаточно любопытен, чтобы нажать на приведенные ссылки&nbsp;&mdash; они все на китайском, так что статья написана на основе перевода Google Translate со всеми вытекающими последствиями. Даже за название &laquo;Aladdin&raquo; не ручаюсь, его тоже он придумал <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<h2>О компании Baidu</h2>
<p><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.baidu.com"  target="_blank" rel="external nofollow">Baidu.com</a></noindex> является лидером китайского рынка интернет-поиска, объем которого достаточно значителен. На данный момент Китай насчитывает около 340-360 миллионов интернет-пользователей, что превышает общую численность населения США. Не трудно представить с каким трафиком приходится сталкиваться крупнейшей китайской поисковой системе.</p>
<p>Чтобы не быть голословным, еще немного цифр о Baidu:</p>
<ul>
<li>100 миллионов поисковых запросов в день</li>
<li>Более миллиарда проиндексированных страниц</li>
<li>300-400 миллионов проиндексированных сайтов</li>
</ul>
<p>Уже на сегодняшний день размеры китайской части интернета производят впечатление и с каждым днем она расширяется все больше. Как следствие, на рынке образуются все новые и новые возможности для создания сервисов, удовлетворяющих потребности китайских пользователей Интернет. Компания <strong>Baidu Inc.</strong> пристально наблюдает за развитием ситуации и обнаружила огромную потребность среди сервис-провайдеров в удобной платформе для создания и предоставления пользователям новых сервисов. Baidu считает создание платформы для использования их технологии сторонними разработчиками и сервис-провайдерами очень важным направлением развития на пути к повышению качества пользовательского опыта в целом. Эти наблюдения стали толчком к рождению в рамках Baidu новой технологии под названием <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://open.baidu.com/"  target="_blank" rel="external nofollow">Aladdin</a></noindex>.</p>
<p>Как крупнейшей китайской поисковой системе, Baidu приходится быть чем-то большим, чем просто инструментом для поиска, это позволяет удовлетворять потребности потенциальных клиентов наиболее гармоничным и целесообразным образом. Помимо неустанной погони за технологическими инновациями, Baidu предпочитает придерживаться политики &laquo;потребности клиентов важнее всего&raquo;.</p>
<h2>Aladdin</h2>
<p>Согласно официальному сайту Baidu, эта технология представляет собой открытую поисковую платформу, позволяющую сторонним разработчикам использовать технологию Baidu в своих приложениях и сервисах. Владельцы интернет-проектов и разработчики могут предоставить Baidu данные в уже структурированном виде для того, чтобы создать еще более мощные и функционально-насыщенные приложения, позволяя интернет-сайтам получать еще более значимый трафик, а пользователям&nbsp;&mdash; еще больше облегчить использование сайтов и поиск в сети Интернет.</p>
<p>В декабре 2008 года Baidu объявили о высокоприоритетной программе под кодовым названием <em>&laquo;Aladdin&raquo;</em>, основной идеей была попытка расширить текущие рамки веб-поиска, по большей части за счет включения так называемого &laquo;глубинного интернета&raquo; в поисковую базу, проведения более глубокого анализа контента. Помимо этого упоминались возможность интеграции и управляемой обработки информации, направленных на минимизацию издержек поиска и времени обработки запроса при повышение общего качества поисковых результатов. В том же заявлении Baidu также описали их общую позицию по данному направлению: платформа Aladdin является надстройкой над текущей поисковой системой Baidu, позволяющей дополнение и расширение функциональных возможностей.</p>
<p>Согласно исследованиям Baidu, только 75% пользователей поисковых систем в конечном итоге удовлетворяют свои информационные потребности. В процессе анализа причин данного факта было выявлено, что в большом количестве случаев искомая информация находится на ресурсах по каким-то причинам находящимся вне доступа поисковых систем (начиная от технических ограничений, отсутствия внешних ссылок на ресурс и заканчивая искусственными барьерами вроде REP или принудительной авторизации).</p>
<p>Перед разработчиками Aladdin встают две основные проблемы с точки зрения технической реализации: &laquo;как определить пользовательские потребности&raquo; и &laquo;как сортировать&raquo;. Конечно же они очень тесно связаны между собой, это хорошо демонстрирует пример с поисковым запросом &laquo;полное солнечное затмение&raquo;: до затмения пользователи хотят когда оно будет и откуда лучше смотреть, а во время и после него намного актуальнее будет увидеть видео-запись или прямую трансляцию, а также прочитать и поделиться комментариями. Самым простым методом решения данного класса задач является статистический анализ&nbsp;&mdash; Aladdin выделяет два основных фактора, используемых для сортировки результатом в соответствии с потребностями пользователей: &laquo;удовлетворенность потребностей&raquo; и &laquo;уровень отклика на спрос&raquo;. Конечно же оценочные характеристики спроса и потребностей не означают сам спрос, то есть возможны и более сложные ситуации, когда за пользовательским запросом стоит целый комплекс более простых потребностей.</p>
<p>Алгоритмы, используемые в Aladdin для решения упомянутых проблем, основаны на машинном обучении, анализе поведения пользователей, а также обратной связи от использования технологии на практике. Конечная цель данной платформы заключается в построении целой интеллектуальной экосистемы,  которая станет новым шагом в развитии компании Baidu и китайской части интернета в целом.</p>
<h3>Возможности платформы</h3>
<p>С технической точки зрения Aladdin от Baidu представляет собой открытый API к поисковой технологии Baidu, позволяющий добавлять свои данные в структурированном виде в поисковый индекс, отмечать релевантные ключевые слова, методы отображения информации и пометки данных гео-метками.</p>
<p>Одним из важнейших направлений развития поисковых систем является повышение &laquo;интеллектуальности&raquo; поиска, 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), но... если вспомнить, что Baidu работает в Китае&nbsp;&mdash; вся затея начинает обретать здравый смысл. Как сама компания Baidu, так и большинство их потенциальных партнеров, клиентов и пользователей находится в примерно одинаковой ситуации: большое количество дешевой рабочей силы, относительно низкий уровень образования и профессиональной подготовки, а также прочие национальные особенности. В их ситуации не выгодно идти по пути Google и делать <em>основной</em> акцент на построении полностью автоматизированных систем анализа контента, добавления дополнительного материала к поисковым результатам и самим делать различные дополнительные приложения и сервисы. Намного выгоднее пойти по собственному пути, более адаптированному к ситуации в Китае, большое количество трудолюбивых людей позволяет строить сервисы коллективно, с привлечением партнеров, клиентов и заинтересованных лиц. Да, во многом вручную, за счет интеграции совершенно различных систем и сервисов, но зато более качественно и продуманно. В этом-то и заключается вся магия Китая.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/feed/</wfw:commentRss>
		<slash:comments>1</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><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://stackoverflow.com/" rel="external nofollow"  target="_blank">Stack Overflow</a></noindex> является любимым многими программистами сайтом, где можно задать профессиональный вопрос и получить ответы от коллег. Этот проект был написан двумя никому не известными парнями, о которых никто никогда раньше не слышал. Хорошо, не совсем так. Stack Overflow был создан топовыми программистами и звездами блогосферы: <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.codinghorror.com/blog/" rel="external nofollow"  target="_blank">Jeff Atwood</a></noindex> и <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.joelonsoftware.com/" rel="external nofollow"  target="_blank">Joel Spolsky</a></noindex>. В этом отношении Stack Overflow похож на ресторан, владельцами которого являются знаменитости. По оценкам Joel&#39;а около 1/3 программистов всего мира использовали этот интернет-ресурс, так что должно быть он представляет собой что-то достаточно полезное и интересное.</p>
<p>Одним из ключевых моментов в истории Stack Overflow является использование вертикального масштабирования, как достаточно работоспособного решения достаточного большого класса проблем. Не смотря на то, что публика на сегодняшний день больше склоняется к подходу с использованием горизонтальным масштабирования и не-SQL баз данных.</p>
<p>Если Вы стремитесь к масштабу Google, у Вас нет другого выхода, как двигаться в направлении не-SQL. Но Stack Overflow&nbsp;&mdash; это не Google, ровно как и подавляющее большинство других сайтов. Когда Вы задумываетесь о возможных вариантов дизайна Вашего проекта, попробуйте учесть и историю Stack Overflow, она тоже имеет право на жизнь. В этот век многоядерных машин с большим объемом оперативной памяти и невероятными темпами развития методов параллельного программирования, вертикальное масштабирование все еще является жизнеспособной стратегией и не должна сразу же отбрасываться в сторону просто так как это теперь больше не модно. Возможно в один прекрасный день мы получим лучшее из обоих миров, но на сегодняшний момент перед нами лежит большой болезненный выбор стратегии масштабирования, от которого определенно зависит судьба Вашего проекта.</p>
<p>Joel любит похвастаться тем, что они достигли производительности, сравнимой с другими сайтами аналогичных размеров, используя в 10 раз меньше оборудования. Он удивляется, работали над этими сайтами по-настоящему хорошие программисты. Давайте взглянем на то, как им это удалось, и дадим Вам возможность побыть судьей.</p>
<p><span id="more-466"></span></p>
<p><em>Перевод <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html" rel="external nofollow"  target="_blank">статьи</a></noindex>, автор оригинала&nbsp;&mdash; 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 <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.microsoft.com/BizSpark" rel="external nofollow"  target="_blank"></a></noindex>BizSpark. Скорее всего они заплатили около 11000$ за лицензии на ОС и MSSQL.</li>
<li>Стратегия монетизации: ненавязчивая реклама, вакансии, конференции DevDays, достижения других смежных ниш (Server Fault, Super User), разработка <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://stackexchange.com/" rel="external nofollow"  target="_blank">StackExchange</a></noindex> и возможно каких-то других систем рейтингов для программистов.<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 />
&mdash; 2 x Lenovo ThinkServer RS110 1U<br />
&mdash; 4 ядра, 2.83 Ghz, 12 MB L2 cache<br />
&mdash; 500 GB жесткие диски, зеркалирование RAID1<br />
&mdash; 8 GB RAM</li>
<li>Уровень базы данных:<br />
&mdash; 1 x Lenovo ThinkServer RD120 2U<br />
&mdash; 8 ядер, 2.5 Ghz, 24 MB L2 cache<br />
&mdash; 48 GB RAM</li>
<li>Четвертый сервер был добавлен для запуска <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://superuser.com/" rel="external nofollow"  target="_blank">superuser.com</a></noindex>. Все сервера вместе обеспечивают работу <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://stackoverflow.com/" rel="external nofollow"  target="_blank">Stack Overflow</a></noindex>, <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://serverfault.com/" rel="external nofollow"  target="_blank">Server Fault</a></noindex>, и <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://superuser.com/" rel="external nofollow"  target="_blank">Super User</a></noindex>.</li>
<li>QNAP TS-409U NAS для резервного копирования данных. Было принято решение не использовать &laquo;облачные&raquo; решения, так как вызванные ими дополнительные 5GB трафика ежедневно были бы накладными.</li>
<li>Сервера располагаются у <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.peakinternet.com/" rel="external nofollow"  target="_blank">Peak Internet</a></noindex>. В основном из-за впечатляющей детализации технических ответов и разумных расценок.</li>
<li>Полнотекстный поиск в SQL Server активно используется для реализации поиска по сайту и выявления повторных вопросов. Lucene .NET рассматривается как достаточно заманчивая альтернатива.<br />
<h2>Подводим итоги</h2>
Данный список является сборником уроков от Jeff и Joel, а также из комментариев к их записям:</li>
<li>Если Вы комфортно себя чувствуете в деле управления серверами&nbsp;&mdash; не бойтесь покупать их. Две основных проблемы с издержками аренды оборудования: 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 программного обеспечения. В противном случае вертикальное масштабирование значит сокращение издержек, связанных с лицензиями, в ущерб стоимости оборудования, а горизонтальное масштабирование&nbsp;&mdash; наоборот: экономия на оборудовании, но требуется существенно больше лицензий на программное обеспечение.</li>
<li>RAID-10 отлично работает для баз данных с высокой нагрузкой операций чтения и записи.</li>
<li>Разделяйте работу приложений и баз данных таким образом, чтобы они могли масштабироваться независимо друг от друга. Например, базы данных могут  масштабироваться вертикально, а сервера приложений&nbsp;&mdash; горизонтально.</li>
<li>Приложения должны хранить все информацию о своем состоянии в базе данных для обеспечения возможности роста путем простого добавления серверов приложений в кластер.</li>
<li>Одна из основных проблем со стратегией вертикального масштабирования&nbsp;&mdash; недостаток избыточности. Кластеризация добавляет надежности, но когда стоимость каждого сервера высока&nbsp;&mdash; это не так просто реализовать.</li>
<li>Некоторые приложения могут масштабироваться линейно относительно числа процессоров. Но зачастую будут использоваться механизмы блокировки, что приведет к сериализации вычислений и в итоге к существенному уменьшению эффективности приложения.</li>
<li>С более крупными серверами, занимающими от 7U в стойке, электроэнергия и охлаждение становятся критичными вопросами. Возможно использование чего-то среднего между 1U и 7U может облегчить Ваши взаимоотношения с датацентром.</li>
<li>С добавлением все новых и новых серверов баз данных издержки на лицензии SQL Server могут стать очень существенными. Если Вы начнете с вертикального масштабирования и постепенно начнете переходить к горизонтальному с использованием не open source продуктов, возможно это сильно ударит по Вашему финансовому состоянию. Это справедливо, что в этой заметке речь идет не совсем об архитектуре проекта. Мы знаем об их серверах, об используемом наборе инструментов, об их двухуровневой схеме, где база данных используется напрямую из кода веб-серверов. Но мы не знаем практически ничего о самой реализации, например таких мелочей как теги. Если Вам интересен этот вопрос, возможно Вам удастся получить интересующую Вас информацию из <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://sqlserverpedia.com/wiki/Understanding_the_StackOverflow_Database_Schema" rel="external nofollow"  target="_blank">описания их схемы базы данных</a></noindex>.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-stack-overflow/feed/</wfw:commentRss>
		<slash:comments>12</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><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/p/terrastore/" rel="external nofollow"  target="_blank">Terrastore</a></noindex> является свежеиспеченной системой хранения документов, с отличными возможностями по масштабируемости и эластичной настройке, при этом без жертв со стороны консистентности данных.</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>Если Вам показалось интересным, у Вас есть возможность <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/p/terrastore/" rel="external nofollow"  target="_blank">получить более подробную информацию</a></noindex>, <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://groups.google.com/group/terrastore-discussions" rel="external nofollow"  target="_blank">принять участие в проекте</a></noindex>, <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/p/terrastore/downloads/list" rel="external nofollow"  target="_blank">скачать дистрибутив</a></noindex> или <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/p/terrastore/source/createClone" rel="external nofollow"  target="_blank">получить копию исходного кода</a></noindex>!<br />
﻿<span id="more-449"></span><br />
<em> В очередной раз спасибо </em><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highscalability.com/blog/2009/12/30/terrastore-scalable-elastic-consistent-document-store.html" rel="external nofollow"  target="_blank"><em>highscalability.com за источник информации</em></a></noindex><em>, за одно хотелось бы услышать мнения о таком формате постов. Я тут уже почти неделю копаюсь над постом-долгостроем про Baidu, а такой можно сочинить за полчаса.</em></p>
<p><em>Кстати про </em><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.terracotta.org" rel="external nofollow"  target="_blank"><em>Terracotta</em></a></noindex><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><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.myspace.com" rel="external nofollow"  target="_blank">MySpace.com</a></noindex> является одним из наиболее быстро набирающих популярность сайтов в Интернете с 65 миллионами пользователей и 260000 регистрациями в день. Этот сайт часто подвергается критике из-за не достаточной производительности, хотя на самом деле MySpace удалось избежать ряда проблем с масштабируемостью, с которыми большинство других сайтов неизбежно сталкивались. Как же им это удалось?<br />
<span id="more-370"></span></p>
<h2>Источники информации</h2>
<p><em>Данная статья является переводом статьи <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highscalability.com/blog/2009/2/12/myspace-architecture.html" rel="external nofollow"  target="_blank">MySpace Architecture</a></noindex>, автором которой является Todd Hoff. Когда-то давно один из читателей этого блога просил меня осветить и эту тему, тогда я так и не решился из-за отсутствия моего личного интереса, но сейчас снова случайно наткнулся на эту статью и подумал: а почему бы и нет?</em></p>
<ul>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.infoq.com/news/2009/02/MySpace-Dan-Farino" rel="external nofollow"  target="_blank">Презентация: за сценой MySpace.com</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.baselinemag.com/c/a/Projects-Networks-and-Storage/Inside-MySpacecom/" rel="external nofollow"  target="_blank">Внутри MySpace.com</a></noindex></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 />
&mdash; 500 тысяч пользователей: простая архитектура перестает справляться<br />
&mdash; 1 миллион пользователей: вертикальное партиционирование временно спасает от основных болезненных вопросов с масштабированием<br />
&mdash; 3 миллиона пользователей: горизонтальное масштабирование побеждает над вертикальным<br />
&mdash; 9 миллионов пользователей: сайт мигрирует на ASP.NET, создается виртуализированная система хранения данных (SAN)<br />
&mdash; 26 миллионов пользователей: MySpace переходит на 64-битную технологию.</li>
<li>500 тысяч учетных записей было многовато для двух веб-серверов и одного сервера баз данных.</li>
<li>На 1-2 миллионах учетных записей:<br />
&mdash; Они использовали архитектуру базы данных, построенную на концепции вертикального партиционирования, с отдельными базами данных для разных частей сайта, которые использовались для выполнения различных функций, таких как экран авторизации, профили пользователей и блоги.<br />
&mdash; Схема с вертикальным партиционированием помогала разделить нагрузку как для операций чтения, так и для операций записи, а если пользователям в друг оказывалась нужна новая функциональная возможность&nbsp;&mdash; достаточно было просто добавить еще один сервер баз данных для её обслуживания.<br />
&mdash; MySpace переходит от использования систем хранения, подключенных к серверам баз данных напрямую, к сетям хранения данных (SAN), при таком подходе целый массив систем хранения объединяется вместе специализированной сетью с высокой пропускной способностью, и сервера баз данных также получают доступ к хранилищам через эту сеть. Переход к SAN оказал положительное влияние как на производительность, так и на доступность и надежность системы.</li>
<li>На 3 миллионах учетных записей:<br />
&mdash; Решение с вертикальным партиционированием не протянуло долго, так как им приходилось реплицировать какую-то часть информации (например информацию об учетных записях) по всем вертикальным частям базы данных. С таким большим количеством операций репликации данных один узел даже при незначительном сбое мог существенно замедлить обновление информации во всей системе.<br />
&mdash; Индивидуальные приложения вроде блогов на под-секциях сайта достаточно быстро стали слишком большими для нормальной работы с единственным сервером базы данных<br />
&mdash; Произведена реорганизация всех ключевых данных для более логичной организации в единственную базу данных<br />
&mdash; Пользователи были разбиты на группы по миллиону в каждой и каждая такая группа была перемещена на отдельный SQL Server</li>
<li>9–17 миллионов учетных записей:<br />
&mdash; Переход на ASP .NET, который требовал меньше ресурсов по сравнению с их предыдущим вариантом архитектуры. 150 серверов, использовавших новый код могли обработать нагрузку, для которой раньше требовалось 246 серверов.<br />
&mdash; Снова пришлось столкнуться с узким местом в системе хранения данных. Реализация SAN решило какую-то часть старых проблем с производительностью, но на тот момент потребности сайта начали переодически превосходить возможности SAN по пропускной способности операций ввода-вывода&nbsp;&mdash; той скорости, с которой она может читать и писать данные на дисковые массивы.<br />
&mdash; Столкнулись с лимитом производительности при размещении миллиона учетных записей на одном сервере, ресурсы некоторых серверов начали исчерпываться.<br />
&mdash; Переход к виртуальному хранилищу, где весь SAN рассматривается как одно большое общее место для хранения данных, без необходимости назначать конкретные диски для хранения данных определенной части приложения. MySpace на данный момент работает со стандартизированным обородуванием от достаточно нового вендора SAN&nbsp;&mdash; 3PARdata</li>
<li>Был добавлен кэширующий уровень — прослойка из специализированных серверов, расположенных между веб-серверами и серверами данных, чья единственная задача была захватывать копии часто запрашиваемых объектов с данными в памяти и отдавать их веб-серверам для минимизации количества поиска данных в СУБД.</li>
<li>26 миллионов учетных записей:<br />
&mdash; Переход на 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&#39;ов для поддержки различных операций.</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>Когда это возможно&nbsp;&mdash; лучше просто использовать дополнительное оборудование для решения проблем. Это намного проще, чем изменять поведение программного обеспечения для того чтобы решать задачи как-то по-другому. Примером может служить добавление нового сервера на каждый миллион пользователей. Возможно было бы более эффективным изменить подход к самой работе с СУБД, но на практике все же проще и дешевле добавлять все новые и новые сервера. По крайней мере на данный момент.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/feed/</wfw:commentRss>
		<slash:comments>10</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[
Давным-давно, в далекой-предалекой галактике...
Хотя да, достаточно давно уже 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;">Давным-давно, в далекой-предалекой галактике...</span></p>
<p>Хотя да, достаточно давно уже Google выпустили в свет платформу <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.appspot.com/" id="ix89" title="Google App Engine"  target="_blank" rel="external nofollow">Google App Engine</a></noindex>. Описание этого продукта меня заинтересовало еще до открытия публичного доступа к системе и я даже записался на полу-закрытое тестирование. Вскоре пришло подтверждение, что мол &laquo;мы рады сообщить, что Ваша учетная запись активирована и теперь у Вас есть возможность попробовать наш новый продукт, для этого нажмите ссылку такую-то&raquo;. Но пришло оно как-то не очень удачно, когда ни лишнего свободного времени не было, да и идеи подходящей для создания чего-нибудь эдакого на новой платформе тоже на горизонте не наблюдалось. В общем зашел на их сайт, посмотрел админку, поставил демо-приложение, поигрался чуток и забросил. Но с тех пор руки так и не прекращали чесаться от желания попробовать GAE на каком-нибудь более приближенном к реальности приложении, что мне совсем недавно и довелось сделать. Спешу поделиться впечатлениями.<br />
<span id="more-213"></span><br />
Если Вы даже краем уха не слышали о платформе <span style="font-family: Courier New;">Google App Engine</span> и после прочтения вступления не удосужились скопировать это название в свою любимую поисковую систему, чтобы почитать по-подробнее, то Вам повезло: для порядка я все-таки расскажу чуть-чуть о тех вкусностях, которые так долго поддерживали мой интерес к данному проекту.</p>
<p>Если взглянуть издалека, то GAE представляет собой условно-бесплатный хостинг для веб-приложений, для разработчиков предоставляется все необходимое: начиная от минимально-необходимого <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/appengine/downloads.html" id="t39e" title="SDK"  target="_blank" rel="external nofollow">SDK</a></noindex> со встроенным веб-сервером, локально эмулирующим саму платформу, заканчивая неплохой документацией по самой системе и доступным из нее API от Google. Почему условно-бесплатный? Бесплатно приложениям выделяется лишь ограниченное количество вычислительных ресурсов, при превышении которых по выбору владельца приложения либо взимается вполне <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/appengine/docs/quotas.html" id="ly53" title="скромная плата"  target="_blank" rel="external nofollow">скромная плата</a></noindex>, либо всем пользователям начинают показывать &laquo;извиняйте, заходите завтра&raquo; (в прямом смысле, счетчики потребления ресурсов сбрасываются ежедневно).</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 и библиотеки, использующие нативный, платформозависимый код, также стоит забыть. Но не все так плохо, как кажется: для реализации всех &laquo;отобранных&raquo; у разработчиков функциональных компонент 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> (лишь отдаленно). Продукт в обращении достаточно своеобразен, как оказалось самый простой способ привыкнуть к работе с ним&nbsp;&mdash; выкинуть из головы все знания о традиционных СУБД и взглянуть на процесс хранения данных с чистого листа. Разномастные JOIN&#39;ы и прочие изыски лишь мешают думать в терминах подобных систем.</p>
<p>Закончив тему с рекламой GAE, позвольте перейти к моим личным впечатлениям. Попробовал я данную платформу на вполне конкретном примере (в конце поста дам ссылочку на частично-готовый результат, если кому интересно), надо же в конце-концов на что-то с пользой убивать внезапно появившееся свободное время. ОтJava и прочей компании языков, основанных на JVM, я невероятно устал на теперь уже &laquo;прошлой&raquo; работе, так что взор мой упал на Python и давно находящийся у меня на слуху (в основном благодаря  <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.softwaremaniacs.org/" id="vdse" title="Ивану Сагалаеву"  target="_blank" rel="external nofollow">Ивану Сагалаеву</a></noindex>) фреймворк <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.djangoproject.com/" id="mnk8" title="Django"  target="_blank" rel="external nofollow">Django</a></noindex>. Ни с тем, ни с другим я ранее почти не был знаком на практике, разве что когда-то пытался помогать своим очень хорошим подругам с прохождением Python в университете (пользуясь случаем, передаю привет Полине, Кате и Юле, очень по вам скучаю <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ). Стоит упомянуть, что существует несколько сборок Django, адаптированных под GAE, наиболее продуманным и готовым к эксплуатации мне показался проект под названием  <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://code.google.com/p/app-engine-patch/" id="u899" title="app engine patch"  target="_blank">app engine patch</a></noindex>, которым я и воспользовался для экспериментов.</p>
<p>Django, как известно, является вполне традиционным веб-фрейморком, пропагандирующим свою вариацию на тему MVC (именуемую <strong>MVT</strong>&nbsp;&mdash; <span style="font-family: Courier New;">Model-View-Template</span>, но по сути абсолютно то же самое), а также целый ряд философских верований (вроде <em>DRY, Don&#39;t repeat yourself</em>), которым даже отведена <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://docs.djangoproject.com/en/dev/misc/design-philosophies/" id="m71-" title="отдельная страница на сайте"  target="_blank" rel="external nofollow">отдельная страница на официальном сайте</a></noindex>. Адаптированная под GAE версия фреймворка отличается от стандартной по большому счету лишь замененной частью <span style="font-family: Courier New;">Model</span>, в которую очень неплохо вписался предоставляемый API к уже упоминавшемуся хранилищу данных. По всем остальным компонентам системы официальная документация по Django практически полностью актуальна и сильно помогла понять всю картину разработки веб-приложений с использованием данных технологий.</p>
<p>Пересказывать функциональные возможности Django как-то не входило в мои планы, все кому интересно и так уже в курсе или знают где посмотреть. Хочу лишь сказать, что со своей задачей упрощения и ускорения процесса разработки веб-приложений он полностью справляется: все основные функциональные компоненты реализуются просто, легко и быстро, при этом особой необходимости (да и желания) вникать в то, как оно в итоге работает не возникает. Если же взглянуть на Django в совокупности с возможностями GAE&nbsp;&mdash; вопросы масштабируемости также по большей части с плеч разработчика снимаются (если не забыть прочитать документацию по хранилищу и не творить глупостей). В общем что-что, а количество человекочасов, требуемых на создание качественного масштабируемого веб-приложения, эта парочка способна сократить изрядно.</p>
<p>Предложение Google по использованию платформы GAE выглядит очень заманчиво, не смотря на все ограничения под нее можно как портировать существующие приложения, так и легко создавать новые. Бесплатное использование до превышения квот также не может не радовать (кстати квоты там рассчитаны на мировой рынок, превысить большинство из них в рамках рунета&nbsp;&mdash; надо постараться, мне кажется). Но закончить данное повествование мне всетаки хотелось парой недокументированных или вкратце официально упоминавшихся &laquo;ложек дегтя&raquo;. Первая неприятная особенность: процессы, обрабатывающие пользовательские запросы приложений, умирают после очень небольшого времени простоя (таймаут судя по всему секунд 20-30). По истечении таймаута система освобождает использующиеся приложением ресурсы и когда после перерыва приходит очередной пользователь система вынуждена заново инициализироваться (чуть ли не заново компилировать байткод, хотя не уверен), что занимает около 5 секунд, а то и больше, во время которых пользователю ничего не остается кроме как терпеливо ждать. Сделали данный механизм видимо в связи с тем фактом, что подавляющее большинство развернутых приложений были сделаны просто чтобы побаловаться и были сразу же заброшены, что делает неэффективным постоянное держание в готовом состоянии даже одного процесса для каждого приложения. Таким образом использование GAE для тяжелых веб-приложений с небольшой целевой аудиторией не очень эффективно.  Минус второй: существуют некоторые жесткие ограничения, которые не разрешают увеличивать даже за деньги (по крайней мере расценок не видно). В их число входят максимальное время обработки одного запроса (30 секунд, правда не ясно распространяется ли это на выполнение задач в Task Queue и местном аналоге Cron&#39;а), 30 активных процессов, обрабатывающих запросы приложения (что влечет за собой достаточно жесткое ограничение на количество запросов в секунду в районе нескольких сотен), максимальный размер HTTP запроса/ответа в 10 мегабайт и некоторые другие. В итоге &laquo;тяжелые&raquo; вычисления на GAE не погоняешь (хотя есть варианты с применением AJAX и, соответственно, большого количества запросов к GAE), от Digg-эффекта или DDOS&#39;а есть шанс не уберечься, хостинг файлов не соорудить, но... разве это ограничения? Есть масса более интересных типов веб-приложений, способных прекрасно существовать в такой среде. Да и в крайнем случае всегда можно связаться с представителями Google с просьбой в виде исключение для Вашего приложения, судя по их заявлениям все ограничения носят искусственный характер и служат лишь для защиты от потребления неоправданно большого количества вычислительных ресурсов плохо спроектированных приложениями.</p>
<p>Этот пост написан по мотивам истории сайта <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.cargobook.ru/" id="csyo" title="CargoBook"  target="_blank">CargoBook</a></noindex>, который задумывался как сообщество для логистов, с плавным выходом на корпоративный рынок с продуктом в виде логистической информационной системы, предоставляемой по принципу SaaS. Сходив по ссылке можно заценить, что можно сделать средствами сладкой парочки Django+GAE и одного студента с почти гуманитарным образованием за часов эдак 20 работы в свободное время. Сейчас в задумке кроме меня участвует всего еще один человек: на правах автора идеи, но  если Вас заинтересовал данный проект и может быть Вы хотите присоединиться в каком-либо амплуа&nbsp;&mdash; пишите об этом в комментариях или <a id="hvgv" title="по другим контактным данным" href="../author" target="_blank">по другим контактным данным</a>.</p>
<p>Кстати в американской части Интернета о GAE ходят в основном негативные мнения, мол тормозит, большое время отклика, сплошные таймауты и ошибки. На практике пока не удалось столкнуться с чем-то подобным, но реально работающего приложения с активной пользовательской базой у меня пока нет для того, чтобы делать какие-то относительно объективные выводы. Может быть со временем что-нибудь изменится и более тонкие нюансы станут выползать на поверхность&nbsp;&mdash; время покажет. Как раз будет повод написать еще один пост на эту же тему <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>11</slash:comments>
		</item>
		<item>
		<title>Как проект Ravelry дорос до 10 миллионов запросов с помощью Rails</title>
		<link>http://www.insight-it.ru/masshtabiruemost/kak-proekt-ravelry-doros-do-10-millionov-zaprosov-s-pomoshhyu-rails/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/kak-proekt-ravelry-doros-do-10-millionov-zaprosov-s-pomoshhyu-rails/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 08:31:29 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=199</guid>
		<description><![CDATA[Данная статься основана на замечательном интервью, взятом Tim Bray у Casey Forbes, создателя Ravelry, сайта на Ruby on Rails, поддерживаемое сообществом вязальщиц и специалистов по вышивке крючком численностью более 400000 человек.
Casey и его небольшой команде удалось реализовать массу великолепных идей на Ravelry. Этот сайт очень сфокусирован на своей тематике и представляет собой большую информационную ценность [...]]]></description>
			<content:encoded><![CDATA[<p>Данная статься основана на замечательном интервью, взятом Tim Bray у Casey Forbes, создателя <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.ravelry.com/"   rel="nofollow external">Ravelry</a></noindex>, сайта на Ruby on Rails, поддерживаемое сообществом вязальщиц и специалистов по вышивке крючком численностью более 400000 человек.</p>
<p>Casey и его небольшой команде удалось реализовать массу великолепных идей на Ravelry. Этот сайт очень сфокусирован на своей тематике и представляет собой большую информационную ценность для заинтересованных лиц. Все пользователи Ravelry просто обожают этот сайт, этот факт очевиден по их комментариям полным энтузиазма и невероятно быстрому освоению Ravelry.</p>
<p>Десять лет назад сайт масштаба Ravelry потребовал бы далеко не один миллион долларов для поддержания своего функционирования. Сегодня же Casey является единственным разработчиком Ravelry, а поддержанием работоспособности системы занимается всего несколько человек. Изначальный процесс разработки занял у Casey 4 месяца работы по ночам и выходным. Если Вы взглянете на список  технологий, используемых в Ravelry, Вам станет видно, что проект построен практически полностью на  свободном и бесплатном программном обеспечении, которые просто было собрано вместе в единую полноценную систему. В сегодняшней экосистеме существует множество возможностей для того чтобы делать новые вещи просто комбинируя существующие качественные приложения, языки программирования, системы хранения, а также услуги по размещению и предоставлению доступа к веб-приложениям и данным.</p>
<p>Сейчас Casey и еще несколько сотрудников живут за счет Ravelry. Не это ли является мечтой любого предприятия малого бизнеса? Хотите узнать как и Вы могли бы достичь подобных успехов?<br />
<span id="more-199"></span><br />
<em>Данный текст является переводом статьи <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highscalability.com/how-ravelry-scales-10-million-requests-using-rails"  rel="nofollow external">How Ravelry Scales to 10 Million Requests Using Rails</a></noindex>, автор оригинала&nbsp;&mdash; <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highscalability.com/user/todd-hoff"  rel="nofollow external">Todd Hoff</a></noindex>.</em></p>
<h2>Статистика</h2>
<ul>
<li>
<p style="margin-bottom: 0in;">10 миллионов запросов 	ежедневно обрабатывается Rails (AJAX + RSS + 	API)</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">3.6 миллиона просмотров 	страниц ежедневно</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">430,000 зарегистрированных 	пользователей. 70,000 активно пользуются 	сайтом ежедневно. 900 новых пользователей 	регистрируется ежедневно.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">2.3 миллиона проектов 	по вязанию, 50000 новых сообщений на форуме 	ежедневно, всего 19 миллионов сообщений 	на форуме, 13 миллионов сообщений, 8 	миллионов фотографий (большая часть 	размещена на Flickr).</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Проект начинался на 	небольшом VPS, но потребности в ресурсах 	очень быстро вышли за его возможности.</p>
</li>
</ul>
<ul>
<li>Монетизация: рекламодатели + магазин 	соответствующей продукции + продажа 	узоров</li>
</ul>
<h2>Platform</h2>
<ul>
<li>
<p style="margin-bottom: 0in;">Ruby on Rails (1.8.6, Ruby GC 	патчи)</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Percona сборка MySQL</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Gentoo Linux</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Servers: Silicon Mechanics (не 	арендуемые, в их собственности)</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Хостинг: Colocation от 	Hosted Solutions</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Интернет-канал: 	Cogent (очень дешево)</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Capistrano для развертывания.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Nginx существенно более 	быстрый и менее требовательный к 	оперативной памяти по сравнению с 	Apache.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Xen для виртуализации</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">HAproxy для балансировки 	нагрузки.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Munin для мониторинга.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Tokyo Cabinet/Tyrant для 	кеширования больших объектов</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Nagios для предупреждений</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">HopToad для уведомлений 	об исключительных ситуациях.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">NewRelic для тонкой 	настройки</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Syslog-ng для агрегации 	логов</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">S3 для хранения данных</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Cloudfront в роли CDN</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Sphinx для текстового 	поиска</p>
</li>
</ul>
<ul>
<li>Memcached для кеширования маленьких 	объектов</li>
</ul>
<h2>Архитектура</h2>
<ul>
<li>
<p style="margin-bottom: 0in;">7 серверов (Gentoo Linux). 	Средствами виртуализации (Xen) создано 	13 виртуальных серверов.<br />
* Для обработки 	пользовательских запросов используются 	Nginx и Haproxy. Запросы проходят следущую 	цепочку: nginx -&gt; haproxy -&gt; apache + mod_passenger.<br />
* 	Один небольшой сервер для резервного 	копирования данных.<br />
* Один небольшой 	вспомогательный сервер для некритичных 	процессов и тестирования новых версий.<br />
* 	2 сервера с 32 GB оперативной памяти для 	master+slave баз данных, а также поисковой 	системы Sphinx.<br />
* 3 сервера приложений, 	состоящих из 6 Apache Passenger и запущенных 	экземпляров Ruby, каждый ограничен 20-ю 	потоками. Суммарно 6 четырехядерных 	процессоров и 40 GB оперативной памяти. 	Часть оперативной памяти большую часть 	времени простаивает.</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">5 терабайт данных 	располагается в Amazon S3. Cloudfront используется 	как CDN.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;">Tokyo Cabinet/Tyrant используется 	вместо memcached в некоторых местах для 	кеширования более крупных объектов, в 	частности уже размеченного текста в 	HTML.</p>
</li>
</ul>
<ul>
<li>HAproxy и Capistrano используются для вывода 	новых версий сайта без негативного 	влияния на производительность и работу 	пользователей.</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Позвольте своим 	пользователям работать над Вашим сайтом 	за Вас</strong>. Проводите итерации и 	развивайтесь. Начните с чего-то, что 	просто работает, и позвольте людям 	начать пользоваться продуктом, развивать 	проект совместно с пользователями 	намного проще. Не торопясь развивайте 	бета-версию своего проекта. Также 	медленно приглашайте новых людей. 	Старайтесь ежедневно обсуждать с 	пользователями что бы они хотели увидеть 	нового в проекте. Разрешите им оказывать 	помощь в развитии проекта и результат 	станет существенно более обнадеживающим, 	утешительным, интуитивно-понятным и 	эффективным.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Позвольте 	пользователям спонсировать Ваш проект</strong>. 	Ravelry частично был создан за счет его 	пользователей, которые пожертвовали 	в пользу проекта более 71 тысячи долларов. 	Эти средства были переданы проекту 	просто как дар, а не в обмен на акции. 	Не недооценивайте значимость капитала 	компании. Ravelry потребовалось 6 месяцев 	непрерывной работы и экономии на 	издержках, связанных с серверным 	оборудованием и каналами связи, чтобы 	наконец-то нначать получать прибыль, 	и полученные от пользователей средства 	оказались основным фактором, позволившим 	проекту пережить этот тяжелый период. 	Залогом их успеха является поддержание 	 интереса и искры в глазах своих 	пользователей, подталкивание пользователей 	к оказанию помощи и поддержки проекту. 	Для этого требуется любовь к своему 	делу и самоотдача.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Станьте центром 	выбранной ниши</strong>. Найдите нишу на рынке 	с недостаточным предложением. Не 	стремитесь к массовым рынкам. Совсем 	не обязательно делать что-то для многих 	миллионов людей. Миллионы скорее всего 	просто зевнут от скуки и в скором времени 	о Вас забудут. Лучше создайте что-нибудь 	очень полезное для небольшой 	заинтересованной группы лиц и их страсть 	к их интересам перейдет и к Вам.</p>
</li>
</ul>
<ul>
<li><strong>Успех не обязательно должен быть 	связан с масштабностью проекта, намного 	большее значение имеет стабильная и 	качественная реализация </strong><em><span style="font-weight: normal;">[Jeff 	Putz]</span></em>.</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Основная проблема 	в базе данных</strong>. Практически вся работа, 	относящаяся к 	масштабируемости/настройке/производительности, 	так или иначе связана с базой данных. 	Например, изменение схемы данных для 	больших таблиц в MySQL всегда связано с 	рядом проблем, особенно если простой 	сервиса неприемлем. Еще один аргумент 	в пользу баз данных, не имеющих схем 	данных.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Продолжайте получать 	удовольствие</strong>. Casey перешел на Ruby on 	Rails так как ему хотелось снова заняться 	программированием с энтузиазмом. Этот 	факт стал одним из основных факторов, 	которые помогли сделать проект успешным.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Придумывайте новые 	вещи, которые будут приводить в восторг 	Ваших пользователей</strong>. Воспользуйтесь 	магией, людям это нравится. Это тоже 	один из принципов данного проекта. 	Например по этой <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.tbray.org/ongoing/When/200x/2009/09/02/Ravelry#c1252474782.65559"  rel="nofollow external">ссылке</a></noindex>, 	можно почитать об использовании очень 	инновационных подходов к управлению 	форумами.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Ruby — это круто</strong>. 	Он представляет собой интересный язык 	программирования, позволивший Ravelry 	быстро пройти стадию изначальной 	разработки и выпускать новые версии 	дважды в день в период бета-тестирования.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Получайте большую 	прибыль за счет минимизации издержек</strong>. 	У Ravelry есть свой магазин с соответствующей 	тематике продукцией, оптовые счета, 	принтеры и реализующая компания. Это 	позволяет им поддерживать издержки на 	низком уровне, таким образом их прибыль 	не уходит сторонним компаниям вроде 	CafePress.</p>
</li>
</ul>
<ul>
<li>
<p style="margin-bottom: 0in;"><strong>Наиболее сложный 	переход заключается в переходе от 	одного сервера к нескольким</strong>. В этом 	процессе все меняется и становится 	более сложным и комплексным. Всегда 	имейте этот переход ввиду, когда 	планируете архитектуру веб-приложения.</p>
</li>
</ul>
<ul>
<li><strong>В сегодняшней экосистеме имеется 	возможность делать массу различных 	вещей даже обладая минимумом ресурсов</strong>. 	Для создания комплексного сайта вроде 	Ravelry больше не нужно много людей или 	финансов. Взгляните на список различных 	программ, используемых в Ravelry, а также 	на небольшое количество людей, работающих 	над поддержанием работы проекта.</li>
</ul>
<p>Некоторые люди могут жаловаться, что здесь нет практически никаких подробностей о том, как же все таки работает Ravelry.  Сайты таких размеров не должны иметь развернутого описания мистического процесса его масштабирования, такие проекты могут быть построены просто из составных частей, с умом собранных вместе. И это очень здорово.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/kak-proekt-ravelry-doros-do-10-millionov-zaprosov-s-pomoshhyu-rails/feed/</wfw:commentRss>
		<slash:comments>3</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 сентября в Москве проходила конференция для разработчиков высоконагруженных систем. Не знаю могу ли я себя полноценно отнести к этой категории людей, но тем не менее данной мероприятие я сегодня посетил, пост будет опубликован скорее всего несколько позже, но начинаю писать прямо с ходу в первый же день конференции. Всю официальную информацию можно получить на <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://highload.info"  target="_blank" rel="nofollow">не менее официальном сайте конференции</a></noindex> или, может быть, на сайте <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://profyclub.org"  target="_blank" rel="nofollow">ProfyClub</a></noindex>&#39;а, здесь же будут лишь мои личные впечатления вперемешку с кратким пересказом происходившего. Что ж, приступим.<br />
<span id="more-93"></span></p>
<h3>Предистория</h3>
<p>Попал я на данное мероприятие достаточно тривиально: благодаря акции для студентов, предоставляющей бесплатное участие по результатам online-тестирования (не знаю заплатил ли бы я недельную зарплату за участие, если бы ее не было, хотя впринципе со скидками тоже не так уж и много получилось бы), а также стратежно добавленной в RSS-агрегатор нужной ленте новостей.</p>
<p>Само же тестирование меня несколько позабавило. Не знаю кто его составлял, но суть его была примерно в следующем: за полтора часа предлагплось ответить на 10 вопросов, семь из которых формулировалось примерно как "какой результат будет получен после выполнения программы <код на перле>". Основной прикол был в том, что этот код написан на Perl там сказано не было, если честно с первого вопроса я его даже не признал, приняв за какой-то псевдо-код. На втором вопросе до меня дошла-таки истина, благодаря не столь отдаленному во времени посещению <a href="/life/yapcrussia-2008-may-perl/" target="_blank">YAPC::Russia 2008 &laquo;May Perl&raquo;</a> и, в частности, проходившему там мастер-классу <em>Ивана Сережкина</em>. Дальнейшее тестированме проходило с открытым <strong>vim</strong>&#39;ом и <strong>/bin/perl</strong> под рукой, лишь один или два вопроса пришлось неторопливо погуглить...</p>
<p>За пару дней до конференции на почту пришло-таки поздравление с успешным прохождением тестирования и приглашением. В планы на эти два дня входило как минимум посещение ВУЗа и работы, но особого труда их освободить не составило. Так я и оказался сегодня утром в &laquo;Инфопространстве&raquo;.</p>
<h3>День первый</h3>
<p>Добравшись-таки до точки назначения на 20 минут позже запланированного открытия регистрация я как раз успел к ее началу. В нагрузку к бэйджику девушки выдали пакетик с программкой и кучей макулатуры, а также адский круглый девайс, на проверку оказавшийся шлепанцами.</p>
<p>Оставшееся до открытия время пришлось коротать по большей части изучая программку и здороваясь с тем очень скромным количеством лично знакомых мне людей, которые тоже посетили данное мероприятие. На удивление с ходу увидел много каким-то непонятным образом виртуально-знакомых лиц, с которыми лично определенно никогда не общался. Конференция проходила в два потока, так что в процессе ознакомления с программкой пришлось и определяться с более полезными для себя докладами; на практике дело оказалось непростым, так как даже прилагавшаяся книжечка с тезисами не позволяла заранее оценить качество доклада. В итоге в этом нелегком деле даже пришлось припомнить пару когда-то давно прочитанных статей по эвристике&nbsp;&mdash; очень помогло.</p>
<p>После непродолжительно-формального открытия начался первый доклад от Анатолия Орлова из Яндекс. Доклад был, как ни странно, вводно-обзорным, и посвящен он был по большей части взгляду на потенциальную нагрузку на веб-сервера с точки зрения оборудования и операционной системы. Никаких деталей, достаточно тривиально, но напомнить никогда не помешает, да и со своей задачей&nbsp;&mdash; задать соответствующий настрой в аудитории он определенно справился.</p>
<p>После непродолжительного перерыва на кофе слово перешло еще одному представителю компании Яндекс&nbsp;&mdash; Филиппу Дельгядо. На этот раз речь пошла о веб-проектах средних размеров, которым необходимо справляться с серьезной нагрузкой (наравне с прочими нефункциональными требованиями) но с несколько другой точки зрения, программиста. Выступление также носило обзорный характер и содержало в себе повествования о достаточно большом количестве граблей, на которые могут натыкаться те или иные проекты. На самом деле по затрагиваемым темам мне в свое время довелось прочитать достаточно много материалов, пару раз споткнуться на практике и даже написать пару постов, так что лично я рассматривал этот доклад как закрепление знакомых тем. Разве что затронутый вопрос горизонтального масштабирования хранения данных меня несколько смутил: не знаю, может быть я несколько не в теме или еще что, но суть была примерно такова, что под partitioning&#39;ом рассматривались только псевдо-универсальные решения, входящие в комплект некоторых СУБД, в то время как sharding&#39;ом было предложено понимать все остальные, &laquo;самопальные&raquo;, решения, специфичные для конкретного проекта. Я же почему-то всегда рассматривал такой подход как нечто концептуально-общее, так как конкретика реализации не важна, а важна сама идея данного подхода, и считаю эти два слова достаточно близкими синонимами (ровно как и многочисленные их русские аналоги), хотя может быть я и не прав...</p>
<p>Следующее выступление было, пожалуй, лучшим из увиденных мной в первый день. В программке оно значилось как: &laquo;Как писать высокопроизводительные веб-сервера&raquo;, Антон Самохвалов (Яндекс). Были рассмотрен ряд возможных подходов к написанию веб-серверов: начиная банальными неработоспособными однопоточными вариантами и заканчивая противопоставлению вполне рабочих вариантов: threads, <abbr title="Finite State Machine">FSM</abbr> и co-routine. Докладчик оказался убежденным сторонником подхода с использованием co-routine или на худой конец thread&#39;ов, а также использующего схожую идеологию веб-сервера от <abbr title="Apache Software Foundation">ASF</abbr>. Презентация сыграла лишь роль детонатора для последующей бурной дискуссии с участием многих слушателей, а также ведущего этой секции&nbsp;&mdash; Игоря Сысоева, по совместительству разработчика известного в &laquo;узких&raquo; кругах проекта nginx. Ничего удивительного, что обсуждение плавно перетекло в Holy War: Threads vs FSM, но в отличии от знаменитых войн анонимусов на linux.org.ru, шоу выдалось захватывающим и информационно-полезным. Основными аргументами были даже не цифры о производительности, полученные ребятами из Яндекса в полу-синтетических тестах (Антон активно упоминал тот факт, что на примере базового поиска Яндекса использованние thread&#39;ы давало примерно 10% прирост производительности по сравнению с FSM), а скорее споры о maintenability кода и его простоте, а также теоретических пределах использования этих подходов в разных условиях (речь даже дошла до гипотетических ситуаций с использованием более чем четырехядерных процессоров). Довелось выслушать мнения профессионалов по обе стороны &laquo;баррикад&raquo; и самостоятельно сделать все требуемые выводы, самый банальный и немаловажный из которых заключается просто в том факте, что оба подхода имеют право на жизнь в реальных проектах и какой из них использовать очень во многом зависит от личных предпочтений разработчиков и специфики проекта.</p>
<p>Далее по расписанию был запланировал обеденный перерыв, на котором я решил заглянуть в аудиторию параллельного потока (где весь день рассказывали о различных системах хранения данных). В это время там как раз проходил доклад Павла Уварова из Рамблер о их собственной разработке для хранения и передачи данных под названием HCS (читается почему-то как &laquo;хикс&raquo;). Самое начало доклада я, к сожалению, пропустил, но почти с первых же увиденных мной слайдов проект меня заинтересовал. Суть данной технологии примерно характеризуется ее названием: Hierarchically Compressed Stream. С одной стороны это формат хранения иерархически структурированных данных, с другой же&nbsp;&mdash; данные в нем представляют обычный файл, который легко обернуть в произвольный протокол передачи потоковых данных (т.е. например просто раздавать через любой HTTP-сервер). По представленным в презентации benchmark&#39;ам запись и линейный доступ к данным в этом формате происходит в разы, а то и порядки быстрее по сравнению с РСУБД, а для ускорения случайного доступа, на сколько я понял, имеется возможность построения индекса по верхнему уровню иерархии. Помимо всего прочего, Павел обрадовал аудиторию, что данная технология в ближайшем времени будет опубликована в opensource, обязательно надо будет попробовать ее в деле как только появится возможность.</p>
<p>Вернувшись после обеда в аудиторию первого потока я сверился с программкой и обнаружил, что сейчас будут рассказывать про архитектуру сервиса SpyLog. Выступление Сергея Скворцова было очень общим и не углублялось в какие-либо детали, если априори представлять себе как работают сервисы веб-аналитики в целом, то становилось и вовсе скучно. Единственной конкретикой было разве что упоминание о том, что для сбора первичных данных используется nginx (модифицированный, если я правильно понял)</p>
<p>После этого доклада можно было стать свидетелем повествования работников mail.ru сначала об их собственной разработке под названием Imagine Framework, которая тоже вполне соответствует своему названию: ее можно разве что представить&nbsp;&mdash; ни одного примера кода, закрыт для использования только в рамках mail.ru, много слов ни о чем и общий стиль изложения в духе &laquo;вот какую клевую штуку мы придумали, но никому не дадим и не покажем&raquo;. В общем я даже, если честно, не понял для какого он языка программирования предназначен и чем он лучше (или хотябы просто отличается) от opensource аналогов (упоминались собственные системы кэширования, мониторинга и бинарный протокол). В итоге я до конца так и не дослушал и ушел снова в соседний поток слушать про хранение слабосвязанных данных.</p>
<p>Илья Космодемьянцев из SUP Fabrik вел рассказ о том, как могут развиваться события, если тот или иной проект сталкивается с хранением данных, плохо вписывающихся в модель РСУБД. Разработчикам приходят мысли о создании собственного специфического формата хранения данных, о том с какими проблемами могут столкнуться в процессе. Возможные варианты решения проблем также рассматривались, например в виде написания не формата хранения данных, а собственного хранилища для, например, MySQL&nbsp;&mdash; это может помочь избежать части проблем. Помимо этого выдвигалось очень спорное предложение о создании некого &laquo;UseCase API&raquo;, которое могло бы позволить инкапсулировать для бэкэнда все особенности хранения данных в случае их нетрадиционности. Хотя на практике подобные методики применяются достаточно давно, особенно в объектно-ориентированных языках программирования в виде data-access objects.</p>
<p>После еще одного кофе-брейка оставалось лишь два заключительных доклада первого дня, из которых я решил посетить нечто под названием &laquo;Масштабный Jaabber-кластер, IM и не только&raquo; от Андрея Федоровского из РБК. Начало доклада было достаточно примитивным&nbsp;&mdash; что такое Jabber и с чем его едят, всем это и без того было известно, так что было достаточно скучно. Даже обзор доступных расширений не открыл ничего нового&nbsp;&mdash; все те же давно знакомые вещи, разве что некий интерес вызвал процесс отправки бинарных данных (т.е. произвольных файлов): было заявлено что отправка файла временно обрывает поток XML-данных и отправляет вместо него бинарный поток, но не заставил себя ждать очевидный вопрос: а как же тогда происходит общение в этот момент. Вокруг этого образовалась небольшая дискуссия, но к консенсусу прийти так и не удалось. Далее пошел рассказ собственно о том как на сегодняшний день можно построить Jabber-кластер&nbsp;&mdash; подробностей повествованию явно не хватало, но суть была примерно такова: единственным более-менее сносным Jabber-сервером является ejabberd, написанный на до сих пор экзотическом языке Erlang (что впоследствии подтвердили сотрудники Яндекс: в своем проекте Я.Онлайн они используют тоже его). По-умолчанию он использует нативное для Erlang хранилище данных под названием Mnesia, но в том проекте РБК, на основе которого и строился весь доклад (правда я так и не понял как он называется), почему-то побоялись его использовать (видимо из-за нежелания разбираться в том как оно функционирует) и использовали имеющуюся возможность интеграции с более традиционной СУБД&nbsp;&mdash; PostgreSQL. В дискуссии после доклада речь шла скорее о самом ejabberd, Erlang&#39;е, острой нехватке программистов на нем и тому подобных вещах, чем о самом докладе.</p>
<p>Подошедший к концу первый день конференции оставил массу положительных впечатлений и тем для размышления. Практическая полезность конференции не вызывает никаких сомнений, чего-то подобное невозможно увидеть и услышать в интернете или где-либо еще. Были конечно же и негативные моменты в виде абсолютно бестолковых докладов, но обычно это удавалось с ходу обнаружить и вовремя ретироваться в соседний поток.</p>
<h3>День второй</h3>
<p>Вот уже почти как неделю никак не могу найти времени дописать этот пост, в связи с жесткой нехваткой свободного времени, благодаря работе и учебе, так что позволю себе опубликовать пока в недописанном варианте. Как дойдут руки&nbsp;&mdash; обязательно допишу, благо во второй день тоже было несколько интересных выступлений, из которых особенно запомнилось выступление Тимура Хайруллина из Яндекс о методиках нагрузочного тестирования.</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 JavaOne 2008 [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.linkedin.com"  target="_blank" rel="nofollow">LinkedIn</a></noindex> является крупнейшей в мире социальной сетью для профессионалов. Популярность этого проекта может быть далека, от более общетематических социальных сетей, таких как, скажем Facebook, но, тем не менее, нагрузка на серверную часть проекта создается пользователями серьезная. О том как этот проект с ней справляется и пойдет речь далее.<br />
<span id="more-91"></span></p>
<h3>Предисловие</h3>
<p><em><br />
Сообщение о публикации двух презентаций c JavaOne 2008 о LinkedIn и их <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://hurvitz.org/blog/2008/06/linkedin-architecture"  target="_blank" rel="nofollow">обобщении</a></noindex> от Overn Hurvitz пронеслось по русскоязычным новостным ресурсам уже достаточно давно, но время черкнуть пару строк обо всем этом нашлось у меня только сейчас.</p>
<ul>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.slideshare.net/linkedin/linkedins-communication-architecture"  target="_blank" rel="nofollow">LinkedIn&nbsp;&mdash; A Professional Social Network Built with Java™ Technologies and Agile Practices</a></noindex></li>
<li><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.slideshare.net/linkedin/linked-in-javaone-2008-tech-session-comm"  target="_blank" rel="nofollow">LinkedIn Communication Architecture</a></noindex></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> в роли &laquo;клея&raquo;</li>
</ul>
<h3>Серверная архитектура</h3>
<h4>2003&mdash;2005</h4>
<ul>
<li>одно монолитное веб-приложение;</li>
<li>одна общая база данных;</li>
<li>сетевой граф кэшируется в памяти в &laquo;Облаке&raquo;;</li>
<li>поиск пользователей реализован с помощью <a href="/tag/lucene" target="_blank">Lucene</a>, он работал на той же машине, что и &laquo;Облако&raquo;, так как поиск был отфильтрован в соответствии с сетью пользователя, таким образом было удобно совмещать эти две функции на одной машине;</li>
<li>веб-приложение напрямую обновляет базу данных, а она, в свою очередь, обновляет &laquo;Облако&raquo;.</li>
</ul>
<h4>2006</h4>
<ul>
<li>Добавлена репликация для уменьшения нагрузки на основную базу данных. Реплики предоставляют данные в режиме &laquo;только для чтения&raquo;, а репликация ведется в асинхронном режиме с помощью дополнительного компонента под названием 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>&laquo;Облаком&raquo; в 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, разбиение графов на части&nbsp;&mdash; не самая тривиальная задача.</li>
</ul>
<p>Облако кэширует целиком весь граф социальной сети LinkedIn, но на практике же пользователям требуется видеть его со своей точки зрения. Данная задача является вычислительно сложной, по-этому она выполняется лишь один раз при создании новой сессии, а затем система поддерживает результат в кэше. Такой подход требует 2 MB оперативной памяти на каждого активного пользователя. В течении сессии такой кэш обновляется только если сам пользователь сделал какие-либо изменения в нем, если же изменение вызвано другими пользователями&nbsp;&mdash; владелец сессии не заметит изменений.</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: каждый раз, когда происходит какое-либо событие, они помещаются в пользовательский &laquo;почтовый ящик&raquo;, в момент запроса пользователя ему возвращается просто содержимое, уже ожидающее своего звездного часа в специально том самом &laquo;ящике&raquo;;</li>
<li>такой подход сильно ускоряет процесс чтения, так как на тот момент данные уже готовы;</li>
<li>с другой стороны, какая-то часть данных может так никогда и не понадобиться, что приводит к бесполезным передвижениям данных и лишнему используемому дисковому пространству;</li>
<li>небольшая часть обработки данных все же производится уже в момент запроса пользователя (например, объединение нескольких обновлений от определенного пользователя в одно);</li>
<li>обновления хранятся в <abbr title="Character Large OBject">CLOB</abbr>&#39;ах: по одному <abbr title="Character Large OBject">CLOB</abbr>&#39;у на каждый тип обновления для каждого пользователя (то есть в сумму около 15 <abbr title="Character Large OBject">CLOB</abbr>&#39;ов на каждого пользователя);</li>
<li>сначала использовался размер <abbr title="Character Large OBject">CLOB</abbr>&#39;ов равный 8 KB, что было явно больше требуемого и приводило к существенному количеству неиспользуемого дискового пространства.</li>
<li>вместо <abbr title="Character Large OBject">CLOB</abbr>&#39;ов можно было бы использовать дополнительные таблици по одной на каждый тип обновлений, но в этом случае пришлось бы постоянно удалять из них устаревшие записи, что было бы чрезвычайно неэффективно. </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>&#39;ов, так как они требуют много вычислительных ресурсов.</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&#39;ах;</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"><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.slideshare.net/linkedin/linkedins-communication-architecture?type=powerpoint" style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;"  title="LinkedIn - A Professional Network built with Java Technologies and Agile Practices" rel="nofollow">LinkedIn&nbsp;&mdash; A Professional Network built with Java Technologies and Agile Practices</a></noindex><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"><noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://www.slideshare.net/linkedin/linked-in-javaone-2008-tech-session-comm?type=powerpoint" style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;"  title="LinkedIn Communication Architecture" rel="nofollow">LinkedIn Communication Architecture</a></noindex><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>&nbsp;&mdash; сейчас самое время!</em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-linkedin/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Еще раз про HBase</title>
		<link>http://www.insight-it.ru/masshtabiruemost/eshe-raz-pro-hbase/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/eshe-raz-pro-hbase/#comments</comments>
		<pubDate>Wed, 27 Aug 2008 16:29:32 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[HBase]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[кластер]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=88</guid>
		<description><![CDATA[Некоторое время назад Neuronus в одном из комментариев к посту &#171;Hadoop возвращается&#187; не согласился с моим кратким определением HBase как &#171;нереляционная база данных&#187; (позаимствованным, собственно говоря, откуда-то с официального портала продукта). Этот факт подтолкнул меня попытаться найти более корректное определение в англоязычных источниках информации, получилось вполне успешно. Хочется прочитать более детально что к чему? Вперед!

Если [...]]]></description>
			<content:encoded><![CDATA[<p>Некоторое время назад <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://neuronus.blogspot.com"  rel="nofollow" target="_blank">Neuronus</a></noindex> в одном из комментариев к посту &laquo;<a href="/net/scalability/hadoop-vozvrashhaetsya/">Hadoop возвращается</a>&raquo; не согласился с моим кратким определением HBase как &laquo;нереляционная база данных&raquo; (позаимствованным, собственно говоря, откуда-то с официального портала продукта). Этот факт подтолкнул меня попытаться найти более корректное определение в англоязычных источниках информации, получилось вполне успешно. Хочется прочитать более детально что к чему? Вперед!<br />
<span id="more-88"></span><br />
Если Вам уже приходилось иметь дело с этой системой,возможно Вы уже поняли, что самым сложным этапом работы является просто-напросто осознавание того, чем она на самом деле является. Обычно приходится мысленно отказаться от всех привычек, доставшихся при работе с традиционный RDBMS, и начинать постигать базовые принципы организации хранения данных с нуля.</p>
<p>Стоит напомнить, что проект позиционируется как opensource реализация <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto//tag/bigtable" target="_blank">BigTable</a> от <a href="/tag/google" target="_blank">Google</a>. Да, проекты имплементированы разными людьми на разных языках программирования, но общие идеи и принципы функционирования у них сильно пересекаются. Наиболее значимой общей характеристикой у них является очень схожие модели данных (о чем <a href="http://wiki.apache.org/hadoop/Hbase/HbaseArchitecture#head-daee3a0ce7a6892096ffb43f3cc3e0310d047f48"  target="_blank" rel="nofollow">упоминается</a></noindex> в вики HBase), а в свою очередь <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://labs.google.com/papers/bigtable.html"  target="_blank" rel="nofollow">в документации</a></noindex> BigTable она описывается очень четко и определенно, точно определяя чем эти продукты по сути являются:<br />
<blockqoute><br />
A Bigtable is a sparse, distributed, persistent multidimensional sorted map.
</p>
</blockquote>
<p>Предлагаю по аналогии со <noindex><a target="_blank" rel="nofollow" href="http://www.insight-it.ru/goto/http://jimbojw.com/wiki/index.php?title=Understanding_HBase_and_BigTable"  target="_blank" rel="nofollow">статьей в вики</a></noindex>, послужившей основой для данного поста, разбить это определение на отдельные слова и последовательно пройтись по ним, попутно составляя в голове полную картину.</p>
<h3>map</h3>
<p>За этим термином нет четкого устоявшегося обозначения в русском языке (да и в английском тоже все далеко не так однозначно), математики обычно называют это <em>отображением одного множества в другое</em>, в то время как если Вы знакомы с программированием, то Вам наверняка больше знакомы будут более знакомы такие обозначения, как <em>ассоциативный массив</em> (<a href="/tag/php" target="_blank">PHP</a>), <em>словарь</em> (<a href="/tag/python" target="_blank">Python</a>), <em>хэш</em> (<a href="/tag/ruby" target="_blank">Ruby</a>) или <em>объект</em> (<a href="/tag/javascript" target="_blank">JavaScript</a>).</p>
<p>По сути же имеется ввиду просто набор однозначно соответствующих пар ключ-значение, в роли которых выступают массивы байт. Во все той же статейке в вики все очень наглядно демонстрируется примерами в нотации <abbr title="JavaScript Object Notation">JSON</abbr>, позволю себе тоже приводить аналогичные примеры. В <abbr title="JavaScript Object Notation">JSON</abbr> наш <strong>map</strong> выглядел бы следующим образом:</p>
<pre lang="javascript">
{
  "qqqq" : "some",
  "abc" : "sample",
  "zz" : "JSON",
  "123" : "map",
  "mnbvcxz" : "looks like this"
}
</pre>
<h3>persistent</h3>
<p>Это прилагательное обозначает всего лишь &laquo;постоянный&raquo;, то есть в данном контексте оно говорит только о том, что данная система не зависит от использующих ее приложений, а также хранится на устройствах постоянного хранения данных, а не в оперативной памяти.</p>
<h3>distributed</h3>
<p>Распределенность этих систем можно рассматривать с двух точек зрения:</p>
<ul>
<li>Как HBase, так и BigTable сами по себе могут функционировать на большом количестве серверов, которые можно разделить на две большие категории: master и slave. Slave сервера собственно выполняют всю работу с данными, а master&nbsp;&mdash; лишь только координируют их действия и управляют процессом в целом. Этот факт обеспечивают высокую степень устойчивости к сбоям (в HBase правда количество master-серверов ограничено одним, что представляет собой единственную точку, сбой в которой приведет к отказу всей системы, но это лишь временная проблема, которую наверняка устранят в следующих версиях), а также существенно облегчает масштабируемость всей системы так как добавление дополнительных серверов (а значит и увеличение производительности и вместительности системы) достаточно тривиально, безболезненно и не мешает общему ее функционированию.</li>
<li>Помимо этого каждая из этих систем обычно использует для хранения данных кластерную файловую систему (HBase&nbsp;&mdash; <a href="/tag/hdfs" target="_blank">HDFS</a>, а BigTable&nbsp;&mdash; <a href="/tag/gfs" target="_blank">GFS</a>), которые тоже по своей природе являются распределенными и функционируют по схожему принципу, обеспечивая дополнительную сохранность данных, реплицируя их в нескольких экземплярах на нескольких серверах (обычно трех).</li>
</ul>
<h3>sorted</h3>
<p>HBase и BigTable не строят никакие индексы для ускорения процесса извлечения данных, единственное используемое в них правило заключается в следующем: каждый slave-сервер в системе отвечает за определенный диапазон ключей (от и до определенных его значений), и держит все записи в строгом лексикографическом порядке по ключам (заметьте: сортировку значений никто не гарантирует!). Продолжая пример с JSON это выглядело бы примерно вот так:</p>
<pre lang="javascript">
{
  "123" : "map",
  "abc" : "sample",
  "mnbvcxz" : "looks like this",
  "qqqq" : "some",
  "zz" : "JSON"
}
</pre>
<p>Этим фактом можно активно пользоваться при планировании использовании системы, например если в качестве ключей планируется использовать доменные именные имена, то имеет смысл использовать их в &laquo;развернутом&raquo; виде, например: &laquo;com.example.www&raquo; вместо &laquo;www.example.com&raquo;. Это почти наверняка обеспечит попадание всех поддоменов одного и того же домена на один slave-сервер, а также группировку доменов по зонам.</p>
<h3>multidimensional</h3>
<p>До сих пор ключ интерпретировался нами как нечто единое и неделимое, но на самом деле в данной ситуации это далеко не так. На самом деле пространство имен HBase и BigTable имеет несколько пространств, по аналогии с трехмерным материальным пространством, где есть ширина, высота и глубина. Если мы попытаемся представить это с помощью JSON, то это будет выглядеть как набор вложенных простых map&#39;ов:</p>
<pre lang="javascript">
{
  "table-1":
  {
     "column-family-1":
     {
        "column-1":
        {
           "row-1":
           {
              "timestamp-1": "value-1",
              "timestamp-2": "value-2",
              "timestamp-3": "value-3"
           },
           "row-2":
           {
              "timestamp-1": "value-4",
              "timestamp-2": "value-5",
              "timestamp-3": "value-6"
           }
        },
        "column-2":
        {
           "row-1":
           {
              "timestamp-1": "value-1",
              "timestamp-3": "value-3"
           },
           "row-2":
           {
              "timestamp-1": "value-4",
              "timestamp-2": "value-5",
              "timestamp-3": "value-6"
           }
        }
     "column-family-2":
     {
        "column-1":
        {
           // ...
        },
        "":
        {
           "row-1": "some-value"
        }
        // ...
     }
     }
  }
}
</pre>
<p>Как можно увидеть из примера, таких пространств используется пять:</p>
<ul>
<li>таблицы;</li>
<li>наборы столбцов;</li>
<li>столбцы;</li>
<li>строки;</li>
<li>время;</li>
</ul>
<p>Таким образом, каждое значение в хранилище данных однозначно соответствует ключу, состоящему из пяти компонентов, например в примере значению &laquo;value-5&raquo; соответствует ключ, состоящий из:</p>
<ul>
<li>table-1;</li>
<li>column-family-1;</li>
<li>column-1;</li>
<li>row-2;</li>
<li>timestamp-2;</li>
</ul>
<p>Принцип очень похож на используемый в более привычных базах данных, с той лишь разницей, что добавляется еще и время (которое обычно представляется в виде целочисленного значения, обозначающего количество секунд с начала эпохи). Изначально оно задумывалось для предоставления возможности отследить историю изменения данных, но этому дополнительному измерению можно найти и массу нестандартных применений, например используя его как самый обыкновенный стек.</p>
<p>Хочется обратить внимание, что ассортимент наборов столбцов (column family) указывается при создании таблиц, и изменения в них должны производиться с помощью специального запроса, в то время как сами столбцы являются динамическими и для его создания достаточно лишь добавить в него данные.</p>
<h3>sparse</h3>
<p>Развивая мысль предыдущего абзаца, можно понять, что наличие значения столбца в каждой строке вовсе не обязательно, оно запросто может и отсутствовать вовсе. Таким образом каждая строка может содержать произвольное количество значений для столбцов в рамках одной column family, ровно как может и не содержать их вовсе. Несуществующие данные не хранятся в виде какого-либо NULL-значения, они просто отсутствуют. Запрос на несуществующие данные просто вернет пустой результат. Если же взглянуть с другой стороны, то тот же самый факт можно представить и как возможность наличия пробелов в списке ключей строк.</p>
<h3>И напоследок...</h3>
<p>хочется сказать, что все это лишь дело терминологии, ровно то же самое можно подразумевать и под краткой фразой &laquo;нереляционная база данных&raquo;, не смотря на то, что она существенно менее точна и полноценна. В данном контексте самое главное лишь чтобы люди просто понимали друг друга. Надеюсь после прочтения этого поста в вашем сознании сложилась четкая картина этого продукта и предоставляемых им возможностей, которая Вам пригодится как для &laquo;общего развития&raquo;, так и для потенциального практического применения этого продукта. Если остались неясные моменты&nbsp;&mdash; смело оставляйте комментарии. <a href="/feed" target="_blank">Традиционная подписка на RSS</a>&nbsp;&mdash; приветствуется <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/eshe-raz-pro-hbase/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 1.938 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2010-09-10 02:26:52 -->
