Графики в Xsan Admin — это sexy. Но не очень информативно. Хотелось иметь аналог Activity Monitor для Xsan, где бы в (относительно) реальном времени отображалась статистика по вводу-выводу всех клиентов и суммарная нагрузка на системы хранения. Итогом стал инструмент xsanio (состоящий из клиентской и серверной части), который как раз делает нечто похожее, отображая количество операций ввода-вывода в секунду, скорость чтения и записи для отдельных томов и клиентов Xsan:
Как это работает?
На все клиенты Xsan устанавливается служба xsanio_client, которая собирает системные счетчики ввода-вывода и информацию о LUN Xsan, которые подключены к этому клиенту.
Серверная часть (xsanio_server) получает информацию о существующих клиентах Xsan и томах из конфигурации Xsan (файлы config.plist и VOLUME.cfg для каждого тома). Сама по себе она состоит из бэкэнда, который собирает статистику с клиентов, и фронтенда, который представляет ее через веб-интерфейс.
Как установить себе такую штуку?
На клиентах
Для клиентской части есть готовый пакет, который можно скачать по ссылке ниже:
Служба будет установлена в /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?
Не пробовал, но все должно получиться. Учтите следующие вещи:
- Требуется Python 2.6/2.7
- Рекомендуется использовать virtualenv
- Gunicorn не работает под Windows
- Вам придется скопировать конфигурационные файлы с контроллера метаданных и задать их расположение вручную (см. выше).
А клиенты «тормозить» не начнут из-за сбора статистики?
Клиентская часть использует системные счетчики. Это отбирает не больше ресурсов, чем запущенный 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, будем крайне признательны!
Что с безопасностью?
Никаких строгих требований по безопасности к службе не предъявлялось. Размещайте ее в закрытой, приватной сети, недоступной извне.