<?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/server/feed/index.xml" rel="self"></atom:link><lastBuildDate>Thu, 14 Feb 2008 15:59:00 +0300</lastBuildDate><item><title>Веб-сервер за два вечера</title><link>https://www.insight-it.ru//linux/2008/web-server-za-dva-vechera/</link><description>&lt;p&gt;&lt;img alt="Beastie" class="left" src="https://www.insight-it.ru/images/beastie.png" title="Beastie: The BSD Daemon"/&gt;
Многие из вас наверняка все еще помнят те времена, когда компьютерная
техника находилась лишь на ранней стадии своего развития. Позволить себе
иметь в личном распоряжении персональный компьютер мог далеко не каждый,
а о серверном оборудовании и вовсе не могло быть и речи.&lt;/p&gt;
&lt;p&gt;Но, к счастью, времена меняются, и на сегодняшний день покупка даже
серверного оборудования связана с достаточно скромными затратами,
сопоставимыми с бюджетом покупки настольного компьютера или ноутбука. Но
возникает другой вопрос - а что же с этим оборудованием делать? Вполне
логичным ответом было бы: "использовать по прямому назначению", о чем мы
с Вами сегодня и поговорим в компании с замечательным персонажем по
имени &lt;em&gt;&lt;a href="/tag/beastie/"&gt;Beastie&lt;/a&gt;&lt;/em&gt; и операционной системой
&lt;strong&gt;&lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;&lt;/strong&gt;, с которой он частенько ассоциируется.&lt;/p&gt;
&lt;!--more--&gt;
&lt;p&gt;Под "использованием по прямому назначению" конечно же можно было
подразумевать множество разных применений, но я хотел все-таки
остановиться на варианте использования в роли веб-сервера, как
альтернативу многочисленным услугам по предоставлению shared и VPS
хостинга.&lt;/p&gt;
&lt;h3 id="predistoriia"&gt;Предистория&lt;/h3&gt;
&lt;p&gt;Некоторое время назад ко мне в руки попал простенький сервер, который
как раз предполагалось использовать как хостинг для одного из проектов.
Оставалось лишь сделать его пригодным для выполнения этой задачи.
Казалось бы дело это как минимум не тривиальное, но буквально через пару
дней мне довелось убедиться в обратном.&lt;/p&gt;
&lt;p&gt;Ассортимент оборудования, спрятанного внутри &lt;strong&gt;1U&lt;/strong&gt; корпуса, был вполне
стандартным, ничего особенного: процессор &lt;strong&gt;Intel Xeon 5335&lt;/strong&gt;,
оперативная память &lt;strong&gt;Kingston 2х2 GB ECC Full-buffered&lt;/strong&gt;, жесткий диск
изначально только один - &lt;strong&gt;WD 150 GB 10000rpm SATA&lt;/strong&gt;, а вот модель
материнской платы, к сожалению, на память назвать не могу, вроде что-то
от &lt;strong&gt;SuperMicro&lt;/strong&gt;, с простенькой встроенной видеокартой, сетевой картой
с двумя гигабитными Ethernet портами и встроенным же видимо software
RAID-контроллером. Опытный глаз наверняка заметил бы в этом списке
сильную недоукомплектацию, особенно проявляющуюся при упоминании
процессора в единственном числе, отсутствии RAID, и скромным объемам
оперативной памяти. Объясняется это достаточно просто - проект еще
предстоит тестировать перед запуском, а этой платформы для этого будет
более чем достаточно.&lt;/p&gt;
&lt;p&gt;Перед запуском проекта в открытое плавание естественно предстоит upgrade
оборудования.&lt;/p&gt;
&lt;h3 id="den-pervyi"&gt;День первый&lt;/h3&gt;
&lt;h4&gt;Подготовка&lt;/h4&gt;
&lt;p&gt;Если верить бумажкам, идущим в комплекте с сервером, на единственный
жестком диск в магазине установили демо-версию одной из серверных
операционных систем от одной мало кому известной корпорации. Смотреть
что это за зверь такой у меня особого желания не было, по-этому я не
долго думая пошел искать среди своей коллекции дистрибутивов болванку с
заранее выбранным &lt;a href="/tag/opensource/"&gt;opensource&lt;/a&gt; решением вопроса об
&lt;a href="/tag/os/"&gt;операционной системе&lt;/a&gt; - &lt;strong&gt;&lt;a href="/tag/freebsd/"&gt;FreeBSD 6.2&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Почему выбор пал именно на эту &lt;a href="/tag/os/"&gt;ОС&lt;/a&gt; объяснить не так уж и
просто, но я все же попробую. Выбор был достаточно классический:
&lt;em&gt;&lt;a href="/tag/unix/"&gt;Unix&lt;/a&gt; vs &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;&lt;/em&gt;, возникали еще некоторые
сомнения насчет решений от &lt;em&gt;Sun&lt;/em&gt; в виде &lt;em&gt;Solaris&lt;/em&gt; и &lt;em&gt;OpenSolaris&lt;/em&gt;, но от
них я отказался достаточно быстро в основном из-за более чем скромной
документации и проприетарного происхождения, попутно закрыв глаза на все
положительные отзывы, которые я видел в Сети.&lt;/p&gt;
&lt;p&gt;Так как мне хотелось иметь иметь перед собой &lt;em&gt;конструктор&lt;/em&gt; для сбора
системы именно таким образом, как было бы удобно мне, а не разработчикам
дистрибутива, то список вариантов, выступавших на стороне
&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt; быстро начал сокращаться, начиная с &lt;strong&gt;CentOS&lt;/strong&gt;.
Предпоследним вычеркнутым из списка дистрибутивов &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;
был &lt;strong&gt;Debian&lt;/strong&gt;, что оставило в нем лишь &lt;a href="/tag/gentoo/"&gt;Gentoo Linux&lt;/a&gt;.
Финальный выбор между &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt; и &lt;a href="/tag/gentoo/"&gt;Gentoo&lt;/a&gt;
был сделан уже легче: во-первых, по &lt;a href="https://www.insight-it.ru/linux/2008/gentoo-linux-sony-vaio/"&gt;своему опыту с ноутбуком&lt;/a&gt; я уже понял, что с
&lt;a href="/tag/gentoo/"&gt;Gentoo&lt;/a&gt; предстояло бы немало хлопот, а, во-вторых, в новый
&lt;em&gt;конструктор&lt;/em&gt;, как ни крути, "играть" намного интереснее, чем в старый,
так что долго думать не пришлось :)&lt;/p&gt;
&lt;h4&gt;Установка&lt;/h4&gt;
&lt;p&gt;Найдя наконец диск с &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;, я попытался решить
следующий возникший вопрос: а как же установить операционную систему с
компакт-диска на компьютер, не имеющий соответствующего привода? Так как
сервер был запломбирован и находился на гарантии, вариант частично
разобрать и подключить обычный привод отпал сразу же, ровно как и
вариант с подключением внешнего привода по причине его отсутствия.
Подходящее решение было найдено практически сразу же, благо жесткие
диски подключались по принципу hotswap: вытащив жесткий диск без
развинчивания корпуса, я подключил его к подвернувшемуся под руку
настольному компьютеру, обладающему DVD-приводом. Загрузка прошла
успешно и я приступил к установке, руководствуясь &lt;a href="https://www.insight-it.ru/goto/358a772c/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html"&gt;FreeBSD Handbook&lt;/a&gt;,
пересказывать его особого желания у меня нет, остановлюсь лишь на
некоторых особенностях этого процесса.&lt;/p&gt;
&lt;p&gt;Первым этапом установки, где пришлось задуматься, был &lt;strong&gt;fdisk&lt;/strong&gt;
(разбиение диска на так называемые &lt;em&gt;slice&lt;/em&gt;). Для избежания путаницы для
самого себя, я решил, что размещу рабочие директории http-сервера и базы
данных в &lt;strong&gt;/var&lt;/strong&gt;, которую и выделил в отдельный &lt;em&gt;slice&lt;/em&gt;, занимающий
б&lt;em&gt;о&lt;/em&gt;льшую часть доступного дискового пространства. В ассортимент
доступного при установке программного обеспечения я особо вникать не
стал, так как знал, что у меня всегда будет возможность заняться им
позже, и как следствие этого выбрал что-то очень близкое к стандартному
набору &lt;a href="/tag/po/"&gt;ПО&lt;/a&gt;.
Подтвердив установку и подождав достаточно непродолжительный период
времени, я перезагрузил систему, вытащив установочный диск в процессе.
Установка оказалась на удивление элементарной, что привело к полученной
с первой попытки работоспособной системе. Увидев долгожданное
приглашение к вводу логина и пароля я убедился, что могу
беспрепятственно получить доступ к консоли и сразу же выключил систему,
чтобы перенести жесткий диск обратно на сервер.&lt;/p&gt;
&lt;p&gt;Так как сетевое подключение еще только предстояло настроить, то на
сервер переносить пришлось не только жесткий диск, но и монитор с
клавиатурой. На новом оборудовании все так же прекрасно запустилось, и я
принялся за настройку подключения. Особых проблем не возникло - в
&lt;a href="https://www.insight-it.ru/goto/ecbcc1a6/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#NETWORK-COMMUNICATION"&gt;Handbook&lt;/a&gt;'е
все более чем качественно задокументировано, самым сложным был процесс
выбора драйвера, вернее осознавание того, что он изначально правильно
сам установился. Следующей маленькой проблемой было угадывание какой же
из &lt;em&gt;Ethernet&lt;/em&gt;-портов был только что настроен, и, соответственно,
подключение кабеля именно в него, а не в его соседа. После завершения
всех манипуляций я с радостью обнаружил, что &lt;strong&gt;ping&lt;/strong&gt; от сервера до
gateway'а успешно проходит, что по сути и означало окончание настройки
сетевого подключения.
Следущей целью было избавить себя от необходимости пользоваться
позаимствованными у другого компьютера клавиатурой и монитором. Дело
тоже оказалось достаточно нехитрым, &lt;strong&gt;sshd&lt;/strong&gt; установился и настроился
вполне самостоятельно где-то в процессе установки, от меня потребовалось
лишь создать дополнительного пользователя, написать нехитрую строчку в
&lt;strong&gt;rc.conf&lt;/strong&gt;: &lt;code&gt;sshd_enable="YES"&lt;/code&gt; и собственно запустить daemon'а. Этого
было вполне достаточно, чтобы набрав на своем &lt;a href="/tag/noutbuk/"&gt;ноутбуке&lt;/a&gt;
&lt;strong&gt;ssh&lt;/strong&gt; в консоли, с указанием необходимых параметров, получить
удаленный доступ к серверу по протоколу &lt;strong&gt;SSH&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Решив, что для начала этого будет вполне достаточно, я отправился по
другим делам, так как тот вечер еще даже не успел подойти к своему
завершению.&lt;/p&gt;
&lt;h3 id="den-vtoroi"&gt;День второй&lt;/h3&gt;
&lt;h4&gt;Программное обеспечение&lt;/h4&gt;
&lt;p&gt;Хорошо, вполне работоспособную &lt;a href="/tag/os/"&gt;операционную систему&lt;/a&gt; мы
получили. Осталось снабдить ее необходимым &lt;a href="/tag/po/"&gt;программным обеспечением&lt;/a&gt; для выполнения своих обязанностей, определенных
нами заранее.&lt;/p&gt;
&lt;p&gt;Прежде чем что-либо устанавливать, очень не пожалел, что ознакомился как
с соответствующим &lt;a href="https://www.insight-it.ru/goto/6ffb90d6/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#PORTS"&gt;разделом handbook'a&lt;/a&gt;,
так и с &lt;a href="https://www.insight-it.ru/goto/a3e92771/" rel="nofollow" target="_blank" title="http://www.freebsd.org/ports/"&gt;доступным ассортиментом ПО&lt;/a&gt;.
После этого я перешел-таки собственно к выбору и установке
&lt;a href="/tag/po/"&gt;ПО&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Так как одной из основных составных частей практически любого
    веб-сервера является http-daemon, именно с его выбора я и решил
    начать. Причем начал еще задолго до описываемых событий, вся
    многофункциональность &lt;a href="/tag/apache/"&gt;Apache&lt;/a&gt; мне была не нужна, а
    аналоги &lt;code&gt;mod_auth&lt;/code&gt; и &lt;code&gt;mod_rewrite&lt;/code&gt; есть и в более легких
    http-серверах. Cамо веб-приложение, которое там предполагалось
    располагать, работает по большей части на &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;, так что
    ничего особенного от httpd совсем не требовалось. В итоге финальный
    выбор был между &lt;em&gt;быстрыми&lt;/em&gt; и &lt;em&gt;легкими&lt;/em&gt; вариантами: &lt;strong&gt;&lt;a href="/tag/nginx/"&gt;nginx&lt;/a&gt;&lt;/strong&gt; и &lt;strong&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt;&lt;/strong&gt;, какой-либо весомой причины по которой я выбрал &lt;strong&gt;&lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt;&lt;/strong&gt; с &lt;code&gt;mod\_fastcgi&lt;/code&gt; привести
    не могу, основным фактором был мой некоторый опыт работы с ним в
    прошлом, и отсутствие такового в отношении &lt;strong&gt;&lt;a href="/tag/nginx/"&gt;nginx&lt;/a&gt;&lt;/strong&gt;. Установка
    прошла легко и непринужденно с помощью в сжатые сроки найденного в
    &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;
