<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Insight IT</title><link>https://www.insight-it.ru/</link><description></description><atom:link href="https://www.insight-it.ru/tag/perl/feed/index.xml" rel="self"></atom:link><lastBuildDate>Sat, 17 May 2008 16:58:00 +0400</lastBuildDate><item><title>YAPC::Russia 2008 May Perl</title><link>https://www.insight-it.ru//event/2008/yapcrussia-2008-may-perl/</link><description>&lt;p&gt;В результате цепочки достаточно случайных факторов сегодня попал на
данное мероприятие, представляющее собой конференцию разработчиков на
&lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;. Пока впечатления еще не улетучились - решил вот
выразить их здесь в словестной форме.
&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;Началось все с того, что мне в голову взбрела достаточно глупая мысль
съездить к 9 утра субботы на лекции в университет, ни о какой
конференции я не знал естественно. Не знаю как я умудрился вовремя
проснуться, но так или иначе я выбрался из дома и отправился в свой ВУЗ,
правда несколько изменив своей традиции делать это на метро - ранним
утром на машине добраться до туда мне можно существенно быстрее, да и
комфортнее. Лекции были по какому-то скучному предмету, так что я решил
прогуляться и наткнулся случайно в коридоре на своего знакомого по имени
Петр Федин, который, как оказалось, участвовал в организации этого
мероприятия. Именно он и поведал мне о проведении в нашем ВУЗе (то есть
ГУ-ВШЭ) конференции &lt;em&gt;"May Perl"&lt;/em&gt;, а также порекомендовал ее посетить.
Собственно говоря в тот момент она только начиналась, и я не нашел
ничего лучше кроме как согласиться, так как возвращаться на лекцию
продолжать читать книжку на телефоне мне явно не хотелось.&lt;/p&gt;
&lt;p&gt;Первые впечатления после попадания в аудиторию, где проводилась
конференция, достаточно своеобразные: достаточно большое количество
людей, там находящихся, состояло из двух групп - одна из них очень
неорганизованно что-то делала в той части аудитории, где обычно
преподаватель находится (как я в итоге понял - это была регистрация на
конференцию), а другая была своеобразной пародией на студентов -
тихо-мирно сидела за партами. Все это сопровождалось массой разного рода
девайсов, валяющихся, казалось бы, где попало: фотоаппараты, камеры,
ноутбуки конечно же в огромном количестве, позабавила лежащая на столе
чья-то кепка с надписью &lt;strong&gt;root&lt;/strong&gt;. Как я понял обстановка вполне
нормальная для подобного рода мероприятий, но я все равно не очень люблю
находиться в подобных скоплениях народа, видимо по-этому я раньше
никогда не присутствовал на конференциях.&lt;/p&gt;
&lt;p&gt;Спустя какое-то время суета закончилась и начался первый доклад. Сразу
хочу сказать, что разработчиком на &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt; я даже примерно не
являюсь. Сталкивался я с этим языком программирования всего дважды:
когда копался в исходниках &lt;a href="/tag/livejournal/"&gt;Livejournal&lt;/a&gt; на предмет
осознавания общих принципов использования в нем
&lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt; и когда недавно тут разбирался с
неправильным определением страны по IP в блоге, скрипт который мне
удалось найти для решения этой задачей был как раз на &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;,
но как надо он не работал - в итоге пришлось заняться доработкой его под
конкретную задачу, не смотря на то, что языка я по сути не знаю и ни
разу на нем ничего полноценно не писал. Первый доклад был достаточно
продолжительным и охватывал серьезную тему асинхронного вывода на
примере библиотеки &lt;strong&gt;IO::Lambda&lt;/strong&gt;, если честно в суть повествования я
вник далеко не сразу, поначалу большая часть моего сознания занималась
тем, что осознавала малознакомый синтаксис. Ближе к концу доклада я
наконец-то смог осознать картину, которая представляла собой по сути
framework для реализации обработчиков различных событий, связанных с
обменом данными. Насколько это эффективно мне судить сейчас сложно, но
подход к программированию достаточно интересный и, возможно, наиболее
рациональный в данном контексте.&lt;/p&gt;
&lt;p&gt;Далее был обзор различных профайлеров для Perl-приложений, по большей
части не очень информативно, скорее просто демонстрация некоторых
решений этой задачи. Из них мне запомнился разве что &lt;strong&gt;kcachegrind&lt;/strong&gt;,
который мне в свое время доводилось совсем чуть-чуть использовать, а
сегодня о нем рассказали несколько новых для меня вещей, а также
показали пару способов визуализировать данные, полученные с помощью
профайлинга.&lt;/p&gt;
&lt;p&gt;Следующим пунктом программы был очень поверхностный рассказ о
&lt;abbr title="Perl Object Environment"&gt;POE&lt;/abbr&gt;. К этому моменту я
уже вполне привык к &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;'у и трудностей с пониманием кода
больше не испытывал, так что понимать было существенно проще. Суть
доклада заключалась в обзоре возможностей, предоставляемым эти
окружением. Оно предоставляет возможность работы приложения как на очень
низком уровне, так и с помощью предоставляемых высокоуровневых
абстракций и framework'ов. Система имеет модульную структуру, основу
которой составляют модули &lt;strong&gt;&lt;abbr title="Perl Object Environment"&gt;POE&lt;/abbr&gt;::Kernel&lt;/strong&gt; и &lt;strong&gt;&lt;abbr title="Perl Object Environment"&gt;POE&lt;/abbr&gt;::Session&lt;/strong&gt;, а
остальные строятся на их базе и позволяют программисту пользоваться
широким предоставляемым набором инструментов для решения задач различной
сложности путем построения логики приложения в виде совокупности
обработчиков событий, вызываемых как вручную так и при взаимодействии с
внешними объектами.&lt;/p&gt;
&lt;p&gt;После этого выступления конференция fork'анулась на две аудитории: в
одной проходил мастер-класс по все тому же
&lt;abbr title="Perl Object Environment"&gt;POE&lt;/abbr&gt; с Иваном Сережкиным
из Яндекс, куда я собственно и пошел, а в другой (как я понял) - обзор
framework'а &lt;strong&gt;Jifty&lt;/strong&gt;. Мастер-класс был достаточно впечатляющим, даже
при том что я ежедневно пользуюсь &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;, я был несколько
удивлен увиденной мной на экране проектора операционной системой: очень
минималистичный оконный менеджер с массой рабочих столов, на которых
располагалось куча приложений, по большей части консольных.
Дополнительное впечатление произвел владелец этой системы, который
пользовался ей на удивление быстро и слаженно. Сам мастер-класс
заключался в реализации средствами &lt;abbr title="Perl Object Environment"&gt;POE&lt;/abbr&gt; на ходу придумываемой задачи, которую на ходу же и меняли по определенным причинам (по большей части благодаря своеобразности организации доступа в интернет в здании). Как и любой нормальный программист, ведущий мастер-класс человек (не знаю как это правильно называется одним словом), в процессе очень активно и эффективно пользовался мануалами, а
также советами и предложениями коллег. Процесс написания кода
сопровождался подробнейшими комментариями, так что даже я прекрасно
понимал что и зачем пишется в данный момент и вообще о чем идет речь.&lt;/p&gt;
&lt;p&gt;Когда первая часть мастер-класса закончилась я поднялся наверх
посмотреть на окончания доклада о &lt;strong&gt;Jifty&lt;/strong&gt;, правда на тот момент
докладчик уже отвечал на вопросы, так что я получил лишь общее
представление о данном продукте. Далее по программе был большой перерыв
на обед, на котором я решил отправиться домой, так как целый час
перерыва слоняться в институте без дела ради еще одного доклада особого
желания не было.&lt;/p&gt;
&lt;p&gt;Конференция продолжится завтра, не знаю соберусь ли я туда съездить,
впрочем свою долю впечатлений и информации я уже определенно получил.
Эта конференция достаточно сильно изменила мое представление о
&lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;, как о языке программирования, причем в лучшую
сторону. Возможно даже она подтолкнет меня изучить его более детально,
правда для этого нужно сначала найти достаточно свободного времени...&lt;/p&gt;
&lt;p&gt;В заключении хочу извиниться за малоинформативный пост, не знаю кому он
вообще может быть интересен, но если вдруг Вы все же дочитали до конца:
&lt;a href="/feed/"&gt;спасибо за внимание!&lt;/a&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sat, 17 May 2008 16:58:00 +0400</pubDate><guid>tag:www.insight-it.ru,2008-05-17:event/2008/yapcrussia-2008-may-perl/</guid><category>IO::Lambda</category><category>Jifty</category><category>kcachegrind</category><category>May Perl</category><category>Perl</category><category>POE</category><category>YAPC</category><category>конференция</category></item><item><title>Архитектура LiveJournal</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-livejournal/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/e53eaf70/" rel="nofollow" target="_blank" title="http://www.livejournal.com"&gt;LiveJournal&lt;/a&gt; был одним из первых сервисов,
бесплатно предоставляющих всем желающим личный блог. Практически с
самого начала своего существования в далеком 1999 году проект столкнулся
с непрерывно растущим потоком желающих воспользоваться услугами сервиса.
Как же проекту удалось справиться с предоставлением маленького кусочка
интернета каждому желающему, обойдя при этом всех конкурентов?
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Возможно Вы ожидали увидеть здесь очередной перевод статьи с
английского, но тогда придется Вас разочаровать, на этот раз я решил
попробовать свои силы в самостоятельном написании статьи на такую
серьезную тему. Просьба особо сильно помидорами в меня не кидаться :)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Основным источником информации послужила &lt;a href="https://www.insight-it.ru/goto/a945bdaf/" rel="nofollow" target="_blank" title="http://video.google.com/videoplay?docid=-8953828243232338732"&gt;презентация Brad Fitzpatrick&lt;/a&gt;
в Токио.&lt;/p&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; (&lt;a href="/tag/debian/"&gt;Debian Sarge&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt; 4.0/4.1 в основном с InnoDB&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/perlbal/"&gt;Perlbal&lt;/a&gt;, веб-сервер и балансировщик нагрузки&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt; для распределенного кэширования&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mogilefs/"&gt;MogileFS&lt;/a&gt;, распределенная файловая система&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/gearman/"&gt;Gearman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/theshwartz/"&gt;TheShwartz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/djabberd/"&gt;djabberd&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;на данный момент 15320315 учетных записей; &lt;em&gt;(10.04.08)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;из них активно используется 551589;&lt;/li&gt;
&lt;li&gt;наиболее активно сервис используется в США и Российской федерации, а
    2/3 пользователей - девушки и женщины;&lt;/li&gt;
&lt;li&gt;более 15 миллионов новых записей в блогах за месяц;&lt;/li&gt;
&lt;li&gt;более 50 миллионов просмотров страниц в день, при пиковой нагрузке -
    несколько тысяч в секунду &lt;em&gt;(сильно устаревшие цифры, 2004 год);&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;связь с внешним миром осуществляется через два BIG-IP (активный + в
    режиме ожидания) с автоматическим восстановлением работоспособности
    в случае сбоя в работе одного из них, защитой от DDoS, L7 набором
    правил, включая TCL;&lt;/li&gt;
&lt;li&gt;более сотни серверов, насчет конфигурации известен только тот факт,
    что практически на каждом сервере установлены огромные объемы
    оперативной памяти (более 12 GB) для эффективного кэширования.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="istoriia"&gt;История&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Все началось с одного обычного сервера. Он выполнял роль как
    веб-сервера так и базы данных. Единственный плюс такого подхода к
    организации работы оборудования - достаточно дешево. Само собой
    достаточно скоро этот сервер перестал справляться с нагрузкой.&lt;/li&gt;
&lt;li&gt;Следующим шагом было разнесение веб-сервера и базы данных на разные
    серверы, всего их получилось два. По прежнему имелось два узла, сбой
    в которых означал недоступность сервиса. По прежнему вычислительная
    мощность такой системы оставалась более чем скромной.&lt;/li&gt;
&lt;li&gt;Первым из тех двух серверов, как ни странно, перестал справляться с
    нагрузкой веб-сервер - докупили еще два. Веб-сервера три, внешний
    IP - один, теперь приходится как-то распределять нагрузку! А как
    добавить еще одну базу данных?&lt;/li&gt;
&lt;li&gt;Новый сервер баз данных был подключен в роли slave к исходному,
    данные в нем обновлялись с помощью репликации, а обрабатывал он
    только операции чтения, оставив все операции записи первому серверу.&lt;/li&gt;
&lt;li&gt;Есть предположения о том, к чему привело дальнейшее добавление новых
    серверов? Правильно - к полнейшему хаосу! Со временем стала
    возникать проблема масштабируемости баз данных. Операции чтения
    производились на каком-то одном сервере, но когда приходил запрос на
    запись данных, так или иначе данные приходилось производить
    обновление на каждом из slave серверов. В итоге выполнение
    синхронизации данных стало занимать подавляющее большинство
    процессорного времени slave серверов, что привело к отсутствию
    возможности продолжать масштабирование просто добавлением
    дополнительных серверов.&lt;/li&gt;
&lt;li&gt;Пришло время задуматься над архитектурой системы и распределением
    операций записи. Основной целью стало избавиться от такой серьезной
    избыточности данных, так как это было практически пустой тратой
    времени копировать одни и те же данные на десяток машин, да еще и с
    RAID на каждой из них.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Наиболее эффективным подходом в такой ситуации является
сегментирование базы данных. Все серверы баз данных разбиваются на
небольшие кластеры. Каждый пользователь системы прозрачно
привязывается к определенному кластеру, таким образом когда он
обновляет свой блог или какие-либо еще данные, запись ведется в
рамках только небольшой группы серверов, такой же принцип справедлив
и для чтения.&lt;/p&gt;
&lt;p&gt;Применительно к LiveJournal эту схему лучше всего демонстрирует один
из слайдов презентации, указанной в источниках информации:
&lt;img alt="Сегментирование базы данных в Livejournal" class="responsive-img" src="https://www.insight-it.ru/images/lj-scheme.jpeg" title="Механизм работы сегментированной базы данных в LiveJournal"/&gt;&lt;/p&gt;
&lt;p&gt;При работе такой системы не используется &lt;code&gt;auto_increment&lt;/code&gt; в
&lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt;, а также используется составной primary key из
номера пользователя и номера записи. Таким образом пространство имен
объектов разбито на группы, соответствующие конкретному
пользователю.&lt;/p&gt;
&lt;p&gt;Дальнейшим развитием решения проблемы излишней избыточности данных
может послужить отказ от кластеров, аналогичных по структуре
исходному для хранения сегментов базы данных. Это может быть как
вариант с общим на несколько серверов хранилищем данных, так и более
низкоуровневая репликация данных средствами &lt;abbr title="Distributed Replicated Block Device"&gt;DRBD&lt;/abbr&gt; в
совокупности с HeartBeat. Каждый из возможных вариантов
кластеризации MySQL имеет массу положительных и отрицательных
сторон, так что конкретного лидера среди них выделить достаточно
сложно. Возможно именно это и подтолкнуло разработчиков построить
собственное решение, комбинируя их с целью получения наилучшего
эффекта.&lt;/p&gt;
&lt;h3 id="programmnoe-obespechenie"&gt;Программное обеспечение&lt;/h3&gt;
&lt;p&gt;В ситуации, когда не удавалось найти готового программного решения для
какой-то конкретной задачи, они не боялись взяться за написание его
самостоятельно, это стало одним из основных компонентов успеха проекта.
Существенная часть программной платформы LiveJournal написана специально
для этого проекта и выпущено под свободной лицензией с открытым исходным
кодом, доступным в &lt;a href="https://www.insight-it.ru/goto/f135e7bd/" rel="nofollow" target="_blank" title="http://code.sixapart.com/"&gt;официальном SVN репозитории&lt;/a&gt;.&lt;/p&gt;
&lt;h4&gt;memcached&lt;/h4&gt;
&lt;p&gt;Залогом быстрой загрузки любой страницы крупного интернет-проекта
является кэширование. Но как всегда возникает вопрос: а на каком уровне
обработки данных его стоит выполнять? Для динамических страниц
недопустимо кэширование на уровне готовых страниц. Можно кэшировать на
уровне &lt;code&gt;mod_perl&lt;/code&gt;, но по сути это пустая трата оперативной памяти, так
как создастся отдельный кэш для каждого потока &lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt;, и
количество промахов мимо кэша будет огромно. Кэширование запросов MySQL
или HEAP таблицы также не дали бы требуемого результата ввиду
чрезвычайной распределенности базы данных.&lt;/p&gt;
&lt;p&gt;Выходом из сложившейся ситуации стало написание собственной
распределенной системы кэширования объектов, получившей название
&lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt;. Она позволяет:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;использовать для кэширования свободную оперативную память
    практически любого компьютера, задействованного в системе;&lt;/li&gt;
&lt;li&gt;кэшировать объекты практически любого языка программирования в
    сериализованном виде: &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;, &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;,
    &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;, &lt;a href="/tag/c/"&gt;C++&lt;/a&gt; и так далее;&lt;/li&gt;
&lt;li&gt;использовать для передачи кэшируемых данных простой протокол, не
    требующий избыточности данных;&lt;/li&gt;
&lt;li&gt;избегать даже теоретической возможности полного сбоя работы
    кэшируещей системы в связи с полной равнозначностью серверов;&lt;/li&gt;
&lt;li&gt;достигать превосходной производительности при формировании HTML-кода
    страниц;&lt;/li&gt;
&lt;li&gt;в разы снизить нагрузку на базы данных в проекте любого масштаба.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Этот продукт на практике оказался более чем эффективен, о чем
свидетельствует его более чем успешное использование во многих
крупнейших веб-проектах.&lt;/p&gt;
&lt;h4&gt;Perlbal&lt;/h4&gt;
&lt;p&gt;При решении вопроса, связанного с балансировкой нагрузки между
веб-серверами, пришлось перепробовать далеко не один десяток готовых
решений, но, к сожалению, ни один из них не смог удовлетворить все
потребности проекта. Не растерявшись, разработчики написали свое решение
этой задачи и назвали его &lt;a href="/tag/perlbal/"&gt;Perlbal&lt;/a&gt;. Конкурентов у него
множество, начиная от решений на уровне оборудования, например от
Foundry, заканчивая proxy балансировщиками нагрузки встроенные в более
популярные веб-сервера, но, тем не менее, продукт получился достаточно
конкурентноспособным. Он удовлетворял всем требованиям, выдвигаемым
разработчиками проекта:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;быстрый;&lt;/li&gt;
&lt;li&gt;небольшой размер;&lt;/li&gt;
&lt;li&gt;"сообразительный";&lt;/li&gt;
&lt;li&gt;обработка "мертвых" узлов;&lt;/li&gt;
&lt;li&gt;может выступать как в роли reverse proxy, так и балансировщика
    нагрузки;&lt;/li&gt;
&lt;li&gt;базовый функционал классического веб-сервера;&lt;/li&gt;
&lt;li&gt;реализация внутреннего перенаправления данных;&lt;/li&gt;
&lt;li&gt;поддержка некоторых менее существенных трюков, реализованных обычно
    в виде plug-in'ов.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="/tag/perlbal/"&gt;Perlbal&lt;/a&gt; не так активно используется вне LiveJournal, по
сравнению с &lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt;, но для решения конкретной
задачи он подошел как нельзя лучше.&lt;/p&gt;
&lt;h4&gt;MogileFS&lt;/h4&gt;
&lt;p&gt;Идея распределенных файловых систем далеко не нова, достаточно вспомнить
лишь &lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt; или любой ее opensource аналог. Сам факт создания
такой системы был очень легок, изначальная версия была написана за одни
выходные, но при доведении ее до требуемого уровня качества пришлось
попотеть. Решение о ее создании было развитием идеи распределения
операций записи. Общая принцип хранения файлов прост: каждый файл в ФС
относится к определенному классу файлов, который определяет все правила
работы с файлом, в основном механизм его реплицирования, об остальном
заботится сама система.&lt;/p&gt;
&lt;p&gt;Как и все файловые системы этого класса,
&lt;acronym title="oMgFileS"&gt;MogileFS&lt;/acronym&gt; работает на уровне
пользовательских приложений и использует достаточно тривиальные протокол
передачи данных и общую архитектуру: клиенты, управляющие серверы,
абстрактные базы данных, сервера для хранения самих данных - в этом
плане ничего нового придумано не было. Доступ к файлам осуществляется с
помощью HTTP-запросов PUT/GET либо через виртуальный NFS-раздел.
Единственной особенностью можно назвать уклон в построение собой
абстрактной прослойки между приложением и собственно кластером базы
данных (в случае LiveJournal - сегмента), используемой в роли
альтернативы более тривиальной master/slave схемы.&lt;/p&gt;
&lt;h4&gt;Gearman&lt;/h4&gt;
&lt;p&gt;&lt;acronym title="manaGer"&gt;Gearman&lt;/acronym&gt; по сути прост до безобразия,
но это не мешает ему быть чрезвычайно эффективным. Возможно Вы уже
догадались в чем суть этого еще одного продукта, написанного специально
для LJ, если уже навели курсор на акроним в начале этого абзаца, если же
нет - поясню: он управляет общей работой системы средствами
клиент-серверной архитектуры и высокопроизводительного бинарного
протокола. С их помощью он способен удаленно вызывать практически любые
процедуры на удаленных серверах с минимальными задержками во времени.
Казалось бы ничего особенного он сам по себе не делает, но на самом деле
он выполняет очень важную функцию: увеличивает степень параллельности
выполнения операций, необходимых для полноценного функционирования
проекта. Единственное &lt;strong&gt;но&lt;/strong&gt; в работе этого механизма заключается в том,
что он не предоставляет никаких гарантий успешности выполнения работ.&lt;/p&gt;
&lt;p&gt;В рамках LiveJournal &lt;acronym title="manaGer"&gt;Gearman&lt;/acronym&gt;
применяется в основном для:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;обработка изображений средствами Image::Magick вне perl-приложений;&lt;/li&gt;
&lt;li&gt;создание pool'а DBI соединений (DBD::Gofer + Gearman);&lt;/li&gt;
&lt;li&gt;уменьшением нагрузки, создаваемой отдельными компонентами системы;&lt;/li&gt;
&lt;li&gt;улучшения субъективного впечатления пользователей о быстродействии
    сервиса, благодаря выполнению части работ параллельно в фоновом
    режиме;&lt;/li&gt;
&lt;li&gt;выполнение блокирующего ресурсы кода отдельно от обработчиков
    различных событий.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;TheShwartz&lt;/h4&gt;
&lt;p&gt;В качестве альтернативы gearman'у для работ, для выполнения которых
необходимы некоторые гарантии успешности, а также некоторая
стабильность, была разработана эта библиотека. Общая схема работы
осталась та же: клиент-серверная, но за стабильность приходится
платить - производительность существенно ниже, возможно возникновение
задержек.&lt;/p&gt;
&lt;p&gt;Хоть эти два продукта и выполняют схожие функции, используются они
обычно в совокупности друг с другом, просто-напросто обрабатывая разные
типы работ.&lt;/p&gt;
&lt;p&gt;Основными сферами применения TheShwartz в LJ являются:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;отправка электронной почты (SMTP клиент);&lt;/li&gt;
&lt;li&gt;LJ Notifications: каждое событие может вызывать за собой цепочку из
    тысяч уведомлений по электронной почте, SMS, XMPP и так далее;&lt;/li&gt;
&lt;li&gt;отправка RPC сообщений внешним сервисам;&lt;/li&gt;
&lt;li&gt;внедрение Atom потоков;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;djabberd&lt;/h4&gt;
&lt;p&gt;Как всегда следуя принципу "чем проще - тем лучше", разработки LJ
написали этот крошечный daemon, лежащий в основе их Jabber/LJTalk. Он
способен спокойно работать с более чем 300 тысячами соединений,
используя очень скромное количество оперативной памяти для поддержания
каждого соединения.&lt;/p&gt;
&lt;p&gt;Основной причиной для написания собственного Jabber-сервера, стало
недостаточная расширяемость и масштабируемость существующих решений.
Была необходимость в реализации многих нестандартных функций, вроде
индивидуальных обработчиков пользовательских изображений и личных
данных, обычно в других решениях было доступно только изменение методов
аутентификации.&lt;/p&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Если перед Вами появилась нетривиальная задача - не бойтесь написать
    программное обеспечение для ее решения самостоятельно! Пускай,
    возможно, это потребует некторых дополнительных усилий, но масса
    преимуществ, связанных с полным соответствием требованиям
    конкретного проекта, превосходит все издержки дополнительной
    разработки.&lt;/li&gt;
&lt;li&gt;Невозможно масштабировать проект просто постоянно добавляя новые
    сервера, рано или поздно все же прийдется задуматься об его
    архитектуре;&lt;/li&gt;
&lt;li&gt;Распределение нагрузок и параллельное операций порой заслуживают
    того, чтобы разработчики обратили на них внимание;&lt;/li&gt;
&lt;li&gt;"Мы ненавидим изобретать колесо! Но тем не менее, если колесо не
    существует или оно квадратное, то мы не боимся изобретать круглое
    колесо." (с)&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 10 Apr 2008 00:24:00 +0400</pubDate><guid>tag:www.insight-it.ru,2008-04-10:highload/2008/arkhitektura-livejournal/</guid><category>Apache</category><category>Debian</category><category>djabberd</category><category>gearman</category><category>Memcached</category><category>MogileFS</category><category>MySQL</category><category>opensource</category><category>Perl</category><category>Perlbal</category><category>TheShwartz</category><category>архитектура</category><category>архитектура LiveJournal</category><category>Масштабируемость</category></item><item><title>Архитектура Amazon</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-amazon/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon&lt;/a&gt; вырос из крошечной книжной лавки в один из
крупнейших магазинов вселенной. Они добились этого благодаря их
инновационному подходу к обзорам, рекомендациям и оценке продукции.-more--&amp;gt;&lt;/p&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Как и &lt;a href="https://www.insight-it.ru/highload/"&gt;многие статьи&lt;/a&gt; об архитектурах высоконагруженных
систем на этом блоге, эта запись представляет собой перевод
&lt;a href="https://www.insight-it.ru/goto/59bb645b/" rel="nofollow" target="_blank" title="http://highscalability.com/amazon-architecture"&gt;статьи&lt;/a&gt;, автором
которой является &lt;a href="https://www.insight-it.ru/goto/f3f1b405/" rel="nofollow" target="_blank" title="http://highscalability.com/user/todd-hoff"&gt;Todd Hoff&lt;/a&gt;.
Источниками информации для оригинала послужили:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/292cd03b/" rel="nofollow" target="_blank" title="http://glinden.blogspot.com/2006/05/early-amazon-end.html"&gt;Ранний Amazon&lt;/a&gt;
    от Greg Linden&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/7a5f17fb/" rel="nofollow" target="_blank" title="http://news.com.com/2100-1001-275155.html"&gt;Как Linux позволил Amazon сэкономить миллионы&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/de1af2aa/" rel="nofollow" target="_blank" title="http://www.se-radio.net/index.php?post_id=157593"&gt;Интервью с Werner Vogels'ом&lt;/a&gt; -
    техническим директором Amazon&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/a27efde/" rel="nofollow" target="_blank" title="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html"&gt;Асинхронные архитектуры&lt;/a&gt; -
    краткий пересказ речи Werner Vogels'а от Cris Loosley&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/5439ba1f/" rel="nofollow" target="_blank" title="http://www.acmqueue.com/modules.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=388"&gt;Познание технологической платформы Amazon&lt;/a&gt; -
    диалог с Werner Vogels&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/bf438042/" rel="nofollow" target="_blank" title="http://www.allthingsdistributed.com/"&gt;Блог Werner Vogels'а&lt;/a&gt; -
    построение масштабируемых распределенных систем&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/oracle/"&gt;Oracle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/c/"&gt;C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mason/"&gt;Mason&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/java/"&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/jboss/"&gt;Jboss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/servlet/"&gt;Сервлеты&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Более чем 55 миллионов учетных записей активных покупателей.&lt;/li&gt;
&lt;li&gt;Более миллиона активных розничных партнеров по всему Миру.&lt;/li&gt;
&lt;li&gt;Для построения страницы осуществляется доступ к 100-150 сервисам.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Что мы на самом деле подразумеваем под словом
    &lt;a href="/tag/masshtabiruemost/"&gt;"масштабируемость"&lt;/a&gt;? Обычно говорят, что
    сервис является масштабируемым, если в случае расширения ресурсов
    системы производительность растет пропорционально. Рост
    производительности обычно означает увеличение количества выполняемых
    в единицу времени работ, но с другой стороны он может означать и
    рост объемов выполняемых работ, например размер обрабатываемых
    наборов данных.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; пришлось претерпеть большое архитектурное
    преобразование в процессе перехода от двух-уровневой монолитной
    системы к полностью распределенной децентрализованной платформе для
    сервисов и приложений.&lt;/li&gt;
&lt;li&gt;Все началось с одного приложения, обменивающегося данными с
    внутренним интерфейсом, написанного на &lt;a href="/tag/c/"&gt;C++&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Оно росло. За годы усилий, направленных на масштабирование,
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; сфокусировался на масштабировании &lt;a href="/tag/bd/"&gt;баз данных&lt;/a&gt; для хранения постоянно растущего объема информации
    о предметах, покупателях, заказах, для поддержки нескольких
    интернациональных сайтов. В 2001 году стало ясно, что исходное
    веб-приложение больше не в состоянии
    &lt;a href="/tag/masshtabiruemost/"&gt;масштабироваться&lt;/a&gt; такими темпами. Базы
    данных были разбиты на маленькие части и для каждой их них был
    построен отдельный &lt;a href="/tag/interfejs/"&gt;интерфейс&lt;/a&gt;, выполненный в виде
    сервиса, который являлся единственным способом получить доступ к
    данным.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/bd/"&gt;Базы данных&lt;/a&gt; стали общим ресурсом, что затрудняло рост
    бизнеса в целом. Интерфейсы, связанные с пользователями и базами
    данных, были сильно ограничены в своей эволюции, так как они
    одновременно использовались множеством разных команд разработчиков и
    процессов.&lt;/li&gt;
&lt;li&gt;Их &lt;a href="/tag/arkhitektura/"&gt;архитектура&lt;/a&gt; тесно связана и построена вокруг
    сервисов. Ориентированная на сервисы архитектура дала им необходимый
    уровень изоляции для построения множества программных компонентов
    быстро и независимо.&lt;/li&gt;
&lt;li&gt;Система выросла до сотен сервисов и не меньшего количества серверов
    приложений, агрегирующих информацию, полученную от сервисов.
    Приложение, генерирующее страницы для
    &lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon.com&lt;/a&gt;, является одним из таких серверов.
    То же самое можно сказать и про приложения, служащие в роли
    интерфейса для Веб-сервисов, сервиса, обслуживающего покупателя,
    интерфейса для продавцов.&lt;/li&gt;
&lt;li&gt;Многие другие &lt;a href="/tag/tekhnologiya/"&gt;технологии&lt;/a&gt; очень трудно
    масштабировать до размеров &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;, особенно
    технологии коммуникационной инфраструктуры. Они отлично работают до
    какого-то предела в размерах системы, а после перестают справляться
    с выполнения своих обязанностей. Именно это подтолкнуло
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; на создание своих
    &lt;a href="/tag/tekhnologiya/"&gt;технологий&lt;/a&gt; в этой области.&lt;/li&gt;
&lt;li&gt;Не ограничиваясь одним конкретным подходом, некоторые части системы
    используют &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;/&lt;a href="/tag/jboss/"&gt;Jboss&lt;/a&gt;, но они являются
    всего лишь &lt;a href="/tag/servlet/"&gt;сервлетами&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/c/"&gt;C++&lt;/a&gt; используется для обработки запросов, в то время как
    &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt; и &lt;a href="/tag/mason/"&gt;Mason&lt;/a&gt; - для составления контента.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; предпочитает не пользоваться промежуточным
    &lt;a href="/tag/po/"&gt;программным обеспечением&lt;/a&gt;, так как оно в большинстве
    случаев является каркасом, а не средством разработки. Если
    используется промежуточное &lt;a href="/tag/po/"&gt;программное обеспечение&lt;/a&gt;, то
    разработчик становится &lt;em&gt;заперт&lt;/em&gt; в использование тех принципов
    разработки, которые выбрал разработчик промежуточного &lt;a href="/tag/po/"&gt;ПО&lt;/a&gt;.
    Если появится необходимость использовать какие-либо другие решения,
    ничего не выйдет - вы заперты. Один и тот же цикл используется для
    обработки всех типов событий: сообщений, задержек в передаче данных,
    &lt;em&gt;AJAX&lt;/em&gt;, и так далее. Слишком громоздко. Если бы промежуточное
    &lt;a href="/tag/po/"&gt;программное обеспечение&lt;/a&gt; было бы доступно в виде более
    мелких компонентов, скорее на правах средства разработки, чем
    каркаса для системы, тогда &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; был бы более
    заинтересован в нем.&lt;/li&gt;
&lt;li&gt;Кажется, что &lt;a href="/tag/soap/"&gt;SOAP&lt;/a&gt; веб стек собирается заново решать все
    те же проблемы распределенных систем.&lt;/li&gt;
&lt;li&gt;Если предложить разработчиком на выбор работу над &lt;a href="/tag/soap/"&gt;SOAP&lt;/a&gt;
    и &lt;a href="/tag/rest/"&gt;REST&lt;/a&gt; веб-сервисами, то только 30% выберут
    &lt;a href="/tag/soap/"&gt;SOAP&lt;/a&gt;, это скорее всего будут разработчики на .NET и
    &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;, привыкшие использовать WSDL файлы для генерации
    интерфейсов удаленных объектов. Оставшиеся 70% выберут
    &lt;a href="/tag/rest/"&gt;REST&lt;/a&gt; - это будут пользователи &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; и
    &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Обе категории разработчиков имеют возможность получить интерфейс к
    объектам &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;. Разработчики заинтересованы просто
    выполнить свою работу, не заботясь о том, что происходит на другом
    конце провода.&lt;/li&gt;
&lt;li&gt;Идея &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; заключалась в построении открытого
    сообщества вокруг своих сервисов. Веб-сервисы были выбраны благодаря
    своей простоте. Но так это выглядит только снаружи. Внутри же
    находится архитектура, ориентированная на сервисы. Доступ к данным
    может быть получен только через соответстыующий
    &lt;a href="/tag/interfejs/"&gt;интерфейс&lt;/a&gt;. Этот процесс описан в WSDL, но они
    используют свои собственные механизмы транспортировки и инкапсуляции
    данных.&lt;/li&gt;
&lt;li&gt;Команды разработчиков очень небольшие и организуются вокруг сервисов&lt;ul&gt;
&lt;li&gt;Сервисы являются независимыми единицами предоставления функционала
в рамках &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Если у разработчика возникает новая бизнес-идея или проблема,
которую ему хотелось бы решить, он собирает команду для ее решения
или реализации. Количество участников ограничено 8-10 людьми.
Команды из такого количества человек обычно называют
&lt;em&gt;пиццерийными&lt;/em&gt;, так как для того, чтобы ее накормить достаточно двух
пицц.&lt;/li&gt;
&lt;li&gt;Команды очень небольшие, но они уполномочены решать поставленную
задачу любыми доступными способами, именно так, как они считают
нужным.
&amp;ndash; В качестве примера задачи, поставленной перед такой командой,
может служить поиск фраз в рамках книги, уникальных для конкретного
текста.
&amp;ndash; Экстенсивное A/B тестирование используется для интеграции новых
сервисов. Они смотрят на произведенное влияние на систему и
выполняют экстенсивные измерения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Развертывание&lt;ul&gt;
&lt;li&gt;Они создают специальную инфраструктуру для управления
зависимостями и развертывания.&lt;/li&gt;
&lt;li&gt;Цель состоит в том, чтобы иметь все необходимые сервисы
развернутыми на новом оборудовании, в том числе код приложений,
системы мониторинга и лицензирования и так далее.&lt;/li&gt;
&lt;li&gt;Результатом развертывания является виртуальная машина, которая
запускается с помощью &lt;strong&gt;EC2&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Работа с покупателями для того, чтобы убедиться, что внедрение нового сервиса того стоит&lt;ul&gt;
&lt;li&gt;Фокусировка на конкретно на тех возможностях, которые планируется
предоставить покупателям&lt;/li&gt;
&lt;li&gt;Разработчики принуждаются работать в первую очередь с упором на
предоставление пользователям новых возможностей, а не на внедрение
новых технологий и уже после этого осознавание того, зачем это
делалось&lt;/li&gt;
&lt;li&gt;Все начинается с пресс-релиза о новых возможностях,
предоставляемых пользователям, а после чего ведется работа по
определению того факта, планировалось ли все же что-то значимое для
пользователей или нет?&lt;/li&gt;
&lt;li&gt;Дизайн должен быть минимален. Простота - залог успеха, когда речь
идет о больших распределенных системах&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Управление состояниями, как основная проблема крупномасштабных систем&lt;ul&gt;
&lt;li&gt;Изнутри они теоретически могут предоставить практически
бесконечный объем дискового пространства.&lt;/li&gt;
&lt;li&gt;Не все, но многие операции имеют состояния. Например, оформление
покупки продукта.&lt;/li&gt;
&lt;li&gt;Сервис отслеживания последних открытых страниц использует
рекомендации, базирующиеся на идентификационных номерах сессий.&lt;/li&gt;
&lt;li&gt;Они следят за всем, так что в любом случае цель вовсе не в
поддержании состояний. Достаточно небольшой набор состояний требует
поддержания с помощью сессий. Сервисы уже хранят всю необходимую
информацию, остается лишь ими воспользоваться.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Три свойства системы или теорема Eric Brewer'а:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Три свойства системы: &lt;em&gt;стабильность, доступность, переносимость
возможных распадений сети&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;В большинстве случаев для любой системы с общими данными
выполняются два свойства из трех&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Возможность разделения:&lt;/em&gt; распределение узлов по небольшим
группам, которые могут иметь доступ к другим группам, но не могут
получить доступ к конкретному произвольному узлу системы&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Стабильность:&lt;/em&gt; запишите какие-либо данные, а затем прочитайте их
же - получите те же самые данные обратно. Для распределенных систем
это далеко не всегда так.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Доступность:&lt;/em&gt; не всегда имеется возможность произвести чтение или
запись каких-либо данных. Система иногда сообщает, что она не может
произвести запись, так как она хочет остаться целостной.&lt;ul&gt;
&lt;li&gt;Для масштабирования системы необходимо разбиение ее на части, что приводит к выбору между стабильностью и доступностью. Необходимо найти некий баланс между ними.&lt;/li&gt;
&lt;li&gt;Выберите определенный подход в соответствии с нуждами сервиса.&lt;/li&gt;
&lt;li&gt;В процессе выбора продуктов приоритет предоставляется доступности: все запросы на добавление товаров в корзину учитываются, так как именно они приносят прибыль. Даже если возникают какие-либо ошибки, они скрываются от покупателя, и разработчики разбираются с ним позже.&lt;/li&gt;
&lt;li&gt;В процессе подтверждения заказа покупателем важна надежность, так как сразу несколько сервисов одновременно используют одни и те же данные: работа с кредитными картами, доставка, составление отчетов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Для того, чтобы строить реально масштабируемые системы, Вам
    необходимо изменить свой склад ума. Вероятностный подход к хаосу
    может принести неплохие результаты. В традиционных системах мы
    представляем себе идеальный мир, где не происходит никаких
    чрезвычайных ситуаций, а затем мы в этом же мире пытаемся построить
    реализацию по-настоящему сложных алгоритмов. При первом же удобном
    случае вся система гарантированно рушится, это реальность, пора бы
    уже к этому привыкнуть. Например, неплохим решением мог бы стать
    подход, использующий быструю перезагрузку и тем самым быстрое
    восстановление работоспособности. При достаточной избыточности
    данных и сервисов этот подход может дать практически 100%
    отказоустойчивость. Необходимо создание самовосстанавливающихся и
    самоорганизующихся операций.&lt;/li&gt;
&lt;li&gt;Создание инфраструктуры, в которой компоненты ничего друг с другом
    не разделяют. Сама инфраструктура может стать общим ресурсом для
    разработки и развертывания с теми же недостатками, что и совместные
    ресурсы в логике и на уровне данных. Это может вызвать запирание и
    блокировку данных. &lt;a href="/tag/arkhitektura/"&gt;Архитектура&lt;/a&gt;, ориентированная
    на сервисы, позволяет создание параллельных изолированных процессов
    разработки, позволяющих масштабировать будущие разработки для
    соответствия темпам роста.&lt;/li&gt;
&lt;li&gt;Откройте систему с помощью собственной API для создания
    экосистемы вокруг Ваших приложений.&lt;/li&gt;
&lt;li&gt;Единственный способ управлять большой распределенной системой -
    разрабатывать ее как можно более простой. Это достигается благодаря
    отсутствию скрытых требований и зависимостей в ее структуре.
    Минимизируйте использование технологий до того уровня, который Вам
    необходим для решения конкретно Ваших проблем и задач. Создание
    дополнительных искуственных и ненужных уровней в системе никогда не
    пойдет ей на пользу.&lt;/li&gt;
&lt;li&gt;Организация вокруг сервисов дает гибкость. Параллельная работа
    возможна, так как на выходе получается сервис. Этот факт резко
    сокращает время, необходимое для выхода на рынок. Построение
    инфраструктуры позволяет сервисам реализовываться очень быстро.&lt;/li&gt;
&lt;li&gt;Определенно будут возникать проблемы со всем, что пускает пыль в
    глаза еще до реальной реализации.&lt;/li&gt;
&lt;li&gt;Для внутреннего управления сервисами стоит использовать SLA.&lt;/li&gt;
&lt;li&gt;Кто угодно может быстро добавлять веб-сервисы к их продукту.
    Достаточно лишь реализовать часть продукта в виде сервиса и начать
    его использовать.&lt;/li&gt;
&lt;li&gt;Построение инфраструктуры производится для обеспечения
    производительности, надежности и контролирования издержек. После ее
    построения Вы никогда не сможете сказать после очередной неудачи,
    что в этом виновата компания &lt;em&gt;Х&lt;/em&gt;. Ваше &lt;a href="/tag/po/"&gt;программное обеспечение&lt;/a&gt; не всегда является более надежным, чем любой
    другой, но зато у Вас появляется возможность быстро устранять
    неполадки и развертывать ее, в отличии от продуктов других компаний.&lt;/li&gt;
&lt;li&gt;Используйте систему оценивания и целенаправленные обсуждения для
    отделения "хорошего" от "плохого". Бывшие сотрудники
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; в своих презентациях неоднократно
    демонстрировали свою глубоко засевшую привычку ставить покупателей
    перед выбором и смотреть какой из вариантов сработает лучшим
    образом, и уже на результатах такого рода тестов строить свои
    решения.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/1a817e43/" rel="nofollow" target="_blank" title="http://www.kaushik.net/avinash/"&gt;Avinash Kaushik&lt;/a&gt; называет это
    избавлением от "гиппопотамов", наиболее высоко оплачиваемых людей.
    Осуществляется оно с помощью A/B тестирований и веб-аналитиков. Если
    у вас есть выбор пути развития, реализуйте оба, позвольте людям ими
    пользоваться, и посмотрите какой из альтернативных результатов
    приведет в лучшим результатам.&lt;/li&gt;
&lt;li&gt;Создайте экономичную культуру. &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; использовал
    двери в роли столов, например.&lt;/li&gt;
&lt;li&gt;Знайте, что Вам необходимо. &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; имеет печальный
    опыт с ранней системой рекомендаций, которая не сработала: "Это было
    не то, что требовалось &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;. Рекомендации книг в
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; требовали работы с разбросанными данными,
    всего лишь несколько рейтингов или покупок. Она должна работать
    быстро. Система должна иметь необходимый
    &lt;a href="/tag/masshtabiruemost/"&gt;масштаб&lt;/a&gt; для работы с массивным количеством
    клиентов и огромным каталогом. Все, что было необходимо: лишь
    усовершенствовать обнаружение книг из глубин каталога, откуда
    читатели не могли достать из самостоятельно."&lt;/li&gt;
&lt;li&gt;Работа в сторонних проектах, просто так как Вы в них заинтересованы,
    часто является намного более продуктивной и инновационной, чем
    просто работа за деньги. Никогда не недооценивайте мощь блуждания в
    той сфере, которая Вам интересна.&lt;/li&gt;
&lt;li&gt;Вовлеките всех в производство еды для собак. Пойдите на склад и
    упаковывайте книги во время рождественской суеты. Это называется
    командной работой.&lt;/li&gt;
&lt;li&gt;Создайте специальный сайт для тестирования нововведений перед
    выпуском их в вольное плавание.&lt;/li&gt;
&lt;li&gt;Непоколебимая, кластеризованная, реплицирующая, распределенная
    файловая система является идеальным решением для хранения данных,
    доступных только для чтения, используемых веб-серверами.&lt;/li&gt;
&lt;li&gt;Предусмотрите способы отменить изменения, если обновление не
    удалось. Если нужно, напишите соответствующие программные средства.&lt;/li&gt;
&lt;li&gt;Переключитесь на глубоко &lt;a href="/tag/soa/"&gt;сервис-ориентированную архитектуру&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Во время интервью обращайте внимание на три критерия: энтузиазм,
    креативность, компетентность. Самым крупным залогом успеха
    &lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon.com&lt;/a&gt; был энтузиазм.&lt;/li&gt;
&lt;li&gt;Наймите Боба, кого-то кто знает свое дело, обладает невероятными
    способностями и знанием системы, и что самое важное, умеет решать
    даже самые невообразимые проблемы просто нырнув в них с головой.&lt;/li&gt;
&lt;li&gt;Инновация может прийти только снизу. Те, кто находится ближе всего к
    проблеме, являются наиболее вероятными людьми, кто смог бы ее
    решить. Любая организация, зависящая от инноваций, должна уметь
    пользоваться хаосом. Лояльность и подчинение - не наш метод.&lt;/li&gt;
&lt;li&gt;Креативность должна лезть из всех щелей.&lt;/li&gt;
&lt;li&gt;У всех должна быть возможность эксперементировать и учиться.
    Позиции, подчинение и традиции не должны играть какой-либо роли. Для
    процветания инновации балом должен править точный расчет.&lt;/li&gt;
&lt;li&gt;Выберите путь инноваций. Перед лицом всей компании, Jeff Bezos может
    дать старый кроссовок Nike в роли награды "Просто сделай это" тому,
    кто привнес инновацию.&lt;/li&gt;
&lt;li&gt;Не платите за производительность. Предоставьте хороший повод задрать
    нос и высокую оплату труда, но оставляйте это простым. Распознать
    выдающуюся работу можно и другими методами. Оплата по заслугам
    звучит неплохо, но в условиях большой организации это практически
    невозможно. Используйте не-денежные награды, такие как тот старый
    кроссовок. Если преподнести это как способ сказать спасибо, кто-то
    оценит.&lt;/li&gt;
&lt;li&gt;Вырастайте быстро. Большие парни вроде Barnes и Nobel у Вас на
    хвосте. &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; не был ни первым, ни вторым, ни даже
    третим книжным магазинам в &lt;a href="/tag/internet/"&gt;Сети&lt;/a&gt;, но их взгляд на
    работу и драйв в итоге позволили им вырваться вперед.&lt;/li&gt;
&lt;li&gt;В дата-центрах персонал проводит только 30% времени в работе над
    вопросами создания инфраструктуры, остальные 70% они проводят за
    размещения поставок тяжелого оборудования, управлением программным
    обеспечением, балансировкой нагрузок, техническими работами,
    изменениями в масштабе и так далее.&lt;/li&gt;
&lt;li&gt;Запретите клиентам прямой доступ к базе данных. Это значит появление
    возможность масштабировать сервис и делать его более надежным не
    вовлекая при этом клиентов. Это очень похоже на возможность Google
    независимо вносить улучшения в части системы, что приводит к
    улучшениям в работе всех остальных ее компонентов.&lt;/li&gt;
&lt;li&gt;Создайте единый универсальный механизм получения доступа к сервисам.
    Это позволяет более легко агрегировать информацию, полученную от
    сервисов, децентрализованно прокладывать маршруты передачи запросов,
    распределенно следить за ними, а также получать доступ к другим
    инфраструктурным механизмам.&lt;/li&gt;
&lt;li&gt;Предоставление свободного доступа ко всем сервисам
    &lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon.com&lt;/a&gt; разработчикам со всех уголков Мира
    также было достаточно значимым компонентом успеха, так как это
    привлекло на порядок больше инноваций, чем они могли надеяться
    построить самостоятельно.&lt;/li&gt;
&lt;li&gt;Разработчики сами знают какими инструментами они владеют лучше
    всего, какие из них делают их наиболее продуктивными.&lt;/li&gt;
&lt;li&gt;Не накладывайте слишком много ограничений на инженеров.
    Предоставляйте стимулы для использования некоторых вещей, например
    интеграцию с системами мониторинга и другими инструментами
    инфраструктуры. Для всего остального старайтесь предоставлять
    возможность командам функционировать максимально независимо.&lt;/li&gt;
&lt;li&gt;Разработчики, они как художники; они делают свою работу лучше всего
    только тогда, когда им предоставляют свободу это делать, но в любом
    случае им требуются качественные инструменты. Имейте много
    вспомогательных инструментов, имеющих само-помогающую природу.
    Поддерживайте окружение вокруг разработки сервисов, которое никогда
    не будет вмешиваться в сам процесс разработки.&lt;/li&gt;
&lt;li&gt;Вы построили это, вы и поддерживаете. Это позволяет разработчикам
    почувствовать повседневную работу их приложения, а также
    предоставляет им постоянный контакт с покупателями.&lt;/li&gt;
&lt;li&gt;Раз в пару лет разработчики должны проводить некоторое время в
    отделе по работе с клиентами. Это позволит им выслушать покупателей,
    ответить на электронные письма, и реально осознать влияние тех
    вещей, которые они реализовали с помощью как технологи.&lt;/li&gt;
&lt;li&gt;Пользуйтесь "голосом покупателя", который являлся бы реалистичной
    историей от покупателя о какой-то конкретной части сайта. Это
    поможет менеджерам и инженерам осознать тот факт, что все эти
    технологии построены для реальных людей. Статистика отдела по работе
    с клиентами является ранним индикатором того, что вы делаете что-то
    не так, а также указывает на то, что реально является болевыми
    точками для ваших покупателей.&lt;/li&gt;
&lt;li&gt;Инфраструктура &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;, подобно &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;,
    является огромным конкурентным преимуществом. Они могут строить
    комплексные приложения на основе примитивных сервисов, которые сами
    по себе просты до безобразия. Они могут независимо масштабировать
    свою работу, поддерживать доступность не распараллеленной системы,
    быстро реализовывать новые сервисы без необходимости массивных
    изменений в конфигурации.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sun, 17 Feb 2008 21:47:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-17:highload/2008/arkhitektura-amazon/</guid><category>Amazon</category><category>C++</category><category>Java</category><category>Jboss</category><category>Linux</category><category>Mason</category><category>online</category><category>Oracle</category><category>Perl</category><category>REST</category><category>Servlet</category><category>SOAP</category><category>архитектура</category><category>архитектура Amazon</category><category>интер информационные технологии</category><category>Масштабируемость</category></item><item><title>Архитектура Flickr</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-flickr/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/f50a76e1/" rel="nofollow" target="_blank" title="http://www.flickr.com"&gt;Flickr&lt;/a&gt; является мировым лидером среди сайтов
размещения фотографий. Перед Flickr стоит впечатляющая задача, они
должны контролировать обширное море ежесекундно обновляющегося контента,
непрерывно пополняющиеся легионы пользователей, постоянный поток новых
предоставляемых пользователям возможностей, а делается все это при
постоянной поддержке отличной производительности. Как же они это
делают?
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Как и предыдущий пост &lt;a href="https://www.insight-it.ru/highload/2008/arkhitektura-google/"&gt;"Архитектура Google"&lt;/a&gt;, этот тоже является
переводом &lt;a href="https://www.insight-it.ru/goto/e7a0ee0d/" rel="nofollow" target="_blank" title="http://highscalability.com/flickr-architecture"&gt;статьи&lt;/a&gt; от
&lt;a href="https://www.insight-it.ru/goto/f3f1b405/" rel="nofollow" target="_blank" title="http://highscalability.com/user/todd-hoff"&gt;Todd'а Hoff'а&lt;/a&gt;. Возможно
читателям &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; был более интересен, но подход Flickr к
масштабируемости тоже более чем заслуживает внимания. Далее привожу
источники информации из оригинальной статьи:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/88014756/" rel="nofollow" target="_blank" title="http://www.niallkennedy.com/blog/uploads/flickr_php.pdf"&gt;Flickr и PHP&lt;/a&gt;
    (ранний документ)&lt;/li&gt;
&lt;li&gt;Планирование нагрузок на LAMP&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/6df1dabf/" rel="nofollow" target="_blank" title="http://www.bytebot.net/blog/archives/2007/04/25/federation-at-flickr-a-tour-of-the-flickr-architecture"&gt;Федерация Flickr: Тур по архитектуре Flickr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/9e0a13a1/" rel="nofollow" target="_blank" title="http://highscalability.com/book-building-scalable-web-sites"&gt;Построение масштабируемых веб-сайтов&lt;/a&gt;
    от Call Handerson'а из Flickr&lt;/li&gt;
&lt;li&gt;История войн баз данных #3: Tim O'Reilly о Flickr&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/d881b0d9/" rel="nofollow" target="_blank" title="http://www.iamcal.com/talks/"&gt;Cal Henderson's Talks&lt;/a&gt; - много
    полезных презентаций&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Сегментирование &lt;em&gt;(прим.: разбиение системы на части, обслуживающие
    каждая свою группу пользователей; называть можно было по-разному, но
    давайте остановимся на этом варианте перевода слова "Shards")&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; для кэширования&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; в качестве обратной-прокси для html и
    изображений&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux"&gt;Linux&lt;/a&gt; (&lt;a href="/tag/redhat/"&gt;RedHat&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/smarty/"&gt;Smarty&lt;/a&gt; в роли шаблонизатора&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;PEAR для парсинга e-mail и XML&lt;/li&gt;
&lt;li&gt;ImageMagick для обработки изображений&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/java/"&gt;Java&lt;/a&gt; для узлового сервиса&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/systemimager/"&gt;SystemImager&lt;/a&gt; для развертывания систем&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/ganglia/"&gt;Ganglia&lt;/a&gt; для мониторинга распределенных систем&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/subcon/"&gt;Subcon&lt;/a&gt; хранит важные системные конфигурационные файлы
    в SVN-репозитории для легкого развертывания на машины в кластере.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/cvsup/"&gt;Cvsup&lt;/a&gt; для распространения и обновления коллекций
    файлов по сети&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Более четырех миллиардов запросов в день&lt;/li&gt;
&lt;li&gt;Примерно 35 миллионов фотографий в кэше &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Около двух миллионов фотографий в оперативной памяти
    &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Всего приблизительно 470 миллионов изображений, каждое представлено
    в 4 или 5 размерах&lt;/li&gt;
&lt;li&gt;38 тысяч запросов к &lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt; (12 миллионов
    объектов)&lt;/li&gt;
&lt;li&gt;2 петабайта дискового пространства&lt;/li&gt;
&lt;li&gt;Более 400000 фотографий добавляются ежедневно&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;p&gt;Симпатичное изображение архитектуры Flickr можно увидеть на &lt;a href="https://www.insight-it.ru/goto/d30e097b/" rel="nofollow" target="_blank" title="http://www.slideshare.net/techdude/scalable-web-architectures-common-patterns-and-approaches/138"&gt;этом слайде&lt;/a&gt;.
Краткое ее описание выглядит следующим образом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Два ServerIron&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; кэши&lt;/li&gt;
&lt;li&gt;Системы хранения NetApp&lt;/li&gt;
&lt;li&gt;Серверы &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; приложений&lt;/li&gt;
&lt;li&gt;Менеджер хранения данных&lt;/li&gt;
&lt;li&gt;Master-master сегменты&lt;/li&gt;
&lt;li&gt;Центральная база данных, структурированная по принципу Dual
Tree&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; кластер&lt;/li&gt;
&lt;li&gt;Поисковая система&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Хранение данных&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Структура Dual Tree является индивидуальным набором модификаций для
&lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt;, позволяющим масштабировать систему путем добавления
новых мастер-серверов без использования кольцевой архитектуры. Эта
система позволяет экономить на масштабировании, так как варианты
мастер-мастер требовали бы удвоенных вложений в оборудование.&lt;/li&gt;
&lt;li&gt;Центральная база данных включает в себя таблицу пользователей,
состоящую из основных ключей пользователей (несколько уникальных
идентификационных номеров) и указатель на сегмент, на котором может быть
найдена остальная информация о конкретном пользователе.&lt;/li&gt;
&lt;li&gt;Использование выделенных серверов для статического контента&lt;/li&gt;
&lt;li&gt;Все, за исключением фотографий, хранится в базе данных&lt;/li&gt;
&lt;li&gt;Отсутствие состояний заключается в том, что в случае необходимости
    они имеют возможность передать пользователей от сервера к серверу,
    что стало намного проще для них после создания своего API&lt;/li&gt;
&lt;li&gt;В основе масштабируемости лежит репликация, но этот факт помогает
    лишь при обработке операций чтения&lt;/li&gt;
&lt;li&gt;Для поиска по определенной части базы данных создается отдельная
    копия этого фрагмента&lt;/li&gt;
&lt;li&gt;Использования горизонтального масштабирования для того чтобы можно
    было проще добавлять новые машины в систему&lt;/li&gt;
&lt;li&gt;Обработка изображений, полученных от пользователей по электронной
    почте, происходит с помощью &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Раньше система страдала от задержек связанных с организацией по
    принципу мастер-слуга. При слишком большой нагрузке они имели одну
    точку, которая теоретически могла дать сбой.&lt;/li&gt;
&lt;li&gt;Им было необходимо иметь возможность проводить технические работы во
    время непрерывной работы сайта, не прекращая его функционирование.&lt;/li&gt;
&lt;li&gt;Были проведены отличные работы по планированию распределения
    дискового пространства, более подробную информацию можно найти по
    ссылкам в разделе "Источники информации".&lt;/li&gt;
&lt;li&gt;Для обеспечения возможности масштабирования в будущем, они пошли по
    федеративному пути развития:&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Сегменты системы:&lt;/em&gt; Мои данные хранятся на моем сегменте, но
запись о Вашем комментарии хранится на Вашем сегменте.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Глобальное кольцо:&lt;/em&gt; Принцип работы схож с DNS, Вам необходимо
знать куда Вы хотите пойти и кто контролирует то место, куда Вы
собираетесь пойти.&lt;/li&gt;
&lt;li&gt;Логика на &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; устанавливает соединение с сегментом и
поддерживает целостность данных (10 строк кода с комментариями!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сегменты:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Срез основной базы данных&lt;/li&gt;
&lt;li&gt;Активная репликация по принципу мастер-мастер: имеет несколько
недостатков в &lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt; 4.1. Автоматическое
инкрементирование идентификационных номеров используется для
поддержания системы в режиме одновременной активности обоих серверов
в паре&lt;/li&gt;
&lt;li&gt;Привязывание новых учетных записей к сегментам системы происходит
случайным образом&lt;/li&gt;
&lt;li&gt;Миграция пользователей проводится время от времени для того, чтобы
избавиться от проблем, связанных с излишне активными пользователями.
Необходима сбалансированность в этом процессе, особенно в случаях с
большим количеством фотографий&amp;hellip; 192 тысячи фотографий, 700 тысяч
тэгов, может занять несколько минут. Миграция выполняется вручную.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Нажатие на &lt;strong&gt;Favorite&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;Получается информация об учетной записи владельца из кэша для
того, чтобы узнать к какому сегменту он привязан (допустим на
shard-5)&lt;/li&gt;
&lt;li&gt;Получается информация о моей учетной записи из кэша, более
конкретно - мой сегмент (например shard-13)&lt;/li&gt;
&lt;li&gt;Начинается "распределенная транзакция" для определения ответов на
вопросы: Кто добавил эту фотографию в избранное? Как изменился
список избранных фотографий?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Подобные вопросы могут задаваться любому сегменту, информация на них
    абсолютно избыточна.&lt;/li&gt;
&lt;li&gt;Для избавления от задержек, связанных с репликацией...&lt;ul&gt;
&lt;li&gt;при каждой загрузке страницы, пользователю предоставляется список
серверов&lt;/li&gt;
&lt;li&gt;если сервер не в состоянии ответить на запрос, запрос переходит к
следующему серверу в списке; если список кончился - выводится
сообщение об ошибке. При этом не используются постоянные соединения,
каждый раз создаются и разрываются новые соединения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Запросы на чтение и запись от каждого пользователя ограничиваются
    рамками одного сегмента. Задержки репликации исчезают из поля зрения
    пользователей.&lt;/li&gt;
&lt;li&gt;Каждый сервер в рамках одного сегмента в обычном состоянии нагружен
    ровно на половину. Выключите половину серверов в каждом сегменте и
    система продолжит функционировать без изменений. Это значит, что
    один сервер внутри сегмента может взять на себя всю нагрузку
    второго, в то время как второй сервер может по каким либо причинам
    быть отключен от системы, например для проведения технических работ.
    Обновление оборудования производится очень просто: отключается
    половина сегмента, она же обновляется, подключается обратно, процесс
    повторяется для оставшейся половины.&lt;/li&gt;
&lt;li&gt;Периоды пиковой нагрузки также нарушают правило 50% нагрузки. В
    такие моменты система получает 6-7 тысяч запросов в секунду, в то
    время как на данный момент система может работать на
    пятидесятипроцентном уровне нагрузки только при четырех тысячах
    запросов в секунду.&lt;/li&gt;
&lt;li&gt;В среднем при загрузке одной страницы выполняется 27-35
    SQL-запросов. Списки избранных фотографий обрабатываются в реальном
    времени, ровно как и доступ через API к базе данных. Все требования
    к нагрузке в реальном времени выполняются без каких-либо
    недостатков.&lt;/li&gt;
&lt;li&gt;Более 36 тысяч запросов в секунду может выполняться не выходя за
    рамки возможностей системы, даже при резком росте трафика.&lt;/li&gt;
&lt;li&gt;Каждый сегмент содержит данные о более чем 400 тысячах
    пользователей.&lt;/li&gt;
&lt;li&gt;Многие данные хранятся в двух местах одновременно. Например,
    комментарий является частью между комментатором и автором
    комментируемого контента. Где его хранить? Как насчет обоих мест?
    Транзакции используются для предотвращения рассинхронизации данных:
    открывается первая транзакция, выполняется запись, открывается
    вторая транзакция, выполняется запись, подтверждается первая
    транзакция если все нормально, после чего вторая подтверждается
    только в случае если первая прошла успешно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Поиск&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Используется два варианта поиска: поиск в рамках сегмента,
поддерживающий до 35 тысяч запросов в секунду, а также проприетарный
веб-поиск от Yahoo!&lt;/li&gt;
&lt;li&gt;В 90% случаев используется система от Yahoo!, за исключением
поиска по тэгу фотографий одного пользователя и массовых изменений
тэгов.&lt;/li&gt;
&lt;li&gt;Эту систему стоит рассматривать как аналог Lucene.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Оборудование&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EMT64 под управлением RHEL 4 с 16 Gb оперативной памяти.&lt;/li&gt;
&lt;li&gt;6 жестких дисков с 15000rpm, объединены в RAID-10.&lt;/li&gt;
&lt;li&gt;Размер для пользовательских метаданных достигает 12 терабайт (это
не включает фотографии, для них цифры существенно больше).&lt;/li&gt;
&lt;li&gt;Используются 2U корпуса.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Резервное копирование данных&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ibbackup выполняется регулярно посредством cron daemon'а, на
каждом сегменте настроен на разное время.&lt;/li&gt;
&lt;li&gt;Каждую ночь делается снимок со всего кластера баз данных.&lt;/li&gt;
&lt;li&gt;Запись или удаление нескольких больших файлов с резервными копиями
одновременно на реплицирующую систему хранения может сильно
сократить производительность системы вцелом на последующие несколько
часов из-за процесса репликации. Выполнение этого на активно
работающей системе хранения фотографий было бы не самой лучшей
идеей.&lt;/li&gt;
&lt;li&gt;Содержание нескольких резервных копий всех Ваших данных требует
существенных материальных затрат, но оно того стоит. Особенно это
актуально для тех ситуаций, когда Вы понимаете, что что-то пошло не
так только спустя несколько дней после того как это случилось, в
таких случаях неплохо иметь, например, резервные копии 1, 3, 10 и
30-дневной давности.&lt;/li&gt;
&lt;li&gt;Фотографии хранятся в системе хранения данных. После загрузки
изображения система выдает различные его размеры, на чем ее работа
заканчивается. Метаданные и ссылки на файловые системы, где
расположены фотографии, хранятся в базе данных.&lt;/li&gt;
&lt;li&gt;Агрегация данных проходит очень быстро, так как она ограничена
пределами сегмента.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_connections = 400&lt;/code&gt; соединений на каждый сегмент, неплохой запас.
Значение для кэша потоков установлено равным 45, так как не бывает
ситуаций когда более 45 пользователей одновременно выполняют
какие-либо действия с одним конкретным сегментом.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Тэги&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Тэги плохо вписываются в традиционную нормализованную схему
реляционной базы данных. Денормализация или активное кэширование -
единственные способы сгенерировать облако меток для сотен миллионов
тэгов в течении миллисекунд.&lt;/li&gt;
&lt;li&gt;Некоторые данные обрабатываются отдельными вычислительными
кластерами, которые сохраняют результаты своей работы в MySQL, так
как иначе вычисление сложных отношений заняло бы все процессорное
время основных серверов баз данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Направления для развития&lt;/h4&gt;
&lt;p&gt;Ускорение работы с помощью создания
организационного плана для непрерывной работы всей системы на уровне
нескольких датацентров, таким образом чтобы все датацентры имели
возможность получать запросы на общий уровень данных (как сами БД,
так и memcache и прочее) все вместе одновременно. Если все части
системы постоянно активны - время простоя оборудования будет сведено
к минимуму.&lt;/p&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Старайтесь думать о своем приложении как о чем-то большем, чем просто
    веб-приложении, тогда у Вас возможно появятся поддержка различных
    API, RSS и Atom ленты и многие другие возможности.&lt;/li&gt;
&lt;li&gt;Отсутствие состояний системы позволяет более легко выполнять
    модернизации не моргнув и глазом.&lt;/li&gt;
&lt;li&gt;Реструктуризация базы данных - не самое лучшее занятие.&lt;/li&gt;
&lt;li&gt;Планирование нагрузок должно проводиться уже на ранних этапах
    развития проекта&lt;/li&gt;
&lt;li&gt;Начинайте медленно. Не покупайте сразу много оборудования просто
    из-за того, что Вы рады/боитесь, что ваш сайт взорвется.&lt;/li&gt;
&lt;li&gt;Измеряйте реально, планирование нагрузок должно базироваться на
    реальных вещах, а не абстрактных.&lt;/li&gt;
&lt;li&gt;Внедряйте ведение логов и индивидуальные измерения для оценки
    реальных показателей на основе серверной статистики, статистика
    использования не менее важна чем серверная.&lt;/li&gt;
&lt;li&gt;Кэширование и оперативная память может стать ответом на все вопросы.&lt;/li&gt;
&lt;li&gt;Создавайте четкие уровни абстракции между работой базы данных,
    бизнес-логикой, логикой страниц, разметкой страниц и презентационным
    уровнем. Это позволяет ускорить циклы итеративной разработки.&lt;/li&gt;
&lt;li&gt;Разделение приложения на уровни позволяет каждому заниматься своим
    делом: разработчики могут строить логику страниц, в то время как
    дизайнеры работают с удобством работы для пользователей.&lt;/li&gt;
&lt;li&gt;Делайте релизы как можно чаще, пускай даже это будет происходить
    каждые полчаса.&lt;/li&gt;
&lt;li&gt;Забудьте о всех небольших эффективных вещах, предварительная
    оптимизация является корнем всего зла в примерно 97% всех случаев.&lt;/li&gt;
&lt;li&gt;Тестируйте в работе. Постройте архитектурные механизмы (флаги
    конфигурации, балансировку нагрузки, и так далее), которые позволят
    Вам разворачивать новое оборудование в (и из) работу.&lt;/li&gt;
&lt;li&gt;Забудьте об искусственных тестах, они годятся только для получения
    общего представления о нагрузках, но не для планирования.
    Искуственные тесты дают искусственные результаты, для настоящих
    тестов все же стоит пользоваться реальным временем выполнения задач.&lt;/li&gt;
&lt;li&gt;Найдите максимальное значения для всех показателей:&lt;ul&gt;
&lt;li&gt;Какой максимум чего-то, что может выполнять каждый сервер?&lt;/li&gt;
&lt;li&gt;Как близко параметр находится к максимуму и каковы тенденции?&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt; (дисковый ввод/вывод?)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; (дисковый ввод/вывод? или процессорное время?)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; (процессорное время? или пропускная способность?)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Старайтесь учесть особенности использования Вашего приложения.&lt;ul&gt;
&lt;li&gt;Возможен ли резкий рост нагрузки, связанный с каким-либо событием?
Например: какое-либо бедствие, или может быть новость?&lt;/li&gt;
&lt;li&gt;Flickr получает на 20-40% больше новых фотографий в первый рабочий
день нового года, чем в любой пик в предыдущем году.&lt;/li&gt;
&lt;li&gt;По воскресеньям нагрузка в среднем на 40-50% выше, чем в любой
другой день недели.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Учтите возможность экспоненциального роста. Больше пользователей
    означает больше контента, больше контента означает больше
    соединений, больше соединений означает более активное использование.&lt;/li&gt;
&lt;li&gt;Планируйте возможные варианты управления работой системы в периоды
    пиковых нагрузок.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 08 Feb 2008 22:41:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-08:highload/2008/arkhitektura-flickr/</guid><category>Apache</category><category>Cvsup</category><category>flickr</category><category>Ganglia</category><category>Java</category><category>Linux</category><category>Memcached</category><category>MySQL</category><category>online</category><category>Perl</category><category>PHP</category><category>RedHat</category><category>shard</category><category>Smarty</category><category>Squid</category><category>Subcon</category><category>SystemImager</category><category>архитектура</category><category>архитектура Flickr</category><category>интернет</category><category>кластер</category><category>Масштабируемость</category><category>сервер</category></item></channel></rss>