вторник, 11 июня 2013 г.

Взвешиваем базу на Vertica

Привет. Всегда возникает момент, когда наше хранилище данных стремительно растет, занимается место на дисках серверов, уменьшается размер оставшейся лицензии и хочется узнать, а что же и сколько занимает из объектов базы данных. Например, сейчас наше хранилище данных «съело» 15 терабайт лицензии, заняв на дисках порядка 11 терабайт пространства. Хороший повод помониторить базу данных и узнать, что и сколько весит.

Для начала посмотрим объем дискового пространства на серверах кластера:
SELECT host_name, disk_space_total_mb, disk_space_used_mb, disk_space_free_mb
FROM HOST_RESOURCES
ORDER BY host_name;

Следует обратить внимание, что в возвращаемый занимаемый дисковый объем базой помимо самих данных так же входит их зеркальная копия, размер которой зависит от установленного k-safe. При k-safe = 1, на каждом сервере занимаемый объем полезных данных к зеркальной копии другой ноды будет 50 на 50, при k-safe = 2 это будет 1/3. Так же в этот объем будут входить промежуточные временные данные, которые могут создаваться Vertica на момент выполнения запросов, однако объем их не велик, так что их смело можно не учитывать.

Важно отслеживать, что свободное пространство на дисках серверов БД достаточно как для проведения промежуточных операций, так и для операций создания резервных копий и ребалансировки кластера. В документации Vertica рекомендуется, чтобы на дисках серверов было не менее 40% свободного пространства, но я думаю этот процент дан с перестраховкой на все случае жизни и он может быть ниже. В любом случае, малый объем пространства на дисках серверов это серьезный повод начинать думать о том, что необходимо на сервера кластера добавить новые диски или же добавить новые сервера в кластер.

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

Итак, с занимаемым дисковым пространством разобрались. Как же узнать, сколько места занимают сами таблицы? Напишем такой запрос:
SELECT
       ANCHOR_TABLE_SCHEMA, ANCHOR_TABLE_NAME,
       Round(Sum(ROS_USED_BYTES) / 1024 / 1024 / 1024, 3)::decimal(12, 3) AS size_gb
FROM COLUMN_STORAGE
GROUP BY ANCHOR_TABLE_SCHEMA, ANCHOR_TABLE_NAME
ORDER BY Sum(ROS_USED_BYTES) DESC;
Результат запроса содержит все таблицы всех схем базы данных, которые были отсортированны по занимаемому физическому пространству на диске по убыванию. В этот объем входят все занимаемые таблицей данные – всех колонок всех проекций таблицы плюс их зеркало на других нодах.
Данный запрос позволит определить наиболее массивные на диске таблицы базы данных. Если они занимаются гораздо больше запланированного вами места, это хороший повод посмотреть на количество проекций таких таблиц и подумать, есть ли возможность сократить их количество, пересоздав проекции, которые более широко охватывали серии различных запросов. Как вариант – можно запустить на данные  таблицы Database Designer, который проанализирует существующие проекции и идущие к таблице запросы и возможно предложит создать меньшее кол-во проекций, удалив текущие.
Разобравшись с физическим хранением, посмотрим теперь на определение занимаемого размера объектов БД в лицензии. Для начала получим информацию по установленной для Vertica лицензии:
SELECT DISPLAY_LICENSE();
В результате будет возвращена дата начала действия лицензии, количество дней, в течении которых сервер будет продолжать сохранять полную работоспособность после превышения лимита лицензии и размер лицензии в терабайтах.
Посмотреть, сколько уже занято размера лицензии можно таким запросом:
SELECT GET_COMPLIANCE_STATUS();
Данные по размеру занимаемой лицензии рассчитываются Vertica раз в сутки. Происходит это после 0 часов. Этот процесс занимает определенные ресурсы, так что, если у вас ночью идет активная загрузка данных, то имеет смысл перенести процесс аудита лицензии на другое время. Делается это с помощью системной функции «SET_AUDIT_TIME».
Если вас интересует подробная информация, как Vertica рассчитывает размер исходных занимаемых в лицензии данных, рекомендую заглянуть в «Administrators Guide», раздел «Managing Licenses», главу «Calculating the Database Size».
Ну и последний штрих - смотрим по интересующим нас объектам, как много у лицензии они отняли. Для этого воспользуемся функцией AUDIT:
SELECT AUDIT('СхемаБД', 'schema');
SELECT AUDIT('СхемаБД.ТаблицаБД', 'table');
Первый запрос вернет размер лицензии, который занимает указанная схема базы данных. Второй запрос вернет размер лицензии, который занимает указанная таблица базы данных.
Если взять выше указанный запрос на определение занимаемого физического пространства таблицами, то получается удобным по нему определить наиболее массивные таблицы и далее на них с помощью функции «AUDIT» просмотреть, сколько лицензии потребили данные таблицы. Так же, при k-safe = 1, можно приближенно вычислить объем занимаемого размера лицензии таблицы по следующей формуле:
РазмерЛицензии = ФизическийРазмерТаблицы * 1.5.

На этом пока все, до новых записей в блоге.

1 комментарий: