Sphinx это система полнотекстового поиска c поддержкой таких баз данных как MySQL и PostgreSQL. Он обычно используется на проектах с большой нагрузкой, поскольку обладает высокой скоростью поиска и масштабируемостью.
Для наблюдения за Sphinx можно использовать MRTG. Наиболее интересными параметрами для наблюдения являются количество обрабатываемых tcp-соединений и количество выполняемых запросов. Далее будет показано как можно организовать такой мониторинг.
Забирать данные о состоянии Sphinx мы будем вот таким скриптом:
#!/usr/local/bin/php <?php // Инклуд с официальным API // Берётся из официального архива с исходниками Sphinx // Должен лежать в одной директории с жтим скриптом!!! include dirname(__FILE__) . DIRECTORY_SEPARATOR . 'sphinxapi.php'; // Получаем имя хоста $host = isset($argv[1]) ? $argv[1] : '127.0.0.1'; // Создаём объект $sph = new SphinxClient; // Указываем сервер $sph->SetServer($host, 9312); // Получаем статус во временный массив $data_tmp = $sph->Status(); // Препарируем временный массив $data = array(); foreach ($data_tmp as $item) { $data[$item[0]] = $item[1]; } // Отображаем результат print "{$data['connections']}\n"; print "{$data['queries']}\n"; print "{$data['uptime']}\n"; print "$host\n";
Далее добавляем в файл конфигурации MRTG вот такие строки:
Target[sphinxsearch]: `/usr/local/scripts/mrtg_sphinxsearch.php sphinx.example.com` MaxBytes[sphinxsearch]: 1 Title[sphinxsearch]: sphinxsearch statistics PageTop[sphinxsearch]: <h1>sphinxsearch statistics</h1> AbsMax[sphinxsearch]: 1250000 Options[sphinxsearch]: integer,nopercent,nobanner,growright,dorelpercent,perhour YLegend[sphinxsearch]: per second ShortLegend[sphinxsearch]: per second Legend1[sphinxsearch]: Connections per second Legend2[sphinxsearch]: Queries per second
Полученный график будет выглядеть примерно так:
Здесь синяя линия это число запросов, обрабатываемых ежесекундно а зелёная - число tcp-соединений. Жёлтая линия показывает соотношение этих двух показателей и является косвенным показателем эффективности использования соединений со sphinx: запросы, выполняемые в рамках одного tcp-соединения выполняются немного быстрее, потому чем ниже эта линия - тем эффективнее используется каждое tcp-соединение.
Ещё одной интересной особенностью Sphinx является реализация в нём протокола MySQL, позволяющая обращаться к Sphinx любому MySQL-клиенту и получать результаты используя SQL-подобный язык запросов (SphinxQL). Чтобы использовать эту возможность в файле конфигурации сервиса в секции "searchd" должна присутствовать строка:
listen = 0.0.0.0:9306:mysql41
Если вы используете Sphinx именно таким образом, то скрипт получения данных для MRTG будет выглядеть так:
#!/usr/bin/php <?php // Получаем имя хоста $host = isset($argv[1]) ? $argv[1] : '127.0.0.1'; // Соединяемся с сервером mysql_connect("$host:9306"); // Запрос, который надо выполнить $query = "SHOW STATUS"; // Пытаемся выполнить запрос $result = mysql_query($query); // Здесь будут данные $data = array(); // Если запрос выполнен удачно if ($result) { // Перебираем данные while ($row = mysql_fetch_assoc($result)) { // Складываем их в массив $data[$row['Variable_name']] = $row['Value']; } // Освобождаем ресурсы mysql_free_result($result); } // Отображаем нужные данные print "{$data['connections']}\n"; print "{$data['queries']}\n"; print "{$data['uptime']}\n"; print "$host\n";
На этом всё. Приятной работы!