Перейти к основному содержимому

Ручное обновление исполняемых файлов СУБД Pangolin

Перед началом обновления необходимо знать особенности, в связи с изменением формата WAL-файлов:

  1. Корректный откат к исходной версии Pangolin (6.1.0/6.1.2/6.1.4) при отсутствии резервной копии осуществить не получится, поэтому необходимо это учесть при попытке обновиться.
  2. При обновлении стенда кластерной конфигурации, перед началом обновления необходимо выключить все узлы кластера во избежание фоновых записей старого формата, который при старте уже обновленного узла считаются некорректными.

Перед началом выполнения инструкции необходимо убедиться, что yum/dnf-репозитории настроены корректно.

Сведения

Перед началом обновления необходимо заблокировать трафик на всех хостах СУБД и выключить службу crond во избежание сторонних подключений на всех хостах СУБД.

В случае кластерной конфигурации дождитесь полного отсутствия задержки репликации между мастером и репликой. Перед началом процесса обновления узлы кластера должны быть синхронизированы.

Обновление СУБД осуществляется от пользователя с правами sudo, пользователя postgres и пользователя kmadmin_pg.

Все команды ниже являются примерами. Их необходимо отредактировать в соответствии с вашими параметрами и конфигурациями.

Поскольку инструкция является универсальной для standalone и cluster-архитектур, каждый пункт необходимо выполнить на всех узлах кластера БД. На узле arbiter производить обновление компонентов только по необходимости.

Обозначения

В инструкции используются переменные для динамической настройки. Перед выполнением команд эти переменные будут экспортироваться. Скорректируйте значение относительно реализуемого сценария обновления:

  • PANGOLIN_VER – новая версия СУБД Pangolin (формат - х.х.х);
  • PANGOLIN_BACKUP_TOOLS – новая версия компонента pangolin-backup-tools (формат - х.х.х);
  • PANGOLIN_POOLER – новая версия компонента pangolin-pooler (формат - х.х.х);
  • PANGOLIN_MANAGER – новая версия компонента pangolin-manager (формат - х.х.х);
  • PANGOLIN_TIMESCALEDB – новая версия компонента pangolin-timescaledb (формат - х.х.х);
  • PANGOLIN_TIMESCALEDB_OLD – исходная версия компонента pangolin-timescaledb (формат - х.х.х);
  • PANGOLIN_PGHOME_VER – новая версия в пути к бинарным файлам СУБД Pangolin (формат - х.х);
  • PANGOLIN_PGHOME_OLD_VER – исходная версия в пути к бинарным файлам СУБД Pangolin (формат - х.х.х/х.х);
  • PANGOLIN_OLD_VER – исходная версия СУБД Pangolin (формат - х.х.х);
  • PANGOLIN_FULL_VER – новая версия СУБД Pangolin (формат - 0х.00х.0х);
  • PANGOLIN_FULL_OLD_VER – исходная версия СУБД Pangolin (формат - 0х.00х.0х);
  • PGPASSWORD - пароль от пользователя БД (по умолчанию пользователь postgres).

Список ограничений перед проведением обновления исполняемых файлов СУБД Pangolin

Сведения

Проверка и устранение данных ограничений происходит автоматически при выборе автоматизированного способа обновления.

Перед обновлением необходимо провести проверку готовности СУБД и устранить выявленные проблемы. Список необходимых проверок описан в проверках готовности к обновлению.

