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

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

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

Внимание!

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

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

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

Поскольку инструкция является универсальной для standalone и кластерных (cluster) конфигураций, каждый пункт необходимо выполнить на всех узлах экземпляра СУБД. На узле арбитр производить обновление компонентов только по необходимости.

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

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

Обозначения

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

  • 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).

Предусловие

Сведения

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

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

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

Сведения

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

В случае использования расширения timescaledb убедитесь, что обновляемая версия расширения не ниже 2.14.2. В противном случае необходимо сначала обновить расширение до этой версии. Если поднять версию расширения в рамках одной версии СУБД невозможно, следует произвести обновление СУБД на промежуточную, а затем на целевую версию. Уточнение по процессу обновления стендов с предустановленным расширением timescaledb указано в «Таблице поддерживаемых для обновления версий СУБД».

Шаг 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. Для кластерной конфигурации. Добавьте временный физический слот репликации на мастере:

    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. В случае конфигурации с Pangolin Manager (patroni) введите компонент в режим паузы:

    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. Обновление компонента pg_auth_reencrypt

Произведите обновление пакета компонента (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, произведите дополнительно обновление на узле арбитр.

Шаг 4. Обновление компонента pangolin_certs_rotate

Произведите обновление пакета компонента (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, произведите дополнительно обновление на узле арбитр.

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

  1. Произведите обновление пакета компонента (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, произведите дополнительно обновление на узле арбитр.

  1. (master, replica) Проверьте присутствует ли на стенде файл secret_dump_key.bin:

    sudo ls -la /etc/pangolin-security-utilities/secret_dump_key.bin
Внимание!

Выполните следующие шаги только при отсутствии файла secret_dump_key.bin. При наличии — повторное создание не требуется и дальнейшие действия не выполняются, переходите к шагу 6.

При отсутствии файла secret_dump_key.bin в зависимости от конфигурации выполните:

  1. C помощью bash-команды создайте файл для хранения ключа засекречивания:

    /opt/pangolin-security-utilities/bin/pg_dump_generate_secret_file

Шаг 6. Обновление компонента diagnostic_tool

Произведите обновление пакета компонента (pangolin-diagnostic-tool):

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

Шаг 7. Обновление компонента резервного копирования (backup-tools)

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

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

    export PANGOLIN_BACKUP_TOOLS=1.2.2
    sudo dnf remove -y ~/pangolin/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS
    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. Произведите обновление пакета компонента (pangolin-pooler):

    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, произведите дополнительно обновление на узле арбитр.

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

    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" /lib/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. Обновление компонента timescaledb

Произведите обновление пакета компонента (pangolin-timescaledb):

  1. При необходимости удалите старый пакет компонента и зафиксируйте версию:

    export PANGOLIN_TIMESCALEDB_OLD=2.14.2
    sudo dnf remove -y pangolin-timescaledb-6.4-apache-$PANGOLIN_TIMESCALEDB_OLD
  2. Произведите обновление:

    export PANGOLIN_TIMESCALEDB=2.19.3
    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
    Внимание!

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

Шаг 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. Произведите запуск обновления системных данных на реплике, если кластерная конфигурация и обновления на основном узле прошло успешно.

    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 pangolin-manager
    • Для конфигурации без Pangolin Manager:

      sudo systemctl restart postgresql
    • Для конфигурации с 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 pangolin-manager
    • Для конфигурации без Pangolin Manager:

      sudo systemctl status postgresql
    • Для конфигурации с 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. Выведите компонент из режима паузы, дождитесь активного состояния и статуса основного узла (мастера) – 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 pangolin-manager
    • Для конфигурации без Pangolin Manager:

      sudo systemctl restart postgresql
    • Для конфигурации с 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 pangolin-manager
    • Для конфигурации без Pangolin Manager:

      sudo systemctl status postgresql
    • Для конфигурации с 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
    " > /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. Добавьте временный параметр enable_protection_catalogs_upgrade под пользователем postgres в конец конфигурационного файла в зависимости от конфигурации с помощью обычного текстового редактора:

    • Для конфигурации без Pangolin Manager. Отредактируйте конфигурационный файл postgresql.conf:

      enable_protection_catalogs_upgrade = True
    • Для конфигурации c Pangolin Manager. Отредактируйте конфигурационный файл postgres.yml:

      postgresql:
      parameters:
      enable_protection_catalogs_upgrade: True
  2. Произведите 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
    • Для конфигурации c 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. Выполните следующую команду в каждой БД поочередно, кроме БД с включенным флагом datallowconn. <DB> - заменить на название базы данных:

    sudo su - postgres
    psql -c "SELECT NOW()" -d <DB>
    exit
  4. Удалите временный параметр 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
    • Для конфигурации c 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