Мониторинг СУБД

Существует несколько способов мониторинга СУБД, и один, который не существует.

Проверка через веб-страничку

Создайте диагностическую страничку, содержание которой будет изменяться в зависимости от состояния базы данных. Этот способ, наверное, самый простой, при этом он безопасный и позволяет выполнять достаточно мощную и сложную проверку (например, проверять количество записей в нужных таблицах). В простом случае, страничка может выдавать либо строчку "OK", либо строчку "Error" (и возможное пояснение ошибок). Диагностическая страничка может быть написана на любом удобном языке программирования (PHP, итд).

В случае такого подхода, мониторинг можно выполнять, к примеру, через метод проверки "HTTP grep". Указав, что страница должна содержать (musthave) "OK" и не содержать (mustnothave) "Error". Как только в сообщении диагностического скрипта появится строчка "Error", okerr при следующей проверке это обнаружит и поднимет тревогу.

Пример простейшего диагностического скрипта (укажите верные значения $user, $pass и имя базы данных):

<?php

$host = "localhost";
$user = "okerrtest";
$pass = "";
$name = "test";

$link = mysqli_connect($host, $user, $pass, $name);

if ($link) {
    echo "OK";
}else{
    echo "Error";
}
?>

Более сложный пример (скрипт проверяет еще и содержание базы данных):

<?php
$host = "localhost";
$user = "okerrtest";
$pass = "";
$name = "test";

$link = mysqli_connect($host, $user, $pass, $name);
if (!$link) {
    echo "Error (no connect)";
    exit;
};
$result = mysqli_query($link, "SELECT MAX(x) FROM x;");
$value = $result->fetch_array()[0];
if($value > 100){
    echo "Error (too high max value: $value)";
    exit;
}
echo "OK";
?>

Возможна так же косвенная проверка - если проблему с базой данных можно обнаружить по содержанию какой-то обычной страницы (например, главная страница отображает сообщение об ошибке Mysql), то можно использовать либо методы HTTP grep или даже HTTP SHA1 hash static/dynamic (если содержание документа не изменяется). Это еще проще, так как не требует создавать диагностическую страничку.

Проверка через shell скрипт

Создать тестового пользователя:

$ mysql -u root -pXXXXX
...
mysql> create user 'okerrtest' identified by 'okerrtestpass';
Query OK, 0 rows affected (0.16 sec)

Создать базу данных для тестов. (не обязательно)

mysql> create database test;
Query OK, 1 row affected (0.01 sec)

Дать на нее все права тестовому пользователю (не обязательно)

mysql> grant all on test.* to okerrtest@localhost;
Query OK, 0 rows affected (0.04 sec)

Дать на нее только права чтения (не обязательно)

mysql> grant select on test.* to okerrtest@localhost;
Query OK, 0 rows affected (0.00 sec)

Пример скрипта:

#!/bin/sh

user=okerrtest
pass=okerrtestpass
name=test # optional 
iname=db 


if [ "$?" != "0" ]
then
    okerrclient --name $iname -s "DETAILS connect failure" ERR
    exit
fi

# optional part
NUM=`mysql -N --batch -u $user -p$pass $name -e "SELECT MAX(x) FROM x;"`
if [ "$NUM" -ge "100" ]
then
    okerrclient --name $iname -s "DETAILS too high num: $NUM" ERR
    exit    
fi

# no errors -> set ok
okerrclient --name $iname -s OK

Этот метод удобен по ряду причин:

  • Не требуется внешнего доступа к серверу. Это и безопаснее и позволяет отслеживать сервер на NAT'ом.
  • Не требуется иметь даже веб-сайт на сервере.
  • Проверка может выполняться с любым интервалом, хоть каждую минуту
  • Проверка может быть сколь угодно сложной, и включать в себя любое количество под-проверок (каждая, если обнаруживат ошибку, устанавливает статус ERR, и заканчивает скрипт)

Через включение скрипта мониторинга mysql для okerrclient

Метод тоже очень простой. На серверной части, в okerr, нужно зайти в настройки сервера или шаблона сервера (например, anyserver), и там установить галочку на скрипте проверки lib:mysql. При следующем запуске okerrclient выполнит эту проверку и загрузит результаты на сервер okerr.

IMGUR

Для того, чтобы okerrclient мог выполнить проверку, на системе должна быть установлена утилита 'mysql' для работы из командной строки, должен быть создан mysql пользователь с именем okerrtest и паролем okerrtestpass (по умолчанию). Никаких полномочий пользователю okerrtest не требуется.

Кроме того, нужно разрешить okerrclient'у запускать утилитку mysql. Для этого нужно в конфигурационном файле /etc/okerrclient.conf добавить "mysql" в список разрешенных к запуску программ. Например:

tpconf = [ RUN:safebin=dig, RUN:safebin=mysql ]

Если вы желаете использовать другое имя или пароль для тестового пользователя, или исполнить другую команду, вы можете клонировать скрипт в свою личную библиотеку скриптов, изменить его там, и затем уже активировать этот свой скрипт.

Этот метод очень удобен и достаточно безопасен, однако следует иметь в виду:

  • В этом случае вы храните данные о тест-пользователе mysql (okerrtest) на стороне okerr.
  • Вы разрешаете okerrclient запускать mysql.
  • Если злоумышленник получит доступ к вашему проекту okerr, он сможет изменить данные пользователя и пароля mysql и тестовой команды (SELECT 1) на что-то более опасное. Например, если он будет знать пароль пользователя root, он сможет изменить команду на DROP DATABASE и удалить любую базу данных.

Конечно, это достаточно маловероятно, особенно если вы будете соблюдать меры безопасности (например, хранить в секрете свой пароль от okerr и от mysql), но тем не менее, мы считаем необходимым предупредить о всех возможных рисках, и подчеркнуть, что мы отказываемся от ответственности в этом случае. Если вам действительно очень важна безопасность - используйте другие рекомендуемые способы (проверка через shell скрипт или диагностическую страничку). В этом случае рисков гораздо меньше.

Удаленный мониторинг через соединение с СУБД (не существует)

Не смотря на то, что этот способ технически очень легко реализовать, мы отказались от его поддержки в okerr в пользу более безопасных способов.

Для того, чтобы удаленный способ мониторинга работал, требуется предоставить доступ сервису мониторинга. Для этого требуется, чтобы сервис мониторинга имел имя пользователя и пароль к сервису, и (так как сервера мониторинга работает с разных IP) чтобы был открыт TCP порт сервера СУБД для всего мира, что крайне небезопасно.

Мониторинг через открытый порт (не рекомендуется)

Этот способ работает, достаточно простой, не требует хранения логина и пароля на сервере okerr, но, тем не менее, мы его не рекомендуем, так как он недостаточно надежен (проверка может не обнаружить некоторые проблемы) и требует небезопасной настройки сервера (как и в предыдущем варианте).

Сервер должен слушать TCP порт на "белом" IP, доступном из интернета. Для ручной проверки, можно со внешнего адреса выполнить команду:

telnet db.example.com 3306

(где db.example.com - адрес вашего сервера, а 3306 - его порт. Для mysql порт 3306, для Postgresql - порт 5432)

Если соединение устанавливается - то порт открыт. Можно создать индикатор для наблюдения за этим портов в okerr. Создайте индикатор, смените тип проверки на "TCP Port" (нажмите "Применить"), затем установите параметры host и port. После ручной проверки ("Перепроверить сразу") убедитесь, что проверка проходит успешно. Все готово.

Еще раз скажем - мы НЕ рекомендуем этот способ. Воспользуйтесь любым из рекомендуемых.