&lt;a href="https://www.insight-it.ru/goto/14d0519d/" rel="nofollow" target="_blank" title="http://www.cyberciti.biz/faq/howto-setup-lighttpd-fastcgi-php-server/"&gt;мануала&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Другим немаловажным компонентом сервера является &lt;strong&gt;ftpd&lt;/strong&gt;, как
    известно используемый для передачи файлов. Собственно говоря, если
    активное его использование не планируется, то особого значения какой
    именно сервер будет использоваться значения не имеет: любой из
    доступных устанавливается настраивается в пару простых шагов без
    каких-либо проблем (если это имеет значение - я выбрал &lt;strong&gt;vsftpd&lt;/strong&gt;,
    так как мне уже далеко не один раз доводилось его настраивать на
    домашних компьютерах, и, как следствие, даже инструкция не
    понадобилась). Но при потенциальной возможности работы через
    Интернет, этот протокол является достаточно уязвимым, так как не
    использует никакого шифрования. Эта проблема решается с помощью
    механизма &lt;em&gt;FTP over SSH&lt;/em&gt;, который представляет собой использование
    &lt;strong&gt;SSH&lt;/strong&gt; в роли туннеля для передачи файлов по &lt;strong&gt;FTP&lt;/strong&gt;. О том, как
    воспользоваться этим механизмом вам подскажет &lt;strong&gt;man ssh&lt;/strong&gt;,
    какой-либо дополнительной конфигурации он не требует, разве что
    настройки соответствующим образом firewall'а, но об этом я расскажу
    позже.&lt;/li&gt;
