Обновление#

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

В составе дистрибутива (папка installer) расположены два скрипта, для установки обновления:

  • Скрипт-разведчик — скрипт проверки перед обновлением.

  • Скрипт-обновление — основной скрипт, при запуске которого происходит установка обновления.

Процесс разведки и обновления может осуществляться по различным алгоритмам, существенно различающимися по времени выполнения и сложности (зависит от объема и типа изменений между версиями):

  • Обновление, при котором осуществляется замена старых файлов (исполняемых, конфигурационных, файлов расширений) на их обновленные версии, и/или добавляются новые утилиты, которые отсутствовали в предыдущих версиях. Характеризуется малым временем выполнения и возможностью обновления без прерывания работы сервиса.

  • Обновление, при котором, помимо обновления файлов, осуществляется изменение структуры или состава данных в системных каталогах обновляемых БД. Характеризуется дополнительным набором предварительным проверок, обновлением с прерыванием работы сервиса и рекомендацией по созданию резервной копии перед обновлением.

Примечание:

Под изменением структуры или состава данных понимается:

  • изменение состава системных таблиц;

  • изменение состава системных представлений;

  • изменение состава системных функций;

  • изменение списка встроенных типов данных;

  • изменение формата хранения данных (включая изменения в алгоритме шифрования).

Изменение мажорной версии оригинального ядра PostgreSQL в основе СУБД Pangolin требует дополнительных проверок и ограничений.

В СУБД Pangolin предусмотренно два сценария обновления:

  • обновление исполняемых данных (обновление первого уровня сложности) – процесс обновления, в ходе которого достаточно просто заменить старые файлы (исполняемые, конфигурационные, файлы расширений) их обновленными новыми версиями, либо обновить версии утилит, входящих в состав дистрибутива. Такое возможно, так как формат внутреннего хранилища при таких модификациях не изменяется. Данное обновление необходимо проводить, например, при изменении конфигурационных файлов, используемых утилит и расширений или при доработке кода самой БД, когда в формат внутреннего хранилища БД не вносятся никакие изменения, в том числе ни один из критериев перечисленных в списке «Критерии определяющие необходимость проведения обновления СУБД Pangolin с переносом данных» не выполняется. В старой терминологии для обозначения этого типа обновления использовалось «минорное обновление СУБД»;

  • обновление с переносом данных (обновление второго уровня сложности) – процесс обновления более сложный, чем просто замена одних файлов другими. В данном случае процесс дополнительно усложнен необходимостью проведения тестов, проверяющих возможность обновиться, а также миграцией данных, так как при этом типе обновления вносятся изменения в формат внутреннего хранилища БД. Данное обновление необходимо проводить в случае, если выполняется один или несколько критериев перечисленных в списке «Критерии определяющие необходимость проведения обновления СУБД Pangolin с переносом данных». В старой терминологии для обозначения этого типа обновления использовалось «мажорное обновление СУБД».

Критерии определяющие необходимость проведения обновления СУБД Pangolin с переносом данных:

  • изменение мажорной версии ванильного PostgreSQL;

  • изменение состава или структуры системных каталогов;

  • изменение состава или структуры встроенных функций;

  • изменение состава или структуры встроенных представлений;

  • изменение файловой структуры, в том числе алгоритма шифрования;

  • изменение состава конфигурационных файлов;

  • изменение списка встроенных типов данных.

Общая информация по обновлению СУБД Pangolin#

Перед началом обновления запустите скрипт-разведчик, который:

  • выводит список установленных extensions (в процессе обновления они не будут перенесены в новую версию СУБД Pangolin):

    • сторонние/не входящие в текущую версию продукта СУБД Pangolin;

    • запрещенные расширения;

    • расширения, несовместимые с новой версией СУБД Pangolin;

    • полный список ограничений, для администраторов автоматизированной системы (в случае их наличия).

  • проверяет:

    • возможность создания резервной копии (РК). Локальная РК является необходимым условием для работы механизма автоматического отката к исходной версии СУБД в случае возникновения любых внештатных ситуаций в процессе работы механизма обновления;

    • наличие дубликатов в конфигурационном файле Pangolin Manager (postgres.yml);

    • наличие специальных символов в конфигурационных файлах postgres.yml, pg_hba.conf, postgresql.conf;

    • количество транзакций с незавершенным статусом;

    • состояние БД на наличие близости к пороговому значению заморозки транзакций autovacuum_freeze_max_age.

Внимание!

Если в настраиваемом конфигурационном слое параметр, отвечающий за создание резервного копирования, будет выключен, то в случае ошибок в процессе обновления ответственность за сохранность данных и восстановление исходной версии СУБД находится на стороне владельца настраиваемого конфигурационного слоя.

В процессе обновления будет обновлена СУБД Pangolin и версии всех утилит, входящих в состав продукта.

При обновлении происходит процесс слияния пользовательских настроек и настроек, отвечающих требованиям новой версии СУБД, в конфигурационных файлах:

  • postgres.yml (в случае наличия Pangolin Manager);

  • pangolin-pooler.ini (в случае наличия Pangolin Pooler);

  • pg_hba.conf;

  • postgresql.conf.

Важно! При обновлении с pgbouncer на Pangolin Pooler ДО обновления patroni на Pangolin Manager необходимо:

  • проверить наличие файла /etc/patroni/reload_pgbouncer.sh

  • изменить содержимое файла: строку sudo systemctl restart pgbouncer заменить на sudo systemctl restart pangolin-pooler

В случае ошибки при обновлении срабатывает механизм прерывания работы обновления версии СУБД, позволяющий остановить процесс обновления и вернуть версию СУБД в состояние до обновления.

Примечание:

Перед запуском скрипта обновления добавьте в файлы sudoerc основного узла, реплики и арбитра строку user_ansible ALL=(ALL:ALL) NOPASSWD: ALL.

Схемы процесса обновления#

Схема процесса обновления СУБД Pangolin второго уровня сложности для конфигурации standalone: реализация внутренних процессов#

Схема обновления standalone

Схема процесса обновления СУБД Pangolin второго уровня сложности для конфигурации cluster: реализация внутренних процессов#

Схема обновления cluster

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

  • WARNINGS (рекомендуется устранить, решение за пользователем):

    • проверьте наличие расширений, установленных в схему public или в системный каталог (рекомендуется: перенести в схему ext);

    • в случае использования конфигурации СУБД cluster-patroni-etcd-pgbouncer (версии СУБД Pangolin до 5.1.0) при обновлении, утилита confd будет автоматически удалена. Поэтому до обновления измените строку подключения к СУБД (проверьте значения портов) и убедитесь что в строке указаны оба узла кластера (active и standby). Например, если раньше было:

      jdbc:postgresql://127.0.0.1:6544,127.0.0.2:6544/dbname?prepareThreshold=0`
      

      исправьте на:

      jdbc:postgresql://127.0.0.1:6544,127.0.0.2:6544/dbname?targetServerType=master&prepareThreshold=0
      
  • ERRORS (обязательно должны быть устранены, иначе обновление не будет доступно):

    • проверьте, что в БД не используются данные следующих типов abstime, reltime, tinterval (рекомендуется: не использовать перечисленные типы данных):

      -- поиск устаревших типов данных // запускать необходимо для КАЖДОЙ БД
      SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
      FROM pg_attribute att
      JOIN pg_type tp ON att.atttypid =tp.oid
      JOIN pg_class cl ON att.attrelid =cl.oid
      JOIN pg_namespace ns ON cl.relnamespace = ns.oid
      WHERE tp.typname IN ('abstime','reltime','tinterval') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');
      
    • убедитесь, что значение параметра max_worker_process конфигурационного файла не превышает сумму количества баз данных на узле (включая системные template1, postgres) + 6. Например, если количество БД = 26, то значение параметра должно быть не меньше 32.

Список необходимых действий после завершения процесса обновления СУБД Pangolin#

  • WARNINGS (рекомендуется устранить, решение за пользователем):

    • необходимо учесть, что файл recovery.conf более не используются в логике работы СУБД (для кластерной конфигурации);

    • в работе автоматизированной системы (приложение работающее с СУБД Pangolin) необходимо учесть, что была расширена информация о клиентских сертификатах SSL в представлении pg_stat_ssl и колонка clientdn была переименована в client_dn;

    • в работе автоматизированной системы необходимо учесть, что были изменены параметры хранения и ротации WAL-файлов, параметр wal_keep_segments был объявлен устаревшим, поэтому необходимо перейти на использование параметра wal_keep_size;

    • обращаем внимание, что начиная с версии СУБД Pangolin 5.1.0 введено понятие TRUSTED EXTENSIONS, таким образом определенные расширения (список таких расширений можно получить с помощью запроса SELECT DISTINCT name FROM pg_available_extension_versions WHERE TRUSTED ORDER BY name;) в дальнейшем могут быть созданы пользователями с правами CREATE (пользователи входящие в as_admin группу) на уровне базы данных;

    • в работе автоматизированной системы необходимо учесть, что в новой версии СУБД Pangolin могли быть изменены некоторые вендорские процедуры, а именно, мог измениться состав или порядок аргументов для них (например, функции sec_admin, в которых убран аргумент current_database).

    Примечание:

    Перед началом обновления версии СУБД внимательно изучите Примечания к релизу новой версии.

Таблица поддерживаемых для обновления версий СУБД#

Обновление#

Внимание

Обновление стендов с разным набором СЗИ возможно только с версии 5.4.0 и выше.

В остальных случаях (не отраженных в таблице) обновление невозможно.

Конфигурация

Исходная версия

Тип обновления

с СЗИ

Обновление с переносом данных

5.5.0, 5.5.1, 5.5.2, 5.5.3, 5.5.4

без СЗИ

Обновление с переносом данных

5.4.0, 5.4.1, 5.4.3, 5.5.0, 5.5.1, 5.5.2, 5.5.3, 5.5.4

с СЗИ

Обновление исполняемых файлов

6.1.0, 6.1.1, 6.1.2, 6.1.4, 6.1.5, 6.1.6, 6.1.7, 6.1.8, 6.1.9, 6.1.10, 6.2.0, 6.2.1, 6.3.0, 6.4.0, 6.4.1, 6.4.2

без СЗИ

Обновление исполняемых файлов

6.1.0, 6.1.1, 6.1.2, 6.1.4, 6.1.5, 6.1.6, 6.1.7, 6.1.8, 6.1.9, 6.1.10, 6.2.0, 6.2.1, 6.3.0, 6.4.0, 6.4.1, 6.4.2

Обозначение поля конфигурации

Тип конфигурации определен следующим образом:

  • с СЗИ – включено хотя бы одно из СЗИ (TDE, защита конфигурации, защита от привилегированных пользователей) включено;

  • без СЗИ – СЗИ отключены.

Как определить версию, установленную на сервере#

Для получения названия и версии продукта серверной части необходимо подключиться к серверу Pangolin и выполнить команды из таблицы ниже. Результат выполнения зависит от названия, номера версии и платформы, для которой была выполнена сборка.

Действие

Команда

Тип значения

Примеры выполнения команды

Название продукта

SELECT version();

Строковое значение

PostgreSQL {postgres_version} on x86_64-apple-darwin19.4.0, compiled by Apple clang version 11.0.0 (clang-1100.0.33.17), 64-bit

Номер open-source версии

SHOW server_version;

Строковое значение

{postgres_version}

SHOW server_version_num;

Числовое значение

110007

Номер Pangolin версии

SHOW server_se_version;

Строковое значение

{version}

SELECT product_version();

Строковое значение

Platform V Pangolin {version}

Время обновления#

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

Методика тестирования:

  1. Установка и обновление продуктов версии:

    • c 5.5.4 до 6.4.0 - мажорное обновление;

    • c 6.1.8 до 6.4.0 - минорное обновление с обновлением системных данных;

    • с 6.1.6 до 6.3.1 - минорное обновление;

    • с 6.4.1 до 6.4.3 - минорное обновление (патч).

  2. Создание тестовой базы данных и генерация тестовых данных (~100ГБ).

  3. Запуск сценария стабильной нагрузки на время обновления. Алгоритм:

    • запускается нагрузка, продолжается 5 минут (100TPS);

    • стартует обновление;

    • после окончания обновления запускается повторная нагрузка на протяжении 10 минут.

  4. Сравнение результатов

Результаты обновления:

Вариант обновления

Тип конфигурации

Время обновления

c 5.5.4 до 6.4.0

standalone

25.3 минут

cluster

64.1 минут

c 6.1.8 до 6.4.0

standalone

10.483 минут

cluster

22.95 минут

с 6.1.6 до 6.3.1

standalone

9.43 минут

cluster

24.183 минут

с 6.4.1 до 6.4.3

standalone

11.03 минут

cluster

31.983 минут

Проверка готовности к обновлению#

Внимание!

В случае, если все пароли указывались в открытом виде, параметры --ask-vault-pass и --vault-password-file=название_файла_с_ключом добавлять не нужно!

Обязательным условием запуска скриптов обновления СУБД, является запуск скрипта-разведчика, в задачи которого входит выполнение ряда проверок, сбора информации о стенде, а также вычислении типа обновления версии СУБД, необходимого для перехода на новую версию СУБД Pangolin.

  1. Скачайте и распакуйте дистрибутив на сервере.

  2. Перейдите в каталог с распакованным дистрибутивом, а затем в каталог installer.

  3. Перед запуском обновления заполните файл hosts.ini, в зависимости от установленного решения, добавив информацию о хостах и учетных данных пользователя, которые будет использовать Ansible.

    Внимание!

    Данные должны содержать те же параметры, что и при установке. Примеры заполнения файлов описаны в разделе «Установка».

  4. Заполните настраиваемый конфигурационный файл custom_file_sample.yml.

  5. Заполните конфигурационный файл all.yml.

  6. Чтобы удостовериться в готовности к обновлению, используйте ansible-сценарий проверки. Пример команды:

     ansible-playbook playbook_scouting.yaml -i inventories/standalone/hosts.ini -t always,standalone --ask-vault-pass -vv --extra-vars "local_distr_path=${} segment=${} custom_config=${} pangolin_license_path=${} stand=${}"
    

    Ниже приведены шаблоны сценариев для различных решений:

    • Проверка односерверного решения:

      ansible-playbook playbook_scouting.yaml \
      -i inventories/standalone/hosts.ini \
      -t always,standalone \
      --ask-vault-pass \
      -vv \
      --extra-vars "local_distr_path=${} \
      segment=${} \
      custom_config=${} \
      pangolin_license_path=${} \
      stand=${}"
      
    • Проверка кластерного решения:

      ansible-playbook playbook_scouting.yaml \
      -i inventories/cluster/hosts.ini \
      -t always,cluster \
      --ask-vault-pass \
      -vv \
      --extra-vars "local_distr_path=${} \
      segment=${} \
      custom_config=${} \
      pangolin_license_path=${} \
      stand=${}"
      

    Описание параметров:

    • custom_config — абсолютный путь к файлу конфигурации custom_file_template.yml;

    • local_distr_path — абсолютный путь к загруженному и распакованному дистрибутиву Pangolin;

    • segment — сегмент сети;

    • pangolin_license_path - полный путь к каталогу, где расположены файлы лицензии;

    • stand — стенд для тестирования или конечной инсталляции (dev или prom).

    Значения используемых в команде запуска Ansible ключей:

    • -i — путь к inventory-файла;

    • --extra-vars — переменные, которые по приоритету важнее переменных из inventory;

    • -t — теги для запуска;

    • -v — уровень логирования Ansible. Может быть, как пустым, так и -vvvvvv, где запуск без v - минимальное логирование;

    • --ask-vault-pass или --vault-password-file — расшифровка зашифрованных файлов во время выполнения.

      Внимание!

      Для шифрования паролей в примерах выше, использовался следующий ansible-vault пароль: postgreSQL_SE_654321.

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

Проверки и информационные сообщения процесса разведки#

Проверки начинаются с разблокировки пользователя postgres в OC и выставления бессрочного пароля на время работы скрипта.

Подготовительные действия#

Происходит загрузка custom_file_sample.yml и словаря update.yml, содержащего дополнительные переменные с информацией для выводимых сообщений и поддерживаемых расширений.

Проверка установленной версии ansible#

Если текущая версия ansible меньше поддерживаемой версии, то выводится блокирующая дальнейшее выполнение сценария ошибка:

Current ansible version: {{ hostvars['127.0.0.1'].ansible_version.full }}. Needed ansible version: {{ ansible_ver }} or higher

Проверка корректности конфигурационного файла postgresql.conf#

Если конфигурационный файл содержит какие-либо ошибки, то выводится сообщение:

"{{ control_name }}.FAIL__В кандидате на обновление для хоста {host} в конфигурационном файле postgresql.conf обнаружены ошибки заполнения.__{{ control_name }}.FAIL"

Проверка того, что для узлов master и/или replica существует только одно FQDN-имя#

Если для узлов master и/или replica существует более одного FQDN-имени, то выводится сообщение:

"{{ control_name }}.FAIL__В кандидате на обновление для хоста {ansible_fqdn} обнаружен дублирующий fqdn {double_fqdn}.__{{ control_name }}.FAIL"

Проверка того, что значение search_path всегда не пустое#

Если search_path для одной из ролей равен пустому значению (не заполнен), то выводится сообщение:

"{{ control_name }}.FAIL__В кандидате на обновление обнаружено незаполненное значение для поля search_path для следующих пользовательских ролей {roles}. Поле search_path не должно иметь пустое значение, это необходимо для корректного конфигурирования СУБД в процессе обновления.__{{ control_name }}.FAIL"

Проверка поддерживаемой версии к обновлению#

В случае невозможности обновления будет получена ошибка вида:

"{{ control_name }}.FAIL__Обновление невозможно при наличии включенных СЗИ (TDE, защита конфигурации, защита от привилегированных пользователей) в автоматическом режиме для версии (pg_current_version). Обратитесь к администраторам СУБД для осуществления обновления вручную.__{{ control_name }}.FAIL"

Для осуществления обновления вручную необходимо обратиться к администратору.

Проверка символьной ссылки до плагина, реализующего взаимодействие с физическим сервером VAULT#

В случае невозможности обновления по данной причине будет получено следующее сообщение:

"{{ control_name }}.FAIL__На стенде обнаружено использование VAULT заменителя. Произвести обновление будет невозможно. Необходимо перевести стенд на использование физического VAULT сервера и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка пароля postgres_db_pass, передаваемого в пользовательском конфигурационном файле#

Ожидается зашифрованное с помощью ansible-vault значение. В случае ошибки будет получено следующее сообщение:

"{{ control_name }}.FAIL__Для корректного обновления пароль от суперпользователя postgres должен быть задан в открытом виде, либо в виде ansible-хэша. Скорректируйте значение для параметра postgres_db_pass в пользовательском конфигурационном файле '{}' и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка корректной записи хеша пароля суперпользователя postgres во временный файл для корректной инициализации БД#

В случае ошибки будет получено сообщение вида:

"{{ control_name }}.FAIL__В процессе формирования хэша для пароля суперпользователя postgres что-то пошло не так. Пароль не был записан во временный файл '{}'. Инициализация БД невозможна. Произведите проверку корректно заполненного параметра postgres_db_pass в пользовательском конфигурационном файле '{}' и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка наличия пароля суперпользователя postgres в исходной БД#

При возникновении ошибки будет получено следующее сообщение:

"{{ control_name }}.FAIL__Пароль от суперпользователя postgres в исходной БД не задан. Произвести обновление будет невозможно. Скорректируйте значение для параметра postgres_db_pass в пользовательском конфигурационном файле '{}' и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка идентичности паролей суперпользователя postgres в исходной БД с паролем, переданным в пользовательском конфигурационном файле#

В случае, когда пароли не идентичны, будет выведена следующая ошибка:

"{{ control_name }}.FAIL__Пароль от суперпользователя postgres в пользовательском конфигурационном файле не совпадает с текущим паролем в БД. Скорректируйте значение параметра 'postgres_db_pass' в пользовательском конфигурационном файле '{}' и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка корректного расположения утилиты secret_storage_client#

Для осуществления проверки готовности защищенного хранилища VAULT к последующему обновлению, скрипты используют утилиту secret_storage_client, которая входит в состав дистрибутива.

Утилита расположена в папке installer/utilities/secret_storage_client_bundle/bin/. При отсутствии утилиты будет выведено предупреждающее сообщение (процесс работы скриптов при этом не останавливается).

В случае если утилита не обнаружена, будет получено предупреждение:

"{{ control_name }}.WARNING__Утилита secret_storage_client не обнаружена. Проверки готовности защищенного хранилища VAULT к обновлению будут пропущены.__{{ control_name }}.WARNING"

Проверка наличия конфигурационного файла VAULT#

При отсутствии файла будет выведено сообщение:

"{{ control_name }}.FAIL__В кандидате на обновление не был обнаружен конфигурационный файл VAULT '{}'. Произведите проверку состояния стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка наличия успешного подключения к защищенному хранилищу VAULT#

При невозможности подключиться к VAULT будет выведено сообщение вида:

"{{ control_name }}.FAIL__Не удалось обнаружить ни одного успешного подключения к защищенному(ым) хранилищу(ам) VAULT. Возникли следующие ошибки: {}. Произведите проверку состояния стенда на предмет подключения к защищенному хранилищу VAULT и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Получение общего списка параметров из защищенного хранилища VAULT#

В случае возникновения ошибок будет получено сообщение вида:

"{{ control_name }}.FAIL__В процессе получения списка параметров из защищенного хранилища VAULT возникли ошибки: '{}'. Причиной может быть отсутствие конфигурационного файла '{}' с параметрами подключения к защищенному хранилищу VAULT. Произведите проверку состояние подключения к VAULT серверу(ам) и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка корректного значения для параметра secure_config на защищенном хранилище VAULT#

Если состояние стенда показало, что защита конфигурации включена, ожидается значение on:

"{{ control_name }}.FAIL__Значение параметра secure_config на защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При включенной защите параметров конфигурации значение для параметра secure_config должно быть 'on' на защищенном хранилище VAULT. Произведите проверку состояние стенда на наличие подключенных СЗИ и корректность сконфигурированного id на сервере VAULT. После повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

В случае отключенной защиты конфигурации значение параметра secure_config будет off:

"{{ control_name }}.FAIL__Значение параметра secure_config на защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При выключенной защите параметров конфигурации значение для параметра secure_config должно быть 'off' на защищенном хранилище VAULT. Произведите проверку состояние стенда на наличие подключенных СЗИ и корректность сконфигурированного id на сервере VAULT. После повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка корректного значения для параметра is_tde_on на защищенном хранилище VAULT#

В случае, когда состояние стенда показало включенное TDE, ожидается значение on/true:

"{{ control_name }}.FAIL__Значение параметра is_tde_on на защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При включенном прозрачном шифровании (TDE) значение для параметра is_tde_on должно быть 'on' на защищенном хранилище VAULT. Произведите проверку состояние стенда на наличие подключенных СЗИ и корректность сконфигурированного id на сервере VAULT. После повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

В случае, если TDE выключено, значение параметра is_tde_on будет соответствовать off/false:

