21.12.09

После некоторых мучений поставил наконец pinba. Авторам респект за реализацию хорошей идеи. Очень коротко напишу как она (pinba ведь явно "она") работает и подробно - как я ее собирал. И еще пару слов по эксплуатации.

Состоит проект из двух частей - серверной, которая ставится в виде плагина к MySQL и клиентской, которая ставится в виде экстеншена в PHP. Клиентские части (с одного или нескольких серверов) передают данные о выполнении PHP скриптов на серверную, которая слушает на UDP порту 30002. Таком образом, появляется возможность собирать оперативную статистику с нескольких серверов.

Версия Pinba engine (серверная, плагин в MySQL) 0.06-dev была взята из snapshot-а со страницы http://pinba.org/wiki/Main_Page.

Версия Pinba extension (клиентская, экстеншен в PHP) вроде как 0.04 из snapshot-а с той же страницы.

Ставилось всё это на RedHat Enterprise Linux 5.2 x86_64.

Сервер - Pinba MySQL plugin

Установка MySQL

Для установки серверной части необходимо установить MySQL начиная с версии 5.1, в которой появился механизм плагинов.

Итак, устанавливаем MySQL версии 5.1.40 на RedHat Enterprise Linux 5.2 x86_64.

Скачиваем RPM c исходниками MySQL отсюда: Source downloads.

Устанавливаем, не забывая предварительно создать директорию /usr/src/redhat при отсутствии оной:

shell> rpm -ivh MySQL-community-5.1.40-0.rhel5.src.rpm
shell> rpmbuild -bp --target=x86_64 --define 'community 1' /usr/src/redhat/SPECS/mysql-5.1.40-patched.rhel5.spec

Естественно, надо доставлять все необходимые пакеты если rpmbuild ругается на неудовлетворенные зависимости.

Теперь надо перейти в директорию /usr/src/redhat/BUILD/mysql-5.1.40, которая была создана последней командой и выполнить в ней:

shell> cd /usr/src/redhat/BUILD/mysql-5.1.40
shell> ./configure
shell> cd include
shell> make

В результате будет создан файл my_config.h, который необходим для сборки pinba.

В документации по установке pinba отмечается, что configure должен вызываться с теми-же параметрами, с которыми были собраны бинарники MySQL. В данном случае configure вызван без параметров, к.т. не удалось выяснить, с какими параметрами производилась сборка RPM-ов с бинарниками. С эти надо еще разбираться. Правильным решением в данной ситуации является сборка MySQL из исходников.

Скачиваем сам MySQL отсюда: Red Hat Enterprise Linux 5 RPM (AMD64 / Intel EM64T) downloads.

Устанавливаем бинарники MySQL:

shell> rpm -ivh MySQL-shared-compat-5.1.40-0.rhel5.x86_64.rpm
shell> rpm -ivh MySQL-devel-community-5.1.40-0.rhel5.x86_64.rpm
shell> rpm -ivh MySQL-server-community-5.1.40-0.rhel5.x86_64.rpm
shell> rpm -ivh MySQL-client-community-5.1.40-0.rhel5.x86_64.rpm

Update:
Собрал MySQL из исходников, верися 5.1.41. Всего одна тонкость: в configure в параметре --with-mysqld-ldflags нельзя укзывать флаг -all-static, т.к. он не даст подключать отдельно собранные плагины, в частноти pinba.

В остальном сборка - как обычно.

Необходимые библиотеки

Перед сборкой pinba необходимо собрать некоторые библиотеки:

Google Protocol Buffers - http://code.google.com/p/protobuf.

Текущая версия protobuf (2.2.0) не подошла, pinba отказалась компилироваться. В исходниках в файле pinba-pb.h в районе 10 строки обнаружилось, что версия protobuf должна быть 2.0.3 и никак иначе. Берем ее отсюда: protobuf-2.0.3.tar.gz.

Собираем:

shell> ./configure --prefix=/usr/local/prog/protobuf-2.0.3
shell> make
shell> make install