&lt;li&gt;Сам &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; установлен последней доступной в
    &lt;a href="https://www.insight-it.ru/goto/a3e92771/" rel="nofollow" target="_blank" title="http://www.freebsd.org/ports/"&gt;ports&lt;/a&gt; версии и , как уже
    упоминалось, был подключен к &lt;a href="/tag/lighttpd/"&gt;lighttpd&lt;/a&gt; с помощью
    &lt;code&gt;mod_fastcgi&lt;/code&gt;, какой-либо дополнительной конфигурации с моей
    стороны не потребовалось, я разве что выбрал список модулей (в
    общем-то тоже занятие не сложное, достаточно лишь осознавать какие
    именно используются, плюс я еще решил
    &lt;strong&gt;&lt;a href="https://www.insight-it.ru/goto/41a25ac6/" rel="nofollow" target="_blank" title="http://www.hardened-php.net/suhosin/"&gt;Suhosin&lt;/a&gt;&lt;/strong&gt; установить) и
    просто просмотрел по диагонали все конфиги (в основном сам
    &lt;strong&gt;php.ini&lt;/strong&gt; и &lt;strong&gt;lighttpd.conf&lt;/strong&gt;) на предмет их соответствия
    потребностям моего приложения. Отдельная история возникла с лишь
    одним модулем - &lt;em&gt;&lt;a href="/tag/blitz/"&gt;Blitz&lt;/a&gt;&lt;/em&gt;, который на данный момент все
    еще отсутствует в репозиториях как &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;, так и
    подавляющего большинства (если не всех) дистрибутивов
    &lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;. Его пришлось устанавливать вручную из
    исходников по &lt;a href="https://www.insight-it.ru/goto/1e985790/" rel="nofollow" target="_blank" title="http://alexeyrybak.com/blitz/blitz_ru.html#install_config.install"&gt;соответствующему мануалу&lt;/a&gt;,
    что правда тоже дело не хитрое и заняло всего несколько минут.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt;&lt;/strong&gt; особо выбирать не пришлось - приложение
    написано было с расчетом на &lt;strong&gt;&lt;a href="/tag/postgresql/"&gt;PostrgeSQL&lt;/a&gt;&lt;/strong&gt;, ее
    соответственно и прикручивал к &lt;strong&gt;&lt;a href="/tag/php/"&gt;PHP&lt;/a&gt;.&lt;/strong&gt; Этот этап был
    пожалуй одним из самых проблематичных, так как сразу после
    классического &lt;code&gt;make install clean&lt;/code&gt; соответствующий daemon
    запускаться отказался. Какого-либо осознанного сообщения об ошибке
    &lt;code&gt;/usr/local/etc/rc.d/postgresqld start&lt;/code&gt; не выводило как в консоль,
    так и в логи, но тем не менее консольный клиент &lt;strong&gt;psql&lt;/strong&gt; и само
    веб-приложение жаловались на отсутствие запущенной
    &lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt;. Этот факт сильно затруднял поиск возможных
    вариантов решения на просторах &lt;a href="/tag/internet/"&gt;Сети&lt;/a&gt;, так что не
    найдя ничего полезного я решил заняться диагностикой проблемы и
    поиском решения для нее самостоятельно. Методом проб и ошибок,
    перебрав множество возможных вариантов запуска daemon'а, я пришел к
    выводу, что у пользователя от имени которого он должен был
    запускаться явно проблемы с доступом к файловой системе. Видимо так
    получилось из-за нестандартного расположения самой базы данных - в
    директории &lt;strong&gt;/var&lt;/strong&gt;. Не смотря на тот факт, что &lt;strong&gt;chown&lt;/strong&gt; и
    &lt;strong&gt;chmod&lt;/strong&gt; были использованы по прямому назначению в отношении
    соответствующих директорий для установления прав доступа. В итоге
    оказалось, что директория указанная для этого пользователя как
    домашняя (по памяти пишу, могу ошибиться, но вроде
    &lt;strong&gt;/usr/local/pgsql&lt;/strong&gt;) по каким-то причинам не создалась и
    соответственно именно этот факт и мешал запуску daemon'а.
    Восстановив справедливость в отношении этого пользователя, я
    обнаружил, что &lt;strong&gt;&lt;a href="/tag/postgresql/"&gt;PostrgeSQL&lt;/a&gt;&lt;/strong&gt; успешно
    запустился-таки, а мое приложение тоже стало функционировать именно
    так, как ему было положено. Проверив содержимое соответствующего
    конфига, я решил его больше не трогать, а то как говорится
    "premature optimization is the root of all evil"&amp;amp;copyright;. За
    компанию решил установить веб-интерфейс к
    &lt;a href="/tag/postgresql/"&gt;PostrgeSQL&lt;/a&gt; - &lt;strong&gt;phppgadmin&lt;/strong&gt;. Собравшись из
    &lt;a href="https://www.insight-it.ru/goto/a3e92771/" rel="nofollow" target="_blank" title="http://www.freebsd.org/ports/"&gt;портов&lt;/a&gt;, он повел себя как-то не
    очень адекватно, совсем не так каким я привык его видеть у себя на
    &lt;a href="/tag/noutbuk/"&gt;ноутбуке&lt;/a&gt;, разбираться в причинах было не охота -
    простое копирование и замена соответствующей директории по &lt;em&gt;ftp&lt;/em&gt;
    буквально за минуту решило проблему.&lt;/li&gt;
