it-консалтинг и аутсорсинг
что мы делаем контакты блог

(Почти) real-time мониторинг ввода-вывода Xsan

Василий Колосов 22.03.2013

Графики в Xsan Admin — это sexy. Но не очень информативно. Хотелось иметь аналог Activity Monitor для Xsan, где бы в (относительно) реальном времени отображалась статистика по вводу-выводу всех клиентов и суммарная нагрузка на системы хранения. Итогом стал инструмент xsanio (состоящий из клиентской и серверной части), который как раз делает нечто похожее, отображая количество операций ввода-вывода в секунду, скорость чтения и записи для отдельных томов и клиентов Xsan:

Xsan I/O monitoring

Как это работает?

На все клиенты Xsan устанавливается служба xsanio_client, которая собирает системные счетчики ввода-вывода и информацию о LUN Xsan, которые подключены к этому клиенту.

Серверная часть (xsanio_server) получает информацию о существующих клиентах Xsan и томах из конфигурации Xsan (файлы config.plist и VOLUME.cfg для каждого тома). Сама по себе она состоит из бэкэнда, который собирает статистику с клиентов, и фронтенда, который представляет ее через веб-интерфейс.

Как установить себе такую штуку?

На клиентах

Для клиентской части есть готовый пакет, который можно скачать по ссылке ниже:

xsanio_client.pkg

Служба будет установлена в /opt/xsanio_client и немедленно запущена (используется элемент launchd /Library/LaunchDaemons/ru.shortcut.xsanio_client.plist). Представляет собой сервер HTTP, который слушает на порту 8090 и отдает статистику в JSON-формате. Есть конфигурационный файл (/opt/xsanio_client/xsanio.cfg), в котором можно задать следующие параметры:

sample_time = 2.0   # частота обновления статистики (в секундах)
cvlabel_refresh_time = 60.0    # частота обновления меток LUN (в секундах)
http_port = 8090    # порт, на котором слушает служба
log_level = ERROR    # поменяйте на INFO, если нужна более подробная диагностическая информация

Значения по умолчанию оптимальны, поэтому их можно не изменять без особой необходимости.

На сервере

Проще всего установить на один из контроллеров метаданных — конфигурация будет автоматически прочитана из каталога, соответствующего версии системы (например, /Library/Filesystems/Xsan/config для Snow Leopard). HTTP-сервер (gunicorn) будет слушать на стандартном порту 80.

Установка через Fabric

Установите git и Command Line Tools на вашу рабочую машину. Затем, (на ней же) склонируйте репозиторий в любое удобное расположение:

git clone https://bitbucket.org/shortcut/xsanio_server.git

Перейдите в локальную копию репозитория (каталог с файлом fabfile.py):
cd /path/to/local/git/repo

Установите pip и fabric:
easy_install pip
pip install fabric

Теперь можно установить xsanio_server на удаленный сервер:
fab bootstrap:host=user@remote-host

Здесь user@remote-host соответствуют реквизитам подключения через SSH. Откройте http://remote-host/ и убедитесь, что вас встречает веб-интерфейс.

Установка вручную

Так тоже можно!

На удаленном сервере (контроллер метаданных) cклонируйте репозиторий в /opt/xsanio_server:

 sudo -i
 mkdir -p /opt
 cd /opt
 git clone https://bitbucket.org/shortcut/xsanio_server.git