Шаг 1. Подготовка

  1. Скачайте дистрибутив в рабочий каталог и распакуйте его. Далее по инструкции путь к компонентам дистрибутива будет формироваться по ~/pangolin:

    mkdir -p ~/pangolin
    tar -xzvf pangolin_6.tar.gz -C ~/pangolin
  2. Перед началом обновления убедитесь, что данный сценарий подходит для текущего стенда. Запустите команду из примера ниже на мастере и на реплике:

    sudo mkdir -p /home/postgres/pg_inplace_upgrade/{util,backup,log,dump}
    sudo cp -r ~/pangolin/installer/utilities/pg_inplace_upgrade/* /home/postgres/pg_inplace_upgrade/util
    sudo chmod 700 -R /home/postgres/pg_inplace_upgrade
    sudo chown postgres:postgres -R /home/postgres/pg_inplace_upgrade

    sudo -iu postgres
    export PANGOLIN_VER=x.x.x
    export PANGOLIN_OLD_VER=x.x.x
    export PGPASSWORD=<password for db user>
    cd /home/postgres/pg_inplace_upgrade/util
    ./inplace_upgrade.sh info -n $PANGOLIN_OLD_VER -N $PANGOLIN_VER -s /home/postgres/pg_inplace_upgrade/util -B /home/postgres/pg_inplace_upgrade/backup -d /pgdata/06/data -l /home/postgres/pg_inplace_upgrade/log -p 5433 -h 127.0.0.1 -u postgres -b postgres -m /home/postgres/pg_inplace_upgrade/dump -t /usr/pangolin/bin -T /usr/pangolin-dbms-client/bin -P $PGPASSWORD

    В случае, если необходимо произвести обновление системных данных каталога, будет выведено сообщение:

    INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
    INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
    INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
    INFO: ======= START INPLACE_UPGRADE IN INFO MODE =======
    INFO: ----------- Initial update analysis -----------
    INFO: CATALOG_VERSION_NO_OLD: 202310091
    INFO: Following directories will be searched to find sql-scripts applicable in this run:
    INFO: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version/sql_upgrade_6xx/6.4.0/
    INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
    INFO: Initial update analysis........................... OK
    INFO: ----------- Update CATALOG_VERSION_NO -----------
    INFO: update_catalog_version: The new catalog version is the same as the current one.
    INFO: Update CATALOG_VERSION_NO......................... OK
    INFO: ----------- Read all catalog update SQL-scripts -----------
    INFO: Read all catalog update SQL-scripts............... OK
    INFO: ----------- Extract info about users tablespaces -----------
    INFO: paths: /opt/pangolin_cache/pg_inplace_upgrade/tmp_check/test_db
    INFO: version: PostgreSQL 15.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Platform V SberLinux 8.5.0-18), 64-bit
    INFO: Extract info about users tablespaces.............. OK
    INFO:
    INFO mode finished with Success. Update required.
    ===================================================

    Если нет необходимости в обновлении системных данных каталога, будет выведено сообщение:

    INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
    INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
    INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
    INFO: ======= START INPLACE_UPGRADE IN INFO MODE =======
    INFO: ----------- Initial update analysis -----------
    INFO: CATALOG_VERSION_NO_OLD: 202409231
    INFO: Following directories will be searched to find sql-scripts applicable in this run:
    INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.4.0/
    INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
    INFO: Initial update analysis........................... OK
    INFO:
    INFO mode finished with Success. Update not required.
    ===================================================

    Если в процессе работы утилиты что-то пошло не так, будет выведено сообщение:

    INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
    INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
    INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
    INFO: ======= START INPLACE_UPGRADE IN INFO MODE =======
    INFO: ----------- Initial update analysis -----------
    INFO: CATALOG_VERSION_NO_OLD: 202310091
    INFO: Following directories will be searched to find sql-scripts applicable in this run:
    INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.2.0/
    INFO: Version: 6.2.0 CATALOG_VERSION_NO_NEW: 202310091
    INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.3.0/
    INFO: Version: 6.3.0 CATALOG_VERSION_NO_NEW: 202310091
    INFO: /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.4.0/
    INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
    ERROR: File /opt/pangolin_cache/pg_inplace_upgrade/sql_upgrade_6xx/6.4.1/CATALOG_VERSION was not found
    INFO: Initial update analysis........................... FAIL
    INFO:
    INFO mode finished with Error.
    ===================================================
    Сведения

    К дальнейшим шагам приступайте, если утилита inplace_upgrade.sh вернула сообщение на Шаге 1: «INFO mode finished with Success. Update required».

  3. Для кластерной конфигурации. Добавьте временный физический слот репликации на master:

    1. Проверьте наличие заданных слотов репликации в конфигурации DCS:

      sudo -iu postgres
      /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml show-config
    2. Создайте отдельный файл ignore_slots.json и добавьте, по необходимости, существующие слоты репликации. Формат файла должен быть следующим:

      ignore_slots:
      - <слот репликации>

      где <слот репликации> - существующие слоты репликации из конфигурации DCS.

    3. Добавьте в созданный ранее файл ignore_slots.json информацию о новом временном слоте репликации:

      echo '- name: tmp_update_slot' >> ignore_slots.json && echo '  type: physical' >> ignore_slots.json
    4. Сохраните текущую конфигурацию DCS и примените настройки для ignore_slots:

      cp -r /pgdata/data/data/patroni.dynamic.json /home/postgres
      /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --apply <path_to_ignore_slots> --force
      psql
      SELECT * FROM pg_create_physical_replication_slot('tmp_update_slot', 'TRUE');
      exit

      где path_to_ignore_slots - полный путь до созданного ранее файла ignore_slots.json.

Шаг 2. Остановка компонентов СУБД Pangolin

  1. В случае конфигурации с Patroni/Pangolin Manager введите компонент в режим паузы:

    sudo -iu postgres
    patronictl -c /etc/patroni/postgres.yml edit-config --set 'pause=true' --force
    exit
  2. Остановите все компоненты СУБД Pangolin. Перед остановкой необходимо выполнить команду CHECKPOINT на мастере. В случае кластерной конфигурации действия по остановке произведите сначала на реплике, затем на основном узле:

    # Для конфигурации без pangolin-manager
    sudo systemctl stop postgresql

    # Для конфигурации с pangolin-manager
    sudo -iu postgres
    pg_ctl stop
    exit
    sudo systemctl stop patroni
    sudo systemctl stop pangolin-manager

    # Для конфигурации с etcd
    sudo systemctl stop etcd

    # Для любой конфигурации
    sudo systemctl stop pangolin-pooler
    sudo systemctl stop pangolin_reencrypt@postgres.service
    sudo systemctl stop pangolin_reencrypt@kmadmin_pg.service
    sudo systemctl stop pg_certs_rotate_agent.service
    sudo systemctl stop pangolin-certs-rotate
    sudo systemctl stop pangolin-auth-reencrypt@postgres
    sudo systemctl stop pangolin-auth-reencrypt@kmadmin_pg
  3. Проверьте, что все компоненты корректно остановлены:

    sudo ps aux | grep -E "pgbouncer|pangolin-pooler|pangolin-manager|patroni|postgresql|pangolin-certs-rotate|pg_certs_rotate_agent|pangolin-auth-reencrypt|pangolin_reencrypt|etcd" | grep -v grep

    Если команда на шаге 3 вернула результат, то выполните следующее:

    sudo kill -9 <pid>
    sudo ps aux | grep -E "pgbouncer|pangolin-pooler|pangolin-manager|patroni|postgresql|pangolin-certs-rotate|pg_certs_rotate_agent|pangolin-auth-reencrypt|pangolin_reencrypt|etcd" | grep -v grep

Шаг 3. Обновление компонента pangolin-auth-reencrypt

Произведите обновление пакета компонента:

export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/utilities/pangolin-auth-reencrypt-$PANGOLIN_VER-sberlinux8.x86_64.rpm
Внимание!

В случае конфигурации с DCS, произведите дополнительно обновление на узле arbiter.

Шаг 4. Обновление компонента pangolin-certs-rotate

Произведите обновление пакета компонента:

export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/utilities/pangolin-certs-rotate-$PANGOLIN_VER-sberlinux8.x86_64.rpm
Внимание!

В случае конфигурации с DCS, произведите дополнительно обновление на узле arbiter.

Шаг 5. Обновление компонента pangolin-security-utilities

Произведите обновление пакета компонента:

export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/utilities/pangolin-security-utilities-$PANGOLIN_VER-sberlinux8.x86_64.rpm
Внимание!

В случае конфигурации с DCS, произведите дополнительно обновление на узле arbiter.

Шаг 6. Обновление компонента pangolin-diagnostic-tools

Произведите обновление пакета компонента:

export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/utilities/pangolin-diagnostic-tool-$PANGOLIN_VER-sberlinux8.x86_64.rpm

Шаг 7. Обновление компонента pangolin-backup-tools

  1. Обновите пакет pangolin-backup-tools-venv (обязательная зависимость для pangolin-backup-tools), либо установите его, если он отсутствует:

    sudo dnf install -y ~/pangolin/pangolin-backup-tools-venv-{version_component}-sberlinux8.x86_64.rpm
  2. Произведите обновление пакета компонента:

    export PANGOLIN_BACKUP_TOOLS=1.2.2
    sudo dnf install -y ~/pangolin/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS-sberlinux8.x86_64.rpm
  3. Актуализируйте конфигурационный файл backup-tools-env согласно шаблону ниже:

    # PATH, used for access to required executable files, default value: "${PATH}:{PGHOME}/bin/"
    PATH="${PATH}:/usr/pangolin-6.5/bin/"
    # path to PGHOME, default value: "/opt/pangolin-backup-tools/bin"
    PGHOME="/opt/pangolin-backup-tools"
    # path to python libraries, required for manage_backup.bin, default value: "/opt/pangolin-backup-tools/lib/python3/site-packages"
    PYTHONPATH="/opt/pangolin-backup-tools/lib/python3/site-packages"
    # path to libraries, required for executable files, default value: "/opt/pangolin-backup-tools/lib"
    LD_LIBRARY_PATH="/opt/pangolin-backup-tools/lib"
    # path to plugins libraries, default value: "/opt/pangolin-backup-tools/lib"
    PG_PLUGINS_PATH="/opt/pangolin-backup-tools/lib"

    # Pangolin DBMS server IP, default value: "127.0.0.1"
    ARG_KEY_DBMS_SERVER_IP="127.0.0.1"
    # Pangolin DBMS port, default value: "5433"
    ARG_KEY_DBMS_SERVER_PORT="5433"
    # user used for access to database, default value: "backup_user"
    ARG_KEY_DBMS_CONNECT_USER="backup_user"
    # database to connect, default value: "postgres"
    ARG_KEY_DBMS_CONNECT_DATA_BASE="postgres"
    # path to backup storage, default value: "/pgarclogs"
    ARG_KEY_DBMS_CONNECT_BACKUP_DIR="/pgarclogs/06"
    # password to connect to Pangolin DBMS, default value: 'sample_password'
    # cluster name, default value: "clustername"
    PGINSTANCE="clustername"
    # WAL archives list
    WALSTATE_FILE="$ARG_KEY_DBMS_CONNECT_BACKUP_DIR/wals_to_delete"
    # Log file
    LOG_FILE="$ARG_KEY_DBMS_CONNECT_BACKUP_DIR/archive.log"
    # path to script, used for creating backup files, default value: "/opt/pangolin-backup-tools/bin/manage_backup.sh"
    MANAGE_BACKUP_SCRIPT="/opt/pangolin-backup-tools/bin/manage_backup.sh"

    # setting up of connection string
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS --host $ARG_KEY_DBMS_SERVER_IP"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -p $ARG_KEY_DBMS_SERVER_PORT"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -U $ARG_KEY_DBMS_CONNECT_USER"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -d $ARG_KEY_DBMS_CONNECT_DATA_BASE"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS -B $ARG_KEY_DBMS_CONNECT_BACKUP_DIR"

    # environment variables to launch manage backup
    export PATH
    export PGHOME
    export PYTHONPATH
    export LD_LIBRARY_PATH
    export PG_PLUGINS_PATH

    # опционально
    sudo rm -rf /opt/omni/lbin/*manage_backup*
    sudo rm -rf /opt/omni/lbin/*pg_se_archlogs*

Шаг 8. Обновление компонента Pangolin Pooler

Произведите обновление пакета компонента:

export PANGOLIN_POOLER=1.4.1
sudo dnf install -y ~/pangolin/pangolin-pooler-$PANGOLIN_POOLER-sberlinux8.x86_64.rpm

Шаг 9. Обновление компонента Pangolin Manager

  1. Произведите обновление пакета компонента:

    export PANGOLIN_PGHOME_VER=x.x
    export PANGOLIN_PGHOME_OLD_VER=x.x
    export PANGOLIN_MANAGER=2.1.6
    sudo dnf install -y ~/pangolin/pangolin-manager-venv-$PANGOLIN_MANAGER_VENV-sberlinux8.x86_64.rpm
    sudo dnf install -y ~/pangolin/pangolin-manager-$PANGOLIN_MANAGER-sberlinux8.x86_64.rpm
    sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /etc/pangolin-manager/postgres.yml

    # Добавить в файл /etc/pangolin-manager/postgres.yml параметр в секцию postgresql, если его нет
    bin_dir_client: /usr/pangolin-dbms-client-$PANGOLIN_PGHOME_VER/bin
    Внимание!

    В случае конфигурации с DCS, произведите дополнительно обновление на узле arbiter.

  2. Для конфигурации с DCS выполните данный шаг только на узле arbiter:

    sudo chmod -R 0440 /opt/pangolin-manager/lib/plugins/ /opt/pangolin-manager/lib/libfe_elog.so
    sudo chmod 0770 /opt/pangolin-manager /opt/pangolin-manager/bin /opt/pangolin-manager/lib /opt/pangolin-manager/lib/plugins
    sudo chown postgres:pangolin_users /opt/pangolin-manager /opt/pangolin-manager/bin /opt/pangolin-manager/lib /opt/pangolin-manager/lib/plugins /opt/pangolin-manager/lib/libfe_elog.so

Шаг 10. Обновление компонента pangolin-dbms

Произведите обновление пакета компонента:

export PANGOLIN_OLD_VER=x.x.x
sudo dnf remove -y pangolin-dbms-6.4-$PANGOLIN_OLD_VER
export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/pangolin-dbms-6.5-$PANGOLIN_VER-sberlinux8.x86_64.rpm
sudo rm -rf /usr/pangolin-6.1* /usr/pangolin-6.2* usr/pangolin-6.3* usr/pangolin-6.4* /usr/pgsql-se-06

# Для конфигурации без pangolin-manager
export PANGOLIN_PGHOME_OLD_VER=x.x
export PANGOLIN_PGHOME_VER=x.x
sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /pgdata/06/data/postgresql.conf
sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /etc/systemd/system/postgresql.service

Шаг 11. Обновление компонента pangolin-dbms-client

Произведите обновление пакета компонента:

export PANGOLIN_OLD_VER=x.x.x
sudo dnf remove -y pangolin-dbms-6.4-client-$PANGOLIN_OLD_VER
export PANGOLIN_VER=x.x.x
sudo dnf install -y ~/pangolin/pangolin-dbms-6.5-client-$PANGOLIN_VER-sberlinux8.x86_64.rpm

Шаг 12. Обновление компонента pangolin-timescaledb

Произведите обновление пакета компонента:

# опционально
export PANGOLIN_TIMESCALEDB_OLD=2.14.2
sudo dnf remove -y pangolin-timescaledb-6.4-apache-$PANGOLIN_TIMESCALEDB_OLD
export PANGOLIN_TIMESCALEDB=2.14.2
sudo dnf install -y ~/pangolin/timescaledb/pangolin-timescaledb-6.5-apache-$PANGOLIN_TIMESCALEDB-sberlinux8-x86_64.rpm

Шаг 13. Дополнительные действия

  1. Скопируйте 3rd-party компоненты:

    sudo cp -r ~/pangolin/3rdparty/ /usr/pangolin/
    sudo tar -xzvf /usr/pangolin/3rdparty/3rdparty.tar.gz -C /usr/pangolin/3rdparty/
    sudo chown -R postgres:postgres /usr/pangolin/3rdparty
    sudo chmod -R 0700 /usr/pangolin/3rdparty
  2. Актуализируйте .bash_profile и dynmotd.sh:

    export PANGOLIN_MANAGER=x.x.x
    export PANGOLIN_OLD_MANAGER=x.x.x
    export PANGOLIN_FULL_VER=0x.00x.0x
    export PANGOLIN_FULL_OLD_VER=0x.00x.0x
    export PANGOLIN_PGHOME_VER=x.x
    export PANGOLIN_PGHOME_OLD_VER=x.x

    sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /home/postgres/.bash_profile
    sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /home/kmadmin_pg/.bash_profile
    sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /home/postgres/.bashrc
    sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /home/kmadmin_pg/.bashrc
    sudo sed -i "s/$PANGOLIN_OLD_MANGER/$PANGOLIN_MANAGER/g" /usr/local/sbin/dynmotd.sh
    sudo sed -i "s/$PANGOLIN_FULL_OLD_VER/$PANGOLIN_FULL_VER/g" /usr/local/sbin/dynmotd.sh
    Внимание!

    Произведите дополнительно данные действия на узле arbiter.

Шаг 14. Запуск утилиты обновления системных данных каталога СУБД Pangolin

Внимание!

Выполните данный шаг, если утилита inplace_upgrade.sh вернула сообщение на Шаге 1: «INFO mode finished with Success. Update required».

  1. Добавьте в конец конфигурационного файла postgresql.conf временные значения для мастера и реплики:

    sudo -iu postgres
    echo "synchronous_commit = 'off' #tmp_line" >> /pgdata/data/data/postgresql.conf
    echo "autovacuum = 'off' #tmp_line" >> /pgdata/data/data/postgresql.conf
    echo "cron.database_name = 'template1' #tmp_line" >> /pgdata/data/data/postgresql.conf
    exit
  2. Заменить все вхождения, в строках postgresql.conf, старой версии на новую версию для мастера и реплики

    export PANGOLIN_PGHOME_OLD_VER=x.x
    export PANGOLIN_PGHOME_VER=x.x
    sudo sed -i "s/$PANGOLIN_PGHOME_OLD_VER/$PANGOLIN_PGHOME_VER/g" /pgdata/06/data/postgresql.conf
  3. Произведите запуск обновления системных данных на мастере:

    sudo -iu postgres
    export PANGOLIN_VER=x.x.x
    export PANGOLIN_OLD_VER=x.x.x
    export PGPASSWORD=<password for db user>
    cd /home/postgres/pg_inplace_upgrade/util
    ./inplace_upgrade.sh update -n $PANGOLIN_OLD_VER -N $PANGOLIN_VER -s /home/postgres/pg_inplace_upgrade/util -B /home/postgres/pg_inplace_upgrade/backup -d /pgdata/06/data -l /home/postgres/pg_inplace_upgrade/log -p 5433 -h 127.0.0.1 -u postgres -b postgres -m /home/postgres/pg_inplace_upgrade/dump -t /usr/pangolin/bin -T /usr/pangolin-dbms-client/bin -D -k -P $PGPASSWORD
    exit

    Ожидаемый успешный результат:

    ...
    INFO: Update Complete!
    INFO: ----------- Finish upgrade -----------
    INFO: Finish upgrade.................................... OK
    INFO:
    UPDATE mode finished with Success.
    ===================================================

    Внимание!

    В случае, если на мастере обновление прошло неуспешно, произведите восстановление по инструкции «Восстановление после неудачного обновления исполняемых файлов». Все дальнейшие шаги данной инструкции необходимо пропустить.

  4. Произведите запуск обновления системных данных на реплике, если кластерная конфигурация и обновления на узле master прошло успешно.

    sudo -iu postgres
    export PANGOLIN_VER=x.x.x
    export PANGOLIN_OLD_VER=x.x.x
    export PGPASSWORD=<password for db user>
    cd /home/postgres/pg_inplace_upgrade/util
    ./inplace_upgrade.sh update -n $PANGOLIN_OLD_VER -N $PANGOLIN_VER -s /home/postgres/pg_inplace_upgrade/util -B /home/postgres/pg_inplace_upgrade/backup -d /pgdata/06/data -l /home/postgres/pg_inplace_upgrade/log -p 5433 -h 127.0.0.1 -u postgres -b postgres -m /home/postgres/pg_inplace_upgrade/dump -t /usr/pangolin/bin -T /usr/pangolin-dbms-client/bin -r -D -k -P $PGPASSWORD

    Ожидаемый результат:

    INFO: Location of update_catalog_version utility: /opt/pangolin_cache/pg_inplace_upgrade/update_catalog_version
    INFO: The log-file containing postgresql logs produced during catalog update: /pgarclogs/pg_inplace_upgrade/log/postgres_updade.log
    INFO: The summarized catalog update report: /pgarclogs/pg_inplace_upgrade/log/report.log
    INFO: ======= START INPLACE_UPGRADE IN UPDATE MODE =======
    INFO: ----------- Initial update analysis -----------
    INFO: CATALOG_VERSION_NO_OLD: 202310091
    INFO: Following directories will be searched to find sql-scripts applicable in this run:
    INFO: /opt/pangolin_cache/pg_inplace_upgrade/tmp_check/upgrade9/sql_upgrade_6xx/6.4.0/
    INFO: Version: 6.4.0 CATALOG_VERSION_NO_NEW: 202409231
    INFO: Initial update analysis........................... OK
    INFO: ----------- Update CATALOG_VERSION_NO -----------
    INFO: update_catalog_version: Catalog version has been successfully updated to 202409231.
    INFO: Update CATALOG_VERSION_NO......................... OK
    INFO: ----------- Read all catalog update SQL-scripts -----------
    INFO: Read all catalog update SQL-scripts............... OK
    INFO: ----------- Update user tablespaces -----------
    INFO: renamed '/tmp/WDfqY_1Ing/PG_15_202310091' -> '/tmp/WDfqY_1Ing/PG_15_202409231'
    INFO: Rename directories of user tablespaces
    INFO: Update user tablespaces........................... OK
    INFO: Replica is updated
    INFO:
    UPDATE mode finished with Success.
    ===================================================

    Внимание!

    В случае, если на мастере обновление прошло неуспешно, произведите восстановление по инструкции «Восстановление после неудачного обновления исполняемых файлов».

    Все дальнейшие шаги данной инструкции необходимо пропустить.

Шаг 15. Запуск компонентов СУБД Pangolin

  1. Удалите временные переменные из postgresql.conf на мастере и реплике:

    synchronous_commit = 'off' #tmp_line
    autovacuum = 'off' #tmp_line
    cron.database_name = 'template1' #tmp_line
  2. Запустите компоненты Pangolin на мастере:

    sudo systemctl daemon-reload
    sudo systemctl restart user@$(id -u postgres)
    sudo systemctl restart user@$(id -u kmadmin_pg)

    # Для конфигурации без pangolin-manager
    sudo systemctl restart postgresql

    # Для конфигурации с pangolin-manager
    sudo systemctl restart pangolin-manager

    # Для конфигурации с etcd
    sudo systemctl restart etcd

    # Для любой конфигурации
    sudo systemctl restart pangolin-pooler
    sudo systemctl restart pangolin-certs-rotate
    sudo systemctl restart pangolin-auth-reencrypt@postgres
    sudo systemctl restart pangolin-auth-reencrypt@kmadmin_pg
  3. Произведите проверку состояния служб на мастере:

    # Для конфигурации без pangolin-manager
    sudo systemctl status postgresql

    # Для конфигурации с pangolin-manager
    sudo systemctl status pangolin-manager

    # Для конфигурации с etcd
    sudo systemctl status etcd

    # Для любой конфигурации
    sudo systemctl status pangolin-pooler
    sudo systemctl status pangolin-certs-rotate
    sudo systemctl status pangolin-auth-reencrypt@postgres
    sudo systemctl status pangolin-auth-reencrypt@kmadmin_pg
  4. Для конфигурации с pangolin-manager. Выведите pangolin-manager из режима паузы, дождитесь активного состояния и статуса master – Leader:

    sudo -iu postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
    exit
  5. Для конфигурации с pangolin-manager. Включите синхронизацию:

    sudo -iu postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml show-config | grep synchronous > save_old_dcs_value.txt
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode=true' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=true' --force
    exit
  6. Произведите запуск компонентов Pangolin на реплике:

    sudo systemctl daemon-reload
    sudo systemctl restart user@$(id -u postgres)
    sudo systemctl restart user@$(id -u kmadmin_pg)

    # Для конфигурации без pangolin-manager
    sudo systemctl restart postgresql

    # Для конфигурации с pangolin-manager
    sudo systemctl restart pangolin-manager

    # Для конфигурации с etcd
    sudo systemctl restart etcd

    # Для любой конфигурации
    sudo systemctl restart pangolin-pooler
    sudo systemctl restart pangolin-certs-rotate
    sudo systemctl restart pangolin-auth-reencrypt@postgres
    sudo systemctl restart pangolin-auth-reencrypt@kmadmin_pg
  7. Произведите проверку состояния служб на реплике:

    # Для конфигурации без pangolin-manager
    sudo systemctl status postgresql

    # Для конфигурации с pangolin-manager
    sudo systemctl status pangolin-manager

    # Для конфигурации с etcd
    sudo systemctl status etcd

    # Для любой конфигурации
    sudo systemctl status pangolin-pooler
    sudo systemctl status pangolin-certs-rotate
    sudo systemctl status pangolin-auth-reencrypt@postgres
    sudo systemctl status pangolin-auth-reencrypt@kmadmin_pg
  8. Дождитесь статуса синхронизации на реплике – sync_standby:

    sudo -iu postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml list
    exit
  9. Удалите временный физический слот репликации на мастера:

    sudo -iu postgres
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --replace /home/postgres/patroni.dynamic.json --force
    psql -c "SELECT * FROM pg_drop_replication_slot('tmp_update_slot');"
    exit
  10. Восстановите исходных значений конфигурации dcs

    sudo -iu postgres
    echo pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set "'synchronous_mode=$(sed -n /synchronous_mode:/p save_old_dcs_value.txt | sed 's/synchronous_mode: //')'" --force | bash
    echo pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set "'synchronous_mode_strict=$(sed -n /synchronous_mode_strict:/p save_old_dcs_value.txt | sed 's/synchronous_mode_strict: //')'" --force | bash
    exit

Шаг 16. Обновление расширений

  1. Создайте временный файл ext_update.sql и поместите его в /home/postgres/:

    set ON_ERROR_STOP = true;
    DO $$
    DECLARE
    r text;
    BEGIN
    FOR r IN (SELECT extname FROM pg_catalog.pg_extension WHERE extname in ( 'adminpack', 'amcheck', 'auth_delay', 'auto_explain', 'autoinc', 'bloom', 'btree_gin', 'btree_gist', 'citext', 'cube', 'dblink', 'dict_int', 'dict_xsyn', 'earthdistance', 'file_fdw', 'fuzzystrmatch', 'hstore', 'hstore_plperl', 'hstore_plperlu', 'hstore_plpython3u', 'insert_username', 'intagg', 'intarray', 'isn', 'jsonb_plperl', 'jsonb_plperlu', 'jsonb_plpython3u', 'lo', 'ltree', 'ltree_plpython3u', 'moddatetime', 'pageinspect', 'pg_buffercache', 'pg_freespacemap', 'pg_prewarm', 'pg_stat_statements', 'pg_trgm', 'pg_visibility', 'pgcrypto', 'pgrowlocks', 'pgstattuple', 'plperl', 'plperlu', 'plpgsql', 'pltcl', 'pltclu', 'postgres_fdw', 'refint', 'seg', 'sslinfo', 'tablefunc', 'tcn', 'timetravel', 'tsm_system_rows', 'tsm_system_time', 'unaccent', 'uuid-ossp', 'xml2', 'bool_plperlu', 'bool_plperl', 'rum', 'oid2name', 'online_analyze', 'pg_backup', 'pg_standby', 'protected_dump', 'pg_profile', 'orafce', 'pg_squeeze', 'pg_cron', 'pg_repack', 'pgse_backup', 'pg_hint_plan', 'pg_outline', 'oracle_fdw', 'tds_fdw', 'psql_lockmon', 'pg_stat_kcache', 'psql_rotate_password', 'fasttrun', 'fulleq', 'mchar', 'psql_diagpack', 'pg_store_plans', 'pg_orphaned', 'psql_resources_consumption_limits') and extname not in ('pg_repack', 'timescaledb'))
    LOOP
    RAISE NOTICE 'Update extension %', r;
    EXECUTE FORMAT('ALTER EXTENSION %I UPDATE;', r);
    END LOOP;
    FOR r IN (SELECT extname FROM pg_catalog.pg_extension WHERE extname = 'pg_repack')
    LOOP
    RAISE NOTICE 'Update extension %', r;
    EXECUTE FORMAT('DROP EXTENSION IF EXISTS %I;', r);
    EXECUTE FORMAT('CREATE EXTENSION IF NOT EXISTS %I WITH SCHEMA ext;', r);
    END LOOP;
    END $$;
  2. Создайте временный файл run_update_extentions.sh и поместите его в /home/postgres/:


    databases=($($PG_HOME/bin/psql -t --csv -c "SELECT datname FROM pg_database WHERE datname NOT LIKE 'template0';"))
    echo "databases: " $databases
    for ud in "${databases[@]}"; do
    echo "database: " $ud
    $PG_HOME/bin/psql -d $ud -f /home/postgres/ext_update.sql
    done
    if [ $? -eq 0 ]
    then
    echo "All extentions have updated on nodes"
    else
    echo "There were some problems during proccess updating"
    exit 1

    fi
    fi
    " > /home/postgres/run_update_extentions.sh
    exit
    fi
    " > /home/postgres/run_update_extentions.sh
    exit
  3. Запустите sh-скрипт run_update_extentions.sh:

    sudo -iu postgres
    chmod 0700 run_update_extentions.sh
    cd ~/
    PG_LICENSE_PATH=/opt/pangolin_license PG_HOME=/usr/pangolin-dbms-client PGHOST=127.0.0.1 PGPORT=5433 ./run_update_extentions.sh
    rm -f /home/postgres/run_update_extentions.sh /home/postgres/ext_update.sql
    exit

    Внимание!

    Произведите выключение блокировки трафика и запуск службы crond, если ранее они были выключены.

Шаг 17. Обновление каталога безопасности

  1. (master) Добавьте временный параметр enable_protection_catalogs_upgrade из под пользователя postgres в конец конфигурационного файла в зависимости от конфигурации с помощью обычного текстового редактора:

    # Для конфигурации без pangolin-manager отредактируйте конфигурационный файл postgresql.conf
    enable_protection_catalogs_upgrade = True

    # Для конфигурации с pangolin-manager отредактируйте конфигурационный файл postgres.yml
    postgresql:
    parameters:
    enable_protection_catalogs_upgrade: True
  2. (master) Произведите reload и restart СУБД в зависимости от конфигурации:

    # Для конфигурации без pangolin-manager
    sudo su - postgres
    /usr/pangolin/bin/pg_ctl reload -D /pgdata/data/data
    /usr/pangolin/bin/pg_ctl restart -D /pgdata/data/data
    exit

    # Для конфигурации с pangolin-manager
    sudo su - postgres
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
    exit
  3. (master) Выполните следующую команду в каждой БД поочередно, кроме БД с включенным флагом datallowconn. <DB> - заменить на название базы данных:

    sudo su - postgres
    psql -c "SELECT NOW()" -d <DB>
    exit
  4. (master) Удалите временный параметр enable_protection_catalogs_upgrade из конфигурационного файла в зависимости от конфигурации из под пользователя postgres с помощью обычного текстового редактора. И произведите reload и restart СУБД в зависимости от конфигурации:

    # Для конфигурации без pangolin-manager
    sudo su - postgres
    /usr/pangolin/bin/pg_ctl reload -D /pgdata/data/data
    /usr/pangolin/bin/pg_ctl restart -D /pgdata/data/data
    exit

    # Для конфигурации с pangolin-manager
    sudo su - postgres
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml reload clustername
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
    exit