&lt;li&gt;Вариантов фильтров сетевого трафика в &lt;a href="/tag/freebsd/"&gt;FreeBSD&lt;/a&gt;
    имеется предостаточно:
    &lt;a href="https://www.insight-it.ru/goto/b7a4c2f7/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-PF"&gt;pf&lt;/a&gt;,
    &lt;a href="https://www.insight-it.ru/goto/963bd5ec/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPF"&gt;ipf&lt;/a&gt;,
    &lt;a href="https://www.insight-it.ru/goto/aee50277/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#FIREWALLS-IPFW%22"&gt;ipfw&lt;/a&gt;.
    Опыта работы ни с одним из них у меня не было, так что выбор
    происходил из достаточно субъективных критериев - очевидности
    принципов работы правил и достаточности документации. Так как я был
    уверен, что каждый из них сможет обеспечить достаточный уровень
    безопасности, основываясь на указанных выше критериях в итоге я
    выбрал &lt;strong&gt;ipf&lt;/strong&gt;. Документация позволила легко и непринужденно все
    установить и настроить, правда за компанию пришлось разбираться и с
    &lt;a href="https://www.insight-it.ru/goto/420d629d/" rel="nofollow" target="_blank" title="http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/book.html#KERNELCONFIG"&gt;пересборкой ядра&lt;/a&gt;.
    В качестве базы для построения собственного списка правил я
    использовал приведенный все там же, в документации, пример. Само
    собой пришлось доработать его под конкретную систему, но методом
    проб и ошибок эта задача выполняется достаточно быстро &lt;em&gt;(будте
    осторожны с 22 портом, используемым для SSH - очень легко на этом
    этапе случайно заблокировать самому себе доступ к серверу)&lt;/em&gt;.
    Получившийся в итоге список правил приводить не буду, так как его
    еще предстоит довести до ума на активно работающей системе.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="zakliuchenie"&gt;Заключение&lt;/h3&gt;