Затем (на удаленном сервере), методично выполните следующие команды:
 easy_install pip
 pip install virtualenv
 cd /opt/xsanio_server
 virtualenv xsanio_server_venv
 source xsanio_server_venv/bin/activate
 pip install -r requirements.pip
 cp xsanio_server/settings/local.py.example xsanio_server/settings/local.py
 ./manage.py syncdb
 ./manage.py collectstatic -v0 --noinput
 cp launchd_items/* /Library/LaunchDaemons
 launchctl load /Library/LaunchDaemons/ru.shortcut.xsanio_server_backend.plist
 launchctl load /Library/LaunchDaemons/ru.shortcut.xsanio_server_frontend.plist

Откройте http://remote-host/ и убедитесь, что вас встречает веб-интерфейс.

Что есть в веб-интерфейсе?

Home: общая статистика по всем томам Xsan

Volumes: статистика по отдельным томам.

Clients: список клиентов, где указана его доступность и наличие установленной клиентской части. Щелчок по имени клиента показывает всю доступную для него статистику ввода-вывода.

Возможные проблемы / FAQ

Медленно обновляется статистика

По умолчанию серверная часть использует SQLite в качестве базы данных. Из-за того, что данная СУБД является исключительно файловой, она плохо справляется с большим количеством операций записи. Поэтому, если есть возможность, предпочтительно использовать либо MySQL (Mac OS X 10.6), либо PostgreSQL (OS X 10.7). Я предполагаю, что на сервере уже создана база данных, поэтому достаточно установить на него Xcode / Command Line Tools и установить соответствующий коннектор.

Для MySQL

Остановите серверную часть:

launchctl unload /Library/LaunchDaemons/ru.shortcut.xsanio_server_frontend.plist
launchctl unload /Library/LaunchDaemons/ru.shortcut.xsanio_server_backend.plist

Установите mysql при помощи Homebrew (или любым другим удобным для вас способом):
 ruby -e "$(curl -fsSkL raw.github.com/mxcl/homebrew/go)"
 brew install mysql --client-only
 cd /opt/xsanio_server
 source xsanio_server_venv/bin/activate
 pip install MySQL-python

Создайте пользователя или базу MySQL, измените параметры подключения в /opt/xsanio_server/xsanio_server/settings/local.py (в комментариях файла /opt/xsanio_server/xsanio_server/settings/local.py.example приведены примеры).

Выполните команду синхронизации БД (должна выполниться без ошибок, если подключение корректно работает):

/opt/xsanio_server/manage.py syncdb

Запустите сервер:
launchctl load /Library/LaunchDaemons/ru.shortcut.xsanio_server_frontend.plist
launchctl load /Library/LaunchDaemons/ru.shortcut.xsanio_server_backend.plist

PostgreSQL

Остановите серверную часть (см. выше), затем установите коннектор:

 cd /opt/xsanio_server
 source xsanio_server_venv/bin/activate
 pip install psycopg2

Создайте пользователя или базу PostgreSQL, измените параметры подключения в /opt/xsanio_server/xsanio_server/settings/local.py (в комментариях файла  /opt/xsanio_server/xsanio_server/settings/local.py.example приведены примеры).

Выполните команду синхронизации БД (должна выполниться без ошибок, если подключение корректно работает):

/opt/xsanio_server/manage.py syncdb

Запустите серверную часть.

Ничего не работает!

Проверьте записи в лог-файлах:

tail -n 75 /opt/xsanio_server/log/backend.log
cat /var/log/system.log | grep backend | tail -n 50

Убедитесь, что бэкэнд запущен:
ps uax | grep xsanio_backend | grep -v grep

В логах есть записи «DatabaseError: database is locked»

SQLite не справляется с нагрузкой. Решение — использовать PostgreSQL или MySQL

Я не хочу устанавливать это на контроллер метаданных!

Вы можете установить серверную часть на любую другую машину, скопировать в удобный вам каталог конфигурационные файлы Xsan с контроллера метаданных, а затем указать путь к этому каталогу в файле /opt/xsanio_server/xsanio_server/settings/local.py:

XSAN_CONFIG_PATH = "/path/to/directory"

Можно ли установить серверную часть на Windows или Linux?

Не пробовал, но все должно получиться. Учтите следующие вещи:

  1. Требуется Python 2.6/2.7
  2. Рекомендуется  использовать virtualenv
  3. Gunicorn не работает под Windows
  4. Вам придется скопировать конфигурационные файлы с контроллера метаданных и задать их расположение вручную (см. выше).

А клиенты «тормозить» не начнут из-за сбора статистики?

Клиентская часть использует системные счетчики. Это отбирает не больше ресурсов, чем запущенный Activity Monitor, и нагружает только центральный процессор машины.

Статистика не очень похожа на правдоподобную

  • Убедитесь, что на всех клиентах установлен xsanio_client. Этом можно проверить в разделе Clients.
  • Увеличьте интервал сэмплирования на клиентах (конфигурационный файл /opt/xsanio_client/xsanio.cfg) и перезапустите клиент (через launchd или killall)

Странные ошибки импорта модулей (ImportError)

Не забывайте про virtualenv — его нужно активировать:

source /opt/xsanio_server/xsanio_server_venv/bin/activate

Можно ли удаленно управлять серверной частью?

Разумеется!

Остановить:

fab stop:host=user@remote-server

Запустить:
fab start:host=user@remote-server

Перезапустить:
fab restart:host=user@remote-server

Удалить:
fab remove:host=user@remote-server

Обновить (делает git pull, удаляет службу и устанавливает заново):
fab update:host=user@remote-server

Я нашел ошибку!

Расскажите нам о ней — постараемся исправить.

Почему нет графиков?

Work in progress, work in progress. Пока что графики есть в Xsan Admin :-)

Я хочу что-то изменить в серверной/клиентской части

Весь исходный код открыт: клиент, сервер.

Я кое-что добавил в серверную часть…

Пришлите нам pull request, будем крайне признательны!

Что с безопасностью?

Никаких строгих требований по безопасности к службе не предъявлялось. Размещайте ее в закрытой, приватной сети, недоступной извне.