"{{ control_name }}.FAIL__Значение параметра is_tde_on на защищенном хранилище VAULT не соответствует полученным данным о состоянии стенда. При выключенном прозрачном шифровании (TDE) значение для параметра is_tde_on должно быть 'off' на защищенном хранилище VAULT. Произведите проверку состояние стенда на наличие подключенных СЗИ и корректность сконфигурированного id на сервере VAULT. После повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка идентичности значений pg_ident на защищенном хранилище VAULT и в локальном конфигурационном файле#

В случае ошибки будет получено сообщение вида:

"{{ control_name }}.FAIL__Значение параметра pg_ident на защищенном хранилище VAULT должно соответствовать значению в локальном конфигурационном файле '{}/pg_ident.conf'. Произведите проверку на предмет корректно сконфигурированного id на сервере VAULT и повторите запуск скрипта разведчика.__{{ control_name }}.FAIL"

Проверка состояния параметра KillUserProcesses в файле /etc/systemd/logind.conf#

Если параметр KillUserProcesses в файле /etc/systemd/logind.conf находится в положении yes, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__На хосте host_name в файле /etc/systemd/logind.conf включен параметр KillUserProcesses=yes, для дальнейшей работы требуется переключить данный параметр в положение KillUserProcesses=no и перезапустить хост.__{{ control_name }}.FAIL

Проверка отсутствия неудачных попыток обновления#

Скрипт проверки осуществляет проверку предыдущих обновлений и фиксирует неудачные попытки. Если предыдущие попытки обновления были неуспешными, либо, если при неудачном обновлении был некорректно произведен автоматический откат, то скрипт прервется и создаст файл /home/postgres/.update_pgse/update_disallowed. Пользователю выведется сообщение:

{{ control_name }}.FAIL__Зафиксирована неудачная попытка обновления версии СУБД Pangolin. Перед повторным запуском сценария обновления, необходимо полностью восстановить состояние кластера предыдущей/исходной версии СУБД Pangolin. Обратитесь к администраторам БД__{{ control_name }}.FAIL

В этом случае необходимо вручную откатить стенд на исходное состояние (см. раздел «Откат»), удалить файл /home/postgres/.update_pgse/update_disallowed, а затем перезапустить разведку.

Проверка включения полного внутреннего резервного копирования данных#

Проверяется значение параметра is_inner_full_backup. Если параметр имеет значение false, то выводится информационное сообщение:

{{ control_name }}.INFO__За процедуру резервного копирования данных, на случай непредвиденных ошибок в процессе обновления, отвечает отдельная от Механизма обновления служба.__{{ control_name }}.INFO

Затем производится проверка необходимых linux-пакетов и, в случае отсутствия, их установка, подготовка виртуального окружения python, определение текущего active и standby.

Проверка, что переданный адрес active соответствует действительности#

В случае, если мастер не соответствует переданному в конфигурации hosts.ini, скрипт прервется с ошибкой:

{{ control_name }}.FAIL__В кандидате на обновление текущий active в СУБД не соответствует значению, полученному на вход. На текущий момент обновление невозможно, необходимо выполнить switchover__{{ control_name }}.FAIL

Выполнение роли (checkup/prepare_update.yml) перед обновлением#

Роль получает текущее значение переменных, таких как:

  • pg_current_version;

  • PGDATA_OLD;

  • PGHOME_OLD;

  • PGPORT_OLD;

  • PGBOUNCERPORT_OLD;

  • CLNAME_OLD;

  • PGHOME_OLD_NAME.

Получение состояний компонентов для определения типа установленной конфигурации#

Если нет имени кластера, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Укажите актуальное имя кластера в .bash_profile в параметре '- export CLNAME= '__{{ control_name }}.FAIL

Если файлы сертификатов отсутствуют, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Файл сертификата {{ item }} не найден__{{ control_name }}.FAIL

Примечание:

Скрипты обновления не осуществляют проверку валидности сертификатов.

Проверка соответствия установленных компонентов кластера с текущим типом конфигурации#

Если не соответствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Текущий тип конфигурации согласно конфигурационному параметру СУБД {type_configuration}, при этом обнаружены несоответствующие конфигурации компоненты: {component}. Для продолжения обновления требуется удалить несоответствующие компоненты.__{{ control_name }}.FAIL

Проверка минимальной поддерживаемой версии Postgres SE, над которой может быть выполнен сценарий разведки/обновления#

Скрипт запрашивает информацию об установленной версии. Сравнивает версию с параметром, отвечающим за минимальную поддерживаемую версию, который, в свою очередь, берет информацию из матрицы версий. Если версия не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Обновление невозможно. Текущая версия (pg_current_version) не поддерживается. Минимальная поддерживаемая версия: min_actual_pangolin_ver__{{ control_name }}.FAIL

Проверка типа установленной конфигурации Pangolin#

Скрипт запрашивает информацию об установленном типе конфигурации и сравнивает его со списком неподдерживаемых. Если тип конфигурации не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Тип установленной конфигурации: tag. Процесс обновления для данного типа недоступен. Предварительно необходимо привести тип конфигурации к одному из поддерживаемых типов (как за счет чистой установки новой СУБД, так и за счет ручного изменения типа конфигурации)__{{ control_name }}.FAIL

Не поддерживаемые версии описаны в custom_file_template.yml в параметре not_support_type_installed_configuration:

not_support_type_installed_configuration: ['standalone-postgresql-only']

Определение типа обновления#

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

Алгоритм действий проверки. На текущей СУБД запрашивается информация:

  • текущая версия;

  • включена или нет функциональность «прозрачное шифрование данных (TDE)»;

  • включена или нет функциональность «защита от привилегированных пользователей (AP)»;

Если тип обновления равен unsupported для текущей версии, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Обновление невозможно. При включенной функциональности защиты от привилегированных пользователей (AP) обновление в автоматическом режиме не поддерживается для версии (pg_current_version). Обратитесь к администраторам СУБД для осуществления обновления вручную.__{{ control_name }}.FAIL

Если успешно получены параметры для определения типа обновления(update_complexity_level) из таблицы соответствия для текущей версии, то происходит анализ данных параметров и выводится сообщение:

PANGOLIN.ARGS__{\"update_complexity_level\": \"update_complexity_level_2\"}__PANGOLIN.ARGS

Проверка свободного места#

Проверка свободного места в точке монтирования PGBACKUP (пример: /pgarclogs/0{major_version}). Требуется минимум 1 Гб. Если места не хватает, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Точка монтирования {{ PGBACKUP }} имеет {{ pgdata_mp_free }} Гб свободного пространства, но требуется не менее 1 Гб.__{{ control_name }}.FAIL
  • Для типов update_complexity_level_2/update_complexity_level_3 выполняется проверка размера СУБД. Если размер СУБД больше чем задано в параметре maximum_dbms_size_to_update (параметр максимальный размер СУБД для обновления в настраиваемом конфигурационном файле), то выводится блокирующая дальнейшее выполнение сценария ошибка:

    {{ control_name }}.FAIL__Автоматическое обновление ограничено размером кластера СУБД в maximum_dbms_size_to_update Гб. Текущая СУБД имеет размер current_dbms_size Гб.__{{ control_name }}.FAIL
    
  • Для типов update_complexity_level_2/update_complexity_level_3 и полного внутреннего резервного копирования данных проверяется наличие на active каталога local_backup_path (путь для локального резервного копирования), задающийся в настраиваемом конфигурационном файле или переданным на вход скрипта в виде extra vars. Если отсутствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:

    {{ control_name }}.FAIL__Не найден каталог /pgarclogs, указанный в параметре local_backup_path.__{{ control_name }}.FAIL
    

Проверка свободного места для точки монтирования local_backup_path#

Проверка наличия свободного места для осуществления резервного копирования в директорию local_backup_path (отображается в логе как «локальный backup») складывается из следующих параметров:

  • Размер кластера СУБД (текущего каталога pgdata).

  • Вычисляется процент от размера кластера СУБД. Процент задается в параметре local_backup_coefficient в настраиваемом конфигурационном файле (по умолчанию равен 1%).

  • 1 Гб, если точка монтирования local_backup_path совпала с точкой монтирования для PGBACKUP.

Если в точке монтирования для local_backup_path не хватает места, то выводится ошибка:

{{ control_name }}.SPACE.FAIL__Не достаточно свободного места для локальной резервной копии в local_backup_path_folder. Доступно local_backup_path_free_mb Мб. Требуется >= local_size_backup_mb Мб.__{{ control_name }}.SPACE.FAIL

Проверка точек монтирования#

Производится проверка прав для записи в каталоги, которые могут быть точками монтирования - PGDATA, PGBACKUP и PGLOGS.

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

"FAIL__Инсталлятор не может записать файлы в директорию dir. Проверьте маску директории или назначьте владельца postgres.__FAIL"

Проверка расположения виртуальных сред#

При проверке расположения заранее подготовленных виртуальных сред, в случае их расположения в директории $PGHOME/postgresql_venv, выводится ошибка:

"{{ control_name }}.FAIL__В конфигурационном файле обнаружен недопустимый путь до {} данный путь не должен совпадать с корневым путем установки {} {}. Для продолжения установки/обновления требуется скорректировать данный путь в конфигурационном файле.__{{ control_name }}.FAIL"

Проверка консистентности виртуальных сред#

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

"INFO_Директория указанная в конфигурационном файле {} пуста или в ней отсутствуют пакеты для дальнейшей установки/обновления. Для дальнейшего процесса установки/обновления будет создано виртуальное окружение автоматически_INFO"

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

Проверка типа файловой системы для каталогов текущая PGDATA, новая PGDATA, PGBACKUP, local_backup_path#

Проверка в скрипте выполняется для типа обновления update_complexity_level_2/update_complexity_level_3.

Для каталогов запрашивается тип файловой системы. Список каталогов:

текущая pgdata (пример: /pgdata/0{major_version}/data)
новая pgdata (пример:/pgdata/0{major_version}/data)
pgbackup (пример: /pgarclogs/0{major_version})
local_backup_path (пример: /pgarclogs)

Для типов обновления update_complexity_level_2/update_complexity_level_3 типы файловой системы для каталогов должны совпадать. Если типы файловой системы не равны, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Для продолжения обновления необходимо, чтобы директории с текущей pgdata, новой pgdata, pgbackup и local_backup_path находились в одной файловой системе. Тип файловой системы: текущая pgdata: pgdata_old_file_system_type, новая pgdata: pgdata_file_system_type, pgbackup: pgbackup_file_system_type, local_backup_path: local_backup_path_file_system_type.__{{ control_name }}.FAIL

Проверка использования KMS-заменителя#

Обновление стендов с включенным КМС-заменителем произвести будет невозможно. В скриптах разведчика организована проверка на случай таких стендов. Сообщение скрипта-разведчика будет выглядеть следующим образом:

{{ control_name }}.FAIL__На стенде обнаружено использования VAULT заменителя. Произвести обновление будет невозможно.__{{ control_name }}.FAIL

Проверка структуры каталогов PGDATA#

Скрипт запрашивает структуру каталогов на active и standby для кластерной конфигурации. Если структура каталогов отличается, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Разная структура каталогов в каталоге pgdata на серверах. Обратитесь к администраторам БД для анализа проблемы. Со структурой можно ознакомиться в логе задачи (имя таски: pgdata directory structure).__{{ control_name }}.FAIL

Проверка символических ссылок в PGDATA#

Скрипт запрашивает на active и standby список всех символических ссылок в каталоге PGDATA и определяет куда они направлены. Если символические ссылки отличаются, то выводится блокирующая дальнейшее выполнение сценария ошибка:

{{ control_name }}.FAIL__Отличаются символические ссылки в каталоге pgdata на серверах. Обратитесь к администраторам БД для анализа проблемы. Со списком символических ссылок можно ознакомиться в логе задачи (имя таски: symlinks in pgdata).__{{ control_name }}.FAIL

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

Проверка установленных расширений с поддерживаемыми расширениями#

Под пользователем postgres выполняется запрос к БД:

SELECT format('{{ item.datname }}.%1$s.%2$s',nspname,extname) extname FROM pg_catalog.pg_extension ex
JOIN pg_namespace ns ON ex.extnamespace =ns.oid
WHERE ex.extname not in ({{ _list_extensions }}{{ additional_legal_ext }});

В запросе происходит сравнение установленных расширений с поддерживаемыми.

legal_extensions: "'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', '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'"

Внимание!

Расширения (pg_background, postgis, pgrouting, pgq, pgq_coop, pgqd, pgsql-http, pldebugger, plpgsql_check, pgcopydb, pgloader), не входящие в состав Pangolin, не поддерживаются скриптами автоматического обновления.

Для обновления с типом update_complexity_level_1 в поддерживаемые добавляется расширение: timescaledb. Если список не пустой, то для типа обновления update_complexity_level_1 выводится предупреждающее сообщение:

{{ control_name }}.WARNING__Текущая версия СУБД содержит следующие расширения, не входящие в состав Pangolin (<имя базы>.<имя схемы>.<имя расширения>): extension_name. Для дальнейшей работы данных расширений необходимо после обновления проверить их работоспособность.__{{ control_name }}.WARNING

Если список не пустой, то для типа обновления update_complexity_level_2/update_complexity_level_3 выводится не блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Текущая версия СУБД содержит следующие расширения, не входящие в состав Pangolin или для данных расширений обновление не поддерживается (<имя базы>.<имя схемы>.<имя расширения>): extension_name.__{{ control_name }}.FAIL

Проверка портов по умолчанию в БД, Pangolin Pooler#

Выполняется скрипт для получения списка портов:

netstat -tulpn 2>/dev/null | grep -E "postgres|pgbouncer" | awk '{print $4}' | awk -F ":" '{print $2}'

Если вывод отличается от значений портов в конфигурации, то будут показаны предупреждения:

{{ control_name }}.WARNING__В кандидате на обновление обнаружено использование старого порта > PGPORT = pgport_old, нерекомендуемого безопасностью.__{{ control_name }}.WARNING

{{ control_name }}.WARNING__В кандидате на обновление обнаружено использование старого Pangolin Pooler > порта pgbouncerport_old, нерекомендуемого \безопасностью.__{{ control_name }}.WARNING

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

Под пользователем postgres выполняется скрипт:

SELECT usename
FROM pg_user
WHERE usesysid != all
((SELECT grolist FROM pg_group WHERE groname = 'as_admin') ||
(SELECT grolist FROM pg_group WHERE groname = 'db_admin') ||
(SELECT grolist FROM pg_group WHERE groname = 'as_TUZ') ||
(SELECT grolist FROM pg_group WHERE groname = 'pg_read_all_settings') ||
(SELECT grolist FROM pg_group WHERE groname = 'as_admin_read') ||
(SELECT grolist FROM pg_group WHERE groname = 'all-sa-pam-group'))
AND usename NOT IN ('backup_user', 'postgres', 'auditor', 'pgbouncer', 'pstgcmdb',
'masteromni', 'patroni', 'cron', 'profile_tuz', 'sec_admin_backup', 'sec_admin')

Если скрипт вернет не пустое значение (список пользователей), то выводится предупреждение:

{{ control_name }}.WARNING__Пользователь {{ list_wrong_users | join(', ') }} не соответствует ролевой модели. Его настройка произведена не будет__{{ control_name }}.WARNING

Проверка, что в СРК используется УЗ backup_user (только для промышленной эксплуатации)#

Проверяется наличие скрипта manage_backup.sh и, если он отсутствует, то выводится блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Файл manage_backup.sh не существует. Обратитесь к администраторам БД__{{ control_name }}.FAIL

В случае, если на ПРОМ-стенде в инструменте резервного копирования обнаружено использование другой УЗ, то выводится блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Техническая учетная запись backup_user не используется в процессе резервного копирования. Обратитесь к администраторам БД__{{ control_name }}.FAIL

Проверка статуса состояния снятия РК (только для промышленной эксплуатации)#

Проверяется статус снятия РК через представление backup.history. При получении значений статуса, отличного от failed, complited или waiting_from_wal_backup, будет выведена ошибка, блокирующая выполнение сценария:

{{ control_name }}.FAIL__На текущий момент обновление невозможно так как активна сессия снятия РК. Дождитесь окончания снятия РК со стенда__{{ control_name }}.FAIL

Если установлен confd, то выводится предупреждающее сообщение:

{{ control_name }}.WARNING__В случае использования конфигурации СУБД cluster-patroni-etcd-pgbouncer (версии СУБД Pangolin до 5.1.0) \
при обновлении СУБД Pangolin версии 5.2.0, утилита confd будет автоматически удалена. Поэтому до обновления необходимо изменить строку подключения \
к СУБД (проверить значения портов) и убедиться что в строке указаны оба узла кластера (active и standby). Например, если раньше было \
«jdbc:postgresql://127.0.0.1:6544,127.0.0.2:6544/dbname?prepareThreshold=0», то необходимо исправить на «jdbc:postgresql://127.0.0.1\
:6544,127.0.0.2:6544/dbname?targetServerType=master&prepareThreshold=0»__{{ control_name }}.WARNING

Вывод информационного сообщения с набором действий, которые необходимо произвести после завершения процесса обновления СУБД#

{{ control_name }}.TODO.AFTER__Набор действий, необходимых произвести ПОСЛЕ завершения процесса обновления СУБД:

1) Необходимо учесть, что файл recovery.conf более не используются в логике работы СУБД (для кластерной конфигурации).
2) В работе автоматизированной системы необходимо учесть, что была расширена информация о клиентских сертификатах SSL в представлении pg_stat_ssl и колонка clientdn была переименована в client_dn.
3) В работе автоматизированной системы необходимо учесть, что были изменены параметры хранения и ротации WAL-файлов, параметр wal_keep_segments был объявлен устаревшим, поэтому необходимо перейти на использование параметра wal_keep_size.
4) Обращаем внимание, что начиная с версии СУБД Pangolin 5.1.0 введено понятие TRUSTED EXTENSIONS, таким образом определенные расширения (список таких расширений можно получить с помощью запроса SELECT DISTINCT name FROM pg_available_extension_versions WHERE TRUSTED ORDER BY name;) в дальнейшем могут быть созданы пользователями с правами CREATE (пользователи входящие в as_admin группу) на уровне базы данных.
5) В работе автоматизированной системы необходимо учесть, что в новой версии СУБД Pangolin могли быть изменены некоторые вендорские процедуры, а именно, мог измениться состав или порядок аргументов для них (например, функции sec_admin, в которых убран аргумент current_database).
Рекомендация: перед началом обновления версии СУБД необходимо внимательно изучить release notes новой версии.__{{ control_name }}.TODO.AFTER

Вывод информационного сообщения для типа обновления update_complexity_level_3#

Если тип обновления update_complexity_level_3, то выводится информационное сообщение:

{{ control_name }}.INFO__Для миграции данных БД используется специальная утилита pg_upgrade. В ходе миграции данные в новую версию БД будут перенесены в режиме копирования, что повлечет дополнительное увеличение времени обновления СУБД.__{{ control_name }}.INFO

Вывод информационного сообщения о недоступности СУБД#

{{ control_name }}.INFO__На время выполнения обновления база данных будет недоступна. Просим вас это учесть при проведении работ.__{{ control_name }}.INFO

Проверка не поддерживаемых типов данных#

Выполняется запрос к БД:

SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
FROM pg_attribute att
JOIN pg_type tp ON att.atttypid =tp.oid
JOIN pg_class cl ON att.attrelid =cl.oid
JOIN pg_namespace ns ON cl.relnamespace = ns.oid
WHERE tp.typname IN ('abstime','reltime','tinterval') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');

Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Удалена поддержка типов данных abstime, reltime, tinterval. Список таблиц, использующих их (<имя схемы>.<имя таблицы>(<имя колонки>)): table_name__{{ control_name }}.FAIL

Проверка массива типов из information_schema#

Выполняется запрос к БД:

SELECT format('%1$s.%2$s(%3$s)',ns.nspname,cl.relname,att.attname) tbl_fld
FROM pg_attribute att
JOIN pg_type tp ON att.atttypid =tp.oid
JOIN pg_class cl ON att.attrelid =cl.oid
JOIN pg_namespace ns ON cl.relnamespace = ns.oid
WHERE tp.typname IN ('cardinal_number','character_data','sql_identifier','time_stamp','yes_or_no') AND NOT (ns.nspname SIMILAR TO '(pg_|information_schema)%');

Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Не поддерживаются массивы типов из information_schema. Список таблиц, использующих их (<имя схемы>.<имя таблицы>(<имя колонки>)): table_name__{{ control_name }}.FAIL

Проверка наличия полей в таблицах с типом xid#

Выполняется запрос к БД:

WITH RECURSIVE src AS (
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
WHERE
pa.atttypid::regtype::text IN ('xid','xid[]') AND
pa.attnum > 0 AND
pc.relkind != 'v'
UNION ALL
SELECT
pc.relnamespace::regnamespace,
pa.attrelid::regclass,
pa.attname,
pa.atttypid::regtype,
pc.relkind
FROM pg_catalog.pg_attribute pa
JOIN pg_catalog.pg_class pc ON pa.attrelid = pc.oid
JOIN pg_catalog.pg_type pt ON pt.oid = pa.atttypid
JOIN src ON pt.typrelid = src.attrelid
WHERE
pa.attnum > 0 AND
pc.relkind != 'v'
)
SELECT format('%1$s(%2$s)',attrelid,attname) tbl_xid
FROM src 
WHERE relnamespace::regnamespace::text !~ '^(information_schema|pg_)';

Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Обнаружена(ы) таблица(ы) в которой(ых) присутствует(ют) поле(я) с типом xid. В новой версии СУБД Pangolin применяется 64-битный счетчик транзакций. Необходимо удалить поле(я) с типом xid в таблице(ах). Список таблиц, использующих их (<имя таблицы>(<имя колонки>)): table_name__{{ control_name }}.FAIL

Проверка наличия установленного RPM-пакета Pangolin на серверах#

Производится проверка установленного RPM-пакета Pangolin с новой версией, если пакет обнаружен, то выводится блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Найден установленный пакет package_name с версией на которую планируем обновляться. Обновление не может быть продолжено. Просьба удалить пакет и повторить попытку снова.__{{ control_name }}.FAIL

Удаление каталога для временных файлов#

{{ local_backup_path }}/scout_temp_data

Проверка наличия каталога для временных файлов#