&lt;p&gt;Не прошло и двух дней, как из простого набора оборудования получился
вполне готовый к работе веб-сервер, конечно же доводить до ума его
придется еще достаточно долго, но просто стабильно работать он был в
состоянии уже тогда. Дальше его отвезли в место постоянного его
прибывания, подключили к более-менее приличному интернет-каналу, с моей
стороны при этом потребовалось лишь слегка поменять настройки сетевого
подключения, и вот - он уже доступен из Сети. Практически сразу
же обнаружился один мой недочет в плане выбора &lt;a href="/tag/po/"&gt;ПО&lt;/a&gt; - буквально
в первую же ночь после открытия публичного доступа к серверу нашлась
масса желающих попытаться подобрать по словарю логин и пароль для
доступа к серверу по SSH, но он был открыт лишь для одной учетной
записи, у которой было мягко говоря нестандартное имя пользователя, даже
его никто за ночь не смог угадать, а до более чем 20-символьного пароля
дело так и не дошло. На следующее утро я, не долго думая, установил
программу под названием &lt;strong&gt;&lt;a href="https://www.insight-it.ru/goto/d4707261/" rel="nofollow" target="_blank" title="http://www.freebsd.org/cgi/url.cgi?ports/security/sshguard/pkg-descr"&gt;sshguard&lt;/a&gt;&lt;/strong&gt;, которая сразу же предотвратила все последующие попытки подобным образом издеваться над сервером. Дальше надо было настроить запись на
DNS-сервере для ассоциации домена с IP нашего сервера, настроить почту,
закончить работу над самим веб-приложением и много чего еще, но это уже
совсем другая история.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 14 Feb 2008 15:59:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-14:linux/2008/web-server-za-dva-vechera/</guid><category>Beastie</category><category>FreeBSD</category><category>lighttpd</category><category>PostgreSQL</category><category>Unix</category><category>веб-сервер</category><category>операционная система</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><item><title>Архитектура Google</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-google/</link><description>&lt;p&gt;&lt;em&gt;Эта статья датируется 2008 годом, новая версия: &lt;a href="https://www.insight-it.ru/highload/2011/arkhitektura-google-2011/"&gt;Архитектура Google 2011&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="/tag/google/"&gt;Google&lt;/a&gt;&lt;/strong&gt; - Король масштабируемости.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Каждый хоть раз слышал о &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; благодаря их
всеобъемлющему, "умному" и быстрому поисковому сервису, но ни для кого
не секрет, что они не ограничиваются только им. Их платформа для
построения масштабируемых приложений позволяет выпускать множество
удивительно конкурентноспособных интернет-приложений, работающих на
уровне всего Интернета вцелом. Они ставят перед собой цель постоянно
строить все более и более производительную и масштабируемую архитектуру
для поддержки своих продуктов. Как же им это удается?
&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/goto/31bfd110/" rel="nofollow" target="_blank" title="http://highscalability.com/google-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;. Оригинал написан приблизительно в середине 2007 года, но по-моему до сих пор очень даже актуально.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Далее следует перечисление источников информации из оригинала:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/741bec4c/" rel="nofollow" target="_blank" title="http://video.google.com/videoplay?docid=-5699448884004201579"&gt;Video: Построение больших систем в Google&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/fae0d413/" rel="nofollow" target="_blank" title="http://labs.google.com/papers/gfs.html"&gt;Google Lab: Файловая система Google (GFS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/39138d08/" rel="nofollow" target="_blank" title="http://labs.google.com/papers/mapreduce.html"&gt;Google Lab: MapReduce: упрощенная обработка данных на больших кластерах&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/8667b351/" rel="nofollow" target="_blank" title="http://labs.google.com/papers/bigtable.html"&gt;Google Lab: BigTable.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/dab5470e/" rel="nofollow" target="_blank" title="http://video.google.com/videoplay?docid=7278544055668715642"&gt;Video: BigTable: система распределенного хранения данных.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/87fff9b2/" rel="nofollow" target="_blank" title="http://www.baselinemag.com/article2/0,1540,1985514,00.asp"&gt;Как работает Google&lt;/a&gt;
    от David Carr в Baseline Magazine.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/a426f3de/" rel="nofollow" target="_blank" title="http://labs.google.com/papers/sawzall.html"&gt;Google Lab: интерпретирование данных. Параллельный анализ с помощью Sawzall.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/ed8bca67/" rel="nofollow" target="_blank" title="http://www.25hoursaday.com/weblog/2007/06/25/GoogleScalabilityConferenceTripReportMapReduceBigTableAndOtherDistributedSystemAbstractionsForHandlingLargeDatasets.aspx"&gt;Записи с конференции по масштабированию от Dare Obasonjo.&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/python/"&gt;Python&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;/ul&gt;
