<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>Hi-load в RSS</title>
<link>http://hi-load.php.com.ua/</link>
<atom:link href="http://hi-load.php.com.ua/rss/" rel="self" type="application/rss+xml" />
<language>ru</language>
<description>hi-load.php.com.ua в RSS. Для всех кто интересуется высокими нагрузками</description>
<managingEditor>admin@php.com.ua (http://php.com.ua)</managingEditor>
<webMaster>admin@php.com.ua (http://php.com.ua)</webMaster>
<copyright>http://php.com.ua</copyright>
<lastBuildDate>Wed, 24 Sep 2008 16:00:01 +0700</lastBuildDate>
<generator>http://php.com.ua</generator>
<docs>http://blogs.law.harvard.edu/tech/rss</docs>
<item>
<title>Rediska — удобный PHP клиент для key-value базы Redis</title>
<link>http://hi-load.php.com.ua/topic/146/</link>
<description><![CDATA[<a href="http://rediska.geometria-lab.net/"><img src="http://rediska.geometria-lab.net/images/rediska.png" alt="Rediska" align="left" border="0"></a><a href="http://code.google.com/p/redis/">Redis</a> — это очень быстрая key-value база данных. Может использоваться как memcached, но отличие от последней в том, что Redis сохраняет свои данные на диск, то есть может быть использован для хранения данных (что мы успешно и делаем). Основные отличии от других собратьев это возможность хранить более сложные структуры данных — списки и «сеты» и атомарные операции с ними.<cut><br><br>Так как на этом сайте уже есть <a href="http://hi-load.php.com.ua/topic/82">обзор Redis</a>, не вижу смысла продолжать. Перейду к самой «Редиске».<br><br>Основные возможности:<br>* Работа с <a href="http://rediska.geometria-lab.net/documentation/configuration/servers">несколькими серверами</a><br>* <a href="http://rediska.geometria-lab.net/documentation/configuration/key-distributor">Несколько алгоритмов</a> «размазывания» ключей по серверам: «consistent hashing» и crc32. Причем подключить свой не составит труда.<br>* Работа с <a href="http://rediska.geometria-lab.net/documentation/usage/working-with-keys/single-value-keys">ключами</a> как с объектами<br>* Работа с <a href="http://rediska.geometria-lab.net/documentation/usage/working-with-keys/lists">списками</a> и <a href="http://rediska.geometria-lab.net/documentation/usage/working-with-keys/sets">«сетами»</a>, как с обычными PHP массивами<br>* <a href="http://rediska.geometria-lab.net/documentation/integration-with-frameworks/zend-framework">Полная интеграция с Zend Framework</a><br>* Юнит тесты и документация<br><br>Скоро:<br>* Интеграция с другими фреймворками<br>* «Экспаринг» ключей по тегам<br>* Работа с ключами на определенных серверах с помошью псевдонимов<br>* Поддержка Ketama — быстрой библиотеки реализующей алгоритм «consistent hashing» написанной на С<br><br>Домашняя страница: <a href="http://rediska.geometria-lab.net/">http://rediska.geometria-lab.net/</a>]]></description>
<pubDate>Thu, 26 Nov 2009 01:47:01 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/146/</guid>
</item>
<item>
<title>Масштабирование в Web - опыт Ebay</title>
<link>http://hi-load.php.com.ua/topic/145/</link>
<description><![CDATA[<img src="http://highload.com.ua/wp-content/uploads/2009/11/ebay-logo.jpg" title="Ebay лого" align="left"><br><br>Для начала, некоторые поразительные показатели проекта Ebay.com:<br><br>- Более 89 миллионов активных пользователей<br>- 190 миллионов товаров в 50 тыс. категорий<br>- Более 8 миллиардов URL запросов в день<br>- Большая динамика развития — сотни новых функциональных улучшений каждые 3 месяца<br>- 39 стран, 9 языков, 24 часа в сутки, 7 дней в неделю, круглый год<br>- 70 миллиардов операций чтения/записи в день<br>- Обработка 50 Тб данных в день<br>- Анализ 50 Пб данных каждый день<br><br><a title="Масштабирование в Web - опыт Ebay" href="http://highload.com.ua/index.php/2009/11/20/masshtabirovanie-web-opyt-ebay/">Дальше — 10 основных правил масштабирования от Ebay + презентация</a>]]></description>
<pubDate>Tue, 24 Nov 2009 01:45:01 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/145/</guid>
</item>
<item>
<title>Оптимизация клиентской части</title>
<link>http://hi-load.php.com.ua/topic/88/</link>
<description><![CDATA[<img src="/uploads/users/1/1244569131.jpg" align="left" alt="Скорость " border="0" hspace="10px" vspace="10px"><br><br>Вам наверняка приходилось сталкиваться с проблеммой медленной работы сайта.<br><br>Причину того мы обычно ищем в PHP и MySQL, но зачастую забываем о том, <i>что</i> из себя представляет страница, которая попадает в браузер пользователя. Помимо HTML есть еще и Javascript, CSS, множество картинок, флеш объекты и прочее.<br><br>Время загрузки страницы зачастую занимает лишь несколько процентов от времени загрузки всех компонент этой страницы. Существует ряд практик и подходов, которые помогают оптимизировать загрузку страницы в браузер в разы (все зависит от ситуации, но это может быть и 10 раз).<br><br>Несколько подробных статей на эту тему:<br>* <a href="http://highload.com.ua/index.php/2009/06/07/%D0%BE%D0%BF%D1%82%D0%B8%D0%BC%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D1%81%D0%BA%D0%BE%D0%B9-%D1%87%D0%B0%D1%81%D1%82%D0%B8/">Оптимизация клиентской части</a><br>* <a href="http://webo.in/articles/bynet2v3/clientside-optimization/">Как ускорить работу сайта для посетителя</a><br>* <a href="http://webo.in/articles/ok2009/speed-matters/">Скорость имеет значение</a><br><br><b>Стоит добавить еще несколько вещей</b><br><br>1. Стоит помещать Javascript файлы в конец HTML и использовать только внешние методы для регистрации событий (не использовать атрибутов, типа «onclick» и т.п.). Это поможет избежать ошибок в тех случаях, когда Javascript еще не загружен, а пользователь уже пытается выполнить какое-то действие<br><br>2. Стоит заранее сжимать статику gzip-ом, а в отдающем сервере просто отдавать необходимые заголовки. В этом может помочь <a href="http://sysoev.ru/nginx/docs/http/ngx_http_gzip_static_module.html">этот модуль nginx'a</a><br><br>3. Изолируйте отдачу на разные сервера (например, динамику и статику отдавайте с разных серверов) — поможет изолировать проблемы с нагрузками]]></description>
<pubDate>Sun, 07 Jun 2009 20:28:09 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/88/</guid>
</item>
<item>
<title>Redis - нужна ли Вам реляционная база данных?</title>
<link>http://hi-load.php.com.ua/topic/82/</link>
<description><![CDATA[<img src="http://code.google.com/p/redis/logo?logo_id=1238151630" align="left" hspace="10px" vspace="10px"><br>Зачем мы используем реляционные СУБД, поддерживающие SQL синтаксис? Хранить данные, инкапсулировать работу с данными, делать хитромудрые выборки, сортировки и т.д. Насколько часто Вы (или Ваши разработчики) анализируете определенную задачу на предмет того, какую технологию хранения данных применять? Угадаю — почти никогда. Выбор обычно делается в начале проекта (MySQL, Postgres и т.д.), а потом этот выбор является условием «по умлочанию» для любого рода технических задач, требующих постоянное хранилище.<cut><br><br>Если Вы когда-либо сталкивались с проблемами, связанными со скоростью работы СУБД, это не обязательно означает, что Вы пишете плохие SQL запросы. Может Вы пытаетесь решить задачу технологией, которая не особо хорошо подходит для ее решения?<br><br>Если Вы делаете мелкий проект, и не испытуете проблем с пропускной способностью, то выбор единой технологии оправдан с точки зрения знаний, которых потребуется меньше, чем для поддержки нескольких решений. Но, если это не так...<br><br>Что же такое базы данных «ключ=значение». Это базы данных, которые позволяют хранить и читать значения по ключу… и все! Подробнее про них можно почитать в статье «<a href="http://highload.com.ua/index.php/2009/04/27/keyvalue-ключзначение-базы-данных/" target="_blank">Key=value (ключ=значение) базы данных</a>». А мы остановимся на одном из ярких представителей подобных продуктов:<br><br><b>Redis</b> — «ключ=значение» база данных. Помимо двух методов записи и чтения, она имеет ряд атомарных операций, например: инкремент/декремент, проверка на существование ключа, множественное получение значений и другие.<br><br>Одним важным преимуществом redis перед конкурентами является поддержка структурных данных и примитивов по управлению ими. Такими структурными данными являются наборы (индексированные элементы) и списки (стек элементов). Redis предоставляет возможность доставать эелементы, добавлять, удалять их и даже получать выборки с ограниченным смещеннием (это как LIMIT OFFSET в MySQL).<br><br>В чем же сила? В простоте и скорости! Redis использует алгоритм асинхронных комитов на диск, поэтому все операции синхронно выполняются только в памяти и клиенту отдается результат. Это позволяет добится огромного выигрыша в производительности. Учитывая то, что redis не имеет затратных слоев SQL движка, прослойки индексирования, прослойки метаданных, специфических типов данных (для redis'a все — это строка), дополнительных статистических и управляющих процессов, это делает его на порядок (или даже на несколько) быстрее обычных РСУБД.<br><br>К тому же, redis поддерживает репликацию. А если у Вас планы покрупнее на него, то организовать шардинг получается весьма просто, т.к. он легко реализуем на среднем уровне (middletier).<br><br>Если Вы в следующий раз столкнетесь с задачами, не трубующими сложных выборок, сортировок, агрегации данных и т.п., и если Ваша задача ложится в концепцию «хранить и отдавать значения по ключу», обдумайте свое решение хорошенько!<br><br><a href="http://highload.com.ua/index.php/2009/05/01/redis/">Обзорная информация про Redis</a>]]></description>
<pubDate>Fri, 01 May 2009 17:48:22 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/82/</guid>
</item>
<item>
<title>Gear6 - хардверное решение для memcached</title>
<link>http://hi-load.php.com.ua/topic/81/</link>
<description><![CDATA[<img src="http://social.php.com.ua/uploads/users/1/1240553471.png" align="left" alt="Gear6" border="0" hspace="10px" vspace="10px">Интересное аппаратное решение для <a href="http://highload.com.ua/index.php/tag/memcached/" taget="_blank">memcached</a>, на которое я наткнулся читая highscalability.com.<br><br>Как заявляют производители этой железяки, она позволяет вставить в 5...10 раз больше оперативной памяти в обычный юнит (ракспейса), чем стандартный сервер. Что, по их словам, достигается новой гибридной архитектурой устройства подсистемы памяти.<br><br>Интрефейс этого аппаратного решения поддерживает протокол memcached, поэтому Вам не придется прилагать дополнительных усилий для интеграции этого решения в Вашу рабочую среду.<br><br>Интересно услышать Ваши мнения, т.к. вертикальное масштабирование — это хорошо, но ведь не бесконечно.<br><br><a href="http://www.gear6.com/">Их официальный сайт</a>]]></description>
<pubDate>Fri, 24 Apr 2009 01:50:56 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/81/</guid>
</item>
<item>
<title>Создаем Hadoop MapReduce приложение на PHP</title>
<link>http://hi-load.php.com.ua/topic/54/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<img src="/uploads/users/1/1224148645.png" align="left" alt="Hadoop + PHP = Love" border="0" hspace="10px" vspace="10px"> Сегодня посчастливилось ознакомиться со <a href="http://www.michael-noll.com/wiki/Writing_An_Hadoop_MapReduce_Program_In_Python" target="_blank">статьей</a> Майкла Нолла (Michael Noll) о том, как написать распределённое Hadoop приложение на питоне (Python). <br><br>Я всегда был большим поклонником распределённой обработки (MapReduce), но, так как в своей работе использую PHP, я подумал, что неплохо бы было портировать этот пример и показать, как можно создавать распределенные приложения на PHP.<cut><br><br>Чтобы глубже понять, что мы будем делать дальше, рекомендую прочитать упомянутую выше <a href="http://www.michael-noll.com/wiki/Writing_An_Hadoop_MapReduce_Program_In_Python" target="_blank">оригинальную статью</a>.<br><br>Для начала нужно установить и запустить Hadoop, но установка Hadoop-кастера - это довольно нетривиальная задача, с которой можно провозиться весь день.<br><br>Однако, если Вы хотите поэкспериментировать с платформой прямо сейчас, можно загрузить образ виртуальной машины с предварительно сконфигурированной единичной Hadoop нодой.<br><br>Конечно, у Вас не будет высокопроизводительного Hadoop-кластера, но будет возможность проводить эксперименты на своей локальной машине, запуская простые MapReduce задачи.<br><br>Изображение создано так, что его можно использовать с помощью бесплатного <a href="http://www.vmware.com/products/player/" target="_blank">VMware плеера</a>.<br><br>Образ виртуальной машины можно загрузить с <a href="http://code.google.com/edu/parallel/tools/hadoopvm/index.html" target="_blank">Google Code University (150Мб)</a>.<br><br>Образ имеет предустановленных пользователей<br><br>root root<br>guest guest<br><br>Для установки php5 запустите ‘apt-get install php5-cli’ из-под пользователя root. Если не устанавливается, сделайте 'apt-get update' и повторите установку php.<br><br><h3>Маp: mapper.php</h3><br>Скрипт, который выполняет кусочек основной задачи.<br><br>Сохраните приведенный ниже код в файл /home/guest/mapper.php:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">#!/usr/bin/php</div></li>
<li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$word2count</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// Ввод данных происходит через STDIN</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$line</span> <span class="sy0">=</span> <span class="kw3">fgets</span><span class="br0">&#40;</span>STDIN<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="co1">// убираем лишние символы и переводим в нижний регистр</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="re0">$line</span> <span class="sy0">=</span> <span class="kw3">strtolower</span><span class="br0">&#40;</span><span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$line</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="co1">// разбиваем строки по словам и убираем пустые значения</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="re0">$words</span> <span class="sy0">=</span> <span class="kw3">preg_split</span><span class="br0">&#40;</span><span class="st_h">'/\W/'</span><span class="sy0">,</span> <span class="re0">$line</span><span class="sy0">,</span> <span class="nu19">0</span><span class="sy0">,</span> PREG_SPLIT_NO_EMPTY<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="co1">// увеличиваем счетчик</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$words</span> <span class="kw1">as</span> <span class="re0">$word</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$word2count</span><span class="br0">&#91;</span><span class="re0">$word</span><span class="br0">&#93;</span> <span class="sy0">+=</span> <span class="nu0">1</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// Вывод результатов в STDOUT</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// Эти данные будут обрабатываться &quot;склеиваться&quot; reducer.php</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// Reduce step, i.e. the input for reducer.py</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$word2count</span> <span class="kw1">as</span> <span class="re0">$word</span> <span class="sy0">=&gt;</span> <span class="re0">$count</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="co1">// разделение табуляцией</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp;<span class="kw3">echo</span> <span class="re0">$word</span><span class="sy0">,</span> <span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">9</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$count</span><span class="sy0">,</span> PHP_EOL;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br><h3>Reduce: reducer.php</h3><br><br>Сохраните приведенный ниже код в файл /home/guest/reducer.php:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">#!/usr/bin/php</div></li>
<li class="li1"><div class="de1"><span class="kw2">&lt;?php</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="re0">$word2count</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// input comes from STDIN</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$line</span> <span class="sy0">=</span> <span class="kw3">fgets</span><span class="br0">&#40;</span>STDIN<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">!==</span> <span class="kw2">false</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// убираем лишние символы и переводим в нижний регистр</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$line</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$line</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// разбираем данные, которые прислал mapper.php</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">list</span><span class="br0">&#40;</span><span class="re0">$word</span><span class="sy0">,</span> <span class="re0">$count</span><span class="br0">&#41;</span> <span class="sy0">=</span> <span class="kw3">explode</span><span class="br0">&#40;</span><span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">9</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$line</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// приводим тип - из строки в целое число</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="re0">$count</span> <span class="sy0">=</span> <span class="kw3">intval</span><span class="br0">&#40;</span><span class="re0">$count</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="co1">// суммируем</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$count</span> <span class="sy0">&gt;</span> <span class="nu19">0</span><span class="br0">&#41;</span> <span class="re0">$word2count</span><span class="br0">&#91;</span><span class="re0">$word</span><span class="br0">&#93;</span> <span class="sy0">+=</span> <span class="re0">$count</span>;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// сортируем результат</span></div></li>
<li class="li1"><div class="de1"><span class="co1">//</span></div></li>
<li class="li1"><div class="de1"><span class="co1">// это не обязательно, но есть в официальном примере работы с Hadoop</span></div></li>
<li class="li1"><div class="de1"><span class="kw3">ksort</span><span class="br0">&#40;</span><span class="re0">$word2count</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="co1">// выводим результат в STDOUT</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$word2count</span> <span class="kw1">as</span> <span class="re0">$word</span> <span class="sy0">=&gt;</span> <span class="re0">$count</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$word</span><span class="sy0">,</span> <span class="kw3">chr</span><span class="br0">&#40;</span><span class="nu0">9</span><span class="br0">&#41;</span><span class="sy0">,</span> <span class="re0">$count</span><span class="sy0">,</span> PHP_EOL;</div></li>
<li class="li1"><div class="de1"><span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1"><span class="kw2">?&gt;</span></div></li>
</ol></div></code></pre><br>Не забудьте выставить права на выполнение скрипта.<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw3">chmod</span> <span class="sy0">+</span>x <span class="sy0">/</span>home<span class="sy0">/</span>guest<span class="sy0">/</span>mapper<span class="sy0">.</span>php <span class="sy0">/</span>home<span class="sy0">/</span>guest<span class="sy0">/</span>reducer<span class="sy0">.</span>php</div></li>
</ol></div></code></pre><br><br>Запускаем PHP-код на Hadoop:<br><br>Загружаем тестовые данные<br><br>Как и у Майкла Нолла, для данного примера мною были использованы электронные книги из проекта Gutenberg <br><br><ul><li><a href="http://www.gutenberg.org/files/20417/20417-8.txt" target="_blank">http://www.gutenberg.org/files/20417/20417-8.txt</a></li><li><a href="http://www.gutenberg.org/dirs/etext04/7ldvc10.txt" target="_blank">http://www.gutenberg.org/dirs/etext04/7ldvc10.txt</a></li><li><a href="http://www.gutenberg.org/dirs/etext03/ulyss12.txt" target="_blank">http://www.gutenberg.org/dirs/etext03/ulyss12.txt</a></li></ul><br>Загрузите каждую книгу и сохраните ее в какую-нибудь директорию на выбор, например в /tmp/gutenberg<br><br>Копируем данные на распределённую файловую систему HDFS<br><br>Перед запуском тестовой задачи нужно скопировать данные с локальной файловой системы на распределённую файловую систему Hadoop’s HDFS<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">bin<span class="sy0">/</span>hadoop dfs <span class="sy0">-</span>copyFromLocal <span class="sy0">/</span>tmp<span class="sy0">/</span>gutenberg gutenberg</div></li>
</ol></div></code></pre><br>Запускаем тестовый пример<br><br>Теперь все готово к запуску нашей распределенной задачи на Hadoop-кластере. Для того, чтобы уменьшить обмен данными через STDIN и STDOUT между Map и Reduce компонентами, используем HadoopStreaming.<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">bin<span class="sy0">/</span>hadoop jar contrib<span class="sy0">/</span>hadoop<span class="sy0">-</span>streaming<span class="sy0">.</span>jar </div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span>mapper <span class="sy0">/</span>home<span class="sy0">/</span>guest<span class="sy0">/</span>mapper<span class="sy0">.</span>php </div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span>reducer <span class="sy0">/</span>home<span class="sy0">/</span>guest<span class="sy0">/</span>reducer<span class="sy0">.</span>php </div></li>
<li class="li1"><div class="de1"><span class="sy0">-</span>input gutenberg<span class="coMULTI">/* -output gutenberg-output</span></div></li>
</ol></div></code></pre><br><h3>Как это работает</h3><br>Эта задача читает все файлы в HDFS директории gutenberg, обрабатывает их и сохраняет результат в файл, который находится в HDFS директории gutenberg-output.<br><br>Вы можете проследить состояние задачи, используя web-интерфейс Hadoop http://localhost:50030/<br><br>Когда задача будет отработана, проверьте, чтобы результат был сохранен в выходной HADOOP директории gutenberg-output:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">bin<span class="sy0">/</span>hadoop dfs <span class="sy0">-</span>ls gutenberg<span class="sy0">-</span>output</div></li>
</ol></div></code></pre><br>Вы также можете просмотреть содержимое файла, используя команду dfs -cat:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">bin<span class="sy0">/</span>hadoop dfs <span class="sy0">-</span>cat gutenberg<span class="sy0">-</span>output<span class="sy0">/</span>part<span class="sy0">-</span><span class="nu8">00000</span></div></li>
</ol></div></code></pre><br><br>Вот и все, познавайте магию Hadoop - это будущее ;-)<br><br><a href="http://www.lunchpauze.com/2007/10/writing-hadoop-mapreduce-program-in-php.html" target="_blank">Оригинальная статья: от Robin Schuil</a><br><br><a href="http://docs.google.com/Doc?id=dgh6nvkt_304g6gxr5gq" target="_blank">Перевод в виде документа</a>]]></description>
<pubDate>Tue, 04 Nov 2008 11:09:27 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/54/</guid>
</item>
<item>
<title>Знакомьтесь -   Hadoop</title>
<link>http://hi-load.php.com.ua/topic/36/</link>
<description><![CDATA[<img src="/uploads/users/1/1224148645.png" align="left" alt="Hadoop" border="0" style="margin: 5px 10px 0 0px"> <a href="http://ru.wikipedia.org/wiki/Hadoop" target="_blank">Hadoop</a> - распределенная вычислительная платформа, написанная на Java, которая включает в себя компоненты аналогичные Google File System и MapReduse которые позволяют хранить и обрабатывать петабайты данных.<cut><br><br>Hadoop - бесплатный Java фреймворк который обеспечивает быструю работу приложений (которые могут быть написаны  принципе на любом языке) запускающимися в кластерах состоящим из множества серверов. Это позволяет быстро масшабировать ваши приложения на тысячах нод которые могут содержать и обрабатывать петабайты данных.<br><br><a href="http://wikis.sun.com/download/attachments/38208497/Hadoop-Primer.pdf" target="_blank">http://wikis.sun.com/download/attachments/38208497/Hadoop-Primer.pdf</a><br><br>В данное время Hadoop используют - Yahoo, Last.fm<br><br>З.Ы. От себя добавлю что Hadoop дает возможность собрать у себя на коленке аналог Google главное правильно подойти к реализации своей идеи, в принципе за такими системами будущее. <br><br>Не так давно игрались Hadoop на своей тестовой платформе, строили распределенное хранилище, - Hadoop произвел очень хорошее впечатление, осталось только самая малость написать приложения с учетом распределенного запуска ;-)]]></description>
<pubDate>Thu, 16 Oct 2008 12:54:08 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/36/</guid>
</item>
<item>
<title>Сети доставки контента (CDN - Content Delivery Networks) – обзор провайдеров</title>
<link>http://hi-load.php.com.ua/topic/32/</link>
<description><![CDATA[<img src="/uploads/users/1/1223549411.gif" align="left" alt="CDNs" border="0" style="margin: 5px 10px 0 0px"> Ваши пользователи качают гигабайты трафика с вашего ресурса? Как увеличить скорость загрузки файлов пользователями и при этом разгрузить ваш сервер ??? Как сделать зеркалирование вашего ресурса затратив при этом минимум средств.<cut><br><br><br><br><h1> Сети доставки контента </h1><br><img src="/uploads/users/1/1223548514.jpg" align="left" alt="CDNs logos" border="0" style="margin: 5px 10px 0 0px"> Мы люди которые разрабатывают web приложения - как и многие другие web  разработчики населяющие нашу планету. Представим себе что мы создали  ресурс популярность которого растет с довольно большой скоростью,  растет трафик с нашего ресурса  - и орды пользователей которые мучают  наши сервера.<br><br>Перед нами встает вопрос - что делать дальше ???<br><br>Конечно мы не говорим о случайном трафике например из социальных сетей  типа Digg, Yahoo Buzz или других социальных медиа сетей, или сайтов  которые используют арендованные распределенные компьютерные сети (cloud  computing) наподобие Amazon EC2,  MediaTemple Grid или Mosso Hosting  Cloud.<br><br>Я имею в виду трафике, который последовательно увеличивается в течение  долгого времени, пока растет популярность нашего ресурса. Такие монстры  как Google.com, Yahoo.com, Myspace.com, Facebook.com, Plentyoffish.com,  Linkedin.com, Youtube.com пример таких ресурсов, с постоянным высоким  трафиком.<br><br>Зная что пользователи всегда желают получать доступ к ресурсу с  максимальной скоростью - эти службы будут всегда испольховать сети для  доставки контента (CDN) - что бы обеспечить доставку контента  пользователю с максимальной скоростью.<br><br><h2> Что такое CDN?</h2><br>Сеть доставки контента это группа web серверов расположенные в разных  точках (страны, датацентры и тд.) которые дают возможность сделать  наиболее эффективную доставку контента для пользователя. Обычно сервер  с которого пользователь будет получает контент определяется как самый  близко расположенный к нему, для примера выбирается сервер с самым  маленьким количеством хопов, либо с самым маленьким временем ответа.  Это помогает масштабировать web приложения распределяя нагрузку между  множеством серверов.<br><br>Более подробно о CDN можно прочитать <a href="http://en.wikipedia.org/wiki/Content_Delivery_Network" id="pnzo" target="_blank" title="Википедиа - открытый для всех поток знаний ;-)">здесь</a>.<br><br>Некоторые большие ресурсы используют свои собственные cети доставки контента, но <strong>иногда более эффективно использовать CDN стороннего провайдера</strong>.  Plentyoffish.com, например, использует сторонний CDN (он не может  позволить себе иметь свой собственный CDN). Myspace.com и  Friendster.com также используют CDN.<br><br>На картинке снизу вы можете видеть <strong>топологию сети Peer1 Networks</strong> из Канады. Такая топология типична для большинства CDN.<br><br><center><img src="/uploads/users/1/1223548467.gif" alt="Perr1 CDN network" border="0" style="clear: both; margin-top: 5px"></center><br><br>В данное время наблюдается расширение спектра услуг по предоставлению  контента и инвесторы вкладывают неплохие деньги в развитие CDN  технологий.<br><br>В данное время на пост советских просторах нет не одной действующей CDN сети которая бы предоставляла бы услуги конечным пользователям - хотя  есть информация что RuTube сейчас занят построением собственной  довольно большой CDN сети, что из этого получится мы увидим в ближайшее  время.<br><br>Ниже представлен список CDN (в произвольно порядке):<br><br><a href="http://www.akamai.com/" id="usmu" target="_blank" title="Akamai">Akamai</a>, 800-фунтовая горилла CDN бизнеса - компания, которая сделала CDNs известными благодаря выходу на <a href="#Initial_Public_Offering" title="IPO">IPO</a>. Основные предоставляемые услуги это - раздача HTTP контента и потоковое  медиа, недавно открылся сервис мониторинга сети и, а так же  географическая дистрибуция web ресурсов. В апреле 2000, Akamai купил  InterVu; в 2005, Akamai купил Speedera, а в 2007 еще и  Netli. <a href="http://www.akamai.com/html/customers/customer_list.html"  target="_blank" title="Список клиентов">Список клиентов</a>  включает в себя такие знаменитые компании как Adobe, Myspace, Мonster,  NBA, BestBuy, Cabela’s, Reuters, Verizon, Yahoo, IBM, US Airforce,  Travelocity, Sony, CNET, NTT, AMD, NASA, и т.д.)<a href="http://www.limelightnetworks.com" id="dx1e" target="_blank" title="Limelight Networks"></a><br><br><a href="http://www.limelightnetworks.com" id="dx1e" target="_blank" title="Limelight Networks">Limelight Networks</a>   предлагают продвинутую Сеть доставки контента для распространения и  приема которого нужны широкополосные каналы, такой контент как видео,  музыка, игры, и большие файлы. Услугами этой сети пользуются такие  известные компании как Amazon, Akimbo, iFilm, MSNBC. LonelyPlanet,  Valve, VideoJug, и тд.<a href="http://www.edgecast.com/" id="ndsp" target="_blank" title="EdgeCast"></a><br><br><a href="http://www.edgecast.com/" id="ndsp" target="_blank" title="EdgeCast">EdgeCast</a>  - CDN специализирующийся на доставке видео, игр, музыки, трансляций  событий в реальном ремени за относительно небольшие деньги. Так же  предлагают услуги по географическому распределению web ресурсов  ("ускорению работы") - этим сервисом пользуются такие WEB2.0 компании  как (Jaxtr, Mashable, Blip.tv, Mahalo, и т.д)<br><br><a href="http://www.cdnetworks.com/" id="hd:v" target="_blank" title="CDNetworks">CDNetworks</a>  - наибольший поставщик услуг среди CDN Азии - предоставляет услуги по  "ускорению" ресурсов используя глобальную сеть своих точек присутствия (<a href="#POP" title="POP">POP</a>). Клиенты - Toyota, K2Network, Nexon, Megastudy, NCSoft и тд.<br><br><a href="http://aws.amazon.com/" target="_blank">Amazon Web Services</a> не  только предлагают воспрользоваться услугами оренды кластеров, но так же  и использовать их CDN хранилища - используя мощную инфраструктуру  Amazon.<br><br><a href="http://www.bitgravity.com/" target="_blank" title="BitGravity">BitGravity</a>  - CDN , основанный в 2006, предоставляет услуги для доставке аудио,  видео, программного обеспечения, и рекламы. Это первый CDN построенный  для интерактивного вещания, оптимизированный для передачи HD контента и  интеракивных приложений для множества интернет пользователей.<br><br><a href="http://www.peer1.com/" target="_blank" title="Peer1">Peer1</a> обладает уникальной Rapid Edge технологией, которая обеспечивает  глобальную балансировку между сетями и кеш серверами содержищими разные  части контента. <a href="http://Plentyoffish.com" id="zkwj" target="_blank" title="Социальная сеть знакомств">Plentyoffish.com</a> (сервис знакомств) - один из их клиентов.<br><br><a href="http://www.upstreamnetworks.com/" id="cltr" target="_blank" title="UpStreamNetworks">UpStreamNetworks</a> - подразделение ServePath лидера Силиконовой Долины по вещанию на базе windows и flash технологий.<br><br><a href="http://www.business.att.com/enterprise/Family/eb_hosting_storage_and_it/eb_intelligent_content_distribution/" id="g01-" target="_blank" title="ATT Intelligent Content Distribution">ATT Intelligent Content Distribution</a> - CDN построенный на том что контент распространяется по интернету  реплицируясь с единой ноды. Сервисные ноды подключены к глобальной сети  AT&T которые расположены в датацентрах AT&T.<br><br><a href="http://www.gridnetworks.com/" id="qsjo" target="_blank" title="GridNetworks">GridNetworks</a> -  в основном обеспечивает вещание высококачественного телевизионного  контента по интернету к конечному домашнему потребителю. Архитектура <a href="http://www.gridnetworks.com/" id="qsjo" target="_blank" title="GridNetworks">GridNetworks</a> - это частично традиционный CDN, частично одноранговая P2P сеть.<br><br><a href="http://www.movenetworks.com/" id="plh5" target="_blank" title="MoveNetworks">MoveNetworks</a> использует Microsoft Silverlight для вещания потокового HD телевидения.  Клиенты - ABC, Discovery Channel, Fox, Televisa, ESPN360.<br><br><a href="http://www.edgestream.com/" id="jcqn" target="_blank" title="EdgeStream">EdgeStream</a> - обеспечивает видео решения для доставки HD контента, предоставляя  законченную программную клиент-серверную платформу и распределенную  отказоустойчивую CDN сеть.<br><br><a href="http://www.velocix.com/" id="gjh2" target="_blank" title="Velocix">Velocix</a>   - занимается доставкой к потребителю видео, игр, программного  беспечения - и имеет уникальную политику по использованию их CDN - вы  платите за успешную доставку продукта (pay per delivery) - а не за  гигабайты трафика.  Клиенты - BabelGum, Bollywood.tv, Chic.tv, AC Milan  (футольный клуб).<br><br><a href="http://www.pantherexpress.com/" id="r9u1" target="_blank" title="Panther Express">Panther Express</a>   - с помощью этой сети можно распространять аудио, видео, графику, игры.  Так же в этой сети реализовано управление полосой попускания при  доставке контента - что позволяет регулировать стоимость услуги.  Клиенты - StudiVZ, немецкий клон Facebook, LiveJournal, mochi Media и  другие.<br><br><a href="http://www.broadmedia.co.jp/" id="f6_4" target="_blank" title="BroadMedia">BroadMedia</a> - крупнейший Японский CDN специализирующийся на доставке видео, игр и так же вещинию для мобильных устройств.<br><br><a href="http://www.internap.com/" id="irz-" target="_blank" title="InterNap">InterNap</a> использует собственное решение - Performance IP™ для быстрой и  безопастной доставке потокового контента, видео аудио, рекламы и  программ - для этого используются дата центры расположенные по всему  миру. <a href="http://www.internap.com/" id="irz-" target="_blank" title="InterNap">InterNap</a> в 2007 году купил CDN VitalStream. Клиенты -  Diesel, Saatchi & Saatchi, Ice.com, PlanetVU, MyStack.<br><br><a href="http://www.digitalfountain.com/" id="bkja" title="Digital Fountain">Digital Fountain </a>- сеть специализирующаяся на доставке HD видео контента.<br><br><a href="http://www.level3.com/" id="gfz_" title="Level3">Level3</a>   - предлагает довольно большой набор CDN сервисов, давая полную свободу  действий по их настройке и использованию - все услуги вы получаете от  единственого провайдера.<br><br><a href="http://www.mirror-image.com/" target="_blank">Mirror Image</a>   - обеспечивает высоконадёжный CDN - для цифровых медиа ресурсов,  который позволяет использовать самый лучший пользовательский опыт,  позволяя компаниям минимизировать инфраструктуру web ресурсов за счет  чего экономятся средства на содержание таких ресурсов. Клиенты -  Forbes, NOAA, Pacific Sunwear, Ansari X Prize foundation, adECN и тд.<br><br><a href="http://www.navisite.com/" target="_blank">NaviSite</a> - предоставляет полный набор CDN услуг: хостинг, транскодинг, доставку  файлов, ускорение работы веб ресурса, платформу для онлайн публикации  видео.<br><br><a href="http://www.accelia.net/" target="_blank">Accelia</a> - CDN предоставляющий сервис по доставки статического контента - ориентирован в основном на японских пользователей.<br><br><a href="http://www.simplecdn.com/" target="_blank">SimpleCDN</a> -  специализирован на доставке программных продуктов, видео и  изображений (плата за файл). Это обеспечивается продвинутой глобальной  платформойдоставки контента -  все по одной цене, позволяя  организовывать хранилища данных без больших затрат, контрактов или  долгого времени установкии настройки ПО.<br><br>Технологии <a href="http://www.cachefly.com/" target="_blank">CacheFly</a>   используется Anycast, для создания маршрутизаторами оптимального  маршрута от пользователя к ближайшей точке присутствия. Объеденившись с  Anycast, обеспечивающиц очень большую площадь покрытия, CacheFly  построил CDN следующего поколения, специализирующийся на доставке  програмного обеспечения, ускорению работы ресурсов, потоковому видео и  подкастинге. Использовать этот CDN предпочитают такие Web 2.0 компании  как Revision3, Ars Technica, Pluck, BetaNews.<br><br><a href="http://www.nirvanix.com/" target="_blank">Nirvanix</a>   - одна из первых коспаний предоставляющая сетевое распределенное  хранилище (SDN - Storage Delivery Network), аналог Amazon S3.  Распределенное сетевое хранилище  построенно на запатентованой Nirvanix  файловой системе  - Internet Media File System (IMFS), это кластерная  файловая система которая состоит из глобально распределенных хранилищь  котрые объеденены одним пространством имен. Пользователи:  Axentra,  Free Drive и прочие.<br><br><a href="http://www.solidstatenetworks.com/" target="_blank">Solid State Networks</a> - гибрид, одноранговой (P2P) и HTTP CDN сети, специализирующийся на  доставке на программном обеспечении, видео, игр (особенно игр).  Клиенты: Acclaim, Zyon Games, Alchemic Dream и другие.<br><br><a href="http://www.valuecdn.com/" target="_blank">ValueCDN</a> - европейский дешевый CDN, который может использоваться для доставки изображений, CSS, JavaScript, Flash и других файлов.<br><br><a href="http://us.ntt.net/scd" target="_blank">NTT Communications</a>   - предлагает SCD (Smart Content Delivery) технологию, которая  использует три компонента (балансировщики нагрузки, глобальные  балансировщики нагрузки, использование кеширования на реверсивных  прокси), использование этих компонентов ползволяют ускорить скорость  загрузки, ускорить скорость соединений, стабилизировать видео потоки  для ваших интернет решений.<br><br><a href="http://swarmcast.com/" target="_blank">Swarmcast</a>  - CDN, специализированный на доставке видео (хостинг HD видео, потоковое вещание, прямая трансляция событий).<br><br><a href="http://www.bittorrent.com/" target="_blank">BitTorrent</a>  - P2P (peer-to-peer) решение для доставки контента.  <a href="http://www.bittorrent.com/" target="_blank">BitTorrent</a> DNA™ - CDN, который использует безопасную, частную, управляемую p2p  сеть, для обеспечения требуемых мощностей, надежности, и эффективности  доставки контента. <a href="http://www.bittorrent.com/" target="_blank">BitTorrent</a> DNA™ - работает совместно с вашим использующимся CDN или вашим первичным сервером ускоряя скачивание информации или http потоки незаметно для пользователя. Технология используемая <a href="http://www.bittorrent.com/" target="_blank">BitTorrent</a> позволяет предоставлять сервис не внося никаких изменений в текущую инфораструктуру ресурса или аппаратного обеспечения.<br><br><a href="http://www.verisign.com/products-services/content-messaging/text-messaging-network/mobile-content-network/" target="_blank">Verisign Mobile Content Delivery Network</a>   - может помочь контент провайдерам доставлять и производить оплату за  собственный контент используя CDN для мобильных устройств - который  объеденяет более 2 миллиардов пользователей из Серверной Америки,  Европы и других стран.<br><br><a href="http://www.technicolor-eds.com/" target="_blank">Technicolor</a>   специальная сеть для доставки больших объемов данных, спроектированная  по требовательным стандартам Microsoft. Клиенты такие монстры как  Warner Bros, Walmart, Hitachi, Paramount, Imax, Xbox Live, EMI,  National Geographic, Microsoft, NBC Universal.<br><br><a href="http://www.ignitetech.com/" target="_blank">Ignite</a> - предоставляет промышленное наиболее безопастное и расширяемое CDN  решение, позволяющие пользователям эффективно публиковать и доставлять,  свои цифровые материалы широкого спектра, начиная от обучающих  материалов и заканчивая обновлениями антивирусных баз - всегда, везде и  в люое время. Клиенты: Canon, Miller, Huntington, Sabre Holdings,  Accenture, RadioShack.<br><br><a href="http://www.coralcdn.org/" target="_blank">Coral</a> - бесплатный p2p CDN, имеющий в составе международную сеть из прокси и  DNS серверов (~260 серверов). Услуга по акселерированию работы вашего  интернет ресурса стоит порядка 50$ в месяц. <a href="http://wiki.coralcdn.org/wiki.php/Main/Testimonials" id="g.70" target="_blank" title="Список клиентов.">Список клиентов.</a><br><br><a href="http://www.highwinds.com/" target="_blank">HighWinds</a> - компания дающая использовать высокопроизводительную сеть  RollingThunder™ и медиа менеджер (StrikeTracker™) позволяющий создавать  отчеты по глобальной доставке видео контента, трансляций и других медиа  ресурсов. Преимущества этой сети в том что позволяет смотреть аналитику  в реальном времени, мгновенно создавать новые учетные записи,  производить контроль своего контента. Услугами этой компании  пользуются  другие поставщики CDN услуг такие как Technicolor, Solid  State Networks.<br><br><a href="http://www.softlayer.com/" target="_blank">SoftLayer</a> - хостер который так же предоставляет CDN услуги. Используется сеть  серверов с оригинальным ПО для организации процесса доставки контента  конечному пользователю по географическому принципу, пользователь  забирает контент с ближайшего до него сервера.<br><br><a href="http://www.voxel.net/" target="_blank">Voxel</a> - высокопроизводительный CDN разработанный VoxCAST который позволяет  молниеносно доставлять  ваш статический контент (изображения, файлы для  загрузки и тд), трансляции, видео-потоки и приложения которым требуется  высокая полоса пропускания. контент доставляется пользователю через  специально сформированый URL (например cdn.yoursite.com), по которому  доступен закешированный целый ресурс или работает через открытый модуль  mod_cdn, разработанный в Voxel’s , для http сервера Apache, так же  модуль может обновить контент по истичению заданного промежутка  времени. Клиенты: PerezHilton, AirAmerica, Hasbro, Accona, The New York  Observer.<br><br><a href="http://codeen.cs.princeton.edu/coblitz/" target="_blank">CoBlitz</a> - предлагает услуги по распространению больших файлов по HTTP CDN.  Пользователям не нужно вносить никаких изменений в свое ПО или  настройки серверов. Данный CDN построен на базе сети <a href="http://codeen.cs.princeton.edu/" target="_blank">CoDeeN</a> запущенной на базе PlanetLab, вам не обязательно использовать ресурсы  сети активно что бы пользоваться предоставляемыми ресурсами, достаточно  лишь добавить приставку, http://coblitz.codeen.org/, к вашему URL и  CoBlitz сделает за вас всю работу. Сервис пока бесплатный, но есть  ограничения - не принимаются файлы меньше 100Кб и файлы больше 20Gb.<br><br><h2>Приложения</h2><br><ul><li><a href="http://www.mytestbox.com/miscellaneous/content-delivery-networks-cdn-list/">Оригинал статьи</a></li><li><a href="http://docs.google.com/View?docid=dgh6nvkt_2cjx48ncq" target="_blank">Текст статьи в виде документа</a></li></ul>]]></description>
<pubDate>Thu, 09 Oct 2008 13:56:41 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/32/</guid>
</item>
<item>
<title>Пример построения высоконагруженной системы на основе открытого решения</title>
<link>http://hi-load.php.com.ua/topic/31/</link>
<description><![CDATA[<style type="text/css">/**
* GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann
* (http://qbnz.com/highlighter/ and http://geshi.org/)
*/
.php.php .de1, .php.php .de2 {font-family: monospace; font-weight: normal; font-style: normal; margin:0; padding:0; background:inherit;color: #000020;}
.php.php  {color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em}
.php.php a:link {color: #000060;}
.php.php a:hover {background-color: #f0f000;}
.php.php .imp {font-weight: bold; color: red;}
.php.php li, .php.php .li1 {font-weight: normal;}
.php.php .ln {width:1px;font-weight: normal;text-align:right;margin:0;padding:0 2px;}
.php.php .kw1 {color: #b1b100;}
.php.php .kw2 {color: #000000; font-weight: bold;}
.php.php .kw3 {color: #990000;}
.php.php .co1 {color: #666666; font-style: italic;}
.php.php .co2 {color: #666666; font-style: italic;}
.php.php .co3 {color: #0000cc; font-style: italic;}
.php.php .co4 {color: #0000ff; font-style: italic;}
.php.php .coMULTI {color: #666666; font-style: italic;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .es_h {color: #000099; font-weight: bold;}
.php.php .br0 {color: #009900;}
.php.php .sy0 {color: #339933;}
.php.php .st0 {color: #0000ff;}
.php.php .st_h {color: #0000ff;}
.php.php .nu0 {color: #cc66cc;}
.php.php .nu8 {color: #208080;}
.php.php .nu12 {color: #208080;}
.php.php .nu19 {color:#800080;}
.php.php .me1 {color: #004000;}
.php.php .me2 {color: #004000;}
.php.php .re0 {color: #000088;}
.php.php span.xtra { display:block; }
</style>
<h1>Что предстоит сделать?</h1><br><img src="/uploads/users/1/1222774265.png" align="left" alt="Openx" border="0" style="margin: 5px 10px 0 0px"> На основе открытого решения <a href="http://openx.org" target="_blank">Openx</a> нам предстоит реализовать масштабируемую систему управления рекламой, которая бы выдерживала нагрузку порядка 20М показов баннеров в сутки, что равнозначно более 40М запросов к web-серверу. <cut><br><br>Для того, чтобы обеспечить масштабируемость и надежность системы, мы будем использовать несколько серверов под разные нужды.<br><br>В моем случае было использовано 5 серверов для создания http-кластера и 2 сервера для БД.<br><br>В статье будет показано, как с помощью <strong>минимальных усилий</strong> добиться <strong>максимального результата</strong>, с помощью каких инструментов находить узкие места, что нужно изменить для достижения поставленной цели.<br><br>Но, чтобы понять, как и на какие рычаги нам предстоит нажать, сначала необходимо разобраться, как устроенна система, выявить в ней слабые места и способы борьбы с ними, чтобы получить приемлемый результат.<br><br><h1>Как это работает?</h1><br>Изучив внутренности Openx, я задумался, почему все настолько сложно написано, ведь аналогичный функционал можно было реализовать гораздо проще. Хотя, наверное, такова судьба всех открытых проектов.<br>Система управления рекламой состоит из двух частей:<br><ul><li>Административной части (backoffice) – отвечает за управление рекламными материалами</li>  <li>Системы доставки рекламы (delivery engine) – отвечает за  выборку нужного баннера, а также за ведение статистики.</li></ul>Административная чать в оптимизации не нуждается, пока не нуждается ;-)),  так как 99% нагрузки приходится на систему доставки рекламы.<br><br>Система доставки устроена так, что при показе одного баннера к серверу <strong>обращается минимум 3 запроса.</strong><br><br><strong>Первый запрос</strong> делается баннерным кодом для того, чтобы узнать, какой именно баннер показывать в зависимости от входящих параметров:<br><ul><li> идентификатора рекламной зоны</li> <li>IP-адреса</li> <li> URL страницы и т.д. </li></ul><strong>Второй запрос</strong>, сформированный баннерным кодом, нужен для сбора данных (показы, клики). <br><br><strong>Третий запрос</strong> к web-серверу - это запрос на получение самого баннера.<br><br>Вызов баннеров происходит с помощью JavaScript-кода, поскольку это наиболее безопасный способ доставки рекламы, при котором рекламная система на 100% отделена от основного ресурса и никак не может повлиять на его работоспособность.<br><br><h1>Возникающие проблемы</h1><br>  На первый взгляд все прекрасно - установи и пользуйся, но в жизни все оказывается гораздо сложнее.<br>Проведя ряд тестов, была выявлена следующая проблема - при достижении нагрузки в 150-300  запросов в секунду система начинала сильно тормозить, вследствие чего нагрузка на сервера увеличивалась и это могло привести к неспособности серверов отвечать на поступающие запросы и полной остановке системы управления рекламой.<br><br>Для того, чтобы было понятнее, с чем мы имеем дело, нам нужно также ознакомиться с архитектурой системы и понять, где могут быть узкие места. <br><br><h1>Архитектура системы</h1><br><center><img src="/uploads/users/1/1222776695.png" alt="" border="0" style="clear: both; margin-top: 5px"></center><br><ol><li>    Запросы пользователей к системе</li><li>    Балансирующий реверсивный прокси сервер (reverse-proxy)</li><li>    Сервера, обрабатывающие запросы пользователей (application servers)</li><li>Сервера базы данных (database servers)</li></ol><br><br><h2>Используемое ПО</h2><br>На всех серверах стоит OC FreeBSD.<br>  <br><h3>Балансировщики</h3><br>  Для распределения нагрузки между backend серверами (3) используется машина с установленным на нее бесплатным httpd-сервером <a href="http://sysoev.ru" target="_blank">Nginx</a>, который выполняет роль балансировщика нагрузки (2) и реверсивного прокси-сервера.<br><br>Машины, на которых стоит <strong>nginx, настроены для обслуживания очень большого количества соединений</strong>. <br><br>Более подробно о настройках сервера <a href="http://www.profyclub.org/articles/299/3037" target="_blank">можно прочитать здесь</a>.<br><br>Для обеспечения надежности системы используется две машины, которые “делят” между собой один IP-адрес (при помощи протокола CARP). <br><br>В случае выхода из строя основного балансировщика автоматически включается дублирующий.<br><br>Более подробную информацию о CARP можно прочитать здесь <a href="http://ru.wikipedia.org/wiki/CARP" target="_blank">http://ru.wikipedia.org/wiki/CARP</a>.<br><br><h3>Application сервера</h3><br>Типичная конфигурация сервера, обрабатывающего запросы пользователей:<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">&nbsp; CPU Athlon 64x2</div></li>
<li class="li1"><div class="de1">&nbsp; RAM 4Gb</div></li>
<li class="li1"><div class="de1">&nbsp; HDD <span class="nu0">750</span> Gb SATA <span class="nu0">100</span></div></li>
<li class="li1"><div class="de1">&nbsp; </div></li>
<li class="li1"><div class="de1">&nbsp; OS FeeBSD</div></li>
<li class="li1"><div class="de1">&nbsp; Apache <span class="nu19">1.3</span> <span class="sy0">+</span>mod_php<span class="sy0">+</span>eAccelerator</div></li>
</ol></div></code></pre><br><br>Cистема строилась год назад, сейчас я бы рекомендовал использовать nginx+PHPFPM+xcache.<br><br>Три таких сервера обеспечивают более 6 000 000 показов рекламы в сутки. В критической ситуации один сервер может быть выведен из кластера без остановки предоставления сервиса в полном объеме.<br /><br><br><h3>Сервер базы данных</h3><br>Типичная конфигурация сервера БД: <br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">CPU Athlon 64x2</div></li>
<li class="li1"><div class="de1">&nbsp; RAM 4Gb</div></li>
<li class="li1"><div class="de1">&nbsp; HDD 2x750 Gb SATA <span class="nu0">100</span> RAID <span class="nu19">0</span></div></li>
<li class="li1"><div class="de1">&nbsp; OS FeeBSD</div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw3">MySQL</span><span class="sy0">:</span> <span class="nu19">5.1</span></div></li>
</ol></div></code></pre><br><br>  Два сервера используются только для увеличения надежности системы, зеркалирование данных осуществляется при помощи репликации.<br><br><h1>Профайлинг - поиск узких мест</h1><br><h2>  Обработка поступающих в систему запросов</h2><br>Входящие запросы от пользователей (1) делятся на два типа: <br><ol><li>  Запросы на отдачу статических файлов: jpg, gif, swf</li><li> Запросы на отдачу динамического содержимого: генерируемая реклама, логирование показов, логирование кликов.</li></ol><br>Статические файлы раздаются с помощью nginx (2) – легкого httpd-сервера нового поколения.<br><br>Вся динамическая часть<a href="http://blog.kovyrin.net/2006/05/18/nginx-as-reverse-proxy/" target="_blank"> проксируется через тот же Nginx</a>, чтобы наиболее оптимально использовать имеющиеся ресурсы. <br><br><h2> Ставим диагноз</h2><br>Для того, чтобы понять, как работает любая система вцелом, рекомендуется делать мониторинг системы - какой-то период времени собирать данные, а потом их анализировать.<br><br>Со временем по графикам вы научитесь определять, когда ваша система работает нормально, а когда у вас начинаются проблемы.<br><br>Для web-ресурсов нужно производить мониторинг:<br><ul><li>  http-сервера - для nginx это модуль stub_status, для Apache это mod_status</li><li> RAM - использование памяти (свободная память, память, выделенная приложению, и т.д.)</li><li> CPU - load average</li><li> HDD - загрузка диска, дисковые операции (особенно актуально для серверов баз данных)<br /></li></ul> <strong>Числовые данные сами по себе практически не несут никакой смысловой нагрузки</strong> - здесь важна динамика и изменение этих данных во времени.<br><br>Например, можно спрогнозировать, когда нам понадобится еще один сервер, обрабатывающий запросы, либо новый жесткий диск.<br><br>Вот графики, котрые были получены при мониторинге работы нашей системы<br><br><center><img src="/uploads/users/1/1222777265.png" alt="Мониторинг системы - определение допустимой нагрузки" border="0" style="clear: both; margin-top: 5px"><br><br><img src="/uploads/users/1/1222777296.png" alt="Мониторинг системы - определение допустимой нагрузки" border="0" style="clear: both; margin-top: 5px"></center><br><br><h2>Что означают эти данные?</h2><br><ul><li>  Reading - сколько соединений находится в состоянии чтения.</li><li> Writing  - сколько соединений находится в состоянии записи.</li><li> Waiting - keep-alive соединения или же в состоянии обработки запроса.</li></ul>На мой взгляд, смысл данных показателей заключается в следующем:<br><br><strong>Writing</strong> - насколько хорошо клиент (application server) отдает данные проксирующему серверу. Если график начинает резко расти вверх, обычно это означает замедление работы сервера, который обслуживает поступающие запросы, либо сервер очень долго обрабатывает поступающие запросы.<br><br><strong>Reading</strong> - насколько хорошо и быстро клиент (пользователь), пославший запрос, читает данные, которые ему отдает балансировщик. Если график с этим показателем резко растет вверх, это означает, что у нас возникают проблемы с каналом (канал слишком узкий). Обычно этот показатель сильно возрастает при DDOS-атаках.<br><br>Теперь посмотрим, что мы видим на графиках:<br><br>до 10:00 система работала нормально<br>после 10:00 резко начинает расти writing<br>где-то в 11:40 резко возрастает количество запросов (от 180 запросов в секунду до 260 запросов в секунду), application сервера напряглись, но выдержали пиковую нагрузку<br><br>После этого нагрузка начинает плавно увеличиваться, а вместе с ней начинает "тормозить" рекламный кластер. <br><br>В 15:45 нагрузка на рекламу максимальная, application сервера перегружены и уже почти не способны обрабатывать новые поступающие запросы - состояние "жуткий тормоз".<br><br>После этого нагрузка была снята и работа серверов вошла в штатный режим, но при увеличении нагрузки до более 200 запросов в секунду опять начинались жуткие проблемы.<br><br>Вот такой неутешительный диагноз был поставлен нами, используя данные системы мониторинга.<br><br><h1>Ищем бутылочное горлышко</h1><br>  В своей работе раздатчик у нас использует два файла <ul><li>  ajs.php - формирует JavaScript-код баннера</li> <li> lg.php  - пишет лог запросов (показы, клики)</li></ul> После профайлинга этих двух файов выяснилось, что php-код хоть и достаточно громоздкий, но выполняется доволно быстро.<br><br>Хороший прирост быстройдействия достигается использованием акселератора, <strong>а основным "тормозом" является работа с MySQL.</strong><br><br><b>Самая болшая проблема</b> Openx на больших нагрузках - это <b>соединение и запись</b> статистических данных в БД MySQL.<br><br>При нагрузке в 2 000 000 показов в сутки количество запросов к MySQL-серверу будет примерно 90 000 000. <br>При этом стоит учесть, что сама <strong>операция записи данных</strong> в таблицу, а также<strong> соединение с сервером БД требует довольно много ресурсов.</strong><br><br>Если при каких-то условиях БД не была доступна, то на серверах резко возрастало количество процессов Apache httpd и резко повышалась нагрузка на сервера, что могло привести к полной остановке системы раздачи рекламы. <br><br><h1>Избавляемся от MySQL при логировании запросов</h1><br>Как говорится, все гениальное - просто! <strong>Вместо того, чтобы писать данные в базу, мы будем писать данные в лог-файлы, которые периодически (например раз в 5 минут) будут вставляться в базу</strong>.<br><br>Этим действием решаем сразу две проблемы: <ul><li> ускоряем работу наших application серверов;</li><li> разгружаем MySQL-сервер (ему теперь не нужно делать единичные вставки, вставки делаются большими пачками).</li></ul> Процесс записи лог-файлов возложим на наш http-сервер, что даст нам максимальное быстродействие для выполнения этой операции.<br><br>Для того, чтобы реализовать такой функционал, надо подкорректировать файл<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">\lib\OA\Dal\Delivery\<span class="kw3">mysql</span><span class="sy0">.</span>php <span class="br0">&#40;</span>~<span class="nu0">690</span> строка<span class="br0">&#41;</span> функция OA_Dal_Delivery_logAction</div></li>
</ol></div></code></pre><br><br>Удаляем там все, что связанно с SQL-запросом, и добавляем такой код:<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'ENV_TYPE_'</span><span class="sy0">.</span><span class="kw3">strtoupper</span><span class="br0">&#40;</span><span class="re0">$table</span><span class="br0">&#41;</span><span class="sy0">,</span> &nbsp; &nbsp;<span class="st_h">'1'</span><span class="sy0">,</span> <span class="kw2">true</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co4">/** plvs */</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv01'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$log_viewerId</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv02'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv03'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$dateFunc</span><span class="br0">&#40;</span><span class="st_h">'Y-m-d H:i:s'</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv04'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$adId</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv05'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$creativeId</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv06'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$zoneId</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv07'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'source'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? MAX_commonDecrypt<span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'source'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="st_h">''</span> <span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv08'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'channel_ids'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'channel_ids'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span> <span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv09'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_ACCEPT_LANGUAGE'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_ACCEPT_LANGUAGE'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="nu19">0</span><span class="sy0">,</span> <span class="nu0">32</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv10'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_ADDR'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv11'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_HOST'</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv12'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'country_code'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'country_code'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv13'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'scheme'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'scheme'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv14'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'host'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'host'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv15'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'path'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv16'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'query'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? &nbsp;<span class="re0">$zoneInfo</span><span class="br0">&#91;</span><span class="st_h">'query'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv17'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'referer'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st_h">'referer'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv18'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_USER_AGENT'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_USER_AGENT'</span><span class="br0">&#93;</span><span class="sy0">,</span> <span class="nu19">0</span><span class="sy0">,</span> <span class="nu0">255</span><span class="br0">&#41;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv19'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$userAgentInfo</span><span class="br0">&#91;</span><span class="st_h">'os'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$userAgentInfo</span><span class="br0">&#91;</span><span class="st_h">'os'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv20'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$userAgentInfo</span><span class="br0">&#91;</span><span class="st_h">'browser'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$userAgentInfo</span><span class="br0">&#91;</span><span class="st_h">'browser'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv21'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'region'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'region'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv22'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'city'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'city'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>; </div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv23'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'postal_code'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'postal_code'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv24'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'latitude'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'latitude'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv25'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'longitude'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'longitude'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv26'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'dma_code'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'dma_code'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv27'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'area_code'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'area_code'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv28'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'organisation'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'organisation'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv29'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'netspeed'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'netspeed'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw3">apache_setenv</span><span class="br0">&#40;</span><span class="st_h">'plv30'</span><span class="sy0">,</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'continent'</span><span class="br0">&#93;</span><span class="br0">&#41;</span> ? <span class="re0">$geotargeting</span><span class="br0">&#91;</span><span class="st_h">'continent'</span><span class="br0">&#93;</span> <span class="sy0">:</span> <span class="st_h">''</span><span class="br0">&#41;</span>;</div></li>
</ol></div></code></pre><br><br>Это позволит установить в сервере Apache значения серверных переменных, которые будут потом записаны в файл.<br><br>Дальше делаем изменения в конфигурационном файле httpd-сервера Apache.<br><br>Для того, чтобы Apache знал, что надо записывать лог-файлы и что именно в них писать, изменяем конфигурационный файл следующим образом.<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="co2"># The following directives define some format nicknames for use with</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2"># a CustomLog directive (see below).</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2">#</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;LogFormat <span class="st0">&quot;%{plv01}e<span class="es0">\t</span>%{plv02}e<span class="es0">\t</span>%{plv03}e<span class="es0">\t</span>%{plv04}e<span class="es0">\t</span>%{plv05}e<span class="es0">\t</span>%{plv06}e<span class="es0">\t</span>%{plv07}e<span class="es0">\t</span>%{plv08}e<span class="es0">\t</span></span></div></li>
<li class="li1"><div class="de1"><span class="st0">%{plv09}e<span class="es0">\t</span>%{plv10}e<span class="es0">\t</span>%{plv11}e<span class="es0">\t</span>%{plv12}e<span class="es0">\t</span>%{plv13}e<span class="es0">\t</span>%{plv14}e<span class="es0">\t</span>%{plv15}e<span class="es0">\t</span>%{plv16}e<span class="es0">\t</span>%{plv17}e<span class="es0">\t</span></span></div></li>
<li class="li1"><div class="de1"><span class="st0">%{plv18}e<span class="es0">\t</span>%{plv19}e<span class="es0">\t</span>%{plv20}e<span class="es0">\t</span>%{plv21}e<span class="es0">\t</span>%{plv22}e<span class="es0">\t</span>%{plv23}e<span class="es0">\t</span>%{plv24}e<span class="es0">\t</span>%{plv25}e<span class="es0">\t</span>%{plv26}e<span class="es0">\t</span></span></div></li>
<li class="li1"><div class="de1"><span class="st0">%{plv27}e<span class="es0">\t</span>%{plv28}e<span class="es0">\t</span>%{plv29}e<span class="es0">\t</span>%{plv30}e&quot;</span> PHP_LOG</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2">#</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2"># The location and format of the access logfile (Common Logfile Format).</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2"># If you do not define any access logfiles within a &lt;VirtualHost&gt;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2"># container, they will be logged here. &nbsp;Contrariwise, if you *do*</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2"># define per-&lt;VirtualHost&gt; access logfiles, transactions will be</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2"># logged therein and *not* in this file.</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co2">#</span></div></li>
<li class="li1"><div class="de1">&nbsp;CustomLog <span class="st0">&quot;| /usr/local/sbin/rotatelogs /var/log/apache/click.log 300&quot;</span> PHP_LOG env<span class="sy0">=</span>ENV_TYPE_OA_DATA_RAW_AD_CLICK</div></li>
<li class="li1"><div class="de1">&nbsp;CustomLog <span class="st0">&quot;| /usr/local/sbin/rotatelogs /var/log/apache/impr.log 300&quot;</span> PHP_LOG env<span class="sy0">=</span>ENV_TYPE_OA_DATA_RAW_AD_IMPRESSION</div></li>
</ol></div></code></pre><br><br>Для ротирования логов используем стандартный Apache rotatelogs.<br><br>После ротации файлы можно брать и использовать.<br><br>Для того, чтобы автоматизировать процесс вставки лог-файлов, пишем простейший консольный скрипт, который будет проверять наличие доступных лог-файлов и импортировать данные в базу.<br><br>Запрос для импортирования будет иметь приблизительно такой вид<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="re0">$sql</span> <span class="sy0">=</span> <span class="st0">&quot;LOAD DATA LOCAL INFILE '&quot;</span><span class="sy0">.</span>LOG_DIR<span class="sy0">.</span><span class="re0">$file</span><span class="sy0">.</span><span class="st0">&quot;' INTO TABLE &quot;</span><span class="sy0">.</span><span class="re0">$table</span><span class="sy0">.</span><span class="st0">&quot; &nbsp;FIELDS TERMINATED BY '<span class="es0">\t</span>' LINES TERMINATED BY '<span class="es0">\n</span>'&quot;</span>;</div></li>
</ol></div></code></pre><br><br>Помимо этого, если в системе используется более одного backend сервера, нужно организовать мониторинг поступления лог-файлов с разных серверов.<br><br>Для этого создадим таблицу в базе и при каждом импорте файлов в БД будем обновлять в ней данные о том, с какого сервера и когда была произведена вставка лог-файлов.<br><br>Запрос на обновление данных в таблице<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="re0">$sql</span> <span class="sy0">=</span> <span class="st0">&quot;REPLACE INTO oa_parsers SET server='&quot;</span><span class="sy0">.</span><span class="re0">$hostname</span><span class="sy0">.</span><span class="st0">&quot;', update_time='&quot;</span><span class="sy0">.</span><span class="kw3">gmdate</span><span class="br0">&#40;</span><span class="st_h">'U'</span><span class="br0">&#41;</span><span class="sy0">.</span><span class="st0">&quot;'&quot;</span>;</div></li>
</ol></div></code></pre><br><br>Теперь по этим данным можно настроить систему мониторинга – <a href="http://www.nagios.org" target="_blank">Nagios</a>,  написав для нее нужный плагин.<br><br><h3>Настройка MySQL</h3><br><br>Для быстрой вставки и хранения логов используйте таблицы типа MyISAM.<br><br>Храните сырую статистику столько времени, сколько вам нужно, причем это надо продумать заранее, потому что удаление небольшой порции данных из очень большой таблицы может длиться очень долго (при наличии 180M записей в таблице удаление данных за неделю происходило более 72 часов).<br><br>Если вы планируете хранить много данных (объем таблицы более 4Gb), внесите изменения в структуру таблиц (выделено цветом)<br><br><pre><code class="sql"><div class="sql sql" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw1">CREATE</span> <span class="kw1">TABLE</span> <span class="st0">`oa_data_raw_ad_impression`</span> <span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`viewer_id`</span> varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`viewer_session_id`</span> varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`date_time`</span> datetime <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0000-00-00 00:00:00'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`ad_id`</span> int<span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`creative_id`</span> int<span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`zone_id`</span> int<span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">UNSIGNED</span> <span class="kw1">NOT</span> <span class="kw1">NULL</span> <span class="kw1">DEFAULT</span> <span class="st0">'0'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`channel`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`channel_ids`</span> varchar<span class="br0">&#40;</span><span class="nu0">64</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`language`</span> varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`ip_address`</span> varchar<span class="br0">&#40;</span><span class="nu0">16</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`host_name`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`country`</span> varchar<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`https`</span> tinyint<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`domain`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`page`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`query`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`referer`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`search_term`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`user_agent`</span> varchar<span class="br0">&#40;</span><span class="nu0">255</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`os`</span> varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`browser`</span> varchar<span class="br0">&#40;</span><span class="nu0">32</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`max_https`</span> tinyint<span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_region`</span> varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_city`</span> varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_postal_code`</span> varchar<span class="br0">&#40;</span><span class="nu0">10</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_latitude`</span> decimal<span class="br0">&#40;</span><span class="nu0">8</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_longitude`</span> decimal<span class="br0">&#40;</span><span class="nu0">8</span><span class="sy0">,</span><span class="nu0">4</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_dma_code`</span> varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_area_code`</span> varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_organisation`</span> varchar<span class="br0">&#40;</span><span class="nu0">50</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_netspeed`</span> varchar<span class="br0">&#40;</span><span class="nu0">20</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="st0">`geo_continent`</span> varchar<span class="br0">&#40;</span><span class="nu0">13</span><span class="br0">&#41;</span> <span class="kw1">DEFAULT</span> <span class="kw1">NULL</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">KEY</span> <span class="st0">`data_raw_ad_impression_viewer_id`</span> <span class="br0">&#40;</span><span class="st0">`viewer_id`</span><span class="br0">&#41;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">KEY</span> <span class="st0">`data_raw_ad_impression_date_time`</span> <span class="br0">&#40;</span><span class="st0">`date_time`</span><span class="br0">&#41;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">KEY</span> <span class="st0">`data_raw_ad_impression_ad_id`</span> <span class="br0">&#40;</span><span class="st0">`ad_id`</span><span class="br0">&#41;</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1"><span class="kw1">KEY</span> <span class="st0">`data_raw_ad_impression_zone_id`</span> <span class="br0">&#40;</span><span class="st0">`zone_id`</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1"><span class="br0">&#41;</span> ENGINE<span class="sy0">=</span>MyISAM <span class="kw1">DEFAULT</span> CHARSET<span class="sy0">=</span>utf8 MAX_ROWS<span class="sy0">=</span><span class="nu0">4294967295</span> AVG_ROW_LENGTH<span class="sy0">=</span><span class="nu0">50</span>;</div></li>
</ol></div></code></pre><br><br>Если таблицы уже существуют, можно использовать ALTER TABLE<br><br><pre><code class="sql"><div class="sql sql" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw1">ALTER</span> <span class="kw1">TABLE</span> tbl_name MAX_ROWS<span class="sy0">=</span><span class="nu0">1000000000</span> AVG_ROW_LENGTH<span class="sy0">=</span> nnn ;</div></li>
</ol></div></code></pre><br><br>Подробнее о вносимых изменениях можно прочитать здесь <a href="http://dev.mysql.com/doc/refman/5.0/en/full-table.html" target="_blank">http://dev.mysql.com/doc/refman/5.0/en/full-table.html</a><br><br><h3>IP-адрес</h3><br><br>При использовании обратного проксирования очень важно, чтобы приложение<strong> правильно определяло IP-адрес клиента</strong>. Для этого мы настроим nginx так, чтобы реальный IP-адрес передавался с помощью переменной HTTP_X_FORWARDED_FOR. <br><br>Для этого вносим в конфигурационный файл nginx следующие настройки<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">proxy_set_header &nbsp; &nbsp; &nbsp; &nbsp;X<span class="sy0">-</span>Forwarded<span class="sy0">-</span><span class="kw1">For</span> <span class="re0">$proxy_add_x_forwarded_for</span>;</div></li>
</ol></div></code></pre><br><br>Далее нужно модифицировать код Openx. <br><br>По крайней мере, версия, которая была на момент написания этого материала, неверно определяет IP-адрес клиента. <br><br>Данная ошибка проявляется только в модуле доставки рекламы при определении условий показа, хотя сбор статистических данных сделан правильно.<br><br>Модифицируем файл  <br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1">\plugins\geotargeting\GeoIP\GeoIP<span class="sy0">.</span>delivery<span class="sy0">.</span>php <span class="br0">&#40;</span><span class="nu0">83</span><span class="br0">&#41;</span></div></li>
</ol></div></code></pre><br><br>В файл добавляем функцию Get_realIP - исходный код есть в том же Openx<br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="co4">/**</span></div></li>
<li class="li1"><div class="de1"><span class="co4">*</span></div></li>
<li class="li1"><div class="de1"><span class="co4">* Get real ip addres from enviroment variables</span></div></li>
<li class="li1"><div class="de1"><span class="co4">*</span></div></li>
<li class="li1"><div class="de1"><span class="co4">*</span></div></li>
<li class="li1"><div class="de1"><span class="co4">*/</span></div></li>
<li class="li1"><div class="de1">&nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">function_exists</span><span class="br0">&#40;</span><span class="st_h">'Get_realIP'</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw2">function</span> Get_realIP<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$aHeaders</span> <span class="sy0">=</span> <span class="kw3">array</span><span class="br0">&#40;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="st_h">'HTTP_FORWARDED'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="st_h">'HTTP_FORWARDED_FOR'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="st_h">'HTTP_X_FORWARDED'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="st_h">'HTTP_X_FORWARDED_FOR'</span><span class="sy0">,</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="st_h">'HTTP_CLIENT_IP'</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">foreach</span> <span class="br0">&#40;</span><span class="re0">$aHeaders</span> <span class="kw1">as</span> <span class="re0">$header</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="re0">$header</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$ip</span> <span class="sy0">=</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="re0">$header</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">break</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">empty</span><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// The &quot;remote IP&quot; may be a list, ensure that</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// only the last item is used in that case</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$ip</span> <span class="sy0">=</span> <span class="kw3">explode</span><span class="br0">&#40;</span><span class="st_h">','</span><span class="sy0">,</span> <span class="re0">$ip</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$ip</span> <span class="sy0">=</span> <span class="kw3">trim</span><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#91;</span><span class="kw3">count</span><span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// If the found address is not unknown or a private network address</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span><span class="re0">$ip</span> <span class="sy0">!=</span> <span class="st_h">'unknown'</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span><span class="sy0">!</span>MAX_remotehostPrivateAddress<span class="br0">&#40;</span><span class="re0">$ip</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// Set the &quot;real&quot; remote IP address, and unset</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// the remote host (as it will be wrong for the</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// newly found IP address) and HTTP_VIA header</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="co1">// (so that we don't accidently do this twice)</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_ADDR'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="re0">$ip</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_HOST'</span><span class="br0">&#93;</span> <span class="sy0">=</span> <span class="st_h">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_VIA'</span><span class="br0">&#93;</span> &nbsp; &nbsp;<span class="sy0">=</span> <span class="st_h">''</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">return</span> <span class="re0">$ip</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
</ol></div></code></pre><br><br>Далее модифицируем функцию MAX_Geo_GeoIP_getInfo, вставив в нее кусок, выделенный жирным шрифтом.<br><br><pre><code class="php"><div class="php php" style="color: #000066; border: 1px solid #CCCCCC; background-color: #F6F6F0; padding: 0 5px 0 15px; margin: 5px 0 5px 0; line-height: 0.1em"><ol><li class="li1"><div class="de1"><span class="kw2">function</span> MAX_Geo_GeoIP_getInfo<span class="br0">&#40;</span><span class="br0">&#41;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$conf</span> <span class="sy0">=</span> <span class="re0">$GLOBALS</span><span class="br0">&#91;</span><span class="st_h">'_MAX'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'CONF'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$GLOBALS</span><span class="br0">&#91;</span><span class="st_h">'_MAX'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'GEO_IP'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$ip</span> &nbsp; <span class="sy0">=</span> <span class="re0">$GLOBALS</span><span class="br0">&#91;</span><span class="st_h">'_MAX'</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st_h">'GEO_IP'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span><span class="kw1">elseif</span><span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'HTTP_X_FORWARDED_FOR'</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$ip</span> <span class="sy0">=</span> Get_realIP<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span></div></li>
<li class="li1"><div class="de1">&nbsp;<span class="re0">$ip</span> <span class="sy0">=</span> <span class="re0">$_SERVER</span><span class="br0">&#91;</span><span class="st_h">'REMOTE_ADDR'</span><span class="br0">&#93;</span>;</div></li>
<li class="li1"><div class="de1">&nbsp;<span class="br0">&#125;</span></div></li>
</ol></div></code></pre><br><br>Это все изменения, которые мы внесли в исходный код продукта. <br><br>Теперь осталось проверить, что же у нас получилось.<br><br><h1>Подводим итоги</h1><br>Итак, что мы получили в результате, покажет наша система мониторинга<br><br><h3>День первый</h3><br><center><img src="/uploads/users/1/1222778205.png" alt="Мониторинг системы - после внесения изменений" border="0" style="clear: both; margin-top: 5px"><br><br><img src="/uploads/users/1/1222778373.png" alt="Мониторинг системы - после внесения изменений" border="0" style="clear: both; margin-top: 5px"></center><br><br>Увеличение нагрузки (макс. 500 запросов в секунду) почти в три раза от того, что есть на исходном графике, - система работает стабильно.<br><br><h3>День второй</h3><br><center><img src="/uploads/users/1/1222778832.png" alt="Мониторинг системы - после внесения изменений" border="0" style="clear: both; margin-top: 5px"><br><br><img src="/uploads/users/1/1222778866.png" alt="Мониторинг системы - после внесения изменений - день 1" border="0" style="clear: both; margin-top: 5px"></center><br><br>780 запросов в секунду - все работает стабильно.<br /><br><br><h3>День третий</h3><br><center><img src="/uploads/users/1/1222778904.png" alt="Мониторинг системы - после внесения изменений - день 2" border="0" style="clear: both; margin-top: 5px"><br><br><img src="/uploads/users/1/1222778923.png" alt="Мониторинг системы - после внесения изменений - день 3" border="0" style="clear: both; margin-top: 5px"></center><br><br>800 запросов в секунду - стабильная работа.<br><br>При такой нагрузке application сервера обрабатывают где-то 120-160 запросов в секунду, в сутки доставляется 13М баннеров.<br><br>Минимальное модифицирование исходных кодов базового продукта дало возможность получить довольно хорошую масштабируемую и отказоустойчивую систему, которая способна выдерживать большие нагрузки.<br><br>При увеличении нагрузки на систему необходимо просто добавить application сервер.<br><br>За год эксплуатации такой системы было показанно более 2,5 миллиарда баннеров и сделано более 15 миллионов кликов.<br><br>Данная статья так же доступна в виде <a href="http://docs.google.com/Doc?id=dgh6nvkt_13gp49sbhd" target="_blank">документа</a>.<br><br><h1>Благодарности</h1><br>Особую благодарность выражаю Алексею Рыбаку за то, что направил в правильное русло мысли о том, как побороть возникшую проблему.]]></description>
<pubDate>Tue, 30 Sep 2008 14:32:23 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/31/</guid>
</item>
<item>
<title>7 этапов масштабируемости web приложений</title>
<link>http://hi-load.php.com.ua/topic/25/</link>
<description><![CDATA[<img src="/uploads/users/1/1222261699.jpg" align="left" alt="Серваки не дураки!!!" border="0" style="margin: 5px 10px 0 0px">Слайды с доклада сделанным John Engates, работающим <a href="http://ru.wikipedia.org/wiki/Главный_инженер" target="_blank" alt="Кто такой CTO ???">CTO</a> в Racksp, на LinuxWorld.<cut><br><br>Типичный успешный web проект проходит 7 стадий развития.<br><br><b>Этап №1 Начало:</b> простая архитектура, низкий уровень кода, приложения не дублируются. Используется фаервол, балансровщик нагрузки, пара web серверов, выделенный сервер БД и внутреннее хранилище.<br><br><b>Этап №2:</b> То же самое только в еще больших объемах.<br><br><b>Этап №3 Первая кровь:</b> используются реверсивные прокси, кеширование статического контента, балансировщики нагрузки, больше серверов для БД, проводится рефакторинг кода.<br><br><b>Этап №4 Боль усиливается:</b> используется кеширование в memcache, процесс записи в приложениях делается медленно - репликация задерживается либо делается очень долго, начали использовать партиционирование в БД, используется множество хранилищь для контента, тербуется существенный рефакторинг архитектуры БД.<br><br><b>Этап №5 Уже действительно больно</b>: основательный рефакторинг системы, разделение нагрузки от пользователей по какому либо параметру - логин, страна и тд. Группы разделенных пользователей обслуживаются отдельными кластерами.<br><br><b>Этап №6 Боль незначительно усиливается</b>: используется масштабируемая архитектура для приложений и баз данных, работа приложений нас уже полностью устраивает, легко наращивается производительность, добавляется новый функционал, оптимизируется код, ваше приложение все еще растет но процесс уже довольно хорошо управляемый.<br><br><b>Этап №7 Исследование неизвестного:</b> узкие места - питание, дисковое пространство, каналы, балансировщики нагрузки, хранилище, люди, БД, все прелести централизованной системы управления ресурсом (один датацентр, одна копия рабочих данных).<br><br><a href="http://highscalability.com/7-stages-scaling-web-apps" target="_blank">Оригинал статьи - highscalability.com</a><br><br>Далее - смотрим презентацию и делимся впечатлениями.<br><center><br><div style="width:425px;text-align:left" id="__ss_545001"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" href="http://www.slideshare.net/davemitz/7-stages-of-scaling-web-applications?type=powerpoint" title="7 Stages of Scaling Web Applications">7 Stages of Scaling Web Applications</a><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=linuxworld-1218083370681251-9&stripped_title=7-stages-of-scaling-web-applications" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=linuxworld-1218083370681251-9&stripped_title=7-stages-of-scaling-web-applications" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;">View SlideShare <a style="text-decoration:underline;" href="http://www.slideshare.net/davemitz/7-stages-of-scaling-web-applications?type=powerpoint" title="View 7 Stages of Scaling Web Applications on SlideShare">presentation</a> or <a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint">Upload</a> your own. (tags: <a style="text-decoration:underline;" href="http://slideshare.net/tag/rackspace">rackspace</a> <a style="text-decoration:underline;" href="http://slideshare.net/tag/web">web</a>)</div></div><br><center>]]></description>
<pubDate>Wed, 24 Sep 2008 16:00:01 +0700</pubDate>
<guid isPermaLink="true">http://hi-load.php.com.ua/topic/25/</guid>
</item>
</channel>
</rss>