{{ local_backup_path }}/scout_temp_data`

Проверка с помощью утилиты pg_upgrade#

Проверка возможности обновления с помощью утилиты pg_upgrade check.

Если проверка завершается с ошибкой, то выводится не блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Не прошла одна из проверок pg_upgrade. Обратитесь к администраторам БД для анализа проблемы. \С ошибками можно ознакомиться в логе задачи (имя таски: journal pg_upgrade).__{{ control_name }}.FAIL

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

Проверка с помощью утилиты pg_dumpall#

Проверка осуществляется с помощью утилиты pg_dumpall --schema-only --no-tablespaces --no-privileges.

Проверка заключается в снятии дампа схемы на текущей БД и загрузка схемы в экземпляр основанный на новой версии

Во время выполнения будут выведены ошибки:

Если во время старта СУБД произошла неожиданная ошибка, то выводится блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Произошла неожиданная ошибка во время старта СУБД для проверки загрузки схемы данных. Обратитесь к администраторам БД для анализа проблемы. Список ошибок: list_errors.__{{ control_name }}.FAIL

Если во время загрузки схемы данных произошла неожиданная ошибка, то выводится блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__Произошла неожиданная ошибка во время проверки загрузки схемы данных. Обратитесь к администраторам БД для анализа проблемы. Список ошибок: list_errors.__{{ control_name }}.FAIL

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

{{ control_name }}.FAIL__Найдены ошибки во время проверки загрузки схемы данных. Обратитесь к администраторам БД для анализа проблемы. Ссылка на схему данных в папке с логами: (ansible_fqdn)pg_scout_log_link/currentdb.sql. Список ошибок: list_errors. Если после анализа выявлено, что ошибка ложно положительная, то необходимо добавить эту ошибку в фильтр в переменную false_error_filter_for_data_schema настраиваемого конфигурационного файла.__{{ control_name }}.FAIL

Проверка минимальной конфигурации ЦПУ и ОЗУ на обновляемых стендах#

Проверка осуществляется путем сбора системных параметров стенда и сравнения с минимальными значениями, указанными в файле конфигурации custom_file_template.yml. Если проверка обнаружила несоответствие минимальным требованиям, будет выдана ошибка:

{{ control_name }}.FAIL__Хост {host_name} не соответствует минимальным требования по CPU. Минимальное значение {count_cpu}.__{{ control_name }}.FAIL
{{ control_name }}.FAIL__Хост {host_name} не соответствует минимальным требования по RAM. Минимальное значение {count_ram}.__{{ control_name }}.FAIL

Проверка наличия установленных пакетов Pangolin разной версии#

Происходит проверка наличия установленных пакетов platform-v-pangolin и postgresql-sber-edition, если они оба установлены, то будет выведено сообщение:

"{{ control_name }}.FAIL__На стенде установлено 2 разных пакета Pangolin - platform-v-pangolin и postgresql-sber-edition. Необходимо удалить неактуальный пакет__.{{ control_name }}.FAIL"

Проверка существования файлов блокирующих обновление#

Если во время повторного запуска обновления, были найдены файлы блокирующие обновление (disallow_update или .trigger_stop_update), то в зависимости от установленного рычага remove_block_update_tmp_files в конфигурационном файле они будут удалены. После удаления будет выведено сообщение об удалении данных файлов:

{{ control_name }}.INFO__Был найден и удален триггер прерывания обновления.__{{ control_name }}.INFO
{{ control_name }}.INFO__Был найден и удален файл предыдущего неудачного обновления.__{{ control_name }}.INFO

Проверка наличия логической репликации#

Происходит проверка наличия логической репликации в СУБД. Если она будет найдена, то будет выведено сообщение:

"{{ control_name }}.FAIL__На стенде {} обнаружено использование логической репликации, для продолжения обновления требуется удалить слот(ы) логической репликации: {}.__{{ control_name }}.FAIL"

Вывод информационного сообщения estimation_update_execution_time#

При успешном прохождении выше описанных проверок и наличия не пустого значения параметра estimation_update_execution_time в настраиваемом конфигурационном файле выводится информационное сообщение:

{{ control_name }}.INFO__{{ estimation_update_execution_time }}__{{ control_name }}.INFO

Проверка успешного завершения сценария#

При успешном прохождении выше описанных проверок выведется сообщение

{{ control_name }}.OK__Разведка перед обновлением успешно выполнена.__{{ control_name }}.OK

Обработка неизвестной ошибки#

В случае появления неожиданной ошибки, будет выводиться блокирующая выполнение сценария ошибка:

{{ control_name }}.FAIL__В процессе работы скрипта разведки произошла неожиданная ошибка. Обратитесь к администраторам БД для анализа проблемы.__{{ control_name }}.FAIL

Если проверка прошла успешно, то можно приступать к процессу обновления.

Проверка установленного пакета СУБД Pangolin версии, на которую планируется обновление#

Если скриптом-разведчиком будет обнаружен установленный rpm-пакет СУБД Pangolin версии, на которую планируется обновление, то выводится ошибка:

"FAIL__На стенде установлен пакет Pangolin версии 05.005.00, на которую планируется обновление. Необходимо удалить данный пакет.__FAIL"

Проверка каталога исполняемых файлов в кластере СУБД Pangolin#

Скрипт-разведчик выполняет сравнение каталогов с исполняемыми файлами на всех хостах с СУБД Pangolin и если они отличаются, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Зафиксировано несоответствие директории '/usr/pangolin-{version-from}', '/usr/pangolin-{version-to}' между узлами кластера. Необходимо произвести их корректировку.__FAIL"

Проверка наличия установленных расширений, которые не поддерживаются#

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

Если расширение установлено в базе данных, то будет выведена следующая ошибка:

FAIL__В кандидате на обновление обнаружены неподдерживаемые расширения. Для корректного обновления необходимо произвести удаление этих расширений (<имя БД>: <имя расширения>): {}: '{}'.FAIL

Если неподдерживаемое расширение находится в параметре shared_preload_libraries:

FAIL__В кандидате на обновление обнаружены неподдерживаемые расширения {} в параметре shared_preload_libraries.FAIL

Проверка наличия неподдерживаемых параметров в конфигурационном файле Pangolin#

Скрипт-разведчик выполняет проверку неподдерживаемых параметров в конфигурационном файле postgresql.conf, если такие параметры найдены, выводится ошибка:

FAIL__В кандидате на обновление обнаружены неподдерживаемые параметры {} в конфигурационном файле {}. Для корректного обновления необходимо произвести удаление этих параметров.FAIL

Проверка наличия неподдерживаемых значений параметра clientcert в правилах pg_hba#

Скрипт-разведчик выполняет поиск в файле pg_hba.conf неподдерживаемые значения для параметра clientcert, в случае обнаружения таких значение, выводится ошибка:

FAIL__В кандидате на обновление обнаружены неподдерживаемые параметры {} в правилах pg_hba. Для корректного обновления необходимо произвести удаление этих параметров.FAIL

Проверка состояния близости БД к порогу заморозки транзакций autovacuum_freeze_max_age#

Скрипт-разведчик получает возраст заморозки старейшей из баз, а также значение параметра autovacuum_freeze_max_age, установленного системно и для отдельных таблиц, TOAST-таблиц, после чего сравнивает возраст заморозки с наименьшим значением параметра autovacuum_freeze_max_age. Если возраст заморозки больше 80% от наименьшего значения autovacuum_freeze_max_age выводится предупреждение:

WARNING__W03007:База данных близка к порогу принудительной заморозки транзакций. Перед обновлением необходимо предварительно либо выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age для таблиц в БД, исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age
Список БД:
{}.WARNING

WARNING__W03009:База данных близка к порогу принудительной заморозки транзакций. Перед обновлением необходимо предварительно либо выполнить vacuumdb -a -F -v (заморозка транзакций в кластере баз), либо увеличить значение параметра autovacuum_freeze_max_age глобально, исходя из формулы max_frozen_age > 0.8 * autovacuum_freeze_max_age.WARNING

Проверка количества транзакций с незавершенным статусом#

Скрипт-разведчик выполняет поиск строк с незавершенным статусом транзакции, в случае превышения подобных транзакций свыше 3,15 млн будет выведено предупреждение:

WARNING__W03008:Обнаружены базы данных с большим количеством транзакций с незавершенным статусом. Рекомендуется выполнить следующую команду перед запуском обновления: vacuumdb -v -d db_name  (запуск очистки базы данных ), где db_name - имя БД из списка. \n\
                                                Список БД: {}.WARNING"

Пороговое количество транзакций определено исходя из максимального количества записей, которые могут содержаться в 1 журнале и количества самих журналов (эмпирически определено как 3).

Обновление Pangolin#

Внимание!

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

Чтобы выполнить обновление Pangolin:

  1. Скачайте и распакуйте дистрибутив на сервере.

  2. Перейдите в каталог с распакованным дистрибутивом, а затем в каталог installer.

  3. Перед запуском обновления заполните файл hosts.ini в зависимости от установленного решения добавив информацию о хостах и учетных данных пользователя, которые будет использовать Ansible.

    Внимание!

    Данные должны содержать те же параметры, что и при установке. Примеры заполнения файлов описаны в разделе «Установка».

  4. Заполните настраиваемый конфигурационный файл custom_file_sample.yml.

    Примечание:

    При обновлении в секции 3.1.HBA RULES не поддерживаются следующие параметры:

    • ldap_tls;

    • cert_dir;

    • openldap_config.

    Заполнять их нет необходимости.

  5. Заполните конфигурационный файл all.yml.

  6. Выполните ansible-сценарий.

    Ниже приведены шаблоны ansible-сценариев для обновления различных решений:

  • Обновление односерверного решения:

    ansible-playbook playbook_updates.yaml \
    -i inventories/standalone/hosts.ini  \
    -t always,standalone \
    --ask-vault-pass \
    -vv \
    -e '{"update_complexity_level": "update_complexity_level_2"}' \
    --extra-vars "local_distr_path=${} \
    segment=${} \
    custom_config=${} \
    stand=${}"
    
  • Обновление кластерного решения:

    ansible-playbook playbook_updates.yaml \
    -i inventories/cluster/hosts.ini  \
    -t always,cluster \
    --ask-vault-pass \
    -vv \
    -e '{"update_complexity_level": "update_complexity_level_2"}' \
    --extra-vars "local_distr_path=${} \
    segment=${} \
    custom_config=${} \
    stand=${}"
    

Описание параметров:

  • custom_config - абсолютный путь к файлу конфигурации custom_config_sample.yml;

  • local_distr_path - абсолютный путь к загруженному и распакованному дистрибутиву Pangolin;

  • segment - сегмент сети;

  • stand - стенд для тестирования или конечной инсталляции (dev или prom).

Значения используемых в команде запуска Ansible ключей:

  • -i - путь к inventory-файлу;

  • --extra-vars - переменные, которые по приоритету важнее переменных из inventory;

  • -t - теги для запуска;

  • -v - уровень логирования Ansible. Может быть, как пустым, так и -vvvvvv, где запуск без v - минимальное логирование.

После завершения обновления у пользователя postgres в его корневой директории будет сгенерирован файл с названием .process_work_statuses. В нем будет отображаться состояние корректности установленных обновлений. Ниже приведен пример данного файла с конфигурации продукта standalone-postgresql-pgbouncer:

Разведка перед обновлением СУБД Pangolin запущена, текущая конфигурация standalone-postgresql-pgbouncer , тип обновления update_major, режим обновления hardlink
Разведка перед обновлением СУБД Pangolin завершена, текущая конфигурация standalone-postgresql-pgbouncer , тип обновления update_major, режим обновления hardlink
Обновление СУБД Pangolin запущено, текущая конфигурация standalone-postgresql-pgbouncer , с версии 04.003.00 на версию 05.002.00, статус обновления: {u'aggregate': False, u'hosts': {u'replica': False, u'master': False, u'etcd': False}, u'components': {u'haproxy': False, u'pgbouncer': False, u'patroni': False, u'pg': False, u'etcd': False, u'configuration': False}, u'types': {u'etcd': {u'finally': False, u'main': False}, u'pg': {u'major_main_migrate_replica_db': False, u'remove_pgaudit': False, u'major_pre': False, u'major_post': False, u'bootstrap': False, u'role_switched': False, u'major_main_migrate_master_db': False, u'major_main_start_after_migrate_db': False, u'not_started_db': False, u'started_db': False}, u'patroni': {u'finally': False, u'main': False}}}, тип обновления update_major, режим обновления hardlink
Обновление СУБД Pangolin успешно завершено, текущая конфигурация standalone-postgresql-pgbouncer , с версии 04.003.00 на версию 05.002.00, статус обновления: {u'aggregate': False, u'hosts': {u'replica': False, u'master': False, u'etcd': False}, u'components': {u'haproxy': False, u'pgbouncer': False, u'patroni': False, u'pg': False, u'etcd': False, u'configuration': False}, u'types': {u'etcd': {u'finally': False, u'main': False}, u'pg': {u'major_main_migrate_replica_db': False, u'remove_pgaudit': False, u'major_pre': False, u'major_post': False, u'bootstrap': False, u'role_switched': False, u'major_main_migrate_master_db': False, u'major_main_start_after_migrate_db': False, u'not_started_db': False, u'started_db': False}, u'patroni': {u'finally': False, u'main': False}}}, тип обновления update_major, режим обновления hardlink

Обновление бинарных файлов#

Внимание! Скрипт обновления бинарных файлов pangolin_update_binary_script используется для применения исправлений и доработок в рамках одной мажорной версии.

Ручное обновление#

Чтобы выполнить обновление бинарных файлов Pangolin с использованием скрипта:

  1. Убедитесь, что на стенде:

    • нет задержки репликации на узлах кластера Pangolin;

    • Pangolin работоспособный (есть доступ в базу данных);

    • отключен мониторинг (фоновых процессов и мониторинг статуса репликации) на время выполнения обновления бинарных файлов;

    • отсутствует активное резервное копирование.

  2. Скачайте и распакуйте дистрибутив.

  3. Из дистрибутива скопируйте rpm-файл файл platform-v-pangolin-<Версия Pangolin>-<Версия ОС>.rpm Pangolin на узлы кластера.

  4. Проверьте наличие утилиты перешифрования в директории /etc/postgres на узлах Pangolin. Если файлы утилиты перешифрования есть, то скопируйте их из дистрибутива pangolin-auth-reencrypt в каталог /etc/postgres с правами root:root 755.

  5. Выполните команду для замены бинарных файлов от суперпользователя на узлах с Pangolin:

    sudo yum install platform-v-pangolin-dbms-<Версия Pangolin>-<Версия ОС>.rpm
    
  6. Удалите старый каталог, затем создайте на него символьные ссылки:

    sudo rm -rf /usr/pangolin-{version-from}
    sudo ln -sf /usr/pangolin-{version-to} /usr/pangolin-{version-from}
    
  7. Выполните перезапуск Pangolin (restart) в зависимости от типа установки с помощью сервиса postgresql.service или patronictl.

  8. Проверьте работоспособность Pangolin.

Автоматическое обновление#

Руководство по автоматическому обновлению бинарных файлов Pangolin:

  1. Проверьте, что на стенде:

    • нет задержки репликации на узлах кластера Pangolin;

    • Pangolin работоспособный (есть доступ в базу данных);

    • отключен мониторинг (фоновых процессов и мониторинг статуса репликации) на время выполнения обновления бинарных файлов;

    • отсутствует активное резервное копирование.

  2. Скачайте и распакуйте дистрибутив.

  3. Скопируйте RPM-файл Pangolin и бинарный файл утилиты pangolin-auth-reencrypt в папку installer/scripts_external/pangolin_update_binary_script/roles/update_binary_script/files.

  4. Настройте узлы в installer/scripts_external/pangolin_update_binary_script/inventories.

  5. Ознакомьтесь с переменными по умолчанию в файле scripts_external/pangolin_update_binary_script/playbook_update_binary.yaml и при необходимости скорректируйте их:

     	- PG_PORT: 5433														#порт postgresql
         - REMOTE_TMP: /home/postgres/update_binary_cache_dir				#временная директория для хранения rpm на время выполнения скрипта 
         - RPM_NAME: platform-v-pangolin-dbms-<Версия Pangolin>-<Версия ОС>.rpm 	#имя rpm-файла
         - PGHOME: /usr/pangolin-{version-from} 										#расположение нового pghome
         - PGHOME_OLD: /usr/pangolin-{version-to} 								    #расположение старого pghome
         - patroni_conf_dir: /etc/patroni 									#расположение конфигурационных файлов patroni
         - clustername: clustername                               			#имя кластера
         - patronictl_path: /usr/patroni/patroni_venv/bin/patronictl 		#расположение patronictl
         - patroni_wait_seconds: 15 											#задержка после выполнения команд restart/switchover
         - LANG: en_US.UTF-8                                                 # язык интерфейса ОС
         - LC_ALL: en_US.UTF-8                                               # язык интерфейса ОС
    
  6. Перейдите в каталог installer/scripts_external/pangolin_update_binary_script и запустите playbook:

  • Обновление односерверного решения:

    ansible-playbook playbook_update_binary.yaml \ 
    -i inventories/standalone/hosts.ini -t standalone \ 
    --flush-cache -vv \
    --ssh-extra-args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' -vv
    
    • Обновление кластерного решения:

      ansible-playbook playbook_update_binary.yaml \ 
      -i inventories/cluster/hosts.ini -t cluster \ 
      --flush-cache -vv \
      --ssh-extra-args='-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' -vv
      

Проверки и информационные сообщения процесса обновления#

Проверка пароля через параметр postgres_db_pass#

Пароль исходной БД должен совпадать с паролем, переданным в пользовательский конфигурационный файл через параметр postgres_db_pass. В случае несовпадения в лог будет выведена ошибка, блокирующая дальнейшее обновление:

FAIL__Пароль от суперпользователя postgres в пользовательском конфигурационном файле не совпадает с текущим паролем в БД. Скорректируйте значение параметра 'postgres_db_pass' в пользовательском конфигурационном файле.__FAIL

Проверка шифрования параметра postgres_db_pass#

Значение параметра postgres_db_pass не должно быть в виде scram-sha-256 или md5. Если пароль для УЗ postgres передан не в зашифрованном с помощью ansible-vault виде, то выводится ошибка, блокирующая дальнейшее выполнение сценария:

"FAIL__Пароль от суперпользователя postgres не должен быть задан в виде хэша 'SCRAM-SHA-256' или 'md5'.__FAIL"

В случае успешного прохождения проверки будет выведено:

"INFO__Проверка пароля от суперпользователя postgres завершилась успешно.__INFO"

Проверки для определения наличия СЗИ#

К проверкам для определения наличия СЗИ в процессе обновления относятся:

  • проверка включенной защиты конфигурации (SHOW secure_config);

  • проверка включенного TDE (SELECT check_tde_is_on());

  • проверка включенной защиты от привилегированных пользователей (SELECT COUNT(1) FROM pg_catalog.pr_object WHERE datoid = 0 AND objoid = 0 AND objkind = 0).

Добавление новых параметров в локальный конфигурационный файл контролируется файлом diff.txt в скриптах развертывания/обновления. Данная доработка будет применяться к обновлению всех стендов независимо от наличия подключенных СЗИ; изменения коснулись только конфигурационных файлов СУБД (postgres.yml, postgresql.conf).

Пароль передается в момент инициализации, перед этим он переводится в хеш SCRAM-SHA-256. Строка запуска выглядит так:

# Установка
{{ PGHOME }}/bin/initdb -D {{ PGDATA }} -k -A scram-sha-256 --pwfile {{ postgres_pass }} --locale {{ locale }} --update-authid

# Обновление
{{ PGHOME }}/bin/initdb -D {{ PGDATA }} -k -A scram-sha-256 --pwfile {{ postgres_pass }} -E {{ old_postgres_encoding.query_result[0].server_encoding }} --update-authid --lc-collate {{ old_postgres_locale.settings.lc_collate.setting }} --lc-ctype {{ old_postgres_locale.settings.lc_ctype.setting }} --lc-messages {{ old_postgres_locale.settings.lc_messages.setting }} --lc-monetary {{ old_postgres_locale.settings.lc_monetary.setting }} --lc-numeric {{ old_postgres_locale.settings.lc_numeric.setting }} --lc-time {{ old_postgres_locale.settings.lc_time.setting }}

Примечание:

Значение параметра postgres_db_pass, отвечающего за проверку пароля, передаваемого в пользовательском конфигурационном файле, не должно быть в виде scram-sha-256 или md5.

Пароль суперпользователя (postgres) считывается в интерактивном режиме, а сам процесс миграции осуществляется с помощью SCRAM-SHA-256. Пароль будет считываться из параметра postgres_db_pass (старое название postgres_db_scram_pass) конфигурационного файла в зашифрованном ansible vault-виде.

Внимание!

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

Утилита secret_storage_client#

Утилита secret_storage_client служит для проверки наличия конфигурационных параметров СУБД Pangolin и их значений в хранилище секретов:

$ secret_storage_client -?
Usage:
  ./secret_storage_client <option>...
Options:
  --help             [-?]  this help
  --plugins-dir-path [-d]  path to directory containing plugins
  --plugin-log-level [-l]  plugin log level [DEBUG, LOG, INFO, NOTICE, WARNING (default), ERROR, FATAL, PANIC]
  --config                 use config file (/etc/postgres/enc_connection_settings.cfg) with settings
                           to connect to Secret storage [default]
  --interactive      [-i]  run in interactive mode
  --cluster          [-c]  cluster ID
  --host             [-h]  domain name or ip address of Secret storage
  --port             [-p]  secret storage server port
  --protocol               secret storage protocol [http (1), default: https (2)]
  --prefix           [-x]  secrets path prefix [default: kv]
  --suffix           [-s]  secrets path suffix [default: empty]
  --namespace        [-n]  secrets namespace [default: empty]
  --type             [-t]  auth type [userpass (1), approle (2)]
  --auth             [-a]  auth point [default: empty]
  --id               [-u]  login or role ID
  --root-ca          [-r]  file or folder with root certificate to check Secret storage server
  --skip-confirm     [-k]  input secret without confirmation

Pangolin product version information:
  --product_version        prints product name and version
  --product_build_info     prints product build number, date and hash
  --product_component_hash prints component hash string

The './secret_storage_client' utility is used to read secrets from Secret storage

Утилита поддерживает следующие варианты ввода параметров для подключения к хранилищу секретов:

  • Чтение параметров из файла /etc/postgres/enc_connection_settings.cfg (аргумент --config). Данный способ используется, если файл предварительно был создан утилитой setup_kms_credentials.

  • Интерактивный ввод параметров (аргумент --interactive).

  • Если параметр отсутствует в аргументах, то будет запрошен ввод его значения. Ввод пароля или secretID осуществляется только интерактивно (аргумент --interactive).

Утилита возвращает список значений всех защищаемых конфигурационных параметров, поддерживаемых СУБД Pangolin, в формате:

имя параметра|||вариант защиты|||статус параметра|||значение:::имя параметра|||вариант защиты параметра|||статус параметра|||значение

В приведенном выше формате варианту защиты может соответствовать одно из значений:

  • VST_ONLY_VAULT - параметру присваивается значение, полученное из хранилища секретов. В случае его отсутствия применяется значение по умолчанию для этого параметра;

  • VST_STRICT_VAULT - для параметра допустимо применение значения, полученного только из хранилища секретов;

  • VST_EITHER - параметру присваивается значение, полученное из хранилища секретов. В случае его отсутствия применяется значение из конфигурационного файла postgresql.conf;

  • VST_BOTH - значение параметра в хранилище секретов должно совпадать со значением в конфигурационном файле postgresql.conf. В случае отсутствия параметра в одном из источников применяется значение по умолчанию для этого параметра.

Статус параметра может быть установлен как:

  • present - присутствует в хранилище секретов;

  • absent - отсутствует в хранилище секретов;

  • null - присутствует в хранилище секретов, но значение не указано.

Ниже приведен пример:

secure_config|||VST_ONLY_VAULT|||present|||off:::password_encryption|||VST_ONLY_VAULT|||absent|||:::ssl|||VST_ONLY_VAULT|||present|||on:::allowed_servers|||VST_ONLY_VAULT|||absent|||:::ssl_ca_file|||VST_ONLY_VAULT|||absent|||:::ssl_ca_path|||VST_ONLY_VAULT|||absent|||:::ssl_cert_file|||VST_ONLY_VAULT|||absent|||:::ssl_crl_file|||VST_ONLY_VAULT|||absent|||:::ssl_crl_dir|||VST_ONLY_VAULT|||present|||/pg_ssl/crl/test/server:::ssl_key_file|||VST_ONLY_VAULT|||absent|||:::ssl_ciphers|||VST_ONLY_VAULT|||absent|||:::ssl_prefer_server_ciphers|||VST_ONLY_VAULT|||absent|||:::ssl_ecdh_curve|||VST_ONLY_VAULT|||absent|||:::ssl_dh_params_file|||VST_ONLY_VAULT|||absent|||:::ssl_passphrase_command|||VST_BOTH|||absent|||:::serverssl.pkcs12_config_path|||VST_ONLY_VAULT|||present|||/pg_ssl/server.p12.cfg:::pg_ident_conf|||VST_BOTH|||absent|||:::is_tde_on|||VST_ONLY_VAULT|||null|||:::password_policies_enable|||VST_ONLY_VAULT|||absent|||:::password_policy.deny_default|||VST_ONLY_VAULT|||absent|||:::password_policy.reuse_time|||VST_ONLY_VAULT|||absent|||:::password_policy.in_history|||VST_ONLY_VAULT|||absent|||:::password_policy.max_age|||VST_ONLY_VAULT|||absent|||:::password_policy.min_age|||VST_ONLY_VAULT|||absent|||:::password_policy.grace_login_limit|||VST_ONLY_VAULT|||absent|||:::password_policy.grace_login_time_limit|||VST_ONLY_VAULT|||absent|||:::password_policy.expire_warning|||VST_ONLY_VAULT|||absent|||:::password_policy.lockout|||VST_ONLY_VAULT|||absent|||:::password_policy.lockout_duration|||VST_ONLY_VAULT|||absent|||:::password_policy.max_failure|||VST_ONLY_VAULT|||absent|||:::password_policy.failure_count_interval|||VST_ONLY_VAULT|||absent|||:::password_policy.check_syntax|||VST_ONLY_VAULT|||absent|||:::password_policy.min_length|||VST_ONLY_VAULT|||absent|||:::password_policy.illegal_values|||VST_ONLY_VAULT|||absent|||:::password_policy.alpha_numeric|||VST_ONLY_VAULT|||absent|||:::password_policy.min_alpha_chars|||VST_ONLY_VAULT|||absent|||:::password_policy.min_special_chars|||VST_ONLY_VAULT|||absent|||:::password_policy.min_uppercase|||VST_ONLY_VAULT|||absent|||:::password_policy.min_lowercase|||VST_ONLY_VAULT|||absent|||:::password_policy.max_rpt_chars|||VST_ONLY_VAULT|||absent|||:::password_policy.track_login|||VST_ONLY_VAULT|||absent|||:::password_policy.max_inactivity|||VST_ONLY_VAULT|||absent|||:::password_policy.use_password_strength_estimator|||VST_ONLY_VAULT|||absent|||:::password_policy.password_strength_estimator_score|||VST_ONLY_VAULT|||absent|||:::password_policy.custom_function|||VST_ONLY_VAULT|||absent|||:::password_policy.allow_hashed_password|||VST_ONLY_VAULT|||absent|||:::psql_encrypt_password|||VST_ONLY_VAULT|||absent|||:::encrypt_new_tablespaces|||VST_ONLY_VAULT|||absent|||:::test_vst_both_restart_only|||VST_BOTH|||absent|||:::password_policy.transport_password_mark_automatic|||VST_ONLY_VAULT|||absent|||:::password_policy.transport_password_life_time|||VST_ONLY_VAULT|||absent|||:::performance_insights.masking|||VST_ONLY_VAULT|||absent|||:::masking_mode|||VST_ONLY_VAULT|||absent|||:::enabled_extra_auth_methods|||VST_ONLY_VAULT|||present|||trust,cert:::enabled_sec_admin_extra_auth_methods|||VST_ONLY_VAULT|||present|||trust

Ручное обновление исполняемых файлов#

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

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

Примечание:

Начиная с СУБД Pangolin 6.2.0 для быстрого доступа к исполняемым файлам клиентской и серверной части СУБД используется встроенный в ОС Linux механизм альтернативных ссылок. Создание и удаление альтернативных ссылок происходит автоматически при развертывании и удалении rpm/deb-пакетов.

Подготовка#

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

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

Обновляются только компоненты, которые есть на исходном стенде. Для отсутствующих пропустить выполнение шага.

Перед началом обновления скачайте дистрибутив в рабочий каталог и распакуйте его. В инструкции рабочим каталогом считается ~/pangolin:

mkdir -p ~/pangolin
tar -xzvf pangolin_{major_version}.tar.gz  -C ~/pangolin

Обновление в рамках 5.3.x или 5.4.x или 5.5.x#

Внимание!

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

  • PGHOME - путь к новому каталогу с исполняемыми файлами СУБД Pangolin;

  • PGHOME_OLD - путь к исходному каталогу с бинарными файлами СУБД Pangolin;

  • MINOR_VER - минорная версия;

  • PATH_VER - патч новой версии СУБД Pangolin;

  • PATH_VER_OLD - патч исходной версии СУБД Pangolin.

  1. Для стендов с Pangolin Manager выполните:

    sudo ls -la /usr/patroni/patroni_venv/lib/python3/site-packages/psycopg2_binary.libs/ | grep libpq.so
    
  2. Сохраните имя символьной ссылки:

    /usr/patroni/patroni_venv/lib/python3/site-packages/psycopg2_binary.libs/libpq-0929ced5.so.5.11
    
  3. В случае кластерной конфигурации переведите его в режим асинхронной потоковой репликации, предварительно проверив, какие значения установлены на стенде, чтобы по окончании обновления их вернуть:

    sudo -iu postgres
    # Необходимо сохранить вывод для дальнейших действий, например, в файл patronictl -c /etc/pangolin-manager/postgres.yml show-config > ~/postgres_show-config.yaml
    patronictl -c /etc/pangolin-manager/postgres.yml show-config
    # меняем  
    patronictl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=true' --force
    patronictl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode=false' --force
    patronictl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=false' --force
    exit
    
  4. Безопасно остановите все компоненты СУБД:

    # Если нет patroni
    sudo systemctl stop postgresql 
    # Если есть patroni
    sudo systemctl stop patroni
     
    sudo -iu postgres
    /usr/pangolin/bin/pg_ctl stop -D /pgdata/data/data
    exit
    sudo systemctl stop etcd
    sudo systemctl stop pgbouncer
    sudo systemctl stop pangolin_reencrypt@postgres.service
    sudo systemctl stop pangolin_reencrypt@kmadmin_pg.service
    sudo systemctl stop pg_certs_rotate_agent.service
    
  5. Убедитесь, что все компоненты остановлены:

    sudo ps aux | grep -E "pgbouncer|postgres|etcd|patroni|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grep
    
  6. Если команда вернула результат, то выполните:

    sudo kill -9 <pid>
    sudo ps aux | grep -E "pgbouncer|postgres|etcd|patroni|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grep
    
  7. Скопируйте бинарный файл утилиты pg_cers_rotate_agent в рабочий каталог и назначьте на него необходимые для использования права:

    sudo cp -rf ~/pangolin/utilities/pg_certs_rotate/pg_certs_rotate_agent /opt/pangolin-common/bin/
    sudo chown postgres:postgres /opt/pangolin-common/bin/pg_certs_rotate_agent
    sudo chmod 0500 /opt/pangolin-common/bin/pg_certs_rotate_agent
    sudo chmod 0710 /pgerrorlogs/05/pg_certs_rotate_agent/
    
  8. Скопируйте бинарный файл утилиты pangolin-auth-reencrypt в рабочий каталог и назначьте необходимые права:

    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version}
    sudo cp -rf ~/pangolin/utilities/pangolin-auth-reencrypt/opt/pangolin-common/bin/pangolin-auth-reencrypt /opt/pangolin-common/bin/
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/pangolin_reencrypt\@.service
    sudo chown root:root /opt/pangolin-common/bin/pangolin-auth-reencrypt
    sudo chmod 0755 /opt/pangolin-common/bin/pangolin-auth-reencrypt
    
  9. Скопируйте бинарный файл компонента manager_backup в рабочий каталог, скорректируйте версию в скриптах СРК и назначьте необходимые права:

    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version}
    sudo cp -rf ~/pangolin/utilities/pg_backup/manage_backup.bin /opt/omni/lbin/0{major_version}_manage_backup.bin 
    sudo chown root:root /opt/omni/lbin/0{major_version}_manage_backup.bin 
    sudo chmod 0751 /opt/omni/lbin/05_manage_backup.bin
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /opt/omni/lbin/0{major_version}_manage_backup.sh
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /opt/omni/lbin/0{major_version}_pg_se_archlogs.sh
    
  10. Скорректируйте версию Pangolin Pooler в service-файле компонента:

    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version} 
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/pgbouncer.service
    
  11. Скопируйте бинарный файл Pangolin Pooler в рабочий каталог и назначьте необходимые права:

    sudo cp -rf ~/pangolin/pgbouncer/usr/local/bin/pgbouncer /usr/local/bin/pgbouncer
    sudo chown root:root /usr/local/bin/pgbouncer
    sudo chmod 0755 /usr/local/bin/pgbouncer
    
  12. Скорректируйте версию Pangolin Manager в service-файле и конфигурационном файле компонента:

    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version}
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/patroni.service
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/pangolin-manager/postgres.yml
    
  13. Скопируйте бинарный файл Pangolin Manager в рабочий каталог и назначьте необходимые права:

    export PATH_VER={path_version}
    export MINOR_VER={minor_version} 
    sudo tar -xzvf ~/pangolin/patroni/patroni.tar.gz  -C /usr/patroni/patroni_venv/bin/
    sudo tar -xzvf ~/pangolin/patroni/postgresql_se_libs.tar.gz -C /usr/patroni/patroni_venv/lib/
    sudo cp -rf ~/pangolin/patroni/se_version /usr/patroni/patroni_venv/bin/
    sudo cp -rf ~/pangolin/patroni/version /usr/patroni/patroni_venv/bin/
    sudo chown postgres:postgres /usr/patroni/patroni_venv/bin/patroni 
    sudo chown postgres:postgres /usr/patroni/patroni_venv/lib/postgresql_se_libs
    sudo chown postgres:postgres /usr/patroni/patroni_venv/bin/se_version
    sudo chown postgres:postgres /usr/patroni/patroni_venv/bin/version
    sudo find /usr/patroni/patroni_venv/bin/ -name "patroni*" -exec chmod -R 0700 {} \;
    sudo chmod 0700 -R /usr/patroni/patroni_venv/lib/postgresql_se_libs
    sudo chmod 0600 /usr/patroni/patroni_venv/bin/se_version
    sudo chmod 0600 /usr/patroni/patroni_venv/bin/version
    # восстанавливаем линку
    sudo ln -sfn /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/lib/libpq.so /usr/patroni/patroni_venv/lib/python3/site-packages/psycopg2_binary.libs/libpq-0929ced5.so.5.11
    
  14. Обновите СУБД Pangolin:

    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version}
    sudo LINK_PGHOME=/usr/pangolin,/opt/pangolin-dbms yum install ~/pangolin/platform-v-pangolin-dbms-0{major_version}.00$MINOR_VER.0$PATH_VER-rhel7.9.x86_64.rpm -y
    sudo -iu postgres
    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version}
    cp -rf /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/postgresql_venv /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/
    # восстанавливаем линку
    ln -sfn /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/lib/libpq.so /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/postgresql_venv/lib/python3.6/site-packages/psycopg2_binary.libs/libpq-0929ced5.so.5.11
    exit
    sudo rm -rf /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/ /usr/pgsql-se-0{major_version}  
     
    # если нет patroni
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /pgdata/05/data/postgresql.conf
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/postgresql.service
    
  15. Скопируйте сторонние библиотеки:

    export PATH_VER={path_version}
    export MINOR_VER={minor_version}
    sudo mkdir /usr/pangolin/3rdparty /usr/pangolin/migration_tools/ /usr/pangolin/diagnostic_tool
    sudo cp ~/pangolin/3rdparty/3rdparty.tar.gz /usr/pangolin/3rdparty/
    sudo tar -xzvf /usr/pangolin/3rdparty/3rdparty.tar.gz -C /usr/pangolin/3rdparty/
    sudo chmod 0700 -R /usr/pangolin/3rdparty
    sudo chown -R postgres:postgres /usr/pangolin/3rdparty
    sudo cp /usr/pangolin/3rdparty/cracklib/libcrack.so /usr/pangolin/lib/
    sudo cp /usr/pangolin/3rdparty/cracklib/pw_dict.hwm /usr/pangolin/lib/
    sudo cp /usr/pangolin/3rdparty/cracklib/pw_dict.pwd /usr/pangolin/lib/
    sudo cp /usr/pangolin/3rdparty/cracklib/pw_dict.pwi /usr/pangolin/lib/
    sudo chmod 0600 /usr/pangolin/lib/libcrack.so
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.hwm
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.pwd
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.pwi
    sudo chown postgres:postgres /usr/pangolin/lib/libcrack.so
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.hwm
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.pwd
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.pwi
    sudo cp -r ~/pangolin/utilities/diagnostic_tool/. /usr/pangolin/diagnostic_tool/
    sudo cp ~/pangolin/utilities/migration_tools/pgloader/pgloader /usr/pangolin/migration_tools/
    sudo cp -r /usr/pangolin/3rdparty/ora2pg /usr/pangolin/migration_tools/
    sudo chmod -R 0700 /usr/pangolin/migration_tools/
    sudo chmod -R 0700 /usr/pangolin/diagnostic_tool/
    sudo chown -R postgres:postgres /usr/pangolin/migration_tools/
    sudo chown -R postgres:postgres /usr/pangolin/diagnostic_tool/
    sudo find ~/pangolin/timescaledb/usr/pangolin-5.$MINOR_VER.$PATH_VER/lib/ -name "*" -exec cp -r {} /usr/pangolin/lib/ \;
    sudo find /usr/pangolin/lib/ -name "timescaledb*" -exec chown postgres:postgres {} \;
    sudo find /usr/pangolin/lib/ -name "timescaledb*" -exec chmod 0600 {} \;
    sudo find ~/pangolin/timescaledb/usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/share/extension/ -name "*" -exec cp -r {} /usr/pangolin/share/extension/ \;
    sudo find /usr/pangolin/share/extension/ -name "timescaledb*" -exec chown postgres:postgres {} \;
    sudo find /usr/pangolin/share/extension/ -name "timescaledb*" -exec chmod 0600 {} \;
    
  16. Установите права на каталоги, необходимые для работы СЗИ:

    export PGHOME=/usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/
    sudo chmod o+x $PGHOME/
    sudo chmod o+x $PGHOME/bin/
    sudo chmod o+x $PGHOME/share/
    sudo chmod o+x $PGHOME/lib/
    sudo chmod o+x $PGHOME/lib/plugins/
    sudo chmod o+r $PGHOME/lib/plugins/
    sudo chmod o+r -R $PGHOME/lib/plugins/
    sudo chmod o+rx $PGHOME/lib/
    sudo chmod o+r $PGHOME/lib/libfe_elog.so
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/encrypt_params_file
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/generate_encryption_key
    sudo chown root:kmadmin_pg $PGHOME/bin/initprotection
    sudo chmod 0750 $PGHOME/bin/initprotection
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/setup_kms_credentials
    
  17. Актуализируйте .bash_profile и dynmotd.sh:

    export PATH_VER={path_version}
    export PATH_VER_OLD={patch_version_old}
    export MINOR_VER={minor_version}
    sudo sed -i  "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /home/postgres/.bash_profile
    sudo sed -i  "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /home/kmadmin_pg/.bash_profile
    sudo sed -i  "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /home/postgres/.bashrc
    sudo sed -i  "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /home/kmadmin_pg/.bashrc
     
    # Если есть patroni. Выполнить команды ниже стенде etcd дополнительно, при наличии.
    sudo sed -i "s/0{major_version}.00$MINOR_VER.0$PATH_VER_OLD/0{major_version}.00$MINOR_VER.0$PATH_VER/g" /usr/local/sbin/dynmotd.sh
    
  18. Запустите поочередно каждую службу, проверяя после запуска их состояние. В случае кластерной конфигурации сначала выполните запуск на мастере:

    sudo systemctl daemon-reload
     
    sudo systemctl restart etcd
    sudo systemctl status etcd
     
    # Если есть patroni
    sudo systemctl restart patroni
    sudo systemctl status patroni  
     
    # Если нет patroni
    sudo systemctl restart postgresql
    sudo systemctl status postgresql
     
    sudo systemctl restart pgbouncer
    sudo systemctl status pgbouncer
    sudo systemctl restart pg_certs_rotate_agent
    sudo systemctl status pg_certs_rotate_agent
    sudo systemctl restart pangolin_reencrypt@postgres
    sudo systemctl restart pangolin_reencrypt@kmadmin_pg
    sudo systemctl status pangolin_reencrypt@postgres
    sudo systemctl status pangolin_reencrypt@kmadmin_pg
     
    # Если кластерная конфигурация, возвращаем исходные значения, полученные на «Шаге 2»
    sudo -iu postgres
    patronictl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force
    patronictl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode=true' --force
    patronictl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=false' --force
     
    # при необходимости верните узлам исходные (до обновления) роли (switch)
    

Обновление в рамках 6.1.x#

Внимание!

Перед началом обновления учесть следующие особенности, в связи с изменением формата WAL-журналов:

  • Корректный возврат к исходной версии (6.1.0/6.1.2/6.1.4) не возможен.

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

Обозначения переменных

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

  • PGHOME - путь к новому каталогу с исполняемыми файлами СУБД Pangolin;

  • PATH_VER - патч новой версии СУБД Pangolin.

  1. Для стендов с pangolin-backup-tools выполните:

    sudo ls -la /opt/ansible_venv/lib/python3/site-packages/psycopg2_binary.libs/ | grep libpq.so
    
  2. Сохраните имя символьной ссылки:

    libpq-0929ced5.so.5.11 -> /usr/pangolin-{version}/lib/libpq.so
    
  3. Только в случае кластерной конфигурации переведите его в ражим асинхронной потоковой репликации, предварительно проверив какие значения установлены на стенде, чтобы вернуть их в конце обновления:

    sudo -iu postgres
    # запоминаем
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml show-config
    # меняем
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=true' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode=false' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=false' --force
    exit
    
  4. Безопасно остановите все компоненты СУБД:

    # Если нет pangolin-manager
    sudo systemctl stop postgresql 
    # Если есть pangolin-manager
    sudo systemctl stop pangolin-manager
     
    sudo -iu postgres
    /usr/pangolin/bin/pg_ctl stop -D /pgdata/data/data
    exit
    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
    
  5. Убедитесь, что все компоненты остановлены:

    sudo ps aux | grep -E "pangolin-pooler|postgres|etcd|pangolin-manager|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grep
    
  6. Если команда вернула результат, то выполните:

    sudo kill -9 <pid>
    sudo ps aux | grep -E "pangolin-pooler|postgres|etcd|pangolin-manager|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grep
    
  7. Настройте права на каталог pg_certs_rotate_agent:

    sudo chmod 0710 /pgerrorlogs/0{major_version}/pg_certs_rotate_agent/
    
  8. Внесите следующие изменения в service-файл:

    sudo sed -i "s/patroni/pangolin-manager/g" /etc/systemd/system/pg_certs_rotate_agent.service
    sudo sed -i "s/pgbouncer/pangolin-pooler/g" /etc/systemd/system/pg_certs_rotate_agent.service
    
  9. Скопируйте утилиту pg_certs_rotate_agent в рабочий каталог:

    sudo cp -rf ~/pangolin/utilities/pg_certs_rotate/pg_certs_rotate_agent /opt/pangolin-common/bin/
    sudo chown postgres:postgres /opt/pangolin-common/bin/pg_certs_rotate_agent
    sudo chmod 0500 /opt/pangolin-common/bin/pg_certs_rotate_agent
    
  10. Скопируйте бинарный файл утилиты pangolin-auth-reencrypt в рабочий каталог:

    export PATH_VER={path_version}
    sudo cp -rf ~/pangolin/utilities/pangolin-auth-reencrypt/opt/pangolin-common/bin/pangolin-auth-reencrypt /opt/pangolin-common/bin/
    sudo sed -i "s/{version}/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/pangolin_reencrypt\@.service
    sudo chown root:root /opt/pangolin-common/bin/pangolin-auth-reencrypt
    sudo chmod 0755 /opt/pangolin-common/bin/pangolin-auth-reencrypt
    
  11. Замените бинарные файлы manager_backup:

    export PATH_VER=4
    sudo cp ~/pangolin/utilities/pg_backup/manage_backup.bin /opt/omni/lbin/0{major_version}_manage_backup.bin 
    sudo chown root:root /opt/omni/lbin/06_manage_backup.bin 
    sudo chmod 0751 /opt/omni/lbin/06_manage_backup.bin
    sudo sed -i "s/{version}/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /opt/omni/lbin/0{major_version}_manage_backup.sh
    sudo sed -i "s/{version}/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /opt/omni/lbin/0{major_version}_pg_se_archlogs.sh
    
  12. Сохраните конфигурационный файл Pangolin Pooler:

    sudo mkdir -p ~/pangolin/backup_pooler/config/
    sudo find /etc/pangolin-pooler/ -name "*" -exec cp -r {} ~/pangolin/backup_pooler/config/ \;
    
  13. Обновите Pangolin Pooler:

    sudo yum install ~/pangolin/pangolin-pooler-1.2.0-rhel7.9.x86_64.rpm -y
    sudo rm -f /etc/pangolin-pooler/*
    sudo cp -r ~/pangolin/backup_pooler/config/* /etc/pangolin-pooler/
    sudo chown postgres:postgres /etc/pangolin-pooler/*
    sudo chmod 0600 /etc/pangolin-pooler/*
    
  14. Создайте файл pangolin-pooler-restart.sh:

    sudo echo '#!/bin/sh
     
    sudo systemctl restart pangolin-pooler' > ~/pangolin/pangolin-pooler-restart.sh
    sudo cp -r ~/pangolin/pangolin-pooler-restart.sh /opt/pangolin-pooler/bin/
    sudo chown postgres:postgres /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    sudo chmod 0500 /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    
  15. Обновите Pangolin Manager:

    export PATH_VER=4
    sudo mkdir -p ~/pangolin/backup_manager/
    sudo cp -r /etc/pangolin-manager/postgres.yml ~/pangolin/backup_manager/
    sudo sed -i "s/{version}/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" ~/pangolin/backup_manager/postgres.yml
    sudo yum install ~/pangolin/pangolin-manager-1.1.1-rhel7.9.x86_64.rpm -y
    sudo rm -f /etc/pangolin-manager/*  
    sudo cp -r ~/pangolin/backup_manager/postgres.yml /etc/pangolin-manager/postgres.yml
    sudo chown postgres:postgres /etc/pangolin-manager/
    sudo chown postgres:postgres /etc/pangolin-manager/postgres.yml
    sudo chmod 0600 /etc/pangolin-manager/postgres.yml
    
  16. Обновите СУБД Pangolin:

    export PATH_VER={path_version}
    sudo LINK_PGHOME=/usr/pangolin,/opt/pangolin-dbms yum install ~/pangolin/platform-v-pangolin-dbms-06.001.0$PATH_VER-rhel7.9.x86_64.rpm -y
    sudo rm -rf /usr/pangolin-{version}/ /usr/pgsql-se-0{major_version}
     
    # восстанавите символьную ссылку
    ln -sfn /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/lib/libpq.so /opt/ansible_venv/lib/python3/site-packages/psycopg2_binary.libs/libpq-0929ced5.so.5.11
     
    # если нет pangolin-manager
    sudo sed -i "s/{version}/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /pgdata/06/data/postgresql.conf
    sudo sed -i "s/{version}/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/postgresql.service
    
  17. Скопируйте сторонние библиотеки:

    export PATH_VER={path_version}
    sudo mkdir /usr/pangolin/3rdparty /usr/pangolin/migration_tools/ /usr/pangolin/diagnostic_tool
    sudo cp -r ~/pangolin/3rdparty/3rdparty.tar.gz /usr/pangolin/3rdparty/
    sudo tar -xzvf /usr/pangolin/3rdparty/3rdparty.tar.gz -C /usr/pangolin/3rdparty/
    sudo chmod 0700 -R /usr/pangolin/3rdparty/
    sudo chown -R postgres:postgres /usr/pangolin/3rdparty/
    sudo cp -r /usr/pangolin/3rdparty/cracklib/libcrack.so /usr/pangolin/lib/
    sudo cp -r /usr/pangolin/3rdparty/cracklib/pw_dict.hwm /usr/pangolin/lib/
    sudo cp -r /usr/pangolin/3rdparty/cracklib/pw_dict.pwd /usr/pangolin/lib/
    sudo cp -r /usr/pangolin/3rdparty/cracklib/pw_dict.pwi /usr/pangolin/lib/
    sudo chmod 0600 /usr/pangolin/lib/libcrack.so
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.hwm
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.pwd
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.pwi
    sudo chown postgres:postgres /usr/pangolin/lib/libcrack.so
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.hwm
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.pwd
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.pwi
    sudo cp -r ~/pangolin/utilities/diagnostic_tool/. /usr/pangolin/diagnostic_tool/
    sudo cp -r ~/pangolin/utilities/migration_tools/pgloader/pgloader /usr/pangolin/migration_tools/
    sudo cp -r /usr/pangolin/3rdparty/ora2pg/. /usr/pangolin/migration_tools/
    sudo chmod -R 0700 /usr/pangolin/migration_tools/
    sudo chmod -R 0700 /usr/pangolin/diagnostic_tool
    sudo chown -R postgres:postgres /usr/pangolin/migration_tools/
    sudo chown -R postgres:postgres /usr/pangolin/diagnostic_tool
    sudo find ~/pangolin/timescaledb/usr/pangolin-$MAGOR_VER.$MINOR_VER.$PATH_VER/lib/ -name "*" -exec cp -r {} /usr/pangolin/lib/ \;
    sudo find /usr/pangolin/lib/ -name "timescaledb*" -exec chown postgres:postgres {} \;
    sudo find /usr/pangolin/lib/ -name "timescaledb*" -exec chmod 0600 {} \;
    sudo find ~/pangolin/timescaledb/usr/pangolin-$MAGOR_VER.$MINOR_VER.$PATH_VER/share/extension/ -name "*" -exec cp -r {} /usr/pangolin/share/extension/ \;
    sudo find /usr/pangolin/share/extension/ -name "timescaledb*" -exec chown postgres:postgres {} \;
    sudo find /usr/pangolin/share/extension/ -name "timescaledb*" -exec chmod 0600 {} \;
    
  18. Проверьте корректность прав на каталоги для работы СЗИ:

    export PGHOME=/usr/pangolin-{version}/
    sudo chmod o+x $PGHOME/
    sudo chmod o+x $PGHOME/bin/
    sudo chmod o+x $PGHOME/share/
    sudo chmod o+x $PGHOME/lib/
    sudo chmod o+x $PGHOME/lib/plugins/
    sudo chmod o+r $PGHOME/lib/plugins/
    sudo chmod o+r -R $PGHOME/lib/plugins/
    sudo chmod o+rx $PGHOME/lib/
    sudo chmod o+r $PGHOME/lib/libfe_elog.so
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/encrypt_params_file
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/generate_encryption_key
    sudo chown root:kmadmin_pg $PGHOME/bin/initprotection
    sudo chmod 0750 $PGHOME/bin/initprotection
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/setup_kms_credentials
    
  19. Актуализируйте .bash_profile и dynmotd.sh:

    export PATH_VER=4
    sudo sed -i  "s/{version}/$MAGOR_VER.$MINOR_VER.$PATH_VER/g" /home/postgres/.bash_profile
    sudo sed -i  "s/{version}/$MAGOR_VER.$MINOR_VER.$PATH_VER/g" /home/kmadmin_pg/.bash_profile
    sudo sed -i  "s/{version}/$MAGOR_VER.$MINOR_VER.$PATH_VER/g" /home/postgres/.bashrc
    sudo sed -i  "s/{version}/$MAGOR_VER.$MINOR_VER.$PATH_VER/g" /home/kmadmin_pg/.bashrc
     
    # выполнить команды ниже стенде etcd дополнительно, при наличии
    sudo sed -i "s/0{$MAJOR_VER}.00{$MINOR_VER}.0{$PATH_VER}/0{$MAJOR_VER}.00{$MINOR_VER}.0{$PATH_VER}/" /usr/local/sbin/dynmotd.sh
     
    # если есть pangolin-manager. Перед выполнением вписать актуальную версию для замены.
    sudo sed -i "s/1.1.0/1.1.1/" /usr/local/sbin/dynmotd.sh
    
  20. Запустите поочередно каждую службу, проверяя после запуска их состояние. В случае кластерной конфигурации сначала выполните запуск на основном узле:

    sudo systemctl daemon-reload
     
    sudo systemctl restart etcd
    sudo systemctl status etcd
     
    # Если есть pangolin-manager
    sudo systemctl restart pangolin-manager
    sudo systemctl status pangolin-manager
     
    # Если нет pangolin-manager
    sudo systemctl restart postgresql
    sudo systemctl status postgresql
     
    sudo systemctl restart pangolin-pooler
    sudo systemctl status pangolin-pooler
    sudo systemctl restart pg_certs_rotate_agent
    sudo systemctl status pg_certs_rotate_agent
    sudo systemctl restart pangolin_reencrypt@postgres
    sudo systemctl restart pangolin_reencrypt@kmadmin_pg
    sudo systemctl status pangolin_reencrypt@postgres
    sudo systemctl status pangolin_reencrypt@kmadmin_pg
     
    # Если кластерная конфигурация, верните исходные значения, полученные на «Шаге 2»
    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 edit-config --set 'synchronous_mode=true' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=false' --force
    exit
     
    # при необходимости верните узлам исходные (до обновления) роли (switch)
    
  21. Для учета глобальных индексов выполните скрипт:

    #!/bin/bash    
    read -s -p "Введите пароль: " pass
    echo
    echo
     
    # Получаем список баз данных
    dblist=$(PGPASSWORD=$pass psql -t -c "select string_agg(datname, ' ') from pg_database where datname not in ('template0','template1');")
     
    for i in $dblist
        do
        # Получаем список глобальных индексов в БД
        dbidx=$(PGPASSWORD=$pass psql -d $i -t -c "\
            SELECT n.nspname || '.' || c.relname as idx_name \
            FROM pg_catalog.pg_class as c \
            LEFT JOIN pg_catalog.pg_namespace as n ON n.oid = c.relnamespace \
            WHERE c.relkind = 'G';")
     
        echo "Текущая БД : $i"
     
        # Выполняем REINDEX для глобальных индексов
        for j in $dbidx
            do
            echo "Текущий обрабатываемый индекс : $j"
            PGPASSWORD=$pass psql -d $i -c "reindex index $j;"
        done
        echo "------------------------------"
    done
    

Обновление в рамках 6.2.x и с версий 6.1.x на 6.2.x#

Внимание!

Перед началом обновления учесть следующие особенности, в связи с изменением формата WAL-журналов:

  • Корректный возврат к исходной версии (6.1.0/6.1.2/6.1.4) не возможен.

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

Обозначения переменных

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

  • PGHOME - путь к новому каталогу с исполняемыми файлами СУБД Pangolin;

  • MINOR_VER - минорная версия;

  • PATH_VER - патч новой версии СУБД Pangolin;

  • PATH_VER_OLD - патч исходной версии СУБД Pangolin.

  1. Для стендов с pangolin-backup-toolsвыполните:

    sudo ls -la /opt/ansible_venv/lib/python3/site-packages/psycopg2_binary.libs/ | grep libpq.so
    
  2. Сохраните имя символьной ссылки:

    libpq-0929ced5.so.5.11 -> /usr/pangolin-{version}/lib/libpq.so
    
  3. Переведите кластер (только в случае кластерной конфигурации) в режим асинхронной потоковой репликации, предварительно зафиксировав значения, установленные на стенде для их возвращения в конце обновления:

    sudo -iu postgres
    # запоминаем
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml show-config
    # меняем
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=true' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode=false' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=false' --force
    exit
    
  4. Безопасно остановите все компоненты СУБД:

    # Если нет pangolin-manager
    sudo systemctl stop postgresql 
    # Если есть pangolin-manager
    sudo systemctl stop pangolin-manager
     
    sudo -iu postgres
    /usr/pangolin/bin/pg_ctl stop -D /pgdata/data/data
    exit
    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
    
  5. Убедитесь, что все компоненты остановлены:

    sudo ps aux | grep -E "pangolin-pooler|postgres|etcd|pangolin-manager|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grep
    
  6. Если команда вернула результат, то выполните:

    sudo kill -9 <pid>
    sudo ps aux | grep -E "pangolin-pooler|postgres|etcd|pangolin-manager|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grep
    
  7. Настройте права на каталог pg_certs_rotate_agent:

    sudo chmod 0710 /pgerrorlogs/0{MAJOR_VER}/pg_certs_rotate_agent/
    
  8. Внесите изменения в service-файл:

    sudo sed -i "s/patroni/pangolin-manager/g" /etc/systemd/system/pg_certs_rotate_agent.service
    sudo sed -i "s/pgbouncer/pangolin-pooler/g" /etc/systemd/system/pg_certs_rotate_agent.service
    
  9. Скопируйте утилиту pg_certs_rotate_agent в рабочий каталог:

    sudo cp -rf ~/pangolin/utilities/pg_certs_rotate/pg_certs_rotate_agent /opt/pangolin-common/bin/
    sudo chown postgres:postgres /opt/pangolin-common/bin/pg_certs_rotate_agent
    sudo chmod 0500 /opt/pangolin-common/bin/pg_certs_rotate_agent
    
  10. Скопируйте бинарный файл утилиты pangolin-auth-reencrypt в рабочий каталог:

    export PATH_VER_OLD={patch_version_old}
    export PATH_VER={path_version}
    export MINOR_VER={minor_version}
    sudo cp -rf ~/pangolin/utilities/pangolin-auth-reencrypt/opt/pangolin-common/bin/pangolin-auth-reencrypt /opt/pangolin-common/bin/
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/g" /etc/systemd/system/pangolin_reencrypt\@.service
    sudo chown root:root /opt/pangolin-common/bin/pangolin-auth-reencrypt
    sudo chmod 0755 /opt/pangolin-common/bin/pangolin-auth-reencrypt
    
  11. Установите пакет pangolin_backup_tools:

    sudo yum install ~/pangolin/pangolin-backup-tools-1.1.0-rhel7.9.x86_64.rpm -y
    
  12. Заполните конфигурационный файл backup-tools-env по шаблону. В примере далее указаны значения по умолчанию:

    # PATH, used for access to required executable files, default value: "$
    {PATH}:{PGHOME}/bin/"
    PATH="${PATH}:/usr/pangolin/bin/"
    # path to PGHOME, default value: "/opt/pangolin-dbms"
    PGHOME="/opt/pangolin-dbms"
    # 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/postgresql_se_libs"
    LD_LIBRARY_PATH="/opt/pangolin-backup-tools/lib/postgresql_se_libs"
    # path to plugins libraries, default value: "/opt/pangolin-backup-tools/
    lib/postgresql_se_libs"
    PG_PLUGINS_PATH="/opt/pangolin-backup-tools/lib/postgresql_se_libs"
    # 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
    # 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
    

    Внимание!

    При наличии защищенного хранилища из файла необходимо удалить следующие строки:

    ARG_KEY_DBMS_USER_AUTH_TYPE="'sample_password'"
    PANGOLIN_BACKUP_TOOLS_ARGS="$PANGOLIN_BACKUP_TOOLS_ARGS --password $ARG_KEY_DBMS_USER_AUTH_TYPE"
    
  13. Сохраните конфигурационный файл Pangolin Pooler:

    sudo mkdir -p ~/pangolin/backup_pooler/config/
    sudo cp -r /etc/pangolin-pooler/* ~/pangolin/backup_pooler/config/
    
  14. Обновите Pangolin Pooler:

    sudo yum install ~/pangolin/pangolin-pooler-1.2.0-rhel7.9.x86_64.rpm -y
    sudo rm -f /etc/pangolin-pooler/*
    sudo cp ~/pangolin/backup_pooler/config/* /etc/pangolin-pooler/
    sudo chown postgres:postgres /etc/pangolin-pooler/*
    sudo chmod 0600 /etc/pangolin-pooler/*
    
  15. Создайте файл pangolin-pooler-restart.sh:

    sudo cat << EOF >> /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    #!/bin/sh
    sudo systemctl restart pangolin-pooler
    EOF
    sudo chown postgres:postgres /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    sudo chmod 0500 /opt/pangolin-pooler/bin/pangolin-pooler-restart.sh
    
  16. Обновите Pangolin Manager:

    export PATH_VER_OLD={patch_version_old}
    export PATH_VER= {path_version}
    export MINOR_VER={minor_version}
    sudo mkdir -p ~/pangolin/backup_manager/
    sudo cp /etc/pangolin-manager/postgres.yml ~/pangolin/backup_manager/
    sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/g" ~/pangolin/backup_manager/postgres.yml
    sudo yum install ~/pangolin/pangolin-manager-1.1.1-rhel7.9.x86_64.rpm -y
    sudo rm -f /etc/pangolin-manager/*  
    sudo cp ~/pangolin/backup_manager/postgres.yml /etc/pangolin-manager/postgres.yml
    sudo chown postgres:postgres /etc/pangolin-manager/
    sudo chown postgres:postgres /etc/pangolin-manager/postgres.yml
    sudo chmod 0600 /etc/pangolin-manager/postgres.yml
    
  17. Обновите СУБД Pangolin:

    export PATH_VER_OLD={patch_version_old}
    export PATH_VER={path_version} 
    export MINOR_VER={minor_version}
    sudo LINK_PGHOME=/usr/pangolin,/opt/pangolin-dbms yum install ~/pangolin/platform-v-pangolin-dbms-0{MAJOR_VER}.00{MINOR_VER}.0{PATH_VER}-rhel7.9.x86_64.rpm -y
    sudo rm -rf /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/ /usr/pgsql-se-0{MAGOR_VER}
     
    # восстанавливаем линку
    ln -sfn /usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/lib/libpq.so /opt/ansible_venv/lib/python3/site-packages/psycopg2_binary.libs/libpq-0929ced5.so.5.11
     
    # если нет pangolin-manager
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /pgdata/06/data/postgresql.conf
    sudo sed -i "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /etc/systemd/system/postgresql.service
    
  18. Скопируйте сторонние библиотеки:

    export PATH_VER=1
    mkdir /usr/pangolin/3rdparty /usr/pangolin/migration_tools/ /usr/pangolin/diagnostic_tool
    sudo cp ~/pangolin/3rdparty/3rdparty.tar.gz /usr/pangolin/3rdparty
    sudo tar -xzvf /usr/pangolin/3rdparty/3rdparty.tar.gz -C /usr/pangolin/3rdparty/
    sudo chmod 0700 -R /usr/pangolin/3rdparty
    sudo chown -R postgres:postgres /usr/pangolin/3rdparty
    sudo cp /usr/pangolin/3rdparty/cracklib/libcrack.so /usr/pangolin/lib/
    sudo cp /usr/pangolin/3rdparty/cracklib/pw_dict.hwm /usr/pangolin/lib/
    sudo cp /usr/pangolin/3rdparty/cracklib/pw_dict.pwd /usr/pangolin/lib/
    sudo cp /usr/pangolin/3rdparty/cracklib/pw_dict.pwi /usr/pangolin/lib/
    sudo chmod 0600 /usr/pangolin/lib/libcrack.so
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.hwm
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.pwd
    sudo chmod 0600 /usr/pangolin/lib/pw_dict.pwi
    sudo chown postgres:postgres /usr/pangolin/lib/libcrack.so
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.hwm
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.pwd
    sudo chown postgres:postgres /usr/pangolin/lib/pw_dict.pwi
    sudo cp -r ~/pangolin/utilities/diagnostic_tool/. /usr/pangolin/diagnostic_tool/
    sudo cp ~/pangolin/utilities/migration_tools/pgloader/pgloader /usr/pangolin/migration_tools/
    sudo cp /usr/pangolin/3rdparty/ora2pg/. /usr/pangolin/migration_tools/
    sudo chmod -R 0700 /usr/pangolin/migration_tools/
    sudo chmod -R 0700 /usr/pangolin/diagnostic_tool
    sudo chown -R postgres:postgres /usr/pangolin/migration_tools/
    sudo chown -R postgres:postgres /usr/pangolin/diagnostic_tool
    sudo find ~/pangolin/timescaledb/usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/lib/ -name "*" -exec cp -r {} /usr/pangolin/lib/ \;
    sudo find /usr/pangolin/lib/ -name "timescaledb*" -exec chown postgres:postgres {} \;
    sudo find /usr/pangolin/lib/ -name "timescaledb*" -exec chmod 0600 {} \;
    sudo find ~/pangolin/timescaledb/usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/share/extension/ -name "*" -exec cp -r {} /usr/pangolin/share/extension/ \;
    sudo find /usr/pangolin/share/extension/ -name "timescaledb*" -exec chown postgres:postgres {} \;
    sudo find /usr/pangolin/share/extension/ -name "timescaledb*" -exec chmod 0600 {} \;
    
  19. Проверьте корректность прав на каталоги, необходимые для работы СЗИ:

    export PATH_VER=1
    export PGHOME=/usr/pangolin-$MAJOR_VER.$MINOR_VER.$PATH_VER/
    sudo chmod o+x $PGHOME/
    sudo chmod o+x $PGHOME/bin/
    sudo chmod o+x $PGHOME/share/
    sudo chmod o+x $PGHOME/lib/
    sudo chmod o+x $PGHOME/lib/plugins/
    sudo chmod o+r $PGHOME/lib/plugins/
    sudo chmod o+rx $PGHOME/lib/
    sudo chmod o+r $PGHOME/lib/libfe_elog.so
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/encrypt_params_file
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/generate_encryption_key
    sudo chown root:kmadmin_pg $PGHOME/bin/initprotection
    sudo chmod 0750 $PGHOME/bin/initprotection
    sudo chown kmadmin_pg:kmadmin_pg $PGHOME/bin/setup_kms_credentials
    
  20. Актуализируйте .bash_profile и dynmotd.sh:

    export PATH_VER_OLD={patch_version_old}
    export PATH_VER={path_version}
    export MINOR_VER={minor_version}
    sudo sed -i  "s/$MAJOR_VER.$MINOR_VER.$PATH_VER_OLD/$MAJOR_VER.$MINOR_VER.$PATH_VER/g" /home/postgres/.bash_profile
    # выполнить команды ниже стенде etcd дополнительно, при наличии
    sudo sed -i "s/0$MAJOR_VER.00$MINOR_VER.0$PATH_VER_OLD/0$MAJOR_VER.00$MINOR_VER.0$PATH_VER/" /usr/local/sbin/dynmotd.sh
    sudo sed -i "s/1.1.0/1.1.1/" /usr/local/sbin/dynmotd.sh
    
  21. Запустите поочередно каждую службу, проверяя после запуска их состояние. В случае кластерной конфигурации сначала запустите основной узел:

    sudo systemctl daemon-reload
     
    sudo systemctl restart etcd
    sudo systemctl status etcd
     
    # Если есть pangolin-manager
    sudo systemctl restart pangolin-manager
    sudo systemctl status pangolin-manager
     
    # Если нет pangolin-manager
    sudo systemctl restart postgresql
    sudo systemctl status postgresql
     
    sudo systemctl restart pangolin-pooler
    sudo systemctl status pangolin-pooler
    sudo systemctl restart pg_certs_rotate_agent
    sudo systemctl status pg_certs_rotate_agent
    sudo systemctl restart pangolin_reencrypt@postgres
    sudo systemctl restart pangolin_reencrypt@kmadmin_pg
    sudo systemctl status pangolin_reencrypt@postgres
    sudo systemctl status pangolin_reencrypt@kmadmin_pg
     
    # Если кластерная конфигурация, возвращаем исходные значения, полученные на «Шаге 2»
    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 edit-config --set 'synchronous_mode=true' --force
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'synchronous_mode_strict=false' --force
    exit
     
    # при необходимости верните узлам исходные (до обновления) роли (switch)
    
  22. Для учета глобальных индексов запустите скрипт:

    #!/bin/bash    
    read -s -p "Введите пароль: " pass
    echo
    echo
     
    # Получаем список баз данных
    dblist=$(PGPASSWORD=$pass psql -t -c "select string_agg(datname, ' ') from pg_database where datname not in ('template0','template1');")
     
    for i in $dblist
        do
        # Получаем список глобальных индексов в БД
        dbidx=$(PGPASSWORD=$pass psql -d $i -t -c "\
            SELECT n.nspname || '.' || c.relname as idx_name \
            FROM pg_catalog.pg_class as c \
            LEFT JOIN pg_catalog.pg_namespace as n ON n.oid = c.relnamespace \
            WHERE c.relkind = 'G';")
     
        echo "Текущая БД : $i"
     
        # Выполняем REINDEX для глобальных индексов
        for j in $dbidx
            do
            echo "Текущий обрабатываемый индекс : $j"
            PGPASSWORD=$pass psql -d $i -c "reindex index $j;"
        done
        echo "------------------------------"
    done
    

Изменение данных локализации при миграции внутри поддерживаемых ОС#

Данные языкового стандарта предоставляются библиотекой glibc. При мажорном обновлении происходит замена библиотеки с версии glibc-2.17 на glibc-2.28. В версии 2.28, выпущенной 2018-08-01, было включено крупное обновление данных локали, которое потенциально может повлиять на данные пользователей СУБД.

Далее рассмотрены сценарии корректного обновления.

Сценарий обновления#

В данном случае необходимо учесть, что индексы, полученные скриптом, должны быть перестроены по завершении обновления в каждой БД до запуска промышленной нагрузки на СУБД:

SELECT DISTINCT indrelid::regclass::text, indexrelid::regclass::text, collname, pg_get_indexdef(indexrelid)
FROM (SELECT indexrelid, indrelid, indcollation[i] coll FROM pg_index, generate_subscripts(indcollation, 1) g(i)) s
  JOIN pg_collation c ON coll=c.oid
WHERE collprovider IN ('d', 'c') AND collname NOT IN ('C', 'POSIX');

Для перестройки индексов после обновления рекомендуется использовать скрипт:

#!/bin/bash
read -s -p "Введите пароль: " pass
echo
echo
# Получаем список баз данных
dblist=$(PGPASSWORD=$pass psql -t -c "select string_agg(datname, ' ')
  from pg_database where datname not in ('template0','template1');")
for i in $dblist
do
    # Получаем список индексов в БД
    dbidx=$(PGPASSWORD=$pass psql -d $i -t -c "\
      SELECT DISTINCT indexrelid::regclass::text idx_name \
      FROM (SELECT indexrelid, indcollation[i] coll FROM pg_index, generate_subscripts(indcollation, 1) g(i)) s \
        JOIN pg_collation c ON coll=c.oid \
      WHERE c.collprovider IN ('d', 'c') AND c.collname NOT IN ('C', 'POSIX') \
        AND indexrelid NOT IN (SELECT DISTINCT inhparent FROM pg_inherits);")
 
    echo "Текущая БД : $i"
    # Выполняем REINDEX для индексов
    for j in $dbidx
    do
        echo "Текущий обрабатываемый индекс : reindex index $j;"
        PGPASSWORD=$pass psql -d $i -c "reindex index $j;"
    done
    echo "------------------------------"
done

Рекомендуется перестроить потенциально поврежденные индексы в конкурентном режиме:

#!/bin/bash
read -s -p "Введите пароль: " pass
echo
echo
# Получаем список баз данных
dblist=$(PGPASSWORD=$pass psql -t -c "select string_agg(datname, ' ')
  from pg_database where datname not in ('template0','template1');")
for i in $dblist
do
    # Получаем список индексов в БД
    dbidx=$(PGPASSWORD=$pass psql -d $i -t -c "\
      SELECT DISTINCT indexrelid::regclass::text idx_name \
      FROM (SELECT indexrelid, indcollation[i] coll FROM pg_index, generate_subscripts(indcollation, 1) g(i)) s \
        JOIN pg_collation c ON coll=c.oid \
      WHERE c.collprovider IN ('d', 'c') AND c.collname NOT IN ('C', 'POSIX') \
        AND indexrelid not in (SELECT distinct inhparent FROM pg_inherits);")
     
    echo "Текущая БД : $i"
    # Выполняем REINDEX для индексов
    for j in $dbidx
    do
        echo "Текущий обрабатываемый индекс : reindex index concurrently $j;"
        PGPASSWORD=$pass psql -d $i -c "reindex index concurrently $j;"
    done
    echo "------------------------------"
done

Для проверки существующих индексов на возможные инварианты, включая расхождения в лексическом порядке с учетом правил сортировки, рекомендуется использовать скрипт на основе расширения amcheck. Для установки расширения amcheck выполните команду от суперпользователя в каждой БД:

CREATE EXTENSION amcheck SCHEMA ext;

Далее в каждой БД запустите скрипт:

do $$
declare stmt record;
declare ret record;
declare verbose_check_indexes boolean:=true; --для большого количества индексов рекомендуется установить в false для сокращения вывода
begin
    IF (select installed_version from pg_available_extensions where name='amcheck') is not null then
    for stmt in
        SELECT DISTINCT  indrelid::regclass::text as table_name,
        indexrelid::regclass::text as index_name,
        'select ext.bt_index_check('''||indexrelid::regclass::text||''');' as check_command
        ,'reindex index concurrently '||indexrelid::regclass::text||';' as reindex_command
        ,indexrelid as id
        FROM (SELECT indexrelid, indrelid, indcollation[i] coll FROM pg_index, generate_subscripts(indcollation, 1) g(i)) s
          JOIN pg_collation c ON coll=c.oid
        WHERE collprovider IN ('d', 'c') AND collname NOT IN ('C', 'POSIX') AND
          indexrelid NOT IN (SELECT distinct inhparent FROM pg_inherits)
    loop
        begin
        execute stmt.check_command  into ret;
        IF verbose_check_indexes then
            raise notice 'таблица % индекс % проверка прошла успешно',stmt.table_name,stmt.index_name ;
        END IF;
    exception when others then
            raise notice '--------------------------------------%ОШИБКА таблица % индекс %. %         Для полного текста ошибки выполните (%). %         Для реиндекса выполните (%)%         Размер индекса %. % %-----------------------------------------------',chr(10), stmt.table_name,stmt.index_name,chr(10),stmt.check_command,chr(10),stmt.reindex_command,chr(10),pg_size_pretty(pg_total_relation_size(stmt.index_named)),( select case when indisunique then 'Индекс уникален' else 'Индекс не уникален' end from pg_index where indexrelid=stmt.index_named ),chr(10) ;
        end;
    end loop;
    ELSE
        raise notice 'установите расширение amcheck';
    END IF;
end ; $$;

При отсутствии ошибок будет получено сообщение вида:

NOTICE:  таблица hint_plan.hints индекс hint_plan.hints_norm_and_app проверка прошла успешно

При возникновении ошибок:


NOTICE:  --------------------------------------
ОШИБКА таблица tron.products индекс tron.products_pkey.
         Для полного текста ошибки выполните (select ext.bt_index_check('tron.products_pkey');).
         Для реиндекса выполните (reindex index concurrently tron.products_pkey;)
         Размер индекса 0 bytes. Индекс уникален
-----------------------------------------------

Статус индекса можно узнать при помощи запроса:

select ext.bt_index_check('tron.products_pkey');

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

reindex index concurrently tron.products_pkey;

При обнаружении в таблице дубликатов неактуальные повторные записи нужно удалить.

Внимание!

Учитывайте размер индекса и нагрузку на БД.

Обновление в рамках 6.3.x#

Обновление с предустановленной СУБД Pangolin SberLinux OS Server 8 на SberLinux OS Server 9#

Внимание!

Обновление ОС подразумевает полную недоступность кластера СУБД Pangolin.

Поскольку инструкция является универсальной для кластерной и standalone-конфигураций, каждый пункт необходимо выполнить на всех узлах. Обновление необходимо производить только тех компонентов, которые есть на исходном стенде. Иначе пропустить выполнение шага. Для удобства такие шаги помечены тегом - опционально.

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

Обновление СУБД осуществляется пользователем с правами суперпользователя, пользователя postgres и пользователя kmadmin_pg. Необходимо учесть это на старте выполнения инструкции.

Внимание!

Перед началом обновления сохраните дистрибутив СУБД Pangolin SberLinux OS Server 9 на каждый узел. В инструкции каталог будет размещен в ~/pangolin_sbel9.

Шаг 1. Подготовка ВМ к процедуре обновления ОС#

  1. (Опционально для конфигурации с Pangolin Manager) Введите Pangolin Manager в режим паузы:

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

    Без функциональности «Отказ от root»:

    # (опционально) Для конфигурации с pangolin-manager
    sudo systemctl stop pangolin-manager
     
    # (опционально) Для конфигурации с etcd
    sudo systemctl stop etcd
     
    # (опционально) Для конфигурации без pangolin-manager
    sudo systemctl stop postgresql
     
    # Для любой конфигурации
    sudo systemctl stop pangolin-pooler
    sudo systemctl stop pangolin-certs-rotate
    sudo systemctl stop pangolin-auth-reencrypt@postgres
    sudo systemctl stop pangolin-auth-reencrypt@kmadmin_pg
    

    С функциональностью «Отказ от root»:

    # (опционально) Для конфигурации с etcd  
    sudo systemctl stop etcd
     
    sudo -iu postgres
    # (опционально) Для конфигурации с pangolin-manager
    systemctl --user stop pangolin-manager
     
    # (опционально) Для конфигурации без pangolin-manager
    systemctl --user stop postgresql
     
    # Для любой конфигурации
    systemctl --user stop pangolin-pooler
    systemctl --user stop pangolin-certs-rotate
    systemctl --user stop pangolin-auth-reencrypt
    exit
    sudo -iu kmadmin_pg
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
    systemctl --user stop pangolin-auth-reencrypt
    exit
    
  3. Проверьте, что все компоненты корректно остановлены:

    sudo ps aux | grep -E "pangolin-pooler|pangolin-manager|postgresql|pangolin-certs-rotate|pangolin-auth-reencrypt@postgres|pangolin-auth-reencrypt@kmadmin_pg|etcd" | grep -v grep
    
  4. Если на предыдущем шаге была выведена информация, то выполните:

    sudo kill -9 <pid>
    sudo ps aux | grep -E "pangolin-pooler|pangolin-manager|postgresql|pangolin-certs-rotate|pangolin-auth-reencrypt@postgres|pangolin-auth-reencrypt@kmadmin_pg|etcd" | grep -v grep
    
  5. (Опционально) Для конфигурации с etcd. Создайте резервную копию рабочих файлов etcd:

    sudo mkdir -p ~/pangolin_sbel9/{etcd_backup_lib,etcd_backup_conf}
    sudo cp -ra /var/lib/etcd ~/pangolin_sbel9/etcd_backup_lib/
    sudo cp -ra /etc/etcd ~/pangolin_sbel9/etcd_backup_conf/
    

Шаг 2. Обновление ОС#

  1. Установите утилиту:

    dnf -y install leapp-upgrade
    
  2. Создайте файл с репозиториями для использования утилиты:

    touch /etc/leapp/files/leapp_upgrade_repositories.repo
    

    Имена id должны отличаться от id в репозитории /etc/yum.repos.d/.

    leapp_upgrade_repositories.repo:

    [SBERLINUX-BASE-9]
    name=SBERLINUX-BASE
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-baseos-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    [SBERLINUX-APPSTREAM-9]
    name=SBERLINUX-APPSTREAM
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-appstream-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    
    [SBERLINUX-HighAvailability-9]
    name=SBERLINUX-HighAvailability
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-highavailability-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    [SBERLINUX-powertools-9]
    name=SBERLINUX-powertools
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-powertools-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
  3. Замените строки в файле /etc/leapp/repos.d/system_upgrade/common/libraries/config/version.py:

    _SUPPORTED_VERSIONS = {
     #'8': {'rhel': ['8.6', '8.8'], 'rhel-saphana': ['8.6', '8.8']},
     '8': {'sberlinux': ['8.6', '8.8'], 'rhel-saphana': ['8.6', '8.8']},
    }
    
  4. Уберите проверку checkinstalledkernels:

    mv /etc/leapp/repos.d/system_upgrade/common/actors/kernel/checkinstalledkernels /var/tmp
    
  5. Обновите с флагом перезагрузки после завершения:

    leapp upgrade --no-rhsm --nogpgcheck –-reboot
    
  6. Замените репозитории yum на новые в целевом месте (/etc/yum.repos.d/):

    [SBERLINUX-BASE]
    name=SBERLINUX-BASE
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-baseos-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    [SBERLINUX-APPSTREAM]
    name=SBERLINUX-APPSTREAM
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-appstream-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    
    [SBERLINUX-HighAvailability]
    name=SBERLINUX-HighAvailability
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-highavailability-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    [SBERLINUX-powertools]
    name=SBERLINUX-powertools
    baseurl=http://repo.infra.sbt/trusted_repo/sberlinux/9.3.3/sberlinux-9-for-x86_64-powertools-rpms/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberTech-System-Tribe
    enabled=1
    
    [SBERLINUX-pangolin]
    name=SBERLINUX-pangolin
    baseurl=http://smirror.slo/pangolin-deps-sl9/latest/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux
    enabled=1
    
    [SBERLINUX-pangolin-dev]
    name=SBERLINUX-pangolin-dev
    baseurl=http://smirror.slo/pangolin-deps-devel-sl9/latest/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux
    enabled=1
    
  7. Убедитесь в том, что версия ОС была корректна изменена:

    sudo cat /etc/os-release
    

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

    NAME="SberLinux"
    VERSION="9.3 (Shkhara)"
    ID="sberlinux"
    ID_LIKE="rhel sberlinux fedora"
    VERSION_ID="9.3"
    PLATFORM_ID="platform:el9"
    PRETTY_NAME="SberLinux 9.3 (Shkhara)"
    ANSI_COLOR="0;34"
    LOGO="fedora-logo-icon"
    CPE_NAME="cpe:/o:sberlinux:sberlinux:9::baseos"
    HOME_URL="https://sbertech.ru/"
    DOCUMENTATION_URL="https://sbertech.ru/"
    BUG_REPORT_URL="https://sbertech.ru/"
    
    SBERLINUX_MANTISBT_PROJECT="SberLinux-9"
    SBERLINUX_MANTISBT_PROJECT_VERSION="9.3"
    REDHAT_SUPPORT_PRODUCT="SberLinux"
    REDHAT_SUPPORT_PRODUCT_VERSION="9.3"
    

Шаг 3. Восстановление работы СУБД Pangolin после обновления ОС#

  1. Остановите все компоненты СУБД Pangolin. В случае кластерной конфигурации действия по остановке произведите сначала на реплике, затем на основном.

    Без функциональности «Отказ от root»:

    # (опционально) Для конфигурации с etcd 
    sudo systemctl stop etcd
    
    # (опционально) Для конфигурации с pangolin-manager
    sudo systemctl stop pangolin-manager
    
    # (опционально) Для конфигурации без pangolin-manager
    sudo systemctl stop postgresql
    
    # Для любой конфигурации
    sudo systemctl stop pangolin-pooler
    sudo systemctl stop pangolin-certs-rotate
    sudo systemctl stop pangolin-auth-reencrypt@postgres
    sudo systemctl stop pangolin-auth-reencrypt@kmadmin_pg
    

    С функциональностью «Отказ от root»:

    # (опционально) Для конфигурации с etcd  
    sudo systemctl stop etcd
    
    sudo -iu postgres
    # (опционально) Для конфигурации с pangolin-manager
    systemctl --user stop pangolin-manager
    
    # (опционально) Для конфигурации без pangolin-manager
    systemctl --user stop postgresql
    
    # Для любой конфигурации
    systemctl --user stop pangolin-pooler
    systemctl --user stop pangolin-certs-rotate
    systemctl --user stop pangolin-auth-reencrypt
    exit
    sudo -iu kmadmin_pg
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
    systemctl --user stop pangolin-auth-reencrypt
    exit
    
  2. Обновите rpm-пакеты компонентов:

    export PANGOLIN_VER=6.3.0
    export PANGOLIN_MANAGER_VER=2.1.1
    export PANGOLIN_POOLER_VER=1.3.1
    export PANGOLIN_BACKUP_TOOLS_VER=1.2.1
    
    # (опционально) Для конфигурации с pangolin-manager
    sudo dnf install -y ~/pangolin_sbel9/pangolin-manager-$PANGOLIN_MANAGER_VER-sberlinux9.3.x86_64.rpm
    
    # (опционально) Для любой конфигурации
    sudo dnf install -y ~/pangolin_sbel9/pangolin-dbms-6.3-$PANGOLIN_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/pangolin-dbms-6.3-client-$PANGOLIN_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/pangolin-pooler-$PANGOLIN_POOLER_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/timescaledb/pangolin-timescaledb-6.3-apache-2.14.2-sberlinux9.3-x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/utilities/pangolin-auth-reencrypt-$PANGOLIN_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/utilities/pangolin-certs-rotate-$PANGOLIN_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/utilities/pangolin-diagnostic-tool-$PANGOLIN_VER-sberlinux9.3.x86_64.rpm
    sudo dnf install -y ~/pangolin_sbel9/utilities/pangolin-security-utilities-$PANGOLIN_VER-sberlinux9.3.x86_64.rpm
    
  3. (Опционально) Восстановите etcd:

    sudo rm -rf /var/lib/etcd /etc/etcd
    sudo cp -ra ~/pangolin_sbel9/etcd_backup_lib/etcd /var/lib/
    sudo cp -ra ~/pangolin_sbel9/etcd_backup_conf/etcd /etc/
    
  4. Запустите компоненты СУБД Pangolin.

    Без функциональности «Отказ от root»:

    # (опционально) Для конфигурации с pangolin-manager
    sudo systemctl restart pangolin-manager
    
    # (опционально) Для конфигурации без pangolin-manager
    sudo systemctl restart postgresql
    
    # (опционально) Для конфигурации с etcd
    sudo systemctl restart etcd
    
    # (опционально) Для конфигурации с dsc. !!! Только для узла 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
    
    # (опционально) Для любой конфигурации
    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
    

    С функциональностью «Отказ от root»:

    sudo -iu postgres
    # (опционально) Для конфигурации с pangolin-manager
    systemctl --user restart pangolin-manager
    
    # (опционально) Для конфигурации без pangolin-manager
    systemctl --user restart postgresql
    
    # (опционально) Для конфигурации с etcd
    exit
    systemctl restart etcd
    
    # Для любой конфигурации
    sudo -iu postgres
    systemctl --user restart pangolin-pooler
    systemctl --user restart pangolin-certs-rotate
    systemctl --user restart pangolin-auth-reencrypt
    exit
    
    # (опционально) Для конфигурации с dsc. !!! Только для узла 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
    
    # Для любой конфигурации
    sudo -iu kmadmin_pg
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
    systemctl --user restart pangolin-auth-reencrypt
    exit
    
  5. (Опционально для конфигурации с Pangolin Manager). Выведите Pangolin Manager из режима паузы:

    sudo -iu postgres
    pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force
    exit
    
  6. Перестройте все объекты баз данных, которые используют параметры сортировки по умолчанию:

    sudo -iu postgres
    psql
    
    DO $$
    DECLARE
    db_name TEXT;
    BEGIN
    FOR db_name IN (SELECT datname FROM pg_database WHERE datname NOT IN ('template0','template1')) LOOP
    EXECUTE format('ALTER DATABASE %I REFRESH COLLATION VERSION', db_name);
    END LOOP;
    END $$;
    
    \q
    exit
    
  7. Проверьте корректность запуска компонентов.

    Без функциональности «Отказ от root»:

    # (опционально) Для конфигурации с 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
    

    С функциональностью «Отказ от root»:

    sudo -iu postgres
    # (опционально) Для конфигурации с pangolin-manager
    systemctl --user status pangolin-manager
    
    # (опционально) Для конфигурации без pangolin-manager
    systemctl --user status postgresql
    
    # (опционально) Для конфигурации с etcd
    exit
    sudo systemctl status etcd
    
    # (опционально) Для любой конфигурации
    sudo -iu postgres
    systemctl --user status pangolin-pooler
    systemctl --user status pangolin-certs-rotate
    systemctl --user status pangolin-auth-reencrypt
    exit
    sudo -iu kmadmin_pg
    export XDG_RUNTIME_DIR=/run/user/$(id -u)
    export DBUS_SESSION_BUS_ADDRESS="unix:path=${XDG_RUNTIME_DIR}/bus"
    systemctl --user status pangolin-auth-reencrypt
    exit
    

Возможные проблемы при миграции#

  1. Если при миграции ОС возникла следующая ошибка на этапе проверки (leapp preupgrade --no-rhsm --nogpgcheck):

    Upgrade has been inhibited due to the following problems:
    1. Inhibitor: Detected RPMs with RSA/SHA1 signature
    Consult the pre-upgrade report for details and possible remediation.
    

    выполните:

    # Сохраните текущее значение
    update-crypto-policies --show > crypt  
    
    # Выставите временное значение
    update-crypto-policies --set LEGACY
    

    Повторно запустите проверку leapp preupgrade --no-rhsm --nogpgcheck. После полной миграции верните исходное значение:

    # Верните исходное значение
    update-crypto-policies --set $(cat crypt)
    
  2. Для миграции есть минимальные требования к характеристикам КТС. Если КТС не соответствует каким-то из параметров, то может быть получена ошибка:

    Upgrade has been inhibited due to the following problems:
    1. Inhibitor: Minimum memory requirements for RHEL 9 are not met
       Consult the pre-upgrade report for details and possible remediation.
       Summary: Memory detected: 962 MiB, required: 1536 MiB
    

    Увеличьте значение mem.

Обновление с версии 5.5.x до 6.4.x#

Данный раздел рассматривает ручное обновление с переносом данных СУБД Pangolin с версии 5.4.x/5.5.x до 6.4.x.

Внимание

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

Например, сочетание (master, replica) означает, что действия, указанные в пункте, необходимо выполнить сначала на основном узле, затем на реплике (при этом выполнять действия на арбитре не нужно).

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

В названиях rpm-пакетов при необходимости в блоках кода замените наименование ОС.

Важно

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

Обозначения переменных

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

  • PANGOLIN_VER - новая версия СУБД Pangolin (формат - x.x.x);

  • PANGOLIN_BACKUP_TOOLS - новая версия компонента pangolin-backup-tools (формат - x.x.x);

  • PANGOLIN_POOLER - новая версия компонента pangolin-pooler (формат - x.x.x);

  • PANGOLIN_MANGER - новая версия компонента pangolin-manager (формат - x.x.x);

  • PANGOLIN_TIMESCALEDB - новая версия компонента pangolin-timescaledb (формат - x.x.x);

  • PANGOLIN_OLD_VER - исходная версия СУБД Pangolin (формат - x.x.x);

  • PANGOLIN_FULL_VER - новая версия СУБД Pangolin (формат - 0x.00x.0x);

  • PANGOLIN_FULL_OLD_VER - исходная версия СУБД Pangolin (формат - 0x.00x.0x).

Шаг 1. Резервное копирование рабочих файлов компонентов#

  1. (master, replica) Сохраните рабочие файлы компонентов СУБД Pangolin:

    • general:

      sudo mkdir -p ~/pangolin/cache/backup/general                                                      # дополнительно создать на ноде arbiter  
      sudo cp -ra /usr/local/sbin/dynmotd.sh                        ~/pangolin/cache/backup/general/     # дополнительно сохранить на ноде arbiter
      sudo cp -ra /home/postgres/.bash_profile                      ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/sudoers.d/10-kmadmin_pg                      ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/sudoers.d/10-postgres                        ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/postgres/enc_connection_settings_cert.cfg    ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/postgres/enc_connection_settings.cfg         ~/pangolin/cache/backup/general/
      sudo cp -ra /etc/postgres/enc_utils_auth_settings.cfg         ~/pangolin/cache/backup/general/
      
    • Pangolin Pooler:

      sudo mkdir -p ~/pangolin/cache/backup/pgbouncer
      sudo cp -ra /etc/systemd/system/pgbouncer.service             ~/pangolin/cache/backup/pgbouncer/
      sudo cp -ra /etc/pgbouncer/pgbouncer.ini                      ~/pangolin/cache/backup/pgbouncer/
      sudo cp -ra /etc/pgbouncer/userlist.txt                       ~/pangolin/cache/backup/pgbouncer/
      sudo cp -ra /usr/local/bin/pgbouncer                          ~/pangolin/cache/backup/pgbouncer/
      sudo cp -ra /usr/local/share/man/man1/pgbouncer.1             ~/pangolin/cache/backup/pgbouncer/
      sudo cp -ra /usr/local/share/man/man5/pgbouncer.5             ~/pangolin/cache/backup/pgbouncer/
      
    • Pangolin Manager:

      sudo mkdir -p ~/pangolin/cache/backup/patroni
      sudo cp -ra /etc/systemd/system/patroni.service               ~/pangolin/cache/backup/patroni/
      sudo cp -ra /etc/patroni/postgres.yml                         ~/pangolin/cache/backup/patroni/
      sudo cp -ra /etc/patroni/reload_pgbouncer.sh                  ~/pangolin/cache/backup/patroni/
      sudo cp -ra /usr/patroni                                      ~/pangolin/cache/backup/patroni/
      sudo cp -ra /pgdata/05/data/patroni.dynamic.json              ~/pangolin/cache/backup/patroni/  
      
    • pangolin_reencrypt:

      sudo mkdir -p ~/pangolin/cache/backup/pangolin_reencrypt
      sudo cp -ra /etc/systemd/system/pangolin_reencrypt@.service   ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /opt/pangolin-common/bin/pg_auth_reencrypt        ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /etc/postgres/enc_util.cfg                        ~/pangolin/cache/backup/pangolin_reencrypt/
      sudo cp -ra /etc/postgres/enc_params.cfg.kmadmin_pg           ~/pangolin/cache/backup/pangolin_reencrypt/ 
      sudo cp -ra /etc/postgres/enc_params.cfg.postgres             ~/pangolin/cache/backup/pangolin_reencrypt/ 
      
    • pg_certs_rotate:

      sudo mkdir -p ~/pangolin/cache/backup/pg_certs_rotate_agent
      sudo cp -ra /etc/systemd/system/pg_certs_rotate_agent.service ~/pangolin/cache/backup/pg_certs_rotate_agent/
      sudo cp -ra /opt/pangolin-common/bin/pg_certs_rotate_agent    ~/pangolin/cache/backup/pg_certs_rotate_agent/
      sudo cp -ra /etc/postgres/pg_certs_rotate_agent.yml           ~/pangolin/cache/backup/pg_certs_rotate_agent/   
      
    • manage_backup:

      sudo mkdir -p ~/pangolin/cache/backup/manage_backup
      sudo cp -ra /opt/omni/lbin/                                   ~/pangolin/cache/backup/manage_backup/
      
    • pangolin_dbms:

      sudo mkdir -p ~/pangolin/cache/backup/pangolin_dbms
      sudo yumdownloader --destdir=/home/pprb_dev/pangolin/cache/backup/pangolin_dbms/ platform-v-pangolin-dbms
      sudo cp -ra /usr/pangolin-5.5.4/                               ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/postgresql.conf                    ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/pg_hba.conf                        ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/postgresql.base.conf               ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/postgresql.auto.conf               ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/pg_quota.conf                      ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /pgdata/05/data/pg_ident.conf                      ~/pangolin/cache/backup/pangolin_dbms/
      sudo cp -ra /etc/systemd/system/postgresql.service             ~/pangolin/cache/backup/pangolin_dbms/
      
  2. (master) Создайте каталог для резервной копии:

    sudo mkdir -p /pgarclogs/cache/backup/pangolin_dbms /pgarclogs/cache/backup/pangolin_dbms{backups,wal}
    sudo chmod -R 0700 /pgarclogs/cache/backup/pangolin_dbms
    sudo chown -R postgres:postgres /pgarclogs/cache/backup/pangolin_dbms
    
  3. (master) Добавьте запись host replication postgres 127.0.0.1/32 scram-sha-256 первой строкой в файл /pgdata/05/data/pg_hba.conf или в файл /etc/patroni/postgres.yml в секцию pg_hba для конфигурации с patroni.

  4. (master) Перечитайте обновленный конфигурационный файл БД.

    • Для конфигурации без patroni:

      /usr/pangolin/bin/pg_ctl reload -D /pgdata/05/data
      
    • Для конфигурации с patroni:

      /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/postgres.yml reload clustername
      
  5. (master) Выполните резервное копирование:

    /usr/pangolin/bin/pg_probackup init -B /pgarclogs/cache/backup/pangolin_dbms
    /usr/pangolin/bin/pg_probackup add-instance -B /pgarclogs/cache/backup/pangolin_dbms -D /pgdata/05/data --instance clustername
    PGPASSWORD=<пароль пользователя postgres> /usr/pangolin/bin/pg_probackup backup -B /pgarclogs/cache/backup/pangolin_dbms --instance clustername -b FULL -h 127.0.0.1 -p 5433 -U postgres --compress-algorithm=zlib --compress-level=4 -j 14 --temp-slot --stream --progress -w
    
  6. (master) Удалите строку host replication postgres 127.0.0.1/32 scram-sha-256 из файла /pgdata/05/data/pg_hba.conf или из файла /etc/patroni/postgres.yml для конфигурации с patroni.

  7. (master) Перечитайте обновленный конфигурационный файл БД.

Шаг 2. Подготовительные действия#

  1. (master, replica, arbiter) Запустите скрипт с базовыми проверками, определяющими готовность стенда к обновлению:

    mkdir ~/pangolin/cache/
    echo " <заменить на содержимое из pangolin_checks.sh> " > ~/pangolin/cache/pangolin_checks.sh
    chmod 0700 ~/pangolin/cache/pangolin_checks.sh
    cd ~/ && sudo STAND=master CONFIGURATION=standalone ./pangolin/cache/pangolin_checks.sh
    
    pangolin-check.sh

    #!/bin/bash

    pangolin-check.sh:

    function log_form {
        echo -e "\e[32m===============================[0m"
        echo -e "\e[32mКонфигурация: $CONFIGURATION[0m"
        echo -e "\e[32mСтенд: $STAND[0m"
        echo -e "\e[32m===============================[0m"
    }
    
    function error_message {
        echo -e "\e[31mERROR: Проверка не пройдена. $1\e[0m"
    }
    
    function success_message {
        echo -e "\e[32mOK: Проверка пройдена. $1\e[0m"
    }
    
    function warning_message {
        echo -e "\e[33mWARNING: $1\e[0m"
    }
    
    log_form
    
    if [ -z "$STAND" ] || [ -z "$CONFIGURATION" ]; then
        echo -e "\e[31mERROR: Передайте обязательные переменные перед запуском скрипта для корректной проверки. Например: STAND=master CONFIGURATION=standalone ./pangolin_checks.sh.\e[0m"
        exit 1
    fi
    
    # Проверка наличия локали en_us.utf-8 или en_us.utf8
    if locale -a | grep -qE "en_US.utf-8|en_US.utf8"; then
     success_message "Локаль en_US.utf-8 или en_US.utf8 установлена."
    else
     error_message "Необходимо установить локаль en_US.utf-8 или en_US.utf8."
    fi
    
    # Определение списка рабочих файлов в зависимости от конфигурации и стенда
    file_common=("/etc/pgbouncer/pgbouncer.ini" "/etc/systemd/system/pgbouncer.service" "/usr/local/bin/pgbouncer" "/opt/pangolin-common/bin/pg_auth_reencrypt" "/etc/systemd/system/pangolin_reencrypt@.service" "/etc/postgres/enc_util.cfg" "/opt/pangolin-common/bin/pg_certs_rotate_agent" "/etc/systemd/system/pg_certs_rotate_agent.service" "/etc/postgres/pg_certs_rotate_agent.yml")
    if [ "$CONFIGURATION" = "cluster" ]; then
        if [ "$STAND" != "arbiter" ]; then
            additional_files=("/etc/systemd/system/patroni.service" "/etc/patroni/postgres.yml" "/etc/systemd/system/etcd.service" "/etc/etcd/etcd.conf")
        else
            additional_files=("/etc/systemd/system/etcd.service" "/etc/etcd/etcd.conf")
        fi
    else
        if [ "$STAND" != "arbiter" ]; then
            additional_files=("/etc/systemd/system/postgresql.service")
        fi
    fi
    if [ "$STAND" != "arbiter" ]; then
        files_all=("${file_common[@]}" "${additional_files[@]}")
    else
        files_all=("${additional_files[@]}")
    fi
     
    # Проверка наличия рабочих файлов
    for file in "${files_all[@]}"; do
        if [ -f "$file" ]; then
            success_message "Рабочий файл $file найден."
        else
            error_message "Рабочий файл $file не найден. Для конфигурации $CONFIGURATION наличие данного файла необходимо для корректного обновления."
        fi
    done
     
    # Определение списка сервисов в зависимости от конфигурации
    service_common=("pgbouncer" "pg_certs_rotate_agent" "pangolin_reencrypt@postgres.service" "pangolin_reencrypt@kmadmin_pg.service")
    if [ "$CONFIGURATION" = "cluster" ]; then
        if [ "$STAND" != "arbiter" ]; then
            additional_services=("patroni" "etcd")
        else
            additional_services=("etcd")
        fi
    else
        if [ "$STAND" != "arbiter" ]; then
            additional_services=("postgresql")
        fi
    fi
    if [ "$STAND" != "arbiter" ]; then
        service_all=("${service_common[@]}" "${additional_services[@]}")
    else
        service_all=("${additional_services[@]}")
    fi
     
    # Проверка состояния сервисов
    for service in "${service_all[@]}"; do
        if systemctl is-active --quiet "$service"; then
            success_message "Сервис $service активен."
        else
            error_message "Необходимо запустить сервис $service."
        fi
    done
     
    if [ "$STAND" != "arbiter" ]; then
        # Проверка наличия установленного rpm пакета
            PACKAGE_NAME="platform-v-pangolin-dbms"
        if command -v yum &> /dev/null; then
            PACKAGE_MANAGER="yum"
        elif command -v dnf &> /dev/null; then
            PACKAGE_MANAGER="dnf"
        elif command -v apt &> /dev/null; then
            PACKAGE_MANAGER="apt"
        elif command -v apt-get &> /dev/null; then
            PACKAGE_MANAGER="apt-get"
        else
            error_message "Необходимо установить пакетный менеджер (yum/dnf/apt/apt-get)."
            exit 1
        fi
     
        if $PACKAGE_MANAGER list installed | grep -q "$PACKAGE_NAME"; then
            success_message "Пакет $PACKAGE_NAME установлен."
        else
            error_message "Пакет $PACKAGE_NAME не обнаружен на стенде."
        fi
     
        # Получение версии пакета
        PACKAGE_VERSION=$($PACKAGE_MANAGER list installed | grep "$PACKAGE_NAME" | awk '{print $2}')
     
        # Извлечение числовой части версии
        NUMERIC_VERSION=$(echo "$PACKAGE_VERSION" | awk -F'[.-]' '{print $1 $2 $3}' | tr -d '0')
     
        # Проверка версии пакета
        if [[ $NUMERIC_VERSION =~ ^55[0-9]$ ]]; then
            success_message "Версия исходного пакета $PACKAGE_NAME ($NUMERIC_VERSION) соответствует требованиям инструкции по ручному обновлению с переносом данных."
        else
            error_message "Инструкция по ручному обновлению не рассматривает обновление с исходной версии пакета $PACKAGE_NAME ($NUMERIC_VERSION), полученной со стенда. Инструкция рассматривает обновление с версий 5.5.x на 6.4.х."
        fi
    fi
     
    warning_message "Набор проверок не является исчерпывающим. Для обновления рекомендуем использовать автоматизированные скрипты."
    

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

    Проверка пройдена успешно

    Результат при неготовности стенда к обновлению:

    Проверка не пройдена

    Предупреждение

    Набор проверок не является исчерпывающим. Для обновления рекомендуется использовать автоматизированные скрипты.

  2. (master, replica, arbiter) Скачайте дистрибутив в рабочий каталог и распакуйте его. Далее по инструкции путь к компонентам дистрибутива будет формироваться с использованием префикса ~/pangolin.

    Действие по скачиванию дистрибутива:

    mkdir -p ~/pangolin
    tar -xzvf pangolin_6.tar.gz  -C ~/pangolin
    
  3. (master) Сохраните исходные значения стенда для последующей инициализации новой БД:

    sudo -iu postgres
    psql -c "SHOW SERVER_ENCODING;" > current_value.txt
    psql -c "SHOW LC_COLLATE;" >> current_value.txt
    psql -c "SHOW LC_CTYPE;" >> current_value.txt
    psql -c "SHOW LC_MESSAGES;" >> current_value.txt
    psql -c "SHOW LC_MONETARY;" >> current_value.txt
    psql -c "SHOW LC_NUMERIC;" >> current_value.txt
    psql -c "SHOW LC_TIME;" >> current_value.txt
    psql -c "SELECT oid, pg_tablespace_location(oid) FROM pg_tablespace WHERE spcname not in ('pg_default', 'pg_global');" >> current_value.txt
    exit
    
  4. (master, replica) Разверните виртуальное окружение и перезапустите сессию пользователей: postgres, kmadmin_pg:

    export PANGOLIN_VER=6.4.2
    sudo dnf install -y ~/pangolin/3rdparty/3rdparty/pangolin-ansible-venv-controlled-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm
    sudo systemctl restart user@$(id -u postgres)
    sudo systemctl restart user@$(id -u kmadmin_pg)
    
  5. (master) Подготовьте исходную базу для корректной миграции:

    sudo -iu postgres
     
    echo "
    SELECT grant_opts AS grant_opts_start FROM (SELECT unnest(proacl) AS grant_opts FROM pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11) AS all_grants, pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11 AND NOT (grant_opts = any( acldefault('f', proowner)));
    SELECT revoke_opts AS revoke_opts_start FROM (SELECT unnest(acldefault('f', proowner)) AS revoke_opts FROM pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11) AS all_defs, pg_proc WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11 AND NOT (revoke_opts = any(proacl));
    SELECT grant_opts AS grant_opts_stop FROM (SELECT unnest(proacl) AS grant_opts FROM pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11) AS all_grants, pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11 AND NOT (grant_opts = any( acldefault('f', proowner)));
    SELECT revoke_opts AS revoke_opts_stop FROM (SELECT unnest(acldefault('f', proowner)) AS revoke_opts FROM pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11) AS all_defs, pg_proc WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11 AND NOT (revoke_opts = any(proacl));
    " > /home/postgres/change_0.sql
     
    echo "
    DELETE FROM pg_depend using (SELECT c.oid AS c_id, p.oid AS p_id, p.proname FROM pg_catalog.pg_class c join pg_catalog.pg_proc p ON c.relname = 'pg_proc' JOIN pg_catalog.pg_namespace ns ON p.pronamespace=ns.oid AND ns.nspname='pg_catalog') flt WHERE pg_depend.refclassid=flt.c_id AND pg_depend.refobjid = flt.p_id AND pg_depend.deptype ='p' AND pg_depend.classid=0 AND pg_depend.objid=0 AND pg_depend.objsubid=0 AND flt.proname IN (SELECT unnest(string_to_array('check_role_params,check_roles_is_on',',')));
    DROP FUNCTION IF EXISTS pg_catalog.check_role_params(role text, settings_to_check text), pg_catalog.check_roles_is_on();
    " > /home/postgres/change_1.sql
     
    echo "
    UPDATE pg_proc SET proacl = NULL WHERE proname = 'pg_start_backup' AND proargtypes = array[25,16,16]::oidvector AND pronamespace = 11;
    UPDATE pg_proc SET proacl = NULL WHERE proname = 'pg_stop_backup' AND proargtypes = array[16,16]::oidvector AND pronamespace = 11;
    UPDATE pg_proc SET proacl = NULL WHERE proname = 'pg_stop_backup' AND cardinality(proargtypes) = 0 AND pronamespace = 11;
    " > /home/postgres/change_2.sql
     
    echo "
    #!/bin/bash \
     
    databases=(\$(\$PGHOME/bin/psql -t --csv -c \"SELECT datname FROM pg_database WHERE datname not in ('template0', 'template1');\"))
    echo \"databases: \" \$databases
    for ud in \"\${databases[@]}\"; do
    echo \"databases: \" \$ud
    \$PGHOME/bin/psql -d \$ud -f /home/postgres/change_0.sql -1
    done
     
    databases=(\$(\$PGHOME/bin/psql -t --csv -c \"SELECT datname FROM pg_database;\"))
    echo \"databases: \" \$databases
    for ud in \"\${databases[@]}\"; do
    echo \"database: \" \$ud
    \$PGHOME/bin/psql -c \"UPDATE pg_database SET datallowconn = true WHERE datname = 'template0';\"
    \$PGHOME/bin/psql -d \$ud -f /home/postgres/change_1.sql -1
    \$PGHOME/bin/psql -c \"UPDATE pg_database SET datallowconn = false WHERE datname = 'template0';\"
    done
     
    databases=(\$(\$PGHOME/bin/psql -t --csv -c \"SELECT datname FROM pg_database WHERE datname not in ('template0', 'template1');\"))
    echo \"databases: \" \$databases
    for ud in \"\${databases[@]}\"; do
    echo \"databases: \" \$ud
    \$PGHOME/bin/psql -d \$ud -f /home/postgres/change_2.sql -1
    done
    " > /home/postgres/run_precondition.sh
     
    chmod 0700 run_precondition.sh
    ./run_precondition.sh >> current_value.txt
    exit
    
  6. (master, replica) Сформируйте конфигурационные файлы для работы с новой версией:

    sudo mkdir -p ~/pangolin/cache/merge
    sudo cp -r /pgdata/05/data/postgresql.conf ~/pangolin/cache/merge/postgresql.conf
    sudo cp -r /etc/patroni/postgres.yml ~/pangolin/cache/merge/postgres.yml
     
    #точечная актуализация или добавление параметров ~/pangolin/cache/merge/postgresql.conf
    archive_command = '/opt/pangolin-backup-tools/bin/pg_probackup archive-push -B /pgarclogs/06 --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100' log_directory = '/pgerrorlogs/06'
    pg_plugins_path = /usr/pangolin-6.4/lib
    hba_file = '/pgdata/06/data/pg_hba.conf'
    ident_file = '/pgdata/06/data/pg_ident.conf'
     
    #точечная актуализация или добавление параметров ~/pangolin/cache/merge/postgres.yml. Для конфигурации с patroni.
    postgresql:
        bin_dir: '/usr/pangolin-6.4/bin'
        bin_dir_client: /usr/pangolin-dbms-client-6.4/bin
        data_dir: '/pgdata/06/data/'
        callbacks:
            on_role_change: '/opt/pangolin-pooler/bin/pangolin-pooler-restart.sh'
        parameters:
            archive_command: '/opt/pangolin-backup-tools/bin/pg_probackup archive-push -B /pgarclogs/06 --instance clustername --wal-file-path=%p --wal-file-name=%f --compress --overwrite -j 4 --batch-size=100'
            pg_plugins_path = /usr/pangolin-6.4/lib
    
  7. (master, replica) Актуализируйте .bash_profile и sudoers:

    export PANGOLIN_OLD_VER=5.5.4
    sudo sed -i '/LD_LIBRARY_PATH/d'                              /home/postgres/.bash_profile
    sudo sed -i '/PG_PLUGINS_PATH/d'                              /home/postgres/.bash_profile
    sudo sed -i 's/pgerrorlogs\/05/pgerrorlogs\/06/g'             /home/postgres/.bash_profile
    sudo sed -i 's/pgdata\/05/pgdata\/06/g'                       /home/postgres/.bash_profile
    sudo sed -i "s/$PANGOLIN_OLD_VER/6.4/g"                       /home/postgres/.bash_profile
    sudo sed -i "s/$PANGOLIN_OLD_VER/6.4/g"                       /home/postgres/.bash_profile
    sudo sed -i "s/pangolin_reencrypt/pangolin-auth-reencrypt/g"  /etc/sudoers.d/10-kmadmin_pg
    sudo sed -i "s/pangolin_reencrypt/pangolin-auth-reencrypt/g"  /etc/sudoers.d/10-postgres
    sudo sed -i "s/pg_certs_rotate_agent/pangolin-certs-rotate/g" /etc/sudoers.d/10-postgres
    sudo sed -i "s/pgbouncer/pangolin-pooler/g"                   /etc/sudoers.d/10-postgres
     
    #для конфигурации с patroni
    sudo sed -i "s/patronictl/pangolin-manager-ctl/g"                                 /home/postgres/.bash_profile
    sudo sed -i "s/\/usr\/patroni\/patroni_venv\/bin/\/opt\/pangolin-manager\/bin/g"  /home/postgres/.bash_profile
    sudo sed -i "s/patroni/pangolin-manager/g"                                        /home/postgres/.bash_profile
    sudo sed -i "s/patroni/pangolin-manager/g"                                        /etc/sudoers.d/10-postgres
    
  8. (master) Проверьте отсутствие большого количества транзакций с незавершенным статусом. Для этого выполните следующий запрос:

    SELECT *
    FROM
    (WITH mysql AS
        (SELECT *
        FROM pg_stat_database) SELECT db.datname,
                                        (mysql.xact_commit::text::bigint - datfrozenxid::text::bigint) / 1048576 AS clog_cnt
    FROM pg_database db,
            mysql
    WHERE db.oid=mysql.datid) mysql2
    WHERE clog_cnt>3;
    

    Результат выполнения данного запроса - таблица с колонками datname (имя БД) и clog_cnt (количество файлов clog). Если результат запроса будет не пустой, то для всех полученных БД необходимо выполнить команду: vacuumdb -v -d db_name, где db_name - имя БД, полученное в результате выполнения запроса выше.

  9. (master) Выполните проверку состояния близости БД к пороговому значению заморозки транзакций autovacuum_freeze_max_age. Для этого выполните следующие действия:

    1. Получите возраст заморозки (max_frozen_age) старейшей из баз:

      SELECT max(age(datfrozenxid)) max_frozen_age FROM pg_database;
      
    2. Получите системное значение параметра autovacuum_freeze_max_age:

      SHOW autovacuum_freeze_max_age;
      
    3. Получите наименьшее значение параметра autovacuum_freeze_max_age, установленного для таблиц и TOAST-таблиц (необходимо выполнить для каждой базы данных):

      SELECT rel.relname, opts.opts, replace(opts.opts, 'autovacuum_freeze_max_age=', '')::bigint the_age
      FROM pg_class rel, ROWS FROM (unnest(reloptions)) opts
      WHERE reloptions IS NOT NULL AND opts ~ 'autovacuum_freeze_max_age.*'
      ORDER BY the_age;
      
    4. Возьмите значение, полученное в пункте 1, и сравните его с наименьшим значением, полученным в рамках пунктов 2 и 3. Данное значение не должно превышать 80% от наименьшего значения параметра autovacuum_freeze_max_age, установленного системно/для отдельных таблиц.

    Если max_frozen_age меньше порогового значения, то необходимо либо выполнить заморозку транзакций для всех БД с помощью команды vacuumdb -a -F -v , либо увеличить значение параметра autovacuum_freeze_max_age глобально/для таблиц, исходя из формулы autovacuum_freeze_max_age > max_frozen_age/0.8

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

  1. (master) В случае конфигурации с patroni переведите patroni в режим паузы:

    sudo -iu postgres
    /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/postgres.yml edit-config --set 'pause=true' --force
    exit
    
  2. (master, replica) Остановите все компоненты СУБД Pangolin:

    sudo systemctl stop pgbouncer
    sudo systemctl stop pg_certs_rotate_agent
    sudo systemctl stop pangolin_reencrypt@postgres.service
    sudo systemctl stop pangolin_reencrypt@kmadmin_pg.service
    

    Дополнительно выполните:

    • для конфигурации без patroni:

      sudo systemctl stop postgresql
      
    • Для конфигурации с patroni:

      sudo -iu postgres
      /usr/pangolin/bin/pg_ctl stop -D /pgdata/05/data
      exit
      sudo systemctl stop patroni
      
    • Для конфигурации с etcd:

      sudo systemctl stop etcd
      
  3. (master, replica) Остановите сторонние компоненты:

    sudo systemctl stop crond
    

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

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=6.4.2
    sudo dnf install -y ~/pangolin/utilities/pangolin-auth-reencrypt-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm
    
  2. (master, replica) Точечно замените конфигурационный файл, ввиду изменения наименований компонентов, путей к файлам подключения к VAULT и пути к защищенному хранилищу:

    sudo sed -i "s/\/etc\/patroni\/postgres.yml/\/etc\/pangolin-manager\/postgres.yml/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    sudo sed -i "s/\/etc\/postgres\/enc_utils_auth_settings.cfg/\/etc\/pangolin-auth-encryption\/enc_utils_auth_settings.cfg/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    sudo sed -i "s/\/etc\/postgres\/enc_connection_settings.cfg/\/etc\/pangolin-security-utilities\/enc_connection_settings.cfg/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    sudo sed -i "s/\/etc\/postgres\/enc_connection_settings_cert.cfg/\/etc\/pangolin-security-utilities\/enc_connection_settings_cert.cfg/g" /etc/pangolin-auth-reencrypt/enc_util.cfg
    
  3. (master, replica) Создайте каталог для логов компонента:

    export PGLOGS=/pgerrorlogs/06
    sudo mkdir -p $PGLOGS/pangolin-auth-reencrypt/
    sudo chown postgres:pangolin_users $PGLOGS/pangolin-auth-reencrypt/
    sudo chmod 0770 $PGLOGS/pangolin-auth-reencrypt/
    

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

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=6.4.2
    sudo dnf install -y ~/pangolin/utilities/pangolin-certs-rotate-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm
    
  2. (master, replica) Точечно замените конфигурационный файл, ввиду изменения наименований компонентов:

    sudo sed -i "s/\/pgerrorlogs\/05/\/pgerrorlogs\/06/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml
    sudo sed -i "s/sudo systemctl reload pgbouncer/sudo systemctl reload pangolin-pooler/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml
    sudo sed -i "s/sudo systemctl reload patroni/sudo systemctl reload pangolin-manager/g" /etc/pangolin-certs-rotate/pangolin-certs-rotate.yml
    

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

  1. (master, replica) Обновите пакет компонента:

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

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

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_VER=6.4.2
    sudo dnf install -y ~/pangolin/utilities/pangolin-security-utilities-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm
    

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

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_BACKUP_TOOLS=1.2.2
    sudo dnf install -y ~/pangolin/pangolin-backup-tools-$PANGOLIN_BACKUP_TOOLS-sberlinux8.8.x86_64.rpm
    
  2. (master, replica) Актуализируйте конфигурационнный файл backup-tools-env согласно шаблону ниже, если установка компонента первичная.

    backup-tools-env

    #!/bin/bash

    backup-tools-env:

    # PATH, used for access to required executable files, default value: "${PATH}:{PGHOME}/bin/"
    PATH="${PATH}:/usr/pangolin-6.4/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
    

    Предупреждение

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

Шаг 9. Обновление компонента pangolin-pooler#

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_POOLER=1.3.2
    sudo dnf install -y ~/pangolin/pangolin-pooler-$PANGOLIN_POOLER-sberlinux8.8.x86_64.rpm
    sudo sed -i "s/\/pgerrorlogs\/05/\/pgerrorlogs\/06/g" /etc/pangolin-pooler/pangolin-pooler.ini
    
  2. (master, replica) Создайте скрипт pangolin-pooler-restart.sh:

    echo "
    #!/bin/sh \
    sudo systemctl restart pangolin-pooler \
    " > ~/pangolin/pangolin-pooler-restart.sh
    sudo cp -r ~/pangolin/pangolin-pooler-restart.sh /etc/pangolin-pooler/pangolin-pooler-restart.sh
    sudo chown postgres:postgres /etc/pangolin-pooler/pangolin-pooler-restart.sh
    sudo chmod 0500 /etc/pangolin-pooler/pangolin-pooler-restart.sh
    

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

  1. (master, replica) Обновите пакет компонента:

    export PANGOLIN_MANAGER=2.1.3
    sudo dnf install -y ~/pangolin/pangolin-manager-$PANGOLIN_MANAGER-sberlinux8.8.x86_64.rpm
    

Шаг 11. Обновление pangolin-license#

  1. (master, replica) Подготовьте файл с лицензией:

    sudo mkdir /opt/pangolin_license/
    sudo touch /opt/pangolin_license/license.json
    sudo chown -R postgres:pangolin_users /opt/pangolin_license/
    sudo chmod 0770 /opt/pangolin_license/
    sudo chmod 0440 /opt/pangolin_license/license.json
     
    #заполните файл /opt/pangolin_license/license.json
    

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

  1. (master, replica) Подготовьте СУБД Pangolin новой версии для миграции.

    • Создание новых рабочих каталогов и файлов БД:

      sudo mkdir -p /pgarclogs/06 /pgerrorlogs/06 /pgdata/06/data
      sudo chown -R postgres:postgres /pgdata/06 /pgarclogs/06 /pgerrorlogs/06  
      sudo chmod -R 0700 /pgdata/06 /pgarclogs/06 /pgerrorlogs/06    
      echo "
      /pgarclogs/06/postgresql-*.log {
          rotate 30
          su postgres postgres
          daily
          compress
          delaycompress
          nocreate
          copytruncate
          sharedscripts
          missingok
          notifempty
      }
       
      postrotate
          SIZE_USED=\$(df /pgarclogs/06| awk '{print $5}' | grep -v Use% | tr -d %)
          if [ \"\$SIZE_USED\" -gt 90 ]; then
              logger \"Диск для логов PostgreSQL заполнен более чем на 90%. Пожалуйста, очистите его для успешной работы.\"
          fi
      endscript
       
      " > ~/pangolin/cache/pangolin-dbms
      sudo cp -r ~/pangolin/cache/pangolin-dbms /etc/logrotate.d/pangolin-dbms
      sudo chown root:root /etc/logrotate.d/pangolin-dbms
      sudo chmod 0644 /etc/logrotate.d/pangolin-dbms
      
    • Обновление пакетов компонентов:

      export PANGOLIN_VER=6.4.2
      export PANGOLIN_TIMESCALEDB=2.14.2
      sudo dnf install -y ~/pangolin/pangolin-dbms-6.4-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm
      sudo dnf install -y ~/pangolin/pangolin-dbms-6.4-client-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm
       
      # при необходимости
      sudo dnf install -y ~/pangolin/timescaledb/pangolin-timescaledb-6.3-apache-$PANGOLIN_TIMESCALEDB-sberlinux8.8-x86_64.rpm
      
    • Копирование вспомогательных файлов:

      sudo mkdir /usr/pangolin/3rdparty/
      sudo tar -xvf  ~/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. (master) Инициализируйте новую версию СУБД Pangolin:

    sudo /opt/pangolin-ansible-venv-controlled/bin/python3 ~/pangolin/installer/utilities/psql_get_password_hash -t scram-sha-256 -P '<пароль пользователя postgres>' > ~/pangolin/cache/.tmp_file
    sudo cp -r ~/pangolin/cache/.tmp_file /home/postgres/
    sudo chown postgres:postgres /home/postgres/.tmp_file
    sudo -iu postgres
    /usr/pangolin/bin/initdb -D /pgdata/06/data -k -A scram-sha-256 --pwfile /home/postgres/.tmp_file -E UTF8 --update-authid --lc-collate <данные из файла current_value.txt> --lc-ctype <данные из файла current_value.txt> --lc-messages <данные из файла current_value.txt> --lc-monetary <данные из файла current_value.txt> --lc-numeric <данные из файла current_value.txt> --lc-time <данные из файла current_value.txt>
    exit
     
    #например, /usr/pangolin/bin/initdb -D /pgdata/06/data -k -A scram-sha-256 --pwfile /home/postgres/.tmp_file -E UTF8 --update-authid --lc-collate en_US.utf-8 --lc-ctype en_US.utf-8 --lc-messages en_US.utf8 --lc-monetary en_US.utf8 --lc-numeric en_US.utf8 --lc-time en_US.utf8
    
  3. (master, replica) Скопируйте заранее сформированные конфигурационные файлы каталога в рабочие:

    sudo cp -r ~/pangolin/cache/merge/postgresql.conf /pgdata/06/data/postgresql.conf
    sudo cp -r /pgdata/05/data/pg_hba.conf            /pgdata/06/data/pg_hba.conf
    sudo cp -r /pgdata/05/data/postgresql.base.conf   /pgdata/06/data/postgresql.base.conf
    sudo cp -r /pgdata/05/data/postgresql.auto.conf   /pgdata/06/data/postgresql.auto.conf
    sudo chown postgres:postgres /pgdata/06/data/postgresql.base.conf /pgdata/06/data/postgresql.auto.conf /pgdata/06/data/postgresql.conf /pgdata/06/data/pg_hba.conf /etc/pangolin-manager/postgres.yml /pgdata/06/data/patroni.dynamic.json
    sudo chmod 0600 /pgdata/06/data/postgresql.base.conf /pgdata/06/data/postgresql.auto.conf /pgdata/06/data/postgresql.conf /pgdata/06/data/pg_hba.conf /etc/pangolin-manager/postgres.yml /pgdata/06/data/patroni.dynamic.json
    
    #дополнительно для конфигурации с patroni
    sudo cp -r ~/pangolin/cache/merge/postgres.yml    /etc/pangolin-manager/postgres.yml
    sudo cp -r /pgdata/05/data/patroni.dynamic.json   /pgdata/06/data/patroni.dynamic.json
    
  4. (master, replica) Скорректируйте сервисный файл postgresq.service для конфигурации без patroni:

    # скорректировать /etc/systemd/system/postgresql.service до состояния приведенного выше
    echo "
    [Unit]
    Description=Runners PostgreSQL service
    After=syslog.target network.target pangolin-auth-reencrypt@postgres.service pangolin-auth-reencrypt@kmadmin_pg.service
     
    [Service]
    Type=notify
     
    Environment=\"PG_LICENSE_PATH=/opt/pangolin_license\"
    Environment=\"PG_PLUGINS_PATH=/usr/pangolin-6.4/lib\"
    Environment=\"PGCTLTIMEOUT=120\"
    Environment=\"LD_LIBRARY_PATH=/usr/pangolin-6.4/lib\"
    LimitNOFILE=65536
      
    # Pre-commands to start watchdog device
    User=postgres
    Group=postgres
     
    PermissionsStartOnly=true
    ExecStartPre=/bin/mkdir -p /var/run/postgresql
    ExecStartPre=/bin/chown -R postgres:postgres /var/run/postgresql
    ExecReload=/bin/kill -HUP \$MAINPID
     
    WorkingDirectory=/usr/pangolin-6.4/
    ExecStart=/bin/bash -i -c \"/usr/pangolin-6.4/bin/postgres -D /pgdata/06/data\"
    Restart=on-failure
     
    [Install]
    WantedBy=multi-user.target
    " > ~/pangolin/cache/postgresql.service
    sudo cp -r ~/pangolin/cache/postgresql.service /etc/systemd/system/postgresql.service
    sudo chown -R postgres:postgres /etc/systemd/system/postgresql.service
    sudo chmod -R 0600 /etc/systemd/system/postgresql.service
    sudo systemctl daemon-reload
    
  5. (master, replica) Внесите следующие корректировки для миграции:

    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line'     /pgdata/05/data/pg_hba.conf
    sudo sed -i '1ilocal all postgres scram-sha-256 #tmp_line'     /pgdata/06/data/pg_hba.conf    
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line"               /pgdata/05/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line"       /pgdata/05/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" /pgdata/05/data/postgresql.conf
    sudo sed -i -e "\$aautovacuum = 'off' #tmp_line"               /pgdata/06/data/postgresql.conf
    sudo sed -i -e "\$asynchronous_commit = 'off' #tmp_line"       /pgdata/06/data/postgresql.conf
    sudo sed -i -e "\$acron.database_name = 'template1' #tmp_line" /pgdata/06/data/postgresql.conf
    
  6. (master) Мигрируйте данные в новую СУБД с помощью pg_upgrade:

    sudo mkdir -p /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo chown -R postgres:postgres /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo chmod -R 0700 /pgarclogs/pg_upgrade /var/run/postgresql/pg_upgrade
    sudo -iu postgres
    PGPASSWORD=<пароль пользователя postgres> PG_LICENSE_PATH=/opt/pangolin_license PGHOST=127.0.0.1 /usr/pangolin-6.4/bin/pg_upgrade -b /usr/pangolin-5.5.4/bin/ -B /usr/pangolin-6.4/bin/ --old-bindirclient /usr/pangolin-5.5.4/bin/ --new-bindirclient /usr/pangolin-dbms-client-6.4/bin/ -d /pgdata/05/data -D /pgdata/06/data -p 5433 -P 50433 -j 2 --socketdir=/var/run/postgresql/pg_upgrade -l /pgarclogs/pg_upgrade --link -r
    exit
    
  7. (master) Актуализируйте файлы табличных пространств (ТП):

    sudo rm -rf /pgdata/05/tablespaces/<название ТП>/PG_13_202306131
    sudo mv /pgdata/05/tablespaces /pgdata/06/tablespaces
    
    #Значения для <path> и <oid> необходимо заменить на значения oid и pg_tablespace_location соответственно из файла current_value.txt
    sudo ln -sfn <path> /pgdata/06/data/pg_tblspc/<oid>
    #например, sudo ln -sfn /pgdata/06/tablespaces/Tbl_t /pgdata/06/data/pg_tblspc/16799
    
  8. (replica) В случае кластерной конфигурации сгенерируйте ключ доступа для переноса данных с мастера на реплику:

    sudo su - postgres
    mkdir -p /pgarclogs/cache/rsync
    ssh-keygen
     
    Generating public/private rsa key pair.
    # Введите имя файла, в котором будет сохранен ключ: /pgarclogs/cache/rsync/ssh_key_rsync
    Enter file in which to save the key (/home/postgres/.ssh/id_rsa): /pgarclogs/cache/rsync/ssh_key_rsync
    # Введите ключевую фразу (опционально):
    Enter passphrase (empty for no passphrase): <passphrase or enter>
    # Введите ту же ключевую фразу еще раз (опционально):
    Enter same passphrase again: <passphrase or enter>
      
    Your identification has been saved in /pgarclogs/cache/rsync/ssh_key_rsync.
    Your public key has been saved in /pgarclogs/cache/rsync/ssh_key_rsync.pub.
    The key fingerprint is:
    SHA256:5VV.........
    The key's randomart image is:
    +---[RSA 3072]----+
    |              ==+|
    |            .BBo+|
    |          .o.=*=+|
    |         o..+ +++|
    |        S .o = =o|
    |          + o *.+|
    |         o =. .* |
    |        ..oo.+. E|
    |        .oo o... |
    +----[SHA256]-----+ 
      
    # копирование ssh-ключа с replica на master
    ssh-copy-id -i /pgarclogs/cache/rsync/ssh_key_rsync postgres@<ip адрес ноды master>
    
  9. (replica) В случае кластерной конфигурации запустите rsync для переноса данных:

    sshpass -d4 /bin/rsync --delay-updates -F --checksum --archive --rsync-path=rsync --hard-links --progress --size-only --no-inc-recursive --delete --rsh='ssh -S none -i /pgarclogs/cache/rsync/ssh_key_rsync -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --out-format='<<CHANGED>>%i %n%L' <ip адрес ноды master>:/pgdata/06 /pgdata
    #если есть табличные пространства, находящиеся в не /pgdata/05, их необходимо тоже перенсти, напрмер: sshpass -d4 /bin/rsync --delay-updates -F --checksum --archive --rsync-path=rsync --hard-links --size-only --stats --dry-run --delete --no-inc-recursive --rsh='ssh -S none -i /pgarclogs/cache/rsync/ssh_key_rsync -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --out-format='<<CHANGED>>%i %n%L' <ip адрес ноды master>:/pgdata/11/tablespaces/tsin11 /pgdata/11/tablespaces
    
  10. (master) Проиндексируйте данные в БД, выполните очистку и анализ базы данных:

#для конфигурации без pangolin-manager
sudo systemctl restart postgresql
 
#для конфигурации c pangolin-manager
sudo -iu postgres
/usr/pangolin/bin/pg_ctl start -D /pgdata/06/data/
exit  
 
#для любой конфигурации
sudo -iu postgres
PGPASSWORD=<пароль пользователя postgres> /usr/pangolin-dbms-client-6.4/bin/reindexdb -j 2 --all
PGPASSWORD=<пароль пользователя postgres> /usr/pangolin-dbms-client-6.4/bin/vacuumdb -j 2 --analyze-in-stages --all
exit

#для конфигурации без pangolin-manager
sudo systemctl stop postgresql
 
#для конфигурации c pangolin-manager
sudo -iu postgres
/usr/pangolin/bin/pg_ctl stop -D /pgdata/06/data/
exit

Шаг 13. Завершающие действия#

  1. (master, replica) Удалите временные параметры из рабочих конфигурационных файлов:

    sudo sed -i '/local all postgres scram-sha-256 #tmp_line/d' /pgdata/06/data/pg_hba.conf    
    sudo sed -i "/autovacuum = 'off' #tmp_line/d"               /pgdata/06/data/postgresql.conf
    sudo sed -i "/synchronous_commit = 'off' #tmp_line/d"       /pgdata/06/data/postgresql.conf
    sudo sed -i "/cron.database_name = 'template1' #tmp_line/d" /pgdata/06/data/postgresql.conf
    
  2. (master, replica) Удалите неактуальные рабочие файлы исходной БД:

    sudo dnf remove platform-v-pangolin-dbms -y
    sudo rm -rf /usr/pangolin-5* /usr/pgsql-se-05
    sudo ln -sfvn /pgdata/06 /pgdata/data
    sudo rm -rf /pgdata/05 /pgerrorlogs/05 /pgarclogs/05
    sudo rm -rf /etc/postgres/enc_connection_settings.cfg
    sudo rm -rf /etc/postgres/enc_connection_settings_cert.cfg
    sudo rm -rf /etc/postgres/enc_utils_auth_settings.cfg
    sudo rm -rf /etc/postgres/enc_params.cfg*
    sudo rm -rf /opt/omni/lbin/*manage_backup*
    sudo rm -rf /opt/omni/lbin/*pg_se_archlogs*
    sudo rm -rf /etc/systemd/system/pgbouncer.service
    sudo rm -rf /etc/pgbouncer/
    sudo rm -rf /usr/local/bin/pgbouncer
    sudo rm -rf /usr/local/share/doc/pgbouncer/
    sudo rm -rf /usr/local/share//man/man1/pgbouncer.1
    sudo rm -rf /usr/local/share//man/man5/pgbouncer.5
    sudo rm -rf /usr/patroni/patroni_venv
    sudo rm -rf /opt/pangolin-common
    
  3. (master, replica, arbiter) Актуализируйте dynmotd.sh:

    export PANGOLIN_MANGER=2.1.3
    export PANGOLIN_OLD_MANGER=1.1.1 
    export PANGOLIN_FULL_VER=06.004.02
    export PANGOLIN_FULL_OLD_VER=05.005.04
     
    sudo sed -i "s/$PANGOLIN_OLD_MANGER/$PANGOLIN_MANGER/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#

  1. (master, replica) Запустите компоненты СУБД Pangolin:

    sudo systemctl daemon-reload
    
    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
    

    Дополнительно выполните:

    • для конфигурации без pangolin-manager:

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

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

      sudo systemctl restart etcd
      
  2. (master) Запустите сторонние сервисы:

    sudo systemctl restart crond
    
  3. (master) В случае конфигурации с pangolin-manager очистите кластер и выведите pangolin-manager из режима паузы:

    sudo -iu postgres
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml remove clustername  
    exit
    sudo systemctl restart pangolin-manager
    sudo -iu postgres
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force
    /opt/pangolin-manager/bin/pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml restart clustername
    exit
     
    #дополнительно выполните команду на replica 
    sudo systemctl restart pangolin-manager
    
  4. (master) Восстановите удаленные функции в «Шаг 2. Подготовительные действия» пункт 5.

    Примечание

    В файле /home/postgres/current_value.txt необходимо выявить, в какой БД было найдены следующие сущности: grant_opts_start/revoke_opts_start/grant_opts_stop/revoke_opts_stop. Значение необходимо подставить в скрипты вместо <БД>.

    Также необходимо проверить, какому пользователю были выданы права. Например, backup_user=X/postgres, значит <пользователь> заменить на backup_user, если значение =X/postgres, значит <пользователь> заменить на PUBLIC.

    sudo -iu postgres
     
    #grant_opts_start
    echo "
    SET SESSION AUTHORIZATION <БД>;
    GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start TO <пользователь>;
    RESET SESSION AUTHORIZATION;
    " > /home/postgres/grant_opts_start.sql
     
    #grant_opts_stop
    echo "
    SET SESSION AUTHORIZATION <БД>;
    GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop TO <пользователь>;
    RESET SESSION AUTHORIZATION;
    " > /home/postgres/grant_opts_stop.sql
     
    #revoke_opts_start
    echo "
    REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_start FROM <пользователь>;
    " > /home/postgres/revoke_opts_start.sql
     
    #revoke_opts_stop
    echo "
    REVOKE EXECUTE ON FUNCTION pg_catalog.pg_backup_stop FROM <пользователь>;
    " > /home/postgres/revoke_opts_stop.sql
    psql -f /home/postgres/grant_opts_start.sql
    psql -f /home/postgres/grant_opts_stop.sql
    psql -f /home/postgres/revoke_opts_start.sql
    psql -f /home/postgres/revoke_opts_stop.sql
    exit