&lt;h3 id="chto-vnutri"&gt;Что внутри?&lt;/h3&gt;
&lt;h4&gt;Статистика&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;На 2006 год система включала в себя 450000 недорогих серверов&lt;/li&gt;
&lt;li&gt;За 2005 год было проиндексировано 8 миллиардов страниц. На данный
    момент&amp;hellip; кто знает?&lt;/li&gt;
&lt;li&gt;На момент написания оригинала Google включает в себя более 200
    &lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt; кластеров. Один кластер может состоять из 1000 или
    даже 5000 компьютеров&lt;/li&gt;
&lt;li&gt;Десятки и сотни тысяч компьютеров получают данные из &lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;
    кластеров, которые насчитывают более 5 петабайт дискового
    пространства. Суммарные пропускная способность операций записи и
    чтения между дата центрами может достигать 40 гигабайт в секунду&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt; позволяет хранить миллиарды ссылок (URL),
    сотни терабайт снимков со спутников, а также настройки миллионов
    пользователей&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;// Цифры не первой свежести конечно, но тоже неплохо.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;Стек&lt;/h4&gt;
&lt;p&gt;&lt;a href="/tag/google/"&gt;Google&lt;/a&gt; визуализирует свою инфраструктуру в виде
трехслойного стека:&lt;/p&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; &lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;,
    &lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt; и &lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Вычислительные платформы:&lt;/em&gt; множество компьютеров во множестве
    датацентров&lt;/li&gt;
&lt;li&gt;Легкое развертывание для компании при низком уровне издержек&lt;/li&gt;
&lt;li&gt;Больше денег вкладывается в оборудование для исключения возможности
    потерь данных&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Надежное хранение данных с помощью &lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Надежное масштабируемое хранение данных крайне необходимо для любого
    приложения. &lt;strong&gt;GFS&lt;/strong&gt; является основой их платформы хранения
    информации&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;&lt;/strong&gt; - большая распределенная файловая система, способная хранить и обрабатывать огромные объемы информации&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;em&gt;Зачем строить что-либо самим вместо того, чтобы просто взять это с полки?&lt;/em&gt; Они контролируют абсолютно всю систему и именно эта платформа отличает их от всех остальных.&lt;/p&gt;
&lt;p&gt;Она предоставляет:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;высокую надежность дата центров&lt;/li&gt;
&lt;li&gt;масштабируемость до тысяч сетевых узлов
&amp;ndash; высокую пропускную способность операций чтения и записи&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;p&gt;В системе существуют мастер-сервера и сервера, собственно хранящие
    информацию:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Мастер-сервера хранят метаданные для всех файлов. Сами данные
    хранятся блоками по 64 мегабайта на остальных серверах. Клиенты
    могут выполнять операции с метаданными на мастер-серверах, чтобы
    узнать на каком именно сервере расположены необходимые данные.&lt;/li&gt;
&lt;li&gt;Для обеспечения надежности один и тот же блок данных хранится
    в трех экземплярах на разных серверах, что обеспечивает
    избыточность на случай сбоев в работе какого-либо сервера.&lt;/li&gt;
&lt;li&gt;Новые приложения могут пользоваться как существующими
    кластерами, так и новыми, созданными специально для них.&lt;/li&gt;
&lt;li&gt;Ключ успеха заключается в том, чтобы быть уверенными в том,
    что у людей есть достаточно вариантов выбора для реализации их
    приложений. &lt;strong&gt;&lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;&lt;/strong&gt; может быть настроена для
    удовлетворения нужд любого конкретного приложения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Работаем с данными при помощи MapReduce&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Теперь, когда у нас есть отличная система хранения, что же делать с
    такими объемами данных? Допустим, у нас есть много терабайт данных,
    равномерно распределенных между 1000 компьютерами. Коммерческие базы
    данных не могут эффективно масштабироваться до такого уровня, именно
    в такой ситуации в дело вступает технология
    &lt;strong&gt;&lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt;&lt;/strong&gt; является программной моделью и
    соответствующей реализацией обработки и генерации больших наборов
    данных. Пользователи могут задавать функцию, обрабатывающую пары
    ключ/значение для генерации промежуточных аналогичных пар, и
    сокращающую функцию, которая объединяет все промежуточные значения,
    соответствующие одному и тому же ключу. Многие реальные задачи могут
    быть выражены с помощью этой модели. Программы, написанные в таком
    функциональном стиле автоматически распараллеливаются и адаптируются
    для выполнения на обширных кластерах. Система берет на себя детали
    разбиения входных данных на части, составления расписания выполнения
    программ на различных компьютерах, управления ошибками, и
    организации необходимой коммуникации между компьютерами. Это
    позволяет программистам, не обладающим опытом работы с параллельными
    и распределенными системами, легко использовать все ресурсы больших
    распределенных систем.&lt;/li&gt;
&lt;li&gt;Зачем использовать &lt;strong&gt;&lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt;&lt;/strong&gt;?
    &amp;ndash; Отличный способ распределения задач между множеством компьютеров
    &amp;ndash; Обработка сбоев в работе
    &amp;ndash; Работа с различными типами смежных приложений, таких как поиск или
    реклама. Возможно предварительное вычисление и обработка данных,
    подсчет количества слов, сортировка терабайт данных и так далее
    &amp;ndash; Вычисления автоматически приближаются к источнику ввода-вывода&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt;&lt;/strong&gt; использует три типа серверов:&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Master:&lt;/em&gt; назначают задания остальным типам серверов, а также
следят за процессом их выполнения&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Map:&lt;/em&gt; принимают входные данные от пользователей и обрабатывают
их, результаты записываются в промежуточные файлы&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Reduce:&lt;/em&gt; принимают промежуточные файлы от Map-серверов и
сокращают их указанным выше способом&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Например, мы хотим посчитать количество слов на всех страницах. Для
    этого нам необходимо передать все страницы, хранимые в &lt;strong&gt;GFS&lt;/strong&gt;, на
    обработку в &lt;strong&gt;MapReduce&lt;/strong&gt;. Этот процесс будет происходить на тысячах
    машин одновременно с полной координацией действий, в соответствии с
    автоматически составленным расписанием выполняемых работ, обработкой
    потенциальных ошибок, и передачей данных выполняемыми автоматически.&lt;ul&gt;
&lt;li&gt;Последовательность выполняемых действий выглядела бы следующим
образом: &lt;code&gt;GFS &amp;rarr; Map &amp;rarr; перемешивание &amp;rarr; Reduce &amp;rarr; запись результатов обратно в GFS&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Технология &lt;strong&gt;MapReduce&lt;/strong&gt; состоит из двух компонентов:
соответственно &lt;em&gt;map&lt;/em&gt; и &lt;em&gt;reduce&lt;/em&gt;. Map отображает один набор данных в
другой, создавая тем самым пары ключ/значение, которпыми в нашем
случае являются слова и их количества.&lt;/li&gt;
&lt;li&gt;В процессе перемешивания происходит агрегирование типов ключей.&lt;/li&gt;
&lt;li&gt;Reduction в нашем случае просто суммирует все результаты и
возвращает финальный результат.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;В процессе индексирования &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; подвергает поток
    данных обработке около 20 разных механизмов сокращения. Сначала идет
    работа над всеми записями и агрегированными ключами, после чего
    результат передается следующему механизму и второй механизм уже
    работает с результатами работы первого, и так далее.&lt;/li&gt;
&lt;li&gt;Программы могут быть очень маленькими, всего лишь от 20 до 50 строк
    кода.&lt;/li&gt;
&lt;li&gt;Единственной проблемой могут быть "отстающие компьютеры". Если один
    компьютер работает существенно медленнее, чем все остальные, это
    будет задерживать работу всей системы в целом.&lt;/li&gt;
&lt;li&gt;Транспортировка данных между серверами происходит в сжатом виде.
    Идея заключается в том, что ограничивающим фактором является
    пропускная способность канала и ввода-вывода, что делает резонным
    потратить часть процессорного времени на компрессию и декомпрессию
    данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Хранение структурированных данных в BigTable&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BigTable&lt;/strong&gt; является крупномасштабной, устойчивой к потенциальным
    ошибкам, самоуправляемой системой, которая может включать в себя
    терабайты памяти и петабайты данных, а также управлять миллионами
    операций чтения и записи в секунду.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BigTable&lt;/strong&gt; представляет собой распределенный механизм хэширования,
    построенный поверх &lt;strong&gt;&lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;&lt;/strong&gt;, а вовсе не реляционную базу
    данных и, как следствие, не поддерживает &lt;a href="/tag/sql/"&gt;SQL&lt;/a&gt;-запросы и
    операции типа Join.&lt;/li&gt;
&lt;li&gt;Она предоставляет механизм просмотра данных для получения доступа к
    структурированным данным по имеющемуся ключу. &lt;strong&gt;&lt;a href="/tag/gfs/"&gt;GFS&lt;/a&gt;&lt;/strong&gt;
    хранит данные не поддающиеся пониманию, хотя многим приложениям
    необходимы структурированные данные.&lt;/li&gt;
&lt;li&gt;Коммерческие базы данных попросту не могут масштабироваться до
    такого уровня и, соответственно, не могут работать с тысячами машин
    одновременно.&lt;/li&gt;
&lt;li&gt;С помощью контролирования своих низкоуровневых систем хранения
    данных, &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; получает больше возможностей по
    управлению и модификации их системой. Например, если им понадобится
    функция, упрощающая координацию работы между датацентрами, они
    просто могут написать ее и внедрить в систему.&lt;/li&gt;
&lt;li&gt;Подключение и отключение компьютеров к функционирующей системе никак
    не мешает ей просто работать.&lt;/li&gt;
&lt;li&gt;Каждый блок данных хранится в ячейке, доступ к которой может быть
    предоставлен как по ключу строки или столбца, так и по временной
    метке.&lt;/li&gt;
&lt;li&gt;Каждая строка может храниться в одной или нескольких таблицах.
    Таблицы реализуются в виде последовательности блоков по 64
    килобайта, организованных в формате данных под названием
    &lt;strong&gt;SSTable&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;В &lt;strong&gt;&lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt;&lt;/strong&gt; тоже используется три типа серверов:&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Master:&lt;/em&gt; распределяют таблицы по Tablet-серверам, а также следят
за расположением таблиц и перераспределяют задания в случае
необходимости.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Tablet:&lt;/em&gt; обрабатывают запросы чтения/записи для таблиц. Они
разделяют таблицы, когда те превышают лимит размера (обычно 100-200
мегабайт). Когда такой сервер прекращает функционирование по
каким-либо причинам, 100 других серверов берут на себя по одной
таблице и система продолжает работать как-будто ничего не произошло.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Lock:&lt;/em&gt; формируют распределенный сервис ограничения одновременного
доступа. Операции открытия таблицы для записи, анализа
Master-сервером или проверки доступа должны быть
взаимоисключающими.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Локальная группировка может быть использована для физического
    хранения связанных данных вместе, чтобы обеспечить лучшую
    локализацию ссылок на данные.&lt;/li&gt;
&lt;li&gt;Таблицы по возможности кэшируются в оперативной памяти серверов.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="oborudovanie"&gt;Оборудование&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Как эффективно организовать большую группу компьютеров с точки
    зрения издержек и производительности?&lt;/li&gt;
&lt;li&gt;Используется самое обыкновенное ультра-дешевое оборудование и поверх
    него строится программное обеспечение, способное спокойно пережить
    смерть любой части оборудования.&lt;/li&gt;
&lt;li&gt;Тысячекратный рост вычислительной мощности может быть достигнут с
    издержками в 33 раза меньшими, если воспользоваться толерантной к
    сбоям инфраструктурой, по сравнению с инфраструктурой, построенной
    на высоконадежных компонентах. Надежность строится поверх ненадежных
    компонентов.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;, домашнее размещение серверов, материнские платы
    предназначенные для персональных компьютеров, дешевые средства
    хранения данных.&lt;/li&gt;
&lt;li&gt;Цена за каждый ватт энергии в расчете на производительность не
    становится меньше, что ведет к большим проблемам связанным с
    энергообеспечением и охлаждением.&lt;/li&gt;
&lt;li&gt;Использование совместного размещения в своих и арендуемых
    датацентрах.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="raznoe"&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;
&lt;h3 id="puti-razvitiia"&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;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Инфраструктура может быть конкурентным преимуществом.&lt;/strong&gt; Это
    определенно так для Google. Они могут выпускать новые интернет
    сервисы быстрее, с меньшими издержками, на таком уровне, что мало
    кто сможет составить им конкуренцию. Подход многих компаний сильно
    отличается от подхода &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;, эти компании
    рассматривают инфраструктуру как статью расходов, они обычно
    используют совсем другие технологии и совсем не задумываются о
    планировании и организации своей системы. Google позиционирует себя
    как компанию по построению систем, что является очень современным
    подходом к разработке программного обеспечения.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Охватывание нескольких дата центров до сих пор является нерешенной проблемой.&lt;/strong&gt; Большинство сайтов базируется в одном или двух дата
    центрах. Полное распределение сайта между несколькими датацентрами
    является хитрой задачей.&lt;/li&gt;
&lt;li&gt;Взгляните на &lt;em&gt;&lt;a href="https://www.insight-it.ru/goto/30a7481/" rel="nofollow" target="_blank" title="http://hadoop.apache.org/core/"&gt;Hadoop&lt;/a&gt;&lt;/em&gt;, если у Вас
    нет времени на собственноручное построение всей архитектуры с нуля.
    &lt;em&gt;Hadoop&lt;/em&gt; является opensource воплощением в жизнь многих идей здесь
    представленных.&lt;/li&gt;
&lt;li&gt;Часто недооцениваемым преимуществом платформенного подхода является
    тот факт, что даже неопытные разработчики могут быстро и качественно
    реализовывать трудоемкие приложения на базе платформы. Но если бы
    каждый проект требовал одинаково распределенной архитектуры, то это
    создало бы много проблем, так как люди, которые понимают как это
    делается, являются достаточно большой редкостью.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Совместная деятельность не всегда является таким уж плохим занятием.&lt;/strong&gt; Если все части системы работают взаимосвязанно, то
    улучшение в одной из них сразу и абсолютно прозрачно отразится
    положительным образом и на остальных компонентах системы. В
    противном случае такой эффект наблюдаться не будет.&lt;/li&gt;
&lt;li&gt;Построение самоуправляемых систем позволяет более легко
    перераспределять ресурсы между серверами, расширять систему,
    отключать некоторые компьютеры и элегантно проводить обновления.&lt;/li&gt;
&lt;li&gt;Производить длительные операции стоит параллельно.&lt;/li&gt;
&lt;li&gt;Всему, что было сделано Google, предшествовало искусство, а не
    только крупномасштабное развертывание системы.&lt;/li&gt;
&lt;li&gt;Учитывайте возможность &lt;strong&gt;компрессии данных&lt;/strong&gt;, она является очень
    неплохим решением, если остается лишнее процессорное время, но
    присутствует нехватка пропускной способности.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 31 Jan 2008 18:05:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-01-31:highload/2008/arkhitektura-google/</guid><category>BigTable</category><category>featured</category><category>GFS</category><category>Google</category><category>MapReduce</category><category>online</category><category>Sawzall</category><category>архитектура</category><category>архитектура Google</category><category>интернет</category><category>кластер</category><category>Масштабируемость</category><category>поиск</category><category>сервер</category><category>хранение данных</category></item></channel></rss>