В ногу со временем,
или как делать
upgrade PostgreSQL
Андрей Сальников
Data Egret
Основные проблемы обновления PostgreSQL
• И так работает!
• Мы - сервис 7х24.
• У нас слишком сложная система.
• Вдруг мы потеряем данные?
Дам ответы на вопросы
• Зачем, вообще, обновляться
• Методика обновлений PostgreSQL
• Ожидаемые проблемы
• Как избежать простоя системы
• Вы сможете делать это самостоятельно
Нумерация версий PostgreSQL
Нумерация, которая использовалась до 10 версии
9.5.8
Major
Major
Minor
Нумерация версий PostgreSQL
Нумерация, которая используется, начиная с 10 версии
10.3
Major Minor
Возможные типы обновлений
• Минорное обновление
• 9.6.2 -> 9.6.5
• 10.0 -> 10.1
• Мажорное обновление
• 9.2.12 -> 10.0
• Актуальные версии:
• 9.3.19, 9.4.14, 9.5.9, 9.6.5, 10.0
• PostgreSQL 9.2 ушел из поддержки сообщества
Подготовка к обновлению
• Прочитайте полностью все release notes
• Обновитесь на тестовом окружении
• Синхронизируйтесь с разработчиками
• Сделайте бэкап базы и проверьте его
Минорное обновление
• Установите пакеты с новой версией PostgreSQL
• Обновите PostgreSQL-зависимые пакеты
• CHECKPOINT
• pgbouncer и пауза
• Перезапустите базу
• Обновите extensions
• Дополнительные процедуры из release notes
E.4.1. Migration to Version 9.6.2
However, if your installation has been affected by the bug described in the first changelog entry below, then after updating you may need to
take action to repair corrupted indexes.
E.4.2. Changes
• Fix a race condition that could cause indexes built with CREATE INDEX CONCURRENTLY to be corrupt (Pavan Deolasee, Tom Lane)
If CREATE INDEX CONCURRENTLY was used to build an index that depends on a column not previously indexed, then rows updated by
transactions that ran concurrently with the CREATE INDEX command could have received incorrect index entries. If you suspect this may
have happened, the most reliable solution is to rebuild affected indexes after installing this update.
postgres@bd14fe3a45ee:~$ psql
psql (9.6.1)
postgres=# select version ();
version
-----------------------------------------------------------------------------------------
PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.3.1-14ubuntu2)
(1 row)
postgres=# dx
List of installed extensions
Name | Version | Schema | Description
--------------+---------+------------+---------------------------------------------------
btree_gin | 1.0 | public | support for indexing common datatypes in GIN
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
postgres@bd14fe3a45ee:~$ psql
psql (9.6.1, server 9.6.5)
postgres=# select version ();
version
-----------------------------------------------------------------------------------------
PostgreSQL 9.6.5 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4)
(1 row)
postgres=# alter extension btree_gin update;
NOTICE: version "1.0" of extension "btree_gin" is already installed
ALTER EXTENSION
Минорное обновление. Итоги
• Легко сделать
• Несёт исправления существенных ошибок
• Улучшение производительности
• Минимальный простой системы
Мажорное обновление
• pg_dump/restore
• pg_upgrade
• Основанные на логических репликациях
Обновление с pg_dump
• Установка пакетов с новой версией PostgreSQL
• Создание нового кластера в той же локали
• Изменение конфигурационных файлов
• Создание дампа базы
• Восстановление дампа базы
• Запуск приложений на новом PostgreSQL
Детали о pg_dump
• Сложности с нагруженными базами
• Обязательна остановка базы
• Требует дополнительного дискового пространства
• pg_dump -Fc - custom format
• pg_dump -Fd --jobs - распараллеливание
• pg_dumpall -p 5432 | psql -d postgres -p 5433
• pg_dumpall --schema-only
pg_upgrade
• Сложная предварительная подготовка
• Возможна потеря базы
• Самый быстрый
• Вероятные проблемы после обновления
Как работает pg_upgrade
user data
pg_catalog
pg_clog
pg_catalog
pg_clog
old
new
user data
pg_catalog
pg_clog
pg_catalog
-
freeze
user data
pg_catalog
pg_clog
pg_catalog
pg_clog
pg_clog
pg_control
user data
pg_catalog
pg_clog
user data
pg_catalog
pg_clog
dump/restore schema
copy or link
Подготовка к pg_upgrade
• Установите все необходимые пакеты для PostgreSQL
• Создайте пустую базу новой версии
• pg_upgrade --check
• pg_dumpall --schema-only
• Проверьте extensions
Обновление с помощью pg_upgrade
• Создайте пустую базу новой версии PostgreSQL
• Остановите старую базу
• Используйте pgbouncer
• Сделайте checkpoint
Обновление с помощью pg_upgrade
• Создайте пустую базу новой версии PostgreSQL
• Остановите старую базу
• Запустите обновление командой pg_upgrade
• Используйте флаг -k для hard links вместо копирования файлов
Обновление с помощью pg_upgrade
• Создайте пустую базу новой версии PostgreSQL
• Остановите старую базу
• Запустите обновление командой pg_upgrade
• Запустите новую версию базы PostgreSQL
• Запустите сбор статистики
Сбор статистики после pg_upgrade
• Обычно запускается vacuumdb --all --analyze-in-stages
• Иногда может быть лучше vacuumdb --all --analyze-only
• Начиная с 9.5, можно запускать параллельные задания (-j)
• Мы используем сгенерированный скрипт со стадиями 1, 10,
10000, и после сбора статистики по 10 разрешаем соединения к
БД
• Необходимо следить за блокировками
Обновление с помощью pg_upgrade
• Создайте пустую базу новой версии PostgreSQL
• Остановите старую базу
• Запустите обновление командой pg_upgrade
• Запустите новую версию базы PostgreSQL
• Запустите сбор статистики
• Разрешите соединения с базой
Extensions
• pg_upgrade не обновляет расширения автоматически
• Release notes для расширений важны
• Некоторые расширения требуют обновления до pg_upgrade
• Всем расширениям необходимо актуализировать версию после
pg_upgrade
• alter extension EXTENSION_NAME update;
Обновление hot-standby (реплики)
• Сначала обновите мастер-сервер
• Реплика старой версии вам пригодится, если случилась беда при
обновлении
• Проверьте, что приложения работают штатно с новой версией
PostgreSQL (postgresql.log)
• Установите новую версию PostgreSQL на сервер реплики
• Скопируйте новую базу командой pg_basebackup
• Запустите реплику на новой версии PostgreSQL
• Не используйте rsync
Использование репликации для обновления
PostgreSQL
• Потоковая репликация не работает между разными версиями
PostgreSQL
• Другие виды репликации работают
• Логическая репликация от 9.4
• Slony-I
• Londiste
Использование репликации для обновления
PostgreSQL
• Процедура обновления
• Настройте новую версию PostgreSQL
• Настройте репликацию со старой версии в новую
• Сделайте мастером новую БД
• Проблемы
• Сложные схемы БД
• Как правило, переносятся только данные в таблицах
• Дополнительное место на дисках
Метод
Простой
системы
Дополнительное
место на дисках
Сложность Риски?
dump/restore
высокий двойное низкая низкие
pg_upgrade
(copy)
высокий двойное высокая низкие
pg_upgrade (link) низкий не нужно высокая высокие
Logical
Replication нет двойное высокая средние
Полезные ссылки
• http://momjian.us/main/writings/pgsql/pg_upgrade.pdf
• https://blog.2ndquadrant.com/untangling-the-postgresql-upgrade/
• http://blog.endpoint.com/2016/12/postgres-statistics-and-pain-of-
analyze.html
• https://www.depesz.com/2016/11/08/major-version-upgrading-with-
minimal-downtime/
Спасибо за внимание!
Вопросы?
andrey.salnikov@dataegret.com
contact@dataegret.com

В ногу со временем, или как делать upgrade PostgreSQL / Андрей Сальников (Data Egret)

  • 1.
    В ногу современем, или как делать upgrade PostgreSQL Андрей Сальников Data Egret
  • 2.
    Основные проблемы обновленияPostgreSQL • И так работает! • Мы - сервис 7х24. • У нас слишком сложная система. • Вдруг мы потеряем данные?
  • 3.
    Дам ответы навопросы • Зачем, вообще, обновляться • Методика обновлений PostgreSQL • Ожидаемые проблемы • Как избежать простоя системы • Вы сможете делать это самостоятельно
  • 4.
    Нумерация версий PostgreSQL Нумерация,которая использовалась до 10 версии 9.5.8 Major Major Minor
  • 5.
    Нумерация версий PostgreSQL Нумерация,которая используется, начиная с 10 версии 10.3 Major Minor
  • 6.
    Возможные типы обновлений •Минорное обновление • 9.6.2 -> 9.6.5 • 10.0 -> 10.1 • Мажорное обновление • 9.2.12 -> 10.0 • Актуальные версии: • 9.3.19, 9.4.14, 9.5.9, 9.6.5, 10.0 • PostgreSQL 9.2 ушел из поддержки сообщества
  • 7.
    Подготовка к обновлению •Прочитайте полностью все release notes • Обновитесь на тестовом окружении • Синхронизируйтесь с разработчиками • Сделайте бэкап базы и проверьте его
  • 8.
    Минорное обновление • Установитепакеты с новой версией PostgreSQL • Обновите PostgreSQL-зависимые пакеты • CHECKPOINT • pgbouncer и пауза • Перезапустите базу • Обновите extensions • Дополнительные процедуры из release notes
  • 9.
    E.4.1. Migration toVersion 9.6.2 However, if your installation has been affected by the bug described in the first changelog entry below, then after updating you may need to take action to repair corrupted indexes. E.4.2. Changes • Fix a race condition that could cause indexes built with CREATE INDEX CONCURRENTLY to be corrupt (Pavan Deolasee, Tom Lane) If CREATE INDEX CONCURRENTLY was used to build an index that depends on a column not previously indexed, then rows updated by transactions that ran concurrently with the CREATE INDEX command could have received incorrect index entries. If you suspect this may have happened, the most reliable solution is to rebuild affected indexes after installing this update.
  • 10.
    postgres@bd14fe3a45ee:~$ psql psql (9.6.1) postgres=#select version (); version ----------------------------------------------------------------------------------------- PostgreSQL 9.6.1 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.3.1-14ubuntu2) (1 row) postgres=# dx List of installed extensions Name | Version | Schema | Description --------------+---------+------------+--------------------------------------------------- btree_gin | 1.0 | public | support for indexing common datatypes in GIN plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (2 rows)
  • 11.
    postgres@bd14fe3a45ee:~$ psql psql (9.6.1,server 9.6.5) postgres=# select version (); version ----------------------------------------------------------------------------------------- PostgreSQL 9.6.5 on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) (1 row) postgres=# alter extension btree_gin update; NOTICE: version "1.0" of extension "btree_gin" is already installed ALTER EXTENSION
  • 12.
    Минорное обновление. Итоги •Легко сделать • Несёт исправления существенных ошибок • Улучшение производительности • Минимальный простой системы
  • 13.
    Мажорное обновление • pg_dump/restore •pg_upgrade • Основанные на логических репликациях
  • 14.
    Обновление с pg_dump •Установка пакетов с новой версией PostgreSQL • Создание нового кластера в той же локали • Изменение конфигурационных файлов • Создание дампа базы • Восстановление дампа базы • Запуск приложений на новом PostgreSQL
  • 15.
    Детали о pg_dump •Сложности с нагруженными базами • Обязательна остановка базы • Требует дополнительного дискового пространства • pg_dump -Fc - custom format • pg_dump -Fd --jobs - распараллеливание • pg_dumpall -p 5432 | psql -d postgres -p 5433 • pg_dumpall --schema-only
  • 16.
    pg_upgrade • Сложная предварительнаяподготовка • Возможна потеря базы • Самый быстрый • Вероятные проблемы после обновления
  • 17.
    Как работает pg_upgrade userdata pg_catalog pg_clog pg_catalog pg_clog old new user data pg_catalog pg_clog pg_catalog - freeze user data pg_catalog pg_clog pg_catalog pg_clog pg_clog pg_control user data pg_catalog pg_clog user data pg_catalog pg_clog dump/restore schema copy or link
  • 18.
    Подготовка к pg_upgrade •Установите все необходимые пакеты для PostgreSQL • Создайте пустую базу новой версии • pg_upgrade --check • pg_dumpall --schema-only • Проверьте extensions
  • 19.
    Обновление с помощьюpg_upgrade • Создайте пустую базу новой версии PostgreSQL • Остановите старую базу • Используйте pgbouncer • Сделайте checkpoint
  • 20.
    Обновление с помощьюpg_upgrade • Создайте пустую базу новой версии PostgreSQL • Остановите старую базу • Запустите обновление командой pg_upgrade • Используйте флаг -k для hard links вместо копирования файлов
  • 21.
    Обновление с помощьюpg_upgrade • Создайте пустую базу новой версии PostgreSQL • Остановите старую базу • Запустите обновление командой pg_upgrade • Запустите новую версию базы PostgreSQL • Запустите сбор статистики
  • 22.
    Сбор статистики послеpg_upgrade • Обычно запускается vacuumdb --all --analyze-in-stages • Иногда может быть лучше vacuumdb --all --analyze-only • Начиная с 9.5, можно запускать параллельные задания (-j) • Мы используем сгенерированный скрипт со стадиями 1, 10, 10000, и после сбора статистики по 10 разрешаем соединения к БД • Необходимо следить за блокировками
  • 23.
    Обновление с помощьюpg_upgrade • Создайте пустую базу новой версии PostgreSQL • Остановите старую базу • Запустите обновление командой pg_upgrade • Запустите новую версию базы PostgreSQL • Запустите сбор статистики • Разрешите соединения с базой
  • 24.
    Extensions • pg_upgrade необновляет расширения автоматически • Release notes для расширений важны • Некоторые расширения требуют обновления до pg_upgrade • Всем расширениям необходимо актуализировать версию после pg_upgrade • alter extension EXTENSION_NAME update;
  • 25.
    Обновление hot-standby (реплики) •Сначала обновите мастер-сервер • Реплика старой версии вам пригодится, если случилась беда при обновлении • Проверьте, что приложения работают штатно с новой версией PostgreSQL (postgresql.log) • Установите новую версию PostgreSQL на сервер реплики • Скопируйте новую базу командой pg_basebackup • Запустите реплику на новой версии PostgreSQL • Не используйте rsync
  • 26.
    Использование репликации дляобновления PostgreSQL • Потоковая репликация не работает между разными версиями PostgreSQL • Другие виды репликации работают • Логическая репликация от 9.4 • Slony-I • Londiste
  • 27.
    Использование репликации дляобновления PostgreSQL • Процедура обновления • Настройте новую версию PostgreSQL • Настройте репликацию со старой версии в новую • Сделайте мастером новую БД • Проблемы • Сложные схемы БД • Как правило, переносятся только данные в таблицах • Дополнительное место на дисках
  • 28.
    Метод Простой системы Дополнительное место на дисках СложностьРиски? dump/restore высокий двойное низкая низкие pg_upgrade (copy) высокий двойное высокая низкие pg_upgrade (link) низкий не нужно высокая высокие Logical Replication нет двойное высокая средние
  • 29.
    Полезные ссылки • http://momjian.us/main/writings/pgsql/pg_upgrade.pdf •https://blog.2ndquadrant.com/untangling-the-postgresql-upgrade/ • http://blog.endpoint.com/2016/12/postgres-statistics-and-pain-of- analyze.html • https://www.depesz.com/2016/11/08/major-version-upgrading-with- minimal-downtime/
  • 30.