"Долгоиграющие" БД PostgreSQL
LVEE 2013
Когда базы PostgreSQL вырастают до сотен гигабайт, обеспечение их бесперебойной и быстрой работы под высокими нагрузками начинает требовать особых подходов.
Длительный срок эксплуатации при постоянной записи в БД порождает проблему «распухания» индексов и таблиц. Необходимо уметь оценивать степень «опухания», чтобы своевременно проводить обслуживание таблиц и индексов. Для оценки можно использовать запросы, приведенные в wiki1 или в презентации Michael Glaesemann2.
«Распухшие» индексы можно пересоздать штатной конструкцией SQL REINDEX, но это заблокирует таблицу на запись на время пересоздания индекса. Более «либеральный» вариант — создать аналогичный индекс конструкцией CREATE INDEX CONCURRENTLY, затем удалить старый индекс и переименовать новый.
Для «компактизации» таблиц можно использовать конструкции VACUUM FULL и CLUSTER, но они также блокируют обрабатываемые таблицы. Поэтому были созданы альтернативные инструменты: vacuum_table.pl3/pgcompactor4 и pg_repack5.
Большой объем БД и постоянная нагрузка создают проблемы с резервным копированием. Здесь нужно соблюсти баланс между длительностью резервного копирования, создаваемой им нагрузкой на сервер БД и занимаемым им объемом. Самый простой способ — создать дамп базы с помощью pg_dump, но он использует конструкцию COPY, которая блокирует таблицы, и создает нагрузку на сервер БД. Альтернативный вариант — копирование кластера БД с файловой системы и сохранение WAL-логов. Более интересный вариант — использование снапшотов ФС и сохранение WAL-логов. Также есть специализированные решения — pg_rman6 и WAL-E7.
Необходимость постоянной доступности БД требует включения репликации, что также определяет некоторые особенности в обращении с базами.
Для создания потоковой реплики можно использовать как обычные средства сетевого копирования (scp и rsync), так и специализированные утилиты — pg_basebackup и repmgr8.
Переключение ролей по описанному в руководстве способу (с использованием trigger_file) приводит к необходимости пересоздания подчиненных реплик, что выливается в затраты времени и трафика. Если есть возможность последовательного перезапуска всех узлов кластера репликации, то можно просто переконфигурировать узлы в новую схему и перезапустить их с новыми ролями.
Каждое из решений обозначенных выше проблем имеет как свои плюсы, так и свои минусы. Выбор решений зависит от требований и возможностей каждой конкретной инфраструктуры.
Ссылки
1 http://wiki.postgresql.org/wiki/Show_database_bloat
2 http://www.pgcon.org/2009/schedule/attachments/96_visualizing-postgres-2009-05-21.pdf
3 http://code.google.com/p/compacttable/
4 http://code.google.com/p/pgtoolkit/
5 https://github.com/reorg/pg_repack
6 http://code.google.com/p/pg-rman/
7 https://github.com/heroku/WAL-E
8 http://www.repmgr.org/
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Back