<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>HighLoad.org - блог о высоких нагрузках</title>
	
	<link>http://highload.org</link>
	<description />
	<lastBuildDate>Fri, 16 Apr 2010 10:17:15 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/highload" /><feedburner:info uri="highload" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>highload</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Распределенная согласованность — Часть 2 — Некоторые формы конечной согласованности</title>
		<link>http://feedproxy.google.com/~r/highload/~3/3hpteobY99s/post599</link>
		<comments>http://highload.org/post599#comments</comments>
		<pubDate>Fri, 16 Apr 2010 10:17:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[СУБД]]></category>
		<category><![CDATA[CAP]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Конечная согласованность]]></category>
		<category><![CDATA[Репликация]]></category>
		<category><![CDATA[согласованность]]></category>

		<guid isPermaLink="false">http://highload.org/?p=599</guid>
		<description><![CDATA[




Еще в этой серии:

Распределенная согласованность — Часть 1 — Введение

В части 1 мы рассмотрели классы поведения C и A. Для класса A нам нужны более слабые ограничения согласованности. Это не означает, что система должна быть полностью некорректной, но означает, что нам нужно в некоторой мере ослабить согласованность модели.
Amazon популяризировал концепцию «Конченой согласованности». Вот их определение: [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost599"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost599" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-full wp-image-603" title="cons1" src="http://highload.org/wp-content/uploads/2010/04/cons1.jpg" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top">Еще в этой серии:</p>
<ul>
<li><a href="http://highload.org/post590">Распределенная согласованность — Часть 1 — Введение</a></li>
</ul>
<p>В <a href="http://highload.org/post590">части 1</a> мы рассмотрели классы поведения C и A. Для класса A нам нужны более слабые ограничения согласованности. Это не означает, что система должна быть полностью некорректной, но означает, что нам нужно в некоторой мере ослабить согласованность модели.</p>
<p>Amazon популяризировал концепцию «Конченой согласованности». Вот их <a href="http://queue.acm.org/detail.cfm?id=1466448">определение</a>: система хранения гарантирует, что если не было новых обновлений объекта, в конечном счете все точки доступа будут возвращать последнее обновленное знчение.</td>
</tr>
</tbody>
</table>
<p><span id="more-599"></span></p>
<p>Это не ново, но здорово, когда концепция сформулирована/популяризирована. Несколько примеров систем с конечной согласованностью:</p>
<ol>
<li>DNS</li>
<li>Асинхронная мастер/слэйв репликация в реляционных СУБД (и в <a href="http://www.mongodb.org">MongoDB</a> тоже).</li>
<li><a href="http://memcached.org/">Memcached</a> перед <a href="http://www.mysql.com/">MySQL</a>, чтение из кэша</li>
</ol>
<p>Многие (но не все) традиционные примеры, которые приходят в голову, обладают конечной согласованностью чтения, но в них единственный писатель (единственный сервер данных, пишущих клиентов может быть несколько). Все еще более интересно и сложно в ситуации с несколькими писателями. Amazon Dynamo — пример системы с конечной согласованностью множества писателей. Возможно, все что было до — это конечная согласованность с единственным писателем.</p>
<p>Другая традиционная технология, которую следует упомянуть, — это очередь сообщений. Она обладает свойствами, напоминающими конечную согласованность.</p>
<h1>Формы согласованности</h1>
<p>Давайте рассмотрим конкретный пример. Рассмотрим систему, использующую MongoDB в следующей конфигурации:</p>
<p><a href="http://highload.org/wp-content/uploads/2010/04/35lw00x.jpg1.png"><img class="aligncenter size-full wp-image-607" title="35lw00x.jpg" src="http://highload.org/wp-content/uploads/2010/04/35lw00x.jpg1.png" alt="" width="319" height="227" /></a></p>
<p>Для примера сущности «мастер», «слэйв» и «слэйв» могут быть инстансами MongoDB или другой базы данных с асинхронной репликацией. Клиенты случайным образом читают из любого слэйва, а записывают всегда в мастер. Показаны два слэйва и два клиента, но предположим, что все это масштабируется.</p>
<p>Этот тип системы мы называем «конечная согласованность с одним писателем». Какие ее свойства?</p>
<ol>
<li>Клиент может прочитать устаревшие данные.</li>
<li>Клиент может увидеть операции записи вне очереди</li>
</ol>
<p>Предположим, что мы храним некоторую сущность x в хранилище данных. Предположим, что сущности обладают некоторым первоначальным значением — нулём. Клиентами были произведены следующие операции записи в x:</p>
<p><strong>W(x=3), W(x=7), W(x=5)</strong></p>
<p>Так как система конечно согласована, то если записи в x остановились в какой-то момент, мы знаем, что в конце концов прочитаем из x 5 — это R(x==5). Однако в короткой перспективе клиент может увидеть, например:</p>
<p><strong>R(x==7), R(x==0), R(x==5), R(x==3)</strong></p>
<p>(Заметьте, что для такого поведения необходимо от 2 и более узлов.)</p>
<p>Так как это наша слабейшая форма согласованности — конечная согласованность с беспорядочными(ошибочными) чтениями в короткой перспективе.</p>
<p>Мы можем сделать согласованность строже. Рассмотрим конфигурацию MongoDB на <a href="http://compoundthinking.com/blog/index.php/2009/07/16/turbogears-on-sourceforge/">SourceForge</a> (большая диаграма здесь). Эта конфигурация представляет из себя конечную согласованность, но мы не увидим результатов записей в неправильном порядке. Эта система обладает монотонной согласованностью чтения.</p>
<p><a href="http://highload.org/wp-content/uploads/2010/04/sfconsume.png"><img class="aligncenter size-full wp-image-609" title="sfconsume" src="http://highload.org/wp-content/uploads/2010/04/sfconsume.png" alt="" width="554" height="554" /></a></p>
<p>Единственное возможное свойство конечной согласованности — это согласованность чтения своих же собственных записей. Это означает, что процессу гарантировано во время чтения увидеть записи, которые он сделал. Это очень полезное свойство, облегчающее программирование. Заметьте, что вышеприведенные примеры не обеспечивают согласованность чтения своих же записей. Также относительно этой модели стоит рассмотреть определение слова «своих же». В web приложениях это может быть пользователь. Если балансировщик нагрузки системы посылает запросы к разным серверам с приложением, согласованность чтениях своих же записей для конкретного сервера с приложением может не удовлетворять потребности реального мира в согласованности.</p>
<h1>Пункты проверки конкретного случая</h1>
<p>Таким образом, когда вы используете конечную согласованность архитектуры, не помешает задуматься над следующими вопросами:</p>
<ul>
<li>Терпимо ли в моем случае при чтении получать устаревшие данные?</li>
<li>Терпимо ли при чтении получать значения не по порядлку? Если нет, то обеспечивает ли моя конфигурация согласованность монотонного чтения?</li>
<li>Терпимо ли не иметь возможности прочитать свои же записи? Если нет,  то обеспечивает ли моя конфигурация согласованность чтения своих же записей?</li>
</ul>
<p style="text-align: right;"><em>Автор статьи: Блог MongoDB<br />
Дата: 5 апреля 2010<br />
</em> <a href="http://blog.mongodb.org/post/498145601/on-distributed-consistency-part-2-some-eventual"><em>Оригинал статьи</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post599/feed</wfw:commentRss>
		<slash:comments>6545</slash:comments>
		<feedburner:origLink>http://highload.org/post599</feedburner:origLink></item>
		<item>
		<title>Распределенная согласованность — Часть 1 — Введение</title>
		<link>http://feedproxy.google.com/~r/highload/~3/EhmkfKvatG8/post590</link>
		<comments>http://highload.org/post590#comments</comments>
		<pubDate>Thu, 15 Apr 2010 16:26:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[СУБД]]></category>
		<category><![CDATA[CAP]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Конечная согласованность]]></category>
		<category><![CDATA[Репликация]]></category>

		<guid isPermaLink="false">http://highload.org/?p=590</guid>
		<description><![CDATA[




Для распределенных баз данных модели согласованности — очень важная тема. Мы бы хотели изучить этот вопрос немного глубже в виде серии статей, описывающих проблему с точки зрения, какую модель в каких случая правильно применять. Пожалуйста, присоединяйтесь и помогите нам с помощью комментариев.




CAP
CAP теорема гласит, что в системе одновременно можно выбрать только две вещи з трех: [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost590"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost590" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-medium wp-image-594" title="200198999-001" src="http://highload.org/wp-content/uploads/2010/04/cons6-300x300.jpg" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top">Для распределенных баз данных модели согласованности — очень важная тема. Мы бы хотели изучить этот вопрос немного глубже в виде серии статей, описывающих проблему с точки зрения, какую модель в каких случая правильно применять. Пожалуйста, присоединяйтесь и помогите нам с помощью комментариев.</td>
</tr>
</tbody>
</table>
<p><span id="more-590"></span></p>
<h1>CAP</h1>
<p><a href="http://softwaremaniacs.org/blog/2010/01/31/brewers-cap-theorem/">CAP теорема</a> гласит, что в системе одновременно можно выбрать только две вещи з трех: корректность, доступность, устойчивость к разделению сети. В распределенных системах недоступность некоторых узлов неизбежна и система должна быть устойчивой к этому, поэтому CAP означает, что мы не можем одновременно поддерживать корректность и 100% доступности.</p>
<p>Я бы сказал, что теорема CAP означает, что если сеть разорвана, ваша база данных не будет работать.</p>
<p>Однако, мы должны подобрать определение фразе «не будет работать». Это может означать падение (недоступность) или некорректность (старые данные).</p>
<p>Если быть более точными, что мы имеем ввиду под «корректностью»? Академические работы в этой области ссылаются на «упорядочиваемость в одну копию» или «<a href="http://ru.wikipedia.org/wiki/Линеаризуемость">линеаризуемость</a>». Если выполнена серия операций или транзакций, они применены в корректном порядке. Менее формальный способ понимания компромисса: «Могу я читать и управлять старыми/плохими данными? Могу ли я всегда производить запись?»</p>
<h1>Объединение</h1>
<p>У нас есть два класса архитектур: класс C (строгая корректность) и класс A (более высокая доступность, менее согласованная). Давайте рассмотрим некоторые распределенные системы из реального мира, и к какому классу они отнесены.</p>
<p><a href="http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.127.6956">Amazon Dynamo</a> — распределенное хранилище данных, которое реализует <a href="http://weblogs.java.net/blog/2007/11/27/consistent-hashing">согласованное хэширование</a> и оно входит в группу A. Оно предоставляет конечную согласованность. Возможна ситуация чтения старых данных.</p>
<p><a href="http://couchdb.apache.org">CouchDB</a> обычно используется с синхронными мастер-мастер репликациями и она тоже в группе A. Она предоставляет конечную согласованность.</p>
<p>Кластер <a href="http://www.mongodb.org/">MongoDB</a> с автоматическим шардингом и репликацией в каждый момент времени для каждого шарда обладает мастер сервером. Она в группе C. Традиционные реляционные СУБД системы также строго корректны (при обычном использовании) — например, синхронный кластер реляционной СУБД.</p>
<p>Стоит отметить, что альтернативные конфигурации этих продуктов иногда изменяют свойства их корректности (и производительность) . Для нашего обсуждения здесь мы будем считать, пока явно не укажем другого, что эти продукты сконфигурированы их общепривычным способом.</p>
<h1>Главный вопрос — доступность на запись, а не доступность на чтение</h1>
<p>На сегодняшний день легко иметь неограниченное число асинхронных слэйв репликаций, распределенных по миру.  В случае разрыва сети мы все равно будем иметь доступ к локальным слэйв данным. Так как репликация асинхронна, эти данные конечно согласованы, поэтому результат не будет сюрпризом — мы не в группе A. Однако практически все архитектуры, даже из класса C, могут легко добавить асинхронную способность чтения. Таким образом, все важнейшие архитектурные решения касаются способности записи.</p>
<h1>Компромиссы:</h1>
<ul>
<li>В системе с конечной согласованностью распределение нагрузки проще</li>
<li>В системе с конечной согласованностью проще поддержка центра мульти-данных</li>
<li>В системе с конечной согласованностью некоторые проблемы вообще нельзя решить</li>
<li>В системе со строгой согласованностью иногда легче писать код</li>
</ul>
<p>Мы обсудим эти плюсы и минусы более детально в последующих статьях.</p>
<p style="text-align: right;"><em>Автор статьи: Блог MongoDB<br />
Дата: 26 марта 2010<br />
</em> <a href="http://blog.mongodb.org/post/475279604/on-distributed-consistency-part-1"><em>Оригинал статьи</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post590/feed</wfw:commentRss>
		<slash:comments>5164</slash:comments>
		<feedburner:origLink>http://highload.org/post590</feedburner:origLink></item>
		<item>
		<title>Кэширование с помощью Nginx и Memcached</title>
		<link>http://feedproxy.google.com/~r/highload/~3/wIvFIcOv02k/post584</link>
		<comments>http://highload.org/post584#comments</comments>
		<pubDate>Thu, 15 Apr 2010 15:10:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[архитектура]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[SSI]]></category>
		<category><![CDATA[кэшироание]]></category>

		<guid isPermaLink="false">http://highload.org/?p=584</guid>
		<description><![CDATA[






В статье описываетеся способ кэширования страниц и блоков (например блока авторизации и блока содержания) с применением технологий SSI, memcached и nginx. С помощью SSI Web-сервер делает дополнительные запросы к бэкэнду, и в связке с кешированием это становится мощным инструментом. Для кэширования же персонализированных данных предлагается добавлять идентификатор пользователя в ключ memcached.
Ссылка: Nginx + Memcached + [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost584"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost584" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top">
<img src="http://highload.org/wp-content/uploads/2010/04/nginx-logo.png" alt="" title="nginx-logo" width="140" class="aligncenter size-full wp-image-586" /></p>
</td>
<td width="10"></td>
<td valign="top">В <a href="http://highload.com.ua/index.php/2010/04/06/nginx-memcached-ssi-кеширование-страниц-и-блоков-partials/">статье</a> описываетеся способ кэширования страниц и блоков (например блока авторизации и блока содержания) с применением технологий SSI, <a href="http://memcached.org">memcached</a> и <a href="http://nginx.org/">nginx</a>. С помощью SSI Web-сервер делает дополнительные запросы к бэкэнду, и в связке с кешированием это становится мощным инструментом. Для кэширования же персонализированных данных предлагается добавлять идентификатор пользователя в ключ memcached.</p>
<p><strong>Ссылка:</strong> <a href="http://highload.com.ua/index.php/2010/04/06/nginx-memcached-ssi-кеширование-страниц-и-блоков-partials/">Nginx + Memcached + SSI &#8211; кеширование страниц и блоков (partials)</a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post584/feed</wfw:commentRss>
		<slash:comments>10075</slash:comments>
		<feedburner:origLink>http://highload.org/post584</feedburner:origLink></item>
		<item>
		<title>Cassandra: Факт против вымысла</title>
		<link>http://feedproxy.google.com/~r/highload/~3/EWfJHUDLvEw/post578</link>
		<comments>http://highload.org/post578#comments</comments>
		<pubDate>Wed, 14 Apr 2010 10:06:39 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[СУБД]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[Dig]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[hadoop]]></category>
		<category><![CDATA[HBase]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Project Voldemort]]></category>
		<category><![CDATA[Riak]]></category>

		<guid isPermaLink="false">http://highload.org/?p=578</guid>
		<description><![CDATA[




Cassandra достигла впечатляющих успехов в признании за последние месяцы, позволяющих сделать вывод, что она является лидеров среди высокомасштабируемых баз данных (подмножестве популярной категории NoSQL). Вместе с этим,  получили распространение несколько недоразумений, которые я бы хотел прояснить.





Вымысел: &#171;Cassandra полагается на высокоскоростное оптоволокно между датацентрами&#187; и не может реплицироваться между датацентрами, latency между которыми более чем [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost578"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost578" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-full wp-image-487" title="cassandra" src="http://highload.org/wp-content/uploads/2010/04/cassandra_logo.png" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top">Cassandra достигла впечатляющих успехов в признании за последние месяцы, позволяющих сделать вывод, что она является лидеров среди высокомасштабируемых баз данных (подмножестве популярной категории NoSQL). Вместе с этим,  получили распространение несколько недоразумений, которые я бы хотел прояснить.</td>
</tr>
</tbody>
</table>
<p><span id="more-578"></span></p>
<ul>
<li><strong>Вымысел</strong>: &laquo;Cassandra полагается на высокоскоростное оптоволокно между датацентрами&raquo; и не может реплицироваться между датацентрами, latency между которыми более чем несколько мс.<br />
<strong>Факт</strong>: Репликация между несколькими датацентрами одна из самых первых возможностей Cassandra и она несомненно является наиболее протестированной в боевых условиях среди NoSQL проектов. Facebook развернул Cassandra в датацентрах на восточном и западном побережьях перед тем как открыть ее в open source. Кластер Сassandra SimpleGeo занимает 3 зоны доступности EC2, и Digg тоже развернул систему на обоих побережьях. Утверждения о том, что это не может работать, являются отличным признаком, что вы читаете статью того, кто не знает о чем говорит.</li>
<li><strong>Вымысел</strong>: &laquo;Не возможно определить когда реплики Cassandra будут обновлены.&raquo;<br />
<strong>Факт</strong>: Cassandra обеспечивает согласованность когда R + W &gt; N (read replica count + write replica count &gt; replication factor), чтобы использовать Dynamo словарь. Если вы производите и запись, и чтение с QUORUM, например, вы можете ожидать согласованность данных, как только количество доступных узлов станет достаточно для quorum. Cassandra также предоставляет восстановление при чтении и антиэнтропию, поэтому даже чтение при ConsistencyLevel.ONE будет согласованным после любого из этих событий.</li>
<li><strong>Вымысел</strong>: У Cassandra маленькое сообщество.<br />
<strong>Факт</strong>: Хотя популярность никогда не была хорошим показателем для определения корректности, справедливо, что при использовании передовых технологий, хорошо делать это в компании. На момент написания этой статьи в USA поздняя ночь, и есть 175 человек на irc канале Cassandra, 60 на HBase, 32 на Riak и 15 на Voldemort. (6 месяцев назад числа были 90, 45, 12 для Cassandra, HBase и Voldemort. Я еще не посещал #riak тогда.) Участие в списках рассылок показывает похожие результаты. Также интересен тот факт, что создатели Thrudb и Dynomite используют сейчас Cassandra, это показывает, что предсказанная консолидация NoSQL начинается.</li>
<li><strong>Вымысел</strong>: &laquo;Cassandra поддерживает только одно пространство ключей а установку.&raquo;<br />
<strong>Факт</strong>: Это не правда уже почти год (с июня 2009).</li>
<li><strong>Вымысел</strong>: Cassandra не может поддерживать Hadoop или инструменты поддержки такие как Pig.<br />
<strong>Факт</strong>: Всегда было ясно посылать выходные данные Hadoop работ в Cassandra, и Facebook, Digg и другие используют Hadoop подобным образом как Cassandra bulk-loader примерно год. Для версии 0.6, я предоставил Hadoop InputFormat и связанный с этим код для того, чтобы позволить Hadoop работам обрабатывать также данные из Cassandra, кооперируюясь с Hadoop, чтобы продолжать обработку на тех узлах, на которых реально есть данные. Также в версии 0.6 Stu Hood предоставил Pig LoadFunc.</li>
<li><strong>Вымысел</strong>: Cassandra достигает высокой производительности жертвуя надежностью (иными словами: Cassandra хороша только для тез данных, которые вы можете себе позволить потерять).<br />
<strong>Факт</strong>: В отличии от некоторых NoSQL баз данных (особенно MongoDB и HBase), Cassandra предлагает полную стойкость отдельного сервера. В случаях, когда вы не можете позволить себе потерять данные, недостаточно полагаться на репликацию; если ваш датацентр теряет питание, вы с большой вероятностью потеряете данные, которые не были синхронизированы с диском, неважно сколько у вас при этом есть реплик. И если вы работаете с большими системами в продакшене достаточно долго, вы осознаете, что нельзя игнорировать перебои с питанием, как результат комбинации сбоев оборудования и человеческой ошибки. Но Cassandra со своим fsync commitlog решением может защитить вас и в этом случае тоже. Что делать после того, как ваши данные сохранены (например бэкапами и снэпшотами), я здесь не описываю, но это освещается на странице wiki.</li>
</ul>
<p style="text-align: right;"><em>Автор статьи: Jonathan Ellis<br />
Дата: 7 апреля 2010<br />
<a href="http://spyced.blogspot.com/2010/04/cassandra-fact-vs-fiction.html">Оригинал статьи</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post578/feed</wfw:commentRss>
		<slash:comments>2908</slash:comments>
		<feedburner:origLink>http://highload.org/post578</feedburner:origLink></item>
		<item>
		<title>Как заниматься масштабированием, часть первая: не применяйте ничего лишнего</title>
		<link>http://feedproxy.google.com/~r/highload/~3/147ZGuhnIJ4/post563</link>
		<comments>http://highload.org/post563#comments</comments>
		<pubDate>Tue, 13 Apr 2010 17:05:41 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[архитектура]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[масштабирование]]></category>
		<category><![CDATA[СУБД]]></category>

		<guid isPermaLink="false">http://highload.org/?p=563</guid>
		<description><![CDATA[







Верите вы или нет, но первая история произошла в середине 70-х.
Во время учебы в средней школе, мне повезло иметь доступ к миникомпьютеру Data General Nova. В отличие от других &#171;космических&#187; компьютеров, Новы были действительно очень крутыми. У них была возможность непрямой адресации, которая означала, что вы можете сделать любой адрес как непрямой, что заставит использовать [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost563"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost563" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top">
<img src="http://highload.org/wp-content/uploads/2010/04/super3-173x300.png" alt="" title="super3" width="140" class="aligncenter size-medium wp-image-570" /></p>
</td>
<td width="10"></td>
<td valign="top">
<p>Верите вы или нет, но первая история произошла в середине 70-х.</p>
<p>Во время учебы в средней школе, мне повезло иметь доступ к миникомпьютеру <a href="http://en.wikipedia.org/wiki/Data_General_Nova">Data General Nova</a>. В отличие от других &laquo;космических&raquo; компьютеров, Новы были действительно очень крутыми. У них была возможность непрямой адресации, которая означала, что вы можете сделать любой адрес как непрямой, что заставит использовать этот адрес аппаратно как адрес адреса. Эта возможность делала вызовы и передачу параметров очень быстрой. Единственным недостатком была возможность зависания машины, если вы заставляли адрес ссылаться на самого себя).</p>
<p>Как бы то ни было, моей задачей было написать программу классификации. Эта программа должна была получать вход на оптических карточках (которые были как перфокарты, с тем отличием, что нужно было заполнять точечки карандашом, вместо того, чтобы пробивать отверстия), сравнивать ответы по ключу и выдавать всевозможные отчеты в качестве результата. Все просто, не так ли?
</td>
</tr>
</tbody>
</table>
<p><span id="more-563"></span></p>
<p>В те дни, операции ввода/вывода были очень медленными. По крайней мере, нам так рассказывали. Фактически, у нас не было никаких способов улучшить производительность, и я просто принял как данность, что ввод/вывод &#8211; очень медленный. Чтобы разобраться с этой проблемой, я решил использовать многозадачность. Я хотел использовать подзадачи, чтобы считывать карточки, в то время как основная задача выполняла классификацию. Крутая идея, да?</p>
<p>Итак, напомню вам:</p>
<ul>
<li>Это была одна из первых программ, которых я писал в своей жизни.</li>
<li>Я решил использовать сложную, не до конца понятную технологию в проект, основываясь на интуиции. Большинство из нас не имело достаточного жизненного опыта в средней школе, чтобы правильно питаться, не говоря уж о интуитивных выборах технологий.</li>
<li>Все это программировалось на Фортране, который и сегодня не очень-то предназначен для многозадачности, а уж 40 лет назад&#8230;</li>
<li>В те дни не было Интернета. Онлайн вообще было мало что, особенно для уровня средней школы. Это означает, что единственным источником информации были бумажные руководства</li>
</ul>
<p>.<br />
Вы, наверное, не удивитесь, если я скажу, что результат был ужасный, и в конце концов ничего правильно не работало. Теперь я понимаю, что возможно оно бы все равно не работало, даже если бы я знал, что делаю.</p>
<p>Но главная моя ошибка была в том, что я использовал абсолютно ненужную вещь. Я поверил, что нашел МегаРешение (в моем случае – многозадачность).</p>
<p>Другие люди называют это &laquo;преждевременной оптимизацией&raquo;, но я думаю, что здесь все глубже. Раз за разом я вижу, как люди используют технологию, или (еще хуже), пишут свою собственную, когда более простой подход сработал бы так же или даже лучше.</p>
<p>Другой пример возник спустя несколько лет в Macy&#8217;s. Мы были одними из первых установщиков электронных кассовых аппаратов IBM(да-да, IBM делали кассовые аппараты), что означало установку компьютера в каждый магазин и соединение его со всеми аппаратами в магазине. Верите или нет, но нужно было вручную настраивать софт для каждого магазина, настраивая каждый аппарат по отдельности. Будучи в самом низу иерархии (я ведь еще был подростком, помните?), я занимался именно этим.</p>
<p>Если бы я был умным подростком, я бы просто вбил всю эту конфигурацию и занимался своими делами. Всего было около 10 магазинов, и после первоначальной установки там что-то менялось бы раз в несколько месяцев. Но, так как я не был умным, я решил написать сложный макрос на ассемблере, который бы выполнял работу. Это примерно как писать программу для препроцессора C++ (#define, #ifdef, и т.д.), чтобы сгенерировать C-программу.</p>
<p>Это стоило мне недели бессонных ночей, когда я мог бы сконфигурировать каждый чертов магазин в округе, и, до кучи, все остальные супермаркеты за один день. Кроме того, я был единственным человеком, который понимал, как все это работает. Теперь я думаю, что мне очень повезло, что меня не уволили и не дали хорошую взбучку.</p>
<p>Не поймите меня неправильно. Я также провел тысячи полезных часов, разбираясь с новыми технологиями(фактически, я получил мою первую серьезную работу, потому что провел год в колледже занимаясь только МегаРешениями и ничем больше),  для тренировки. Я только призываю не делать этого, когда вам платят за работу, или, еще хуже &#8211; вы делаете что-то, что придется сопровождать кому-то другому.</p>
<p>А теперь вернемся к сегодняшнему дню. Мы с другом думали о новом проекте, и наше внимание привлекла шумиха вокруг NoSQL (также посмотрите эту великолепную подборку NoSQL-решений). Мы оба используем базы данных практически с момента их создания (я обещаю замучить вас этим позже), и все плюсы и минусы реляционных баз данных нам хорошо известны.</p>
<p>Нашей первой реакцией было &laquo;Круто! Автоматическое маштабирование! Автоматическое шардирование! Автоматическое удаление SPOF!”</p>
<p>Наша вторая реакция: &laquo;Эээ, мм.. а как вы делаете отчеты? Каждое бизнес-решение требует новой программы?&raquo; (здесь прячется бизнес-идея для кого-то).</p>
<p>Ладно, я что-то отвлекся. Вопрос в другом &#8211; считать ли желание попробовать NoSQL-решения типа <a href="http://cassandra.apache.org/">Cassandra</a> погоней за очередным МегаРешением? Что ж, я думаю, и да, и нет, и у меня есть компромиссный вариант.</p>
<p>Да, потому что, мы ведь не работаем над Google, Digg, или eBay, и пока что тратить время и силы на попытки подогнать архитектуру под схему, совместимую с Cassandra &#8211; это не лучший способ использовать время.</p>
<p>Нет, это не потеря времени, потому что если у нас все получится, то нам не придется потом в панике что-то переделывать, когда мы вырастем, и мы сможем сосредоточиться на других вещах.</p>
<p>С другой стороны, если мы сейчас тратим время на работу с Cassandra, вместо того, что мы знаем (SQL), то это время потеряно для работы непосредственно над проектом.<br />
Компромисс в том, чтобы инкапсулировать доступ к данным так, чтобы большая часть кода не зависела от того, используем мы MySQL, Oracle, Cassandra, или текстовые файлы. Имея опыт нескольких таких инкапсуляций, я могу сказать, что это не так трудно, если вы грамотно продумаете наперед все, что вы хотите сделать.</p>
<p>Итак, подведем итоги:</p>
<ul>
<li>Остерегайтесь МегаРешений.</li>
<li>Занимайтесь МегаРешениями если ваше расписание, проект, работа и здравый смысл не противоречат этому.</li>
<li>Помните, что МегаРешения сложнее в использовании и отнимают больше времени чем скучные и банальные методы.</li>
<li>Используйте инкапсуляцию где это возможно, чтобы потом выбирать МегаРешениями, стандартными подходами, и чем-то совсем уж неизведанным</li>
<li>Не стесняйтесь заниматься МегаРешениями в качестве упражнения.</li>
</ul>
<p>Спасибо за прочтение!</p>
<p style="text-align: right;"><em>Автор статьи: Michael Wilson<br />
Дата: 30 марта 2010<br />
</em> <a href="http://theremichaelwilson.wordpress.com/2010/03/30/how-to-scale-stuff-part-1-dont-use-stuff-you-dont-need/"><em>Оригинал статьи</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post563/feed</wfw:commentRss>
		<slash:comments>5198</slash:comments>
		<feedburner:origLink>http://highload.org/post563</feedburner:origLink></item>
		<item>
		<title>Удаление дубликатов в деле</title>
		<link>http://feedproxy.google.com/~r/highload/~3/GEMImO9wGco/post553</link>
		<comments>http://highload.org/post553#comments</comments>
		<pubDate>Mon, 12 Apr 2010 20:51:49 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Алгоритмы]]></category>
		<category><![CDATA[бэкап]]></category>
		<category><![CDATA[хэширование]]></category>

		<guid isPermaLink="false">http://highload.org/?p=553</guid>
		<description><![CDATA[




В этом посте я бы хотел поговорить об основных идеях удаления дубликатов. Удаление дубликатов — это сердце любой современной системы онлайн бэкапа и облачной системы хранения данных. Давайте посмотрим, как это все работает.




Создание бэкапов ваших данных
Что может быть проще, чем создание бэкапов данных? Обычно вы просто копируете ваши данные на какой-нибудь надежный защищенный — и [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost553"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost553" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img src="http://highload.org/wp-content/uploads/2010/04/backup.jpg" alt="" title="backup" width="140" class="aligncenter size-full wp-image-559" /></td>
<td width="10"></td>
<td valign="top">В этом посте я бы хотел поговорить об основных идеях удаления дубликатов. Удаление дубликатов — это сердце любой современной системы онлайн бэкапа и облачной системы хранения данных. Давайте посмотрим, как это все работает.</td>
</tr>
</tbody>
</table>
<p><span id="more-553"></span></p>
<h1>Создание бэкапов ваших данных</h1>
<p>Что может быть проще, чем создание бэкапов данных? Обычно вы просто копируете ваши данные на какой-нибудь надежный защищенный — и готово. Но на следующий день вы делаете небольшое изменение в вашем документе или файле данных и хотите снова сделать бэкап. Ну что ж, можно просто перезаписать ваш бэкап, заменив все файлы. Но что тогда насчет предыдущей версии ваших данных?  Вы ведь не хотите просто так потерять историю ваших данных. Вы можете сравнить ваши файлы, найти изменившиеся и таким образом поддерживать историю данных. Таким образом, все сводится к тому, как вы определяете  изменения в ваших файлах и сравниваете их.</p>
<h1>Как определить, что изменилось со времени прошлого бэкапа?</h1>
<p>Побайтовое сравнение содержимого файлов работает слишком медленно, особенно при больших размерах файлов. Нам нужно что-то типа «отпечатка пальцев», чтобы мы могли быстро сказать, идентичны файлы или нет. Отпечаток пальцев (или идентификатор) обычно реализуется как хэш функция (md5, sha256 и др). Бэкап с исключением повторных файлов намного более эффективен, чем бэкап в виде простой копии. Но это по-прежнему слабый метод в случае, когда огромные файлы рамером в несколько гигабайт претерпевают изменение в 1 байте. В этом случае мы обнаружим это изменение и с радостью забэкапим целиком новую версию. Есть ли способ улучшить этот метод?</p>
<h1>Удаление дубликатов блока</h1>
<p>Обычно данные лишь слегка изменяются от версии к версии. Часто мы меняем только кусочек файла, вставляем что-то в него, удаляем некоторые части из файла, и так далее, и очень редко мы заменяем содержимое файла целиком. Нам нужен способ хранить только изменения от предыдущей версии, а не все содержимое файла. Таким образом, основная идея удаления дубликатов блока — это разделение данных на блоки и удаление дубликатов на уровне этих блоков.</p>
<h1>Основные идеи удаления дубликатов</h1>
<p>Блоки идентифицируются и сравниваются с помощью этих идентификаторов.</p>
<p><img class="aligncenter size-full wp-image-554" title="dd1" src="http://highload.org/wp-content/uploads/2010/04/dd1.png" alt="" width="320" height="251" /></p>
<p>Когда нам нужно сослаться на блок, мы используем его идентификатор вместо содержимого. Таким образом, мы определяем содержимое файла как последовательность блоков, а если быть более точными — как последовательность идентификаторов блоков. Для восстановления изначального содержимого файла мы просто проходим по идентификаторам блоков и восстанавливаем их содержимое.</p>
<p>По основным свойствам хэш функций, при вычислении идентификаторов двух идентичных блоков идентификаторы будут тоже одинаковыми. Однако, иногда два различныхблока могут дать в результате один и тот же идентификатор. Это называется коллизией. Коллизия ведет за собой повреждение данных, так как мы ошибочно предположим, что различные блоки являются одинаковыми, и выбросим один из блоков.  Таким образомы мы потеряем информацию в ходе исключения дубликатов. Хорошей новостью является то, что при хорошей хэш функции коллизии встречаются очень редко. Мы обсудим вероятность коллизии немного позже в этом посте.</p>
<h1>Случаи модификации данных</h1>
<p>Так как же модифицируются данные? Существуют три основных вида модификации данных: вставка, обновление, удаление. Любая модификация данных может быть представлена как последовательность этих основных действий.</p>
<p><img class="aligncenter size-full wp-image-555" title="dd2" src="http://highload.org/wp-content/uploads/2010/04/dd2.png" alt="" width="400" height="262" /></p>
<p>Обновление — это простейший вид модификации. Когда мы обрабатываем обновление и данные у нас разделены на блоки, то границы блока не изменяются. Поэтому мы можем легко обнаружить и заменить измененный блок данных.</p>
<p>Но если некоторый кусок данных был удален или добавлен в блок, то границы блоков могут измениться, и нам придется рассматривать все последующие блоки как измененные, в то время как на самом деле они совсем не изменились, а всего лишь немного сдвинулись. Как же обнаружить этот сдвиг?</p>
<h1>Идея плавающего окна для поимки границ блока</h1>
<p>Все, что нам нужно для определения передвигающихся границ (сдвиг границ блока в результате операций удаления/вставки), — это попробовать идентифицировать блоки со всеми смещениями от 0 до размера блока (не включительно). Мы также найдем начало следующего блока или попробуем все смещения из диапазона и ничего не найдем, и это будет означать, что был вставлен целый новый блок.</p>
<p><img class="aligncenter size-full wp-image-556" title="dd3" src="http://highload.org/wp-content/uploads/2010/04/dd3.png" alt="" width="400" height="242" /></p>
<p>Когда существующий блок будет найден, мы возьмем данные от правой границы предыдущего блока до левой границы следующего блока и создадим новый блок. Однако размер этого блока будет короче, чем обычный размер блока, и, таким образом, подобная ситуация будет непригодна для дальнейшего исключения дубликатов с блоками нормального размнера. В виде оптимизации мы можем соединить данные, взятые  из различных частей файла, и независимо разделить их по блокам для удаления маленьких блоков.</p>
<p>Основная проблема в этом подходе — медленная работа плавающего окна. Мы пересчитываем идентификаторы для каждого смещения из диапазона в худшем случае столько раз, сколько байтов в блоке. Именно это — основная потеря производительности.</p>
<h1>Улучшение производительности использованием кольцевого хэширования</h1>
<p>Производительность определения вставленных/удаленных данных с помощью плавающего окна основывается на производительности вычисления идентификатора для данного блока со смещением A и длиной N. В общем, мы имеем дело с вычислением хэш функции с O(N) операциями. Так как нам нужно посчитать идентификаторы для всех смещений с 0 до N, то производительность плавающего окна уменьшается до O(N^2), а это уже не практично для блоков большого размера. Все, что нам нужно, — это каким-то образом получить преимущество подсчета хэш функции для смещения A + 1 за счет того, что мы уже посчитали хэш функцию для смещения A. К счастью, существует хэш функция кольцевого хэширования Adler32, которая нам в этом поможет. Таким образом, мы можем поддерживать плавающее окно с сложностью O(N)  и блоки большого размера.</p>
<h1>Коллизии</h1>
<p>Давайте посчитаем вероятность коллизии. Предположим, что мы можем хранить N блоков в нашем хранилище, и используем B битов в хэшкоде. Вероятность коллизии в нашем хранилище — это вероятность единичной коллизии 1/2^B , умноженная на количество пар блоков N*(N-1)/2</p>
<p style="text-align: center;"><strong>P=N*(N-1)/2^(B+1)</strong></p>
<p>Для 1Tb данных и блоков размером 32К у нас будет 2^40/2^15=2^25 блоков, то есть N=2^25</p>
<p style="text-align: center;"><strong>P=2^25(2^25-1)/2^257~1/2^207~10^-63</strong></p>
<p>Мы потеряем 32Kb из 1TB с вероятностью 10^-69. Это чрезвычайно редкая ситуация. Получается, что если вы будете делать бэкапы 100 PB данных на протяжении миллиона лет, у вас не будет даже одного шанса на миллиард потерять что-нибудь из-за коллизии.</p>
<h1>Удаление дубликатов VS ZIP сжатием</h1>
<p>Используя все вышеперечисленные идеи, я создал утилиту удаления дубликатов, которая удаляет дубликаты во всех файлах заданной папки и всех ее подпапках. Для анализа результатов удаления дубликатов я провел две серии тестов.</p>
<p>Я взял один наш проект со всеми исходниками, бинарными файлами и метаданными SCM (мы используем Mercurial). Удаление дубликатов было проведено для 3 снимков нашего проекта с перерывом в 1 месяц, и один раз для всех снимков вместе. Результаты были сравнены с ZIP сжатием с максимальными настройками сжатия. Сравнение приведено в таблице:</p>
<p><img class="aligncenter size-full wp-image-557" title="dd4" src="http://highload.org/wp-content/uploads/2010/04/dd4.png" alt="" width="448" height="172" /></p>
<p>Эксперимент показывает, что с эволюционированием технологий удаления дубликатов они превосходят архивирование данных.</p>
<p>Надеюсь, этот пост будет полезным тем, кто собирается построить большое масштабируемое хранилище данных и задумывается насчет технологии удаления дублткатов.</p>
<p style="text-align: right;"><em>Автор статьи: Vladimir Balandin<br />
Дата: 8 апреля 2010<br />
</em> <a href="http://blog.griddynamics.com/2010/04/deduplication-in-action.html"><em>Оригинал статьи</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post553/feed</wfw:commentRss>
		<slash:comments>10743</slash:comments>
		<feedburner:origLink>http://highload.org/post553</feedburner:origLink></item>
		<item>
		<title>Puppet против Chef: 10 причин, из-за которых выигрывает Puppet</title>
		<link>http://feedproxy.google.com/~r/highload/~3/6aZHwDKc6Kw/post549</link>
		<comments>http://highload.org/post549#comments</comments>
		<pubDate>Sat, 10 Apr 2010 22:32:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[Chef]]></category>
		<category><![CDATA[configuration management]]></category>
		<category><![CDATA[Puppet]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://highload.org/?p=549</guid>
		<description><![CDATA[




Puppet, Chef, cfengine, и Bcfg2 &#8211; игроки в пространстве управления конфигурациями. Если вы ищете Linux решения для автоматизации или инструменты управления конфигурациями серверов, то вы скорее всего натолкнетесь на такие 2 технологии, как Puppet и Opscode Chef. У них очень похожая архитектура, и они решают одинаковые виды задач. Puppet от Reductive Labs существует дольше, у [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost549"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost549" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-full wp-image-487" title="puppet" src="http://highload.org/wp-content/uploads/2010/04/puppet.png" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top">Puppet, Chef, cfengine, и Bcfg2 &#8211; игроки в пространстве управления конфигурациями. Если вы ищете Linux решения для автоматизации или инструменты управления конфигурациями серверов, то вы скорее всего натолкнетесь на такие 2 технологии, как Puppet и Opscode Chef. У них очень похожая архитектура, и они решают одинаковые виды задач. Puppet от Reductive Labs существует дольше, у него большое количество пользователей. Chef от Opscode извлек несколько уроков из разработки Puppet и у него есть клиент высокого уровня &#8211; EngineYard.</p>
<p>Вам надо сделать важный выбор: на какую систему поставить? Когда вы строите автоматизированную инфраструктуру, скорее всего вы будете работать с ней несколько лет. Когда ваша инфраструктура уже построена, смена технологий стоит дорого. Развертывания Puppet и Chef часто оказываются крупномасштабными, порой они покрывают тысячи серверов.</p>
<p>﻿﻿﻿﻿﻿﻿﻿﻿﻿&raquo;Chef против Puppet&raquo; &#8211; это продолжающийся спор, но вот 10 преимуществ, которые сегодня есть у Puppet над Chef по моему мнению.</td>
</tr>
</tbody>
</table>
<p><span id="more-549"></span></p>
<ol>
<li><strong>Большее количество инсталляций</strong><br />
Проще говоря, практически все используют Puppet, а не Chef. В то время как на сайте Chef есть только<a href="http://wiki.opscode.com/display/chef/Chef+Users+List"> небольшой список компаний</a>, испольщующих его, у Puppet есть более <a href="http://reductivelabs.com/trac/puppet/wiki/WhosUsingPuppet">80 организаций</a>, в том числе Google, Red Hat, Siemens, большое количество крупных фирм по всему миру, и несколько университетов из основных, включая Stanford и Harward Law School.<br />
Это значит, что у Puppet серьезные намерения, и облегчает его распространение. Когда люди узнают, что эту же технологию использует Google, они полагают, что она работает. У развертываний Chef нет этого преимущества (пока). Разработчики и системные администраторы часто смотрят на своих коллег в других компаниях для социального доказательства.</li>
<li><strong>Большее количество разработчиков</strong><br />
Puppet настолько широко используется, что большое количество людей работают над ним. У Puppet много контрибуторов в исходный код ядра, но также он породил разнообразие систем поддержки и сторонних дополнений специфичных для Puppet, в том числе <a href="http://theforeman.org/">Foreman</a>. Популярные инструменты создают свои собственные экосистемы.<br />
Число разработчиков Chef растет быстро, но пока остает от Puppet, и его разработчики безусловно менее опытны в работе над ним, так как это более молодой проект.</li>
<li><strong>Выбор языков конфигурации</strong><br />
Puppet использует для конфигурирования серверов <a href="http://reductivelabs.com/trac/puppet/wiki/LanguageTutorial">язык</a>, который специально разработан для этой задачи: это предметно-ориентированный язык, оптимизированный для задачи описания и связывания таких ресурсов, как пользователи и файлы.<br />
Chef использует <a href="http://wiki.opscode.com/display/chef/Just+Enough+Ruby+for+Chef">расширение Ruby</a>. Ruby хороший язык программирования общего назначения, но он не разрабатывается специально для управления конфигурацией, и обучение Ruby намного сложнее чем обучение язык Puppet.<br />
Некоторые считают, что отсутствие предметного-ориентированного языка является преимуществом Chef. Они приводят аргумент: &laquo;Вы получаете мощь Ruby бесплатно&raquo;. К сожалению, в Ruby есть много неинтуитивных вещей, особенно для начинающих, также необходимо овладеть большим и сложным синтаксисом.<br />
В Puppet есть экспериментальная поддержка написания манифестов на языке, встроенном в Ruby, также как в Chef. Поэтому возможно лучше будет сказать, что Puppet дает вам выбор использования либо его предметно-ориентированного языка, либо мощь языка общего назначения Ruby. Я схожусь во мнении с <a href="http://utcc.utoronto.ca/~cks/space/People/ChrisSiebenmann">Chris Siebenmann</a>, что проблема использования языков общего назначения для конфигураций в том, что <a href="http://utcc.utoronto.ca/~cks/space/blog/programming/ConfiguringInRealLanguage">они жертвуют ясностью ради мощи</a>, и это не является выгодным обменом.</li>
<li><strong>Более длинный путь в коммерческом использовании</strong><br />
Puppet находится в коммерческой эксплуатации много лет, и он непрерывно совершенствовался и улучшался. Он развертывался в очень больших инфраструктурах (5000+ машин) и уроки производительности и масштабирования полученные из этих проектов, внесли вклад в разработку Puppet.<br />
Chef все еще находится на ранней стадии разработки. С моей точки зрения он еще не созрел для промышленного использования. Он не поддерживает столько операционных систем, сколько Puppet. Так что возможно он даже не может рассматриваться как вариант в вашем окружении. Хотя развертывания Chef сущестуют на множестве платформ, поэтому проверяйте доступность для вашей ОС.</li>
<li><strong>Лучшая документация</strong><br />
У Puppet есть огромная поддерживаемая пользователям вики с сотнями страниц <a href="http://reductivelabs.com/trac/puppet/wiki/DocumentationStart">документации</a> и исчерпывающих справочных руководств и для <a href="http://reductivelabs.com/trac/puppet/wiki/LanguageTutorial">языка</a>, и для <a href="http://reductivelabs.com/trac/puppet/wiki/TypeReference">типов ресурсов</a>. В добавок к этому, он активно обсуждается в нескольких <a href="http://groups.google.com/group/puppet-users">списках рассылок</a> и есть очень популярный <a href="http://reductivelabs.com/trac/puppet/wiki/GettingHelp">IRC канал</a>. Поэтому, какова бы ни была ваша проблема с Puppet, ответ найти легко. (Если вы начинаете знакомиться с Puppet, можете обратиться к моему <a href="http://bitfieldconsulting.com/puppet-tutorial">руководству по Puppet</a>.)<br />
По вполне понятным причинам разработчики Chef больше сконцентированы на том, чтобы сделать рабочий инструмент, чем на написание обширной документации. <a href="http://wiki.opscode.com/display/chef/Getting+Started">Руководства по Chef</a> существуют, но они немного схематичны. Информация есть, но она рассеяна и сложно найти необходимую часть.</li>
<li><strong>Больше способов использования</strong><br />
И Chef, и Puppet могут использоваться как инструмент развертывания. Документация по Chef нацелена на пользователей, развертывающих <a href="http://wiki.opscode.com/display/chef/Getting+Started+with+EC2+Rails+Infrastructure">Ruby on Rails приложения</a>, в частности в облачных окружениях &#8211; основной его пользователь это EngineYard, и это чем они занимаются, большая часть руководств направлена на это. Chef не ограничивается Rails, но справедливо будет сказать, что это его основной способ использования.<br />
Puppet, напротив, не ассоциируется ни с каким конкретным языком или web фреймворком. Его пользователи управляют приложениями Rails, но также PHP приложениями, Python и Django, Mac десктопами или AIX мэйнфреймами с Oracle.<br />
Необходимо прояснить, что это не является техническим преимуществом Puppet, это результат того, что у его сообщества, документации и использования база более обширна.  Чем бы вы не пытались управлять, используя Puppet, вы скорее всего обнаружите, что кто-то уже это сделал и может помочь вам.</li>
<li><strong>Поддержка большего количества платформ</strong><br />
Puppet поддерживает множество платформ. Независимо от того где он запущен, на OS X или на Solaris, Puppet знает какой пакетный менеджер и какие команды использовать для создания ресурсов. Сервер Puppet может быть запущен на любой платформе, которая поддерживает Ruby. Он может быть запущен на довольной устаревших версиях ОС и Ruby (важный момент во многих промылшенных окружениях, которые консервативны в смысле обновления программного обеспечения).<br />
Chef поддерживает меньшее чем Puppet количество платформ, в большой степени потому, что зависит от недавних версий Ruby и CouchDB. Хотя количество поддерживаемых платформ все время растет, также как и у Puppet. Puppet и Chef могут развертывать все области вашей инфраструктуры, которые находятся в списк поддерживаемых платформ.</li>
<li><strong>Не изобретает заново велосипед</strong><br />
Chef был сильно вдохновлен Puppet. Он в большой степени дублирует функциональность, уже существующую в Puppet &#8211; но у него нет всех возможностей Puppet. Если вы уже используете Puppet, Chef не может предложить вам ничего нового, что стоило бы перехода.<br />
Конечно Puppet тоже переизобрел много функциональности, которая была в предыдущих поколениях программного обеспечения, управляющего конфигурациями, таких как cfengine. Все повторяется.</li>
<li><strong>Явное управление зависимостями</strong><br />
Некоторые ресурсы зависят от других ресурсов &#8211; вещи должны быть выполнены в определенном порядке. Chef похоже на shell скрипт: вещи выполняются в том порядке, в котором они написаны, и это все. Но так как нет способа явно сказать, что один ресурс зависит от другого, порядок ваших ресурсов в коде может быть критичен, или нет &#8211; читатель не сможет определить это посмотрев на набор команд. Следовательно, рефакторинг и перемещение кода могут быть опасны, простое изменение порядка ресурсов в текстовом файле может сломать работу.<br />
В Puppet зависимости всегда явные и вы можете свободно менять порядок ресурсов в коде, не влия на порядок приложения. Ресурс в Puppet может &laquo;слушать&raquo; изменения в вещах, от которых он зависит: если изменяется конфигурация Apache, может быть автоматически вызыван перезапуск Apache. Верно и обратное, ресурсы могут &laquo;уведомлять&raquo; другие ресурсы, которые могут быть заинтересованы в них. Chef тоже может это делать, но от вас не требуется делать эти зависимости явными &#8211; и это с моей точки зрения плохо, хотя некоторые не соглашаются. Andrew Clay Shafer продуманно написал об этом различии: <a href="http://stochasticresonance.wordpress.com/2010/01/20/puppet-chef-dependencies-and-worldviews/">Puppet, Chef, Dependencies and WorldViews</a>).<br />
Фанаты chef считают, что его поведение детерминировано: одни и те же изменения будут каждый раз применяться в одном и том же порядке. Sterve Traugott и Lance Brown спорят о важности этого свойства в статье <a href="http://www.infrastructures.org/papers/turing/turing.html">Why Order Matters: Turing Equivalence in Automated Systems Administration</a>.</li>
<li><strong>Лучшая осведомленность потребителей</strong><br />
Хотя это не техническик момент, но возможно он самый важный. Когда вы говорите &laquo;управление конфигурациями&raquo;, большинство людей (по крайней мере среди тех, кто знает о чем речь) обычно ответят &laquo;Puppet&raquo;. Puppet владеет этим пространством. Я знаю, что есть большое, готовое помочь сообщество, к которому я могу обратиться, и даже <a href="http://www.amazon.com/gp/product/1590599780?ie=UTF8&amp;tag=cribbcorne-20&amp;linkCode=as2&amp;camp=1789&amp;creative=9325&amp;creativeASIN=1590599780">опубликованные книги про Puppet</a>. Puppet настолько широко признан, что фактически любая задача, с которой вы можете столкнуться, уже была кем-то обнаружена и решена.</li>
</ol>
<p><strong>Заключение</strong></p>
<p>На данный момент &laquo;Chef против Puppet&raquo; довольно нечестное сравнение. Большинство отмеченных недостатков Chef являются следствием того, что Chef еще очень молод. Технически, Puppet и Chef обладают похожими возможностями, но у Puppet преимущество первого хода и он колонизировал большую часть уголков мира управления конфигурациями. Однажды Chef догнать его, но сегодня я рекомендую Puppet.</p>
<p style="text-align: right;"><em>Автор статьи: John Arundel<br />
Дата: 12 января 2010<br />
<a href="http://bitfieldconsulting.com/puppet-vs-chef">Оригинал статьи</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post549/feed</wfw:commentRss>
		<slash:comments>5641</slash:comments>
		<feedburner:origLink>http://highload.org/post549</feedburner:origLink></item>
		<item>
		<title>7 секретов успешного масштабирования с SCALR (на Amazon) от Sebastian Stadil</title>
		<link>http://feedproxy.google.com/~r/highload/~3/RqmPHraCqlg/post542</link>
		<comments>http://highload.org/post542#comments</comments>
		<pubDate>Fri, 09 Apr 2010 07:45:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Облачные вычисления]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[Scalr]]></category>
		<category><![CDATA[масштабирование]]></category>

		<guid isPermaLink="false">http://highload.org/?p=542</guid>
		<description><![CDATA[




Это часть интервью с Sebastian Stadil, основателем Scalr, дешевой опенсорс-версии RightScale.  Scalr заботится об инфраструктурах всех web-сайтов, находящихся на Amazon (и других облаках), так что вам этого делать не приходится.





Я впервые встретил Sebartian на одном из собраний группы Valley Cloud Computing Group, которую он основал. Собрания начались в крошечных офисах Intalio, где Sebastian работал [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost542"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost542" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-full wp-image-543" title="Scalr_Logo" src="http://highload.org/wp-content/uploads/2010/04/Scalr_Logo.gif" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top">Это часть интервью с Sebastian Stadil, основателем <a href="http://scalr.net">Scalr</a>, дешевой опенсорс-версии <a href="http://www.rightscale.com/">RightScale</a>.  Scalr заботится об инфраструктурах всех web-сайтов, находящихся на Amazon (и других облаках), так что вам этого делать не приходится.</p>
</td>
</tr>
</tbody>
</table>
<p><span id="more-542"></span></p>
<p>Я впервые встретил Sebartian на одном из собраний группы Valley Cloud Computing Group, которую он основал. Собрания начались в крошечных офисах Intalio, где Sebastian работал с этими новыми штуками от Amazon для создания фермы автоматически масштабирующихся серверов на EC2. Я хорошо помню, как Sebastian встречал каждого в дверях с улыбкой и рукопожатием, заставляя нас чувствовать себя как дома. Позже я посетил его занятия по использованию <a href="http://aws.amazon.com/">AWS</a>. Я думаю, он разобрался со всеми этими облачными вещами и решил организовать Scalr.</p>
<p>Мне очень жаль, что название «Amazon» не начинается с буквы &#8216;S&#8217; – тогда бы получилось просто эпическое название поста.</p>
<h1>Знакомство</h1>
<p>В этом разделе – ответы Sebastian на общие вопросы о Scalr.</p>
<p><strong>Что такое Scalr</strong><br />
Scalr – это тот самый парень, которого вы просите помочь разобраться с серверами: Scalr помогает вам создавать масштабируемую инфраструктуру и управлять ей.</p>
<p><strong>Когда ты начал?</strong><br />
Scalr выпущена в свет под GPL лицензией в апреле 2008, так что в следующем месяце мы празднуем двухлетнюю годовщину с Scalr 2.0!</p>
<p><strong>Что заставило тебя покинуть старую работу и начать заниматься Scalr?</strong><br />
Потому что очень сложно построить правильную инфраструктуру! И масштабирование так дорого обходится!</p>
<p><strong>Твой продукт развивался со временем?</strong><br />
Сначала он использовал только EC2 и обходные пути из-за отсутствия EBS. А сейчас это полностью функциональная система, использующая последние фичи Amazon, такие как RDS и ELB, для масштабирования и управления всем для вас.</p>
<p><strong>Можешь сравнить с RightScale и предложениями Amazon?</strong><br />
Представляйте Scalr как опенсорс RightScale, фокусирующийся только на масштабировании web-приложений. Amazon почти не предлагает автоматизации и не помогает вам создавать масштабируемую архитектуру. Если у есть хотя бы маленький шанс, что ваш проект вырастет, ознакомьтесь с нашей системой.</p>
<p><strong>Как думешь, к чему движутся все эти облачные штуки?</strong><br />
Я вижу некоторые зарождающиеся перспективы в управлении гибридным облаком, но очень надеюсь, что за 3 года все новые приложения будут готовы к выкладыванию в интертрубы в 1 клик, самоуправляемы и готовы к масштабированию. Мы добавляем поддержку для всех остальных облачных платформ.</p>
<h1>7 секретов для успешного масштабирования  с Scalr</h1>
<p>Я подумал, что Sebastian за много лет приобрел большой опыт работы с AWS, и ему должно быть известно множество трюков и ловушек. Поэтому я попросил рассказать его, о каких главных проблемах следует помнить, когда работаешь с Amazon, и затем объяснить, как Scalr помогает их решать. Вот ответы Sebastian:</p>
<p><strong>Не задавайте четко адреса.</strong><br />
Вещи меняются быстро в облаке, особенно IP адреса. Адрес базы данных, который у вас есть сегодня, может измениться завтра или на следующей неделе. Это может произойти случайно из-за остановки или запуска сущности EC2 или предсказуемо, когда  вычисления и данные переезжают по разным пулам ресурсов – например, с EC2 на Rackspace Cloud. Elastic IPs — сервис Amazon для привязки IP к любому серверу — решает эту проблему до тех пор, пока вы продолжаете использовать сервисы Amazon. Но вы не можете назначить его не EC2 серверу, поэтому вы не можете использовать это за пределами AWS.</p>
<p>Проблема в данном случае заключается в том, что когда вы жестко задаете адрес базы данных как IP адрес в вашем приложении и этот IP адрес меняется, то ваше приложение будет отправлять запросы и данные в никуда — ничего хорошего, согласитесь. Для того чтобы справиться с этим, хорошим решением будет определять адрес назначения перед отправкой на него данных — DNS как раз придумали для этого.</p>
<p>Мы все это упростили в Scalr. Scalr хранит обновленный список IP адресов для каждой сущности и названия сервера в форме записей DNS на кластере серверов имен. Когда вы отправляете запрос к базе данных db.example.com, клиент ищет IP адрес для этого имени сервера в записях DNS для этой зоны и кэширует все это до тех пор, пока не истечет TTL.</p>
<p>Переносите вычисления в Rackspace Cloud? Scalr добавит записи для вашей новой базы данных на Rackspace и удалит ссылки на IP адреса EC2.</p>
<p><strong>Масштабирование чтения-записи прошло долгий путь</strong><br />
Принимая во внимание все сегодняшние разговоры о шардинге и noSQL, легко оценить, как много вы сможете сделать с кластером мастер-слэйв репликаций.</p>
<p>Кластер мастер-слэйв репликаций – это набор множеств баз данных, которые синхронизируют данные в одном направлении. Мастер-база данных – это хранитель всех данных, и она единственная, в которую вы записываете: INSERT, DELETE и UPDATE. Слэйв-база данных реплицирует данные от мастера и хранит их копию. Из нее вы производите чтение: SELECT. Это разделение освобождает ресурсы в мастере, которые часто ограничены возможностями CPU, и позволяет вам производить JOIN без уничтожения всей производительности, так как обрабатывает эту операцию слэйв, а не мастер.</p>
<p>Для дальнейшего масштабирования и отказоустойчивости возможен также вариант с мастер-мастер репликацией, в которой сервера оба ведут себя как мастер и как слэйв по отношению к другим. Хитрость в данном случае для высокой доступности базы данных заключается в добавлении мастера в каждый из двух улов ресурсов, чтобы, если один исчезнет, другой принял на себя весь трафик.</p>
<p>Scalr автоматически настраивает репликацию между вашими инстансами базы данных в случае, если вы не знаете, как, или не хотите этого делать, и добавляет слой защиты от падения при помощи автоматического определения упавших серверов базы данных. В этом случае при падении мастер-базы данных слэйв-база данных автоматически станет мастером, и другие слэйвы перенастроятся для работы с ней.</p>
<p><strong>Распределять CRON задания очень тяжело</strong><br />
Посмотрите на то, как масштабируются инстансы с cron заданиями на них. Cron задания не проектировались для облака.  Если промасштабировать образ машины, содержащей cron задание на 20 инстансов, то получится, что ваше cron задание будет выполняться в 20 раз чаще.</p>
<p>Это еще ничего, если границы вашего cron задания ограничены сами инстансом, но если границы распространяются дальше, то у вас появится большая проблема. И если у вас  будет только одна машина, которая запускает cron задание, то вы рискуете, что задание не выполнится, если эта машина упадет.</p>
<p>Вы можете справиться с этим, используя SQS или другой распределенный сервис очереди, но он действительно очень громоздкий и его долго настраивать, и у вас не будет гарантии, что задание выполнится вовремя.</p>
<p>Apache Software Foundation имеет изящную утилиту для распределенного сервиса блокировок. Она называется <a href="http://hadoop.apache.org/zookeeper/">Zookeeper</a>. Эта утилита является основанием распределенной системы cron задач от Scalr, поэтому пользователи могут настраивать периодическое выполнение скриптов, таких как cron задачи, и риска того, что задание будет выполнено несколько раз или не выполнено вообще, не будет.</p>
<p><strong>Разработка и продакшн должны быть близнецами.</strong><br />
Различия между окружениями разработки и продакшена могут вызвать сбои при переводе продукта из одного в другое. Что-нибудь незначительное – например, различные размеры инстанса, – может вызвать неполадки, особенно на EC2, где маленькие инстансы 32-битные, а большие 64-битные.</p>
<p>Традиционно компании запускают разработку и QA на выделенных серверах. Так как они используются непостоянно, например, пару недель до релиза, компании обычно экономят, покупая только по одному серверу каждого типа — это особенно верно, когда ваша архитектура требует программы с несвободными лицензиями. Брать дополнительные лицензии на Oracle ради нескольких недель в году может быть очень расточительным поступком.</p>
<p>В облаке все обстоит иначе. Так как ты платишь только за то, что взял, вы можете можете получить сервера на ограниченный период, пока вы их используете. Если вы используете Scalr, то все еще проще: просто клонируйе вашу ферму продакшн серверов и называйте их QA. Используйте их 8 часов в понедельник и затем уже выключайте утром во вторник. У вас будет идеальная копия вашего продакшн окружения (та же архитектура, системы и данные), дневная цена часто ниже цены запуска.</p>
<p>А еще сделайте снэпшот вашей базы данных и запускайте Dev и QA с теми же данными, как в продакшене. Используйте Apache Bench и вы сможете получить даже ту же самую нагрузку.</p>
<p><strong>Учитесь у комьюнити</strong><br />
Достаточно сложно оставаться в курсе всех последних изменений и трюков с инфраструктурой,  от Cassandra и Nencached до Varnish и nginx. Я не могу даже представить, сколько нужно времени, чтобы изучить все с нуля</p>
<p>Пока существует множество фреймворков (таких, как построенный нами проект Scalr), и платформ (Heroku и Google App Engine), которые либо упрощают масштабирование, либо абстрагируют все, полезно иметь немного знаний о более нижнем уровне — механике всего этого. Я понял, что чтение OSI модели компьютерных сетей, задачи выбора компромиссных значений в кэшировании, CAP теоремы от Eric Brewer и концепции отложенной согласованности — это все не зря потраченное время.</p>
<p><strong>I/O будут узким местом</strong><br />
Дисковое I/O наверняка будет проблемой в росте вашего приложения, и Raid поверх EBS быстро переполнит сетевое I/O (все пойдет сначала внутрь, а потом наружу, и в итоге будет потребляться двойная пропускная способность). Используйте базу данных  оперативной памяти, где это имеет смысл, и кэшируйте все, что только можно! Мы считаем, что <a href="http://www.memcached.org/">memcached</a> достаточно легко использовать, и она очень сильно повлияет на нагрузку базы данных.</p>
<p><strong>Трудно работать с эфемерным хранилищем</strong><br />
Если вы используете локальный диск для хранения данных для лучшего I/O, то вы рискуете потерять данные из-за неисправной работы инстанса. Это может быть ограничено задержкой репликации, временем после последнего снэпшота или временем последнего дампа базы данных, но все это делает восстановление нудным и лакейским.</p>
<p>Мы решаем это в таких проектах как Scalr, где в случае падения слэйв-сервера автоматически становятся мастер-серверами. Однако существует проблема выбора между временем простоя и потерянными данными, который мы делаем, и по умолчанию мы выбираем потерю данных.</p>
<p style="text-align: right;"><em>Автор статьи: Todd Hoff<br />
Дата: 22 марта 2010<br />
</em> <a href="http://highscalability.com/blog/2010/3/22/7-secrets-to-successfully-scaling-with-scalr-on-amazon-by-se.html"><em>Оригинал статьи</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post542/feed</wfw:commentRss>
		<slash:comments>4808</slash:comments>
		<feedburner:origLink>http://highload.org/post542</feedburner:origLink></item>
		<item>
		<title>Spanner: Новая инфраструктура вычислений и вместительных хранилищ данных Google</title>
		<link>http://feedproxy.google.com/~r/highload/~3/HN8oilDiiPI/post531</link>
		<comments>http://highload.org/post531#comments</comments>
		<pubDate>Sat, 27 Mar 2010 14:57:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[google]]></category>
		<category><![CDATA[BigTable]]></category>
		<category><![CDATA[Paxos]]></category>

		<guid isPermaLink="false">http://highload.org/?p=531</guid>
		<description><![CDATA[




MapReduce, Bigtable, Pregel берут свое начало в Google и все они имеют дело с &#171;огромными системами&#187;. Но все они выглядят мелко по сравнению с новым проектом, над которым работает Google, упомянутым на одном мероприятии в прошлом году.



Выглядит так, что вместо кэширования данных рядом с пользователем, Google пытается &#171;доставить&#187; данные к пользователю. Если вы используете Gmail [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost531"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost531" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-full wp-image-487" title="spanner" src="http://highload.org/wp-content/uploads/2010/03/spanner.jpg" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top"><a href="http://www.royans.net/arch/category/mapreduce/">MapReduce</a>, <a href="http://en.wikipedia.org/wiki/BigTable">Bigtable</a>, <a href="http://www.royans.net/arch/pregel-googles-other-data-processing-infrastructure/">Pregel</a> берут свое начало в Google и все они имеют дело с &laquo;огромными системами&raquo;. Но все они выглядят мелко по сравнению с новым проектом, над которым работает Google, упомянутым на одном мероприятии в прошлом году.</td>
</tr>
</tbody>
</table>
<p><span id="more-531"></span>Выглядит так, что вместо кэширования данных рядом с пользователем, Google пытается &laquo;доставить&raquo; данные к пользователю. Если вы используете Gmail или Google Docs, тогда Google, используя этот фреймворк, может автоматическим-магическим образом переместить одну из мастер копий ваших данных в ближайший к вам датацентр, при этом не потребуется ничего кэшировать локально. И похоже, что им больше не нужны выделенные кластеры для отдельных проектов, так как они строят единый кластер датацентров по всему миру вместо сотен более мелких для отдельных приложений.</p>
<p>Ниже приведена суть Spanner, извлеченная из разговора с Jeff Dean на <a href="http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf">симпозиуме в Cornell</a>. Обратите внимание на другие слайды, если вы интересуетеся впечатляющей статистикой производительности и надежности аппаратного обеспечения.</p>
<p><strong>Spanner</strong>: Система хранения и вычислений, которая охватывает все наши датацентры</p>
<ul>
<li>Единое глобальное пространство имен
<ul>
<li>Имена не зависят от местонахождения данных</li>
<li>Сходства с Bigtable: table, families, locality groups, coprocessors&#8230;</li>
<li>Различия: иерархические директории вместо строк, мелкоструктурная репликация</li>
<li>Мелкоструктурные ACL, настройка репликации на уровне директорий</li>
</ul>
</li>
<li>Поддержка сочетания слабой и сильной согласованности между датацентрами
<ul>
<li>Сильная согласованность реализуется при помощи <a href="http://en.wikipedia.org/wiki/Paxos_algorithm">Paxos</a> реплик</li>
<li>Полная поддержка распределенных транзакций между директориями/машинами</li>
</ul>
</li>
<li>Более автоматизированные операции
<ul>
<li>Система автоматически перемещает и добавляет реплики данных и вычислений основываясь на ограничениях и шаблонах использования</li>
<li>Автоматическое выделение ресурсов для всех машин</li>
</ul>
</li>
</ul>
<p style="text-align: center;"><a href="http://highload.org/wp-content/uploads/2010/03/spanner-end.png"><img class="aligncenter size-full wp-image-533" title="spanner-end" src="http://highload.org/wp-content/uploads/2010/03/spanner-end.png" alt="" width="506" height="384" /></a></p>
<p style="text-align: right;"><em>Автор статьи: Royance Tharakan<br />
Дата: 18 марта 2010<br />
<a href="http://www.royans.net/arch/spanner-googles-next-massive-storage-and-computation-infrastructure/">Оригинал статьи</a></em></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post531/feed</wfw:commentRss>
		<slash:comments>7189</slash:comments>
		<feedburner:origLink>http://highload.org/post531</feedburner:origLink></item>
		<item>
		<title>NoSQL в мире Twitter</title>
		<link>http://feedproxy.google.com/~r/highload/~3/F-YuOtv4xhE/post523</link>
		<comments>http://highload.org/post523#comments</comments>
		<pubDate>Fri, 26 Mar 2010 04:19:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[СУБД]]></category>
		<category><![CDATA[Cassandra]]></category>
		<category><![CDATA[CouchDB]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[NoSQL]]></category>
		<category><![CDATA[Twitter]]></category>

		<guid isPermaLink="false">http://highload.org/?p=523</guid>
		<description><![CDATA[




NoSQL решения имеют одну общую черту — они в основном спроектированы для горизонтальной масштабируемости. Поэтому неудивительно, что для многих приложений в мире Twitter выбирают хранилища, основанные на NoSQL для их уровня данных.




Здесь представлена коллекция этих приложений из блога MyNoSQL:

Twitter использует Cassandra
MusicTweets использовали Redis – Этот сайт сейчас уже не работает, но вы еще можете почитать [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;"><a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fhighload.org%2Fpost523"><img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fhighload.org%2Fpost523" height="61" width="51" /></a></div><table border="0">
<tbody>
<tr>
<td valign="top"><img class="aligncenter size-full wp-image-524" title="twitter_world" src="http://highload.org/wp-content/uploads/2010/03/twitter_world.jpg" alt="" width="140" /></td>
<td width="10"></td>
<td valign="top">NoSQL решения имеют одну общую черту — они в основном спроектированы для горизонтальной масштабируемости. Поэтому неудивительно, что для многих приложений в мире Twitter выбирают хранилища, основанные на NoSQL для их уровня данных.</td>
</tr>
</tbody>
</table>
<p><span id="more-523"></span></p>
<p>Здесь представлена коллекция этих приложений из блога <a href="http://nosql.mypopescu.com/">MyNoSQL</a>:</p>
<ul>
<li><a href="http://twitter.com/">Twitter</a> <a href="http://highload.org/post393">использует</a> <a href="http://incubator.apache.org/cassandra/">Cassandra</a></li>
<li>MusicTweets <a href="http://rfw.posterous.com/musictweets-a-rediswebsocket-powered-experime">использовали</a> <a href="http://code.google.com/p/redis/">Redis</a> – Этот сайт сейчас уже не работает, но вы еще можете почитать о нем</li>
<li><a href="http://github.com/yssk22/tstore">Tstore</a> использует <a href="http://couchdb.apache.org/">CouchDB</a></li>
<li><a href="http://retwis.antirez.com/">Retwis</a> использует <a href="http://couchdb.apache.org/">CouchDB</a></li>
<li><a href="http://retwisrb.danlucraft.com/">Retwis-RB</a> использует <a href="http://code.google.com/p/redis/">Redis</a> и <a href="http://www.sinatrarb.com/">Sinatra</a>. Sinatra- это не БД хранилище.</li>
<li>Floxee <a href="http://locomotivation.squeejee.com/post/148492725/twitter-apps-sing-on-mongodb">использует</a> <a href="http://www.mongodb.org">MongoDB</a></li>
<li><a href="http://github.com/ieure/Twidoop">Twidoop</a> использует <a href="http://hadoop.apache.org">Hadoop</a></li>
<li><a href="http://git.chris-lamb.co.uk/?p=swordfish.git;a=tree">Swordfish</a> построено на <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a></li>
<li>Tweetarium использует <a href="http://1978th.net/tokyocabinet/">Tokyo Cabinet</a></li>
</ul>
<p style="text-align: right;"><em>Автор статьи: Royans Tharakan<br />
Дата: 23 февраля 2010<br />
</em> <a href="http://www.royans.net/arch/nosql-in-the-twitter-world/"><em>Оригинал статьи</em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://highload.org/post523/feed</wfw:commentRss>
		<slash:comments>5053</slash:comments>
		<feedburner:origLink>http://highload.org/post523</feedburner:origLink></item>
	</channel>
</rss>