Скачиваем и ставим judy ( текущая версия 1.0.5, берем отсюда http://sourceforge.net/projects/judy/ ):

shell> ./configure --prefix=/usr/local/prog/judy-1.0.5 --enable-64-bit
shell> make
shell> make check
shell> make install

Далее скачиваем и ставим libevent ( текущая версия 1.4.10-stable 2.0.1-alpha, берем отсюда http://monkey.org/~provos/libevent/ ):

shell> ./configure --prefix=/usr/local/prog/libevent-1.4.12
shell> make
shell> make verify
shell> make install

pinba

Наконец приступаем к сборке pinba:

shell> ./configure --with-mysql=/usr/src/redhat/BUILD/mysql-5.1.40 \
                   --with-judy=/usr/local/prog/judy-1.0.5 \
                   --with-protobuf=/usr/local/prog/protobuf-2.0.3 \
                   --with-event=/usr/local/prog/libevent-1.4.12 \
                   --libdir=/usr/lib64/mysql/plugin

shell> make
shell> make install

После успешной установки в директории /usr/lib64/mysql/plugin должны появиться файлы, начинающиеся с libpinba_engine.... На всякий случай стоит проверить, что у самой директории права rwxr-xr-x, а не rwx------, как было в моём случае.

Теперь заходим в MySQL пользователем root и выполняем:

mysql> INSTALL PLUGIN pinba SONAME 'libpinba_engine.so';
mysql> CREATE DATABASE pinba;

Далее из директории с исходниками pinba:

shell> mysql -u root -p -D pinba < default_tables.sql

Всё, сервер установлен!
Можно убедится в этом, проверив порт, на котором pinba слушает:

shell> netstat -ln|grep 30002

В ответ должно быть:

udp        0      0 0.0.0.0:30002               0.0.0.0:*

Клиент - Pinba PHP extension

Если клиентская (PHP) часть находится не на той же машине, что и серверная, то потребуется еще раз собрать protobuf:

shell> ./configure --prefix=/usr/local/prog/protobuf-2.0.3
shell> make
shell> make install

Далее собственно сборка pinba extension:

shell> phpize
shell> ./configure --with-pinba=/usr/local/prog/protobuf-2.0.3 --with-php-config=/usr/local/prog/php-5.2.3/bin/php-config
shell> make
shell> make install

Если всё прошло успешно, то осталось прописать в php.ini:

extension=pinba.so

pinba.enabled=1
pinba.server=127.0.0.1

Если серверная часть установлена на другой машине, в параметре pinba.server укажите адрес сервера. Перезапускаем Apache, смотрим список модулей в phpinfo().

Не забудьте добавить правила в iptables, если он используется на сервере.

Эксплуатация

Немного модифицированный SQL запрос для просмотра статистики по времени выполнения:

SELECT script_name, count(*) AS n, avg(req_time) AS avg_req_time, sum(req_time<0.2) AS n02, sum(req_time>=0.2 and req_time<0.5) AS n05, sum(req_time>=0.5 and req_time<1) AS n1, sum(req_time>=1 and req_time<2) AS n2, sum(req_time>=2) AS ng2 FROM request GROUP BY script_name HAVING ng2>0 ORDER BY n DESC LIMIT 100;

После успешного запуска сразу возникла проблема (и ее решение): начав активно вставлять в код на сайте вызовы функций pinba для таймеров и т.д. я через некоторое время понял, что теперь чтоб отключить экстеншн придется разыскивать все вызовы и комментировать их. Чтоб этим не заниматься, я сделал на основе кода оригинального экстеншена заглушку, которая имеет все те-же функции, но не исполняет никакого кода. Своего рода рубильник для быстрого отключения. Если теперь в php.ini изменить:


;extension=pinba.so
extension=pinba_choke.so

и перезапустить Apache, то экстеншн будет отключен и сбор статистики прекращен. Все-таки продукт свежий, в развитии, версия только 0.06, неровен час баг какой... А так спокойнее :)

Возможно есть и более красивые способы сделать это - подскажите.

Еще, естественно, прикрутил к этому хозяйству RRDTools. Можно немного написать об этом увлекательнейшем процессе, если кого интересует.

Дополнительно:

Сайт проекта pinba: pinba.org

ОБСУЖДЕНИЯ

Аватар пользователя leog

Но вот уже пару месяцев как проект стоит на месте, застряв на версии 0.05 в статусе beta. Однако хочется дальнейшего развития.

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.
CommentFile
Максимальный размер файла: 5 МБ.
Разрешённые типы файлов: jpg png.