Обновление#
Данный раздел рассматривает процесс обновления СУБД Pangolin.
В составе дистрибутива (папка installer) расположены два скрипта, для установки обновления:
Скрипт-разведчик — скрипт проверки перед обновлением.
Скрипт-обновление — основной скрипт, при запуске которого происходит установка обновления.
Процесс разведки и обновления может осуществляться по различным алгоритмам, существенно различающимися по времени выполнения и сложности (зависит от объема и типа изменений между версиями):
Обновление, при котором осуществляется замена старых файлов (исполняемых, конфигурационных, файлов расширений) на их обновленные версии, либо добавляются новые утилиты, которые отсутствовали в предыдущих версиях. Характеризуется малым временем выполнения и возможностью обновления без прерывания работы сервиса.
Обновление, при котором, помимо обновления файлов, осуществляется изменение структуры или состава данных в системных каталогах обновляемых БД. Характеризуется дополнительным набором предварительным проверок, обновлением с прерыванием работы сервиса и рекомендацией по созданию резервной копии перед обновлением.
Примечание:
Под изменением структуры или состава данных понимается:
изменение состава системных таблиц;
изменение состава системных представлений;
изменение состава системных функций;
изменение списка встроенных типов данных;
изменение формата хранения данных (включая изменения в алгоритме шифрования).
Дополнительные проверки и ограничения привносит и изменение мажорной версии ядра оригинального PostgreSQL, на котором базируется Pangolin.
Общая информация по обновлению СУБД Pangolin#
Перед началом обновления запустите скрипт-разведчик, который:
выводит список установленных
extensions. В процессе обновления они не будут перенесены в новую версию СУБД Pangolin:сторонние/не входящие в текущую версию продукта СУБД Pangolin;
запрещенные расширения;
расширения, несовместимые с новой версией СУБД Pangolin;
полный список ограничений, для администраторов автоматизированной системы (в случае их наличия);
проверит возможность создания резервной копии (РК). Локальная РК является необходимым условием для работы механизма автоматического отката к исходной версии СУБД в случае возникновения любых внештатных ситуаций в процессе работы механизма обновления.
Внимание!
Если в настраиваемом конфигурационном слое параметр, отвечающий за создание резервного копирования, будет выключен, то в случае ошибок в процессе обновления ответственность за сохранность данных и восстановление исходной версии СУБД находится на стороне владельца настраиваемого конфигурационного слоя.
проверит наличие дубликатов в конфигурационном файле patroni (postgres.yml);
проверит наличие специальных символов в конфигурационных файлах
postgres.yml,pg_hba.conf,postgresql.conf.
В процессе обновления будет обновлена СУБД Pangolin и версии всех утилит, входящих в состав продукта.
При обновлении происходит процесс слияния пользовательских настроек и настроек, отвечающих требованиям новой версии СУБД, в конфигурационных файлах:
postgres.yml(в случае наличия patroni);pgbouncer.ini(в случае наличия pgbouncer);pg_hba.conf;postgresql.conf.
В случае ошибки при обновлении срабатывает механизм прерывания работы обновления версии СУБД, позволяющий остановить процесс обновления и вернуть версию СУБД в состояние до обновления.
Схемы процесса обновления#
Схема процесса обновления СУБД Pangolin второго уровня сложности для конфигурации standalone: реализация внутренних процессов#

Схема процесса обновления СУБД Pangolin второго уровня сложности для конфигурации 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)%');в процедурах проверьте, что язык Python 2.х не используется (рекомендуется: использовать Python 3.x):
-- Должен вернуться список процедур на python2u,pythonu // запускать необходимо для КАЖДОЙ БД SELECT format('%1$s.%2$s',ns.nspname,pp.proname) pr_name FROM pg_proc pp JOIN pg_catalog.pg_language pl ON pp.prolang =pl.oid JOIN pg_namespace ns ON pp.pronamespace =ns.oid AND pl.lanname SIMILAR TO 'plpython2?u%';
Список необходимых действий после завершения процесса обновления СУБД 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).
Примечание:
Перед началом обновления версии СУБД внимательно изучите Примечания к релизу новой версии.
Таблица поддерживаемых для обновления версий СУБД#
Обновляемая версия |
Целевая версия обновления |
tde |
admin_protection |
admin_protection + tde |
|---|---|---|---|---|
Postgres SE 4.6.1 |
Pangolin 5.4.0 |
Не установлено |
Не установлено |
Не установлено |
Postgres SE 4.6.2 |
Pangolin 5.4.0 |
Не установлено |
Не установлено |
Не установлено |
Pangolin 5.2.0 |
Pangolin 5.4.0 |
Установлено |
Не установлено |
Не установлено |
Pangolin 5.2.1 |
Pangolin 5.4.0 |
Установлено |
Не установлено |
Не установлено |
Pangolin 5.2.2 |
Pangolin 5.4.0 |
Установлено |
Не установлено |
Не установлено |
Pangolin 5.3.0 |
Pangolin 5.4.0 |
Установлено |
Не установлено |
Не установлено |
Примечание:
Для получения названия и версии продукта серверной части необходимо подключиться к серверу Pangolin и выполнить команды из таблицы ниже. Результат выполнения зависит от названия, номера версии и платформы, для которой была выполнена сборка.
Действие
Команда
Тип значения
Примеры выполнения команды
Название продукта
SELECT version();строковое значение
PostgreSQL 11.7 (PostgreSQL Sber Edition 4.1.0) 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;строковое значение
11.7
SHOW server_version_num;числовое значение
110007
Номер Pangolin версии
SHOW server_se_version;строковое значение
4.1.0
SELECT sber_version();строковое значение
4.1.0
Проверка готовности к обновлению#
Внимание!
В случае, если все пароли указывались в открытом виде, параметры
--ask-vault-passи--vault-password-file=название_файла_с_ключемдобавлять не нужно!
Обязательным условием запуска скриптов обновления СУБД, является запуск скрипта-разведчика, в задачи которого входит выполнение ряда проверок, сбора информации о стенде, а также вычислении типа обновления версии СУБД, необходимого для перехода на новую версию СУБД Pangolin.
Скачайте и распакуйте дистрибутив на сервере.
Перейдите в каталог с распакованным дистрибутивом, а затем в каталог
installer.Перед запуском обновления заполните файл
hosts.ini, в зависимости от установленного решения, добавив информацию о хостах и учетных данных пользователя, которые будет использовать Ansible.Внимание!
Данные должны содержать те же параметры что и при установке. Примеры заполнения файлов описаны в разделе «Установка».
Заполните настраиваемый конфигурационный файл
custom_file_sample.yml.Заполните конфигурационный файл
all.yml.Чтобы удостовериться в готовности к обновлению, используйте 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=${} 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=${} \ 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=${} \ stand=${}"
Описание параметров:
custom_config— абсолютный путь до файла конфигурацииcustom_file_template.yml;local_distr_path— абсолютный путь до загруженного и распакованного дистрибутива Platform V Pangolin;segment— сегмент сети;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
Проверка состояния параметра KillUserProcesses в файле /etc/systemd/logind.conf#
Если параметр KillUserProcesses в файле /etc/systemd/logind.conf находится в положении yes, то выводится блокирующая дальнейшее выполнениe сценария ошибка:
{{ 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
Если SSL настроен, но не включен, то выводится блокирующая дальнейшее выполнение сценария ошибка:
RLM.FAIL__SSL настроен, но выключен в конфигурации БД. Возможно в кандидате на обновление уже был ранее настроен SSL. Для продолжения обновления необходимо удалить настройки БД, связанные с ssl и повторить запуск обновления.__RLM.FAIL
Если SSL не был настроен корректно, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__SSL не был настроен корректно. Возможно в кандидате на обновление уже был ранее настроен SSL. Для продолжения обновления необходимо удалить настройки БД, связанные с ssl и повторить запуск обновления.__{{ control_name }}.FAIL
Если файлы сертификатов отсутствуют, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__Файл сертификата {{ item }} не найден__{{ control_name }}.FAIL
Где item - 3 файла: ключ (например /home/postgres/ssl/client.key), сертификат (например /home/postgres/ssl/client.crt) и корневой сертификат (например /home/postgres/ssl/root.crt).
Проверка соответствия установленных компонентов кластера с текущим типом конфигурации#
Если не соответствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__Текущий тип конфигурации согласно конфигурационному параметру СУБД {type_configuration}, при этом обнаружены несоответствующие конфигурации компоненты: {component}. Для продолжения обновления требуется удалить несоответствующие компоненты.__{{ control_name }}.FAIL
Проверка минимальной поддерживаемой версии Postgres SE, над которой может быть выполнен сценарий разведки/обновления#
Скрипт запрашивает информацию об установленной версии. Сравнивает версию с параметром, отвечающим за минимальную поддерживаемую версию, который, в свою очередь, берет информацию из матрицы версий. Если версия не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__Обновление невозможно. Текущая версия (pg_current_version) не поддерживается. Минимальная поддерживаемая версия: min_actual_pangolin_ver__{{ control_name }}.FAIL
Матрица поддерживаемых версий:
list_versions_to_update: ["4.6.1", "4.6.2","4.6.3", "5.2.0", "5.2.1", "5.3.0" ]
update_version_matrix: {
"table":[
{"to": "5.4.0", "from": ["4.6.1", "4.6.2", "4.6.3"], "admin_protection": false, "tde": false, "update_type": "update_major", "pg_upgrade_mode": "hardlink"},
{"to": "5.4.0", "from": ["4.6.1", "4.6.2", "4.6.3"], "admin_protection": false, "tde": true, "update_type": "unsupported", "pg_upgrade_mode": "not defined"},
{"to": "5.4.0", "from": ["4.6.1", "4.6.2", "4.6.3", "5.2.0", "5.2.1", "5.3.0"], "admin_protection": true, "tde": false, "update_type": "unsupported", "pg_upgrade_mode": "not defined"},
{"to": "5.4.0", "from": ["4.6.1", "4.6.2", "4.6.3", "5.2.0", "5.2.1", "5.3.0"], "admin_protection": true, "tde": true, "update_type": "unsupported", "pg_upgrade_mode": "not defined"},
{"to": "5.4.0", "from": ["5.2.0", "5.2.1", "5.3.0"], "admin_protection": false, "tde": false, "update_type": "update_minor", "pg_upgrade_mode": "not defined"},
{"to": "5.4.0", "from": ["5.2.0", "5.2.1", "5.3.0"], "admin_protection": false, "tde": true, "update_type": "update_minor", "pg_upgrade_mode": "not defined"}
]
}
Проверка типа установленной конфигурации Postgres SE#
Скрипт запрашивает информацию об установленном типе конфигурации и сравнивает его со списком неподдерживаемых. Если тип конфигурации не поддерживается, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ 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) из таблицы соответствия для текущей версии, то происходит анализ данных параметров и выводится сообщение:
RLM.ARGS__{\"update_complexity_level\": \"update_complexity_level_2\"}__RLM.ARGS
Проверка свободного места#
Проверка свободного места в точке монтирования PGBACKUP (пример: /pgarclogs/04). Требуется минимум 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 (отображается в логе как «локальный бэкап») складывается из следующих параметров:
Размер кластера СУБД (текущего каталога
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"
Проверка типа файловой системы для каталогов текущая PGDATA, новая PGDATA, PGBACKUP, local_backup_path#
Проверка в скрипте выполняется для типа обновления update_complexity_level_2/update_complexity_level_3.
Для каталогов запрашивается тип файловой системы. Список каталогов:
текущая pgdata (пример: /pgdata/04/data)
новая pgdata (пример:/pgdata/05/data)
pgbackup (пример: /pgarclogs/04)
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
Проверка корректного расположения PGDATA#
Проверяется расположение PGDATA, с которой работает СУБД. В случае если расположение отличается от эталонного значения, то выводится ошибка:
{{ control_name }}.FAIL__В кандидате на обновление обнаружено некорректное расположение PGDATA. Сейчас - pgdata_real. Должно быть - pgdata_should_be__{{ control_name }}.FAIL
Для версии ниже 4.3.0 эталонное значение - /pgdata/11/data.
Для версии с 4.3.0 до 5.1.0 - /pgdata/<мажорная версия, пример 04>/data.
Для версии начиная с 5.1.0 и выше - /pgdata/<мажорная версия, пример 05>/data.
Проверка работоспособности клиентского сертификата postgres, который уже есть на стенде#
Проверяется возможность подключения к БД с использованием сертификата. При успешном подключении осуществляется выполнение тестового запроса на active:
SELECT version();
В случае возникновения ошибок распечатывается следующая инструкция и выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__Локальный для {{ inventory_hostname }} пользователь postgres не может подключиться к БД используя сертификаты. Возможные причины: \
1.Проверьте валидность дат сертификатов командами: \
openssl x509 -in {{ pg_certs_pwd.postgres_cert }} -noout -enddate; \
openssl x509 -in {{ pg_certs_pwd.root_ca }} -noout -enddate; \
2.Проверить принадлежность сертификатов к одному УЦ с помощью команд: \
openssl x509 -in {{ pg_certs_pwd.postgres_cert }} -noout -text; \
openssl x509 -in {{ pg_certs_pwd.root_ca }} -noout -text; \
openssl x509 -in <значение параметра ssl_cert_file из конфига postgresql.conf> -noout -text; \
3.Проверьте наличие строки подключения в pg_hba 'hostssl all postgres {{ ansible_default_ipv4.address }}/32 cert'__{{ control_name }}.FAIL
Проверка наличия библиотеки cracklib#
Осуществляется запрос проверки наличия библиотеки и словарей в каталоге PGHOME.
Список необходимых файлов:
libcrack.so
pw_dict.hwm
pw_dict.pwd
pw_dict.pwi
Если хотя бы один файл отсутствует, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__Библиотека cracklib не найдена. Обратитесь к администраторам СУБД за решением__{{ control_name }}.FAIL
Если соединение с БД не установлено, то выводится блокирующая дальнейшее выполнение сценария ошибка:
{{ control_name }}.FAIL__Не удалось осуществить тестовое соединение к БД на {{ inventory_hostname }}. Обратитесь к администраторам СУБД за помощью__{{ control_name }}.FAIL
Проверка использования KMS-заменителя#
Для стендов с KMS-заменителем реализована перелинковка библиотек в процессе обновления с /usr/pgsql-se-05/lib/libconnector_plugin.so -> plugins/libvault_plugin.so на /usr/pgsql-se-05/lib/libconnector_plugin.so -> plugins/libkms_substitute_plugin.so. Перед этим действием производится проверка на наличие включенного TDE и определение рабочего файла .so:
SELECT check_tde_is_on();
Если исходная СУБД Pangolin работала с KMS-заменителем, будет произведена перелинковка, если нет, то действие по перелинковке будет пропущено.
Примечание:
Для стендов с исходной версией СУБД Pangolin 5.1.0 и KMS-заменителем до начала обновления будет производиться подмена некорректного плагина KMS-заменителя, который будет входить в состав дистрибутива и находиться в каталоге
plugins/5.1.0/RedHat/libkms_substitute_plugin.so. В случае падения во время обновления, скрипты восстановления к исходной версии производить возврат некорректного плагина KMS-заменителя не будут.
Проверка структуры каталогов 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. В задаче распечатана информация для анализа различий.
Проверка наличия записей в схеме public#
Под пользователем postgres выполняется следующий скрипт:
SELECT format('{{ item.datname }}.%1$s.%2$s',table_schema,table_name) data_public
FROM information_schema.tables
WHERE table_schema = 'public' AND table_name NOT LIKE 'pathman%' AND table_name NOT LIKE 'pg_stat_state%';
Если результат выполнения запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:
{{ control_name }}.FAIL__Данные в схеме public существуют, необходимо руками их перенести в другую схему и повторить обновление. Список таблиц (<имя базы>.<имя схемы>.<имя таблицы>: table_name__{{ control_name }}.FAIL
Проверка установленных расширений с поддерживаемыми расширениями#
Под пользователем 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 ({{ legal_extensions.third_party }}, {{ legal_extensions.contrib }});
В запросе происходит сравнение установленных расширений с поддерживаемыми.
legal_extensions:
third_party: "'pg_profile', 'orafce', 'postgis', 'pgrouting', 'pg_squeeze', 'pg_cron', 'pg_pathman', 'pg_repack', 'pgse_backup', 'pg_hint_plan', \
'pg_outline', 'oracle_fdw', 'tds_fdw', 'psql_lockmon', 'pg_stat_kcache', 'psql_rotate_password', 'fasttrun', 'fulleq', 'mchar'"
contrib: "'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_plpython2u', 'hstore_plpython3u', 'hstore_plpythonu', \
'insert_username', 'intagg', 'intarray', 'isn', 'jsonb_plperl', 'jsonb_plperlu', 'jsonb_plpython2u', 'jsonb_plpython3u', 'jsonb_plpythonu', 'lo', 'ltree', \
'ltree_plpython2u', 'ltree_plpython3u', 'ltree_plpythonu', 'moddatetime', 'pageinspect', 'pg_buffercache', 'pg_freespacemap', 'pg_prewarm', 'pg_stat_statements', \
'pg_trgm', 'pg_visibility', 'pgcrypto', 'pgrowlocks', 'pgstattuple', 'plperl', 'plperlu', 'plpgsql', 'plpython2u', 'plpythonu', 'pltcl', 'pltclu', 'postgres_fdw', \
'refint', 'seg', 'sslinfo', 'tablefunc', 'tcn', 'timetravel', 'tsm_system_rows', 'tsm_system_time', 'unaccent', 'uuid-ossp', 'xml2', 'bool_plperlu', 'bool_plperl'"
Для обновления с типом 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
Проверка портов по умолчанию в БД, pgbouncer, HAProxy#
Выполняется скрипт для получения списка портов:
netstat -tulpn 2>/dev/null | grep -E "postgres|pgbouncer|haproxy" | awk '{print $4}' | awk -F ":" '{print $2}'
Если вывод отличается от значений портов в конфигурации, то будут показаны предупреждения:
{{ control_name }}.WARNING__В кандидате на обновление обнаружено использование старого порта > PGPORT = pgport_old, нерекомендуемого безопасностью.__{{ control_name }}.WARNING
{{ control_name }}.WARNING__В кандидате на обновление обнаружено использование старого pgbouncer > порта pgbouncerport_old, нерекомендуемого \безопасностью.__{{ control_name }}.WARNING
{{ control_name }}.WARNING__В кандидате на обновление обнаружено использование старого haproxy порта haproxyport_old, нерекомендуемого безопасностью.__{{ control_name }}.WARNING
Проверка соотвествия списка учетных записей ролевой модели Postgres SE#
Под пользователем 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
Проверка доступности прав на выполнение некоторых функций для снятия РК переданному пользователю для бекапирования (только для промышленной эксплуатации)#
Проверяется возможность пользователя, переданного на вход через параметр user_for_backup выполнять ряд функций для бекапирования. Если у данного пользователя отсутствует возможность выполнить одну их функций, выводится предупреждение:
{{ control_name }}.WARNING__Пользователь {user_for_backup} не имеет прав на выполнение функции {fuction}. Для данного пользоватея необходимо будет добавить права на выполнение данной функции. В противном случае, служба СРК после обновления не сможет создавать РК в процессе своей работы.__{{ control_name }}.WARNING
Проверка confd#
Если установлен 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
Проверка расширений установленных в системный каталог или в схему public#
Выполняется запрос к БД:
SELECT format('%2$s.%1$s',extname,nspname) extname
FROM pg_catalog.pg_extension ex
JOIN pg_namespace ns ON ex.extnamespace =ns.oid
WHERE (ns.nspname='public') OR (ns.nspname SIMILAR TO '(pg_|information_schema)%' AND ex.extrelocatable);
Если результат запроса не пустой, то выводится предупреждающее сообщение:
{{ control_name }}.WARNING__Установка расширений в схему public или в системный каталог противоречит ВНД. Список расширений, установленных в них (<имя схемы>.<имя расширения>): extension_name__{{ control_name }}.WARNING
Проверка не поддерживаемых типов данных#
Выполняется запрос к БД:
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
Проверка наличия процедур с использованием Python 2.x#
Выполняется запрос к БД:
SELECT format('%1$s.%2$s',ns.nspname,pp.proname) pr_name
FROM pg_proc pp
JOIN pg_catalog.pg_language pl ON pp.prolang =pl.oid
JOIN pg_namespace ns ON pp.pronamespace =ns.oid AND pl.lanname SIMILAR TO 'plpython2?u%';
Если результат запроса не пустой, то выводится не блокирующая выполнение сценария ошибка:
{{ control_name }}.FAIL__Прекращена поддержка языка Python 2.х. Список процедур, использующих их (<имя схемы>.<имя процедуры>): procedure_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-dbms и postgresql-sber-edition, если они оба установлены, то будет выведено сообщение:
"{{ control_name }}.FAIL__На стенде установлено 2 разных пакета Pangolin - platform-v-pangolin-dbms и 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
Вывод информационного сообщения 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 на версию 5.4.0 не производится обновление ролевой модели, пользовательских БД, схем и настройка расширений, которые были добавлены к развертыванию в версиях 5.2.x и выше;
в рамках обновления СУБД Pangolin на версию 5.4.0 не производится пересоздание хранилища паролей, а также добавление новых записей, которые были добавлены к развертыванию в версиях 5.2.x и выше;
в рамках обновления СУБД Pangolin на версию 5.4.0 не производится автоматическое обновление компонента rsyslog. Для этого используется отдельная роль, расположенная в компоненте
installer;в рамках обновления СУБД Pangolin на версию 5.4.0 не производится автоматическая постановка и снятие с паузы monitoring;
в рамках обновления СУБД Pangolin на версию 5.4.0, в том числе в кластерной конфигурации, невозможно избежать простоя БД (в силу сложности задачи). Простой будет наблюдаться в течении всего времени обновления кластера и односерверного решения, исключая подготовительную часть, к которой относятся процессы создания резервной копии, обновления утилит etcd и patroni;
в рамках обновления СУБД Pangolin на версию 5.4.0 обновление стендов с включенной защитой от привилегированных пользователей не рассматривается (такие стенды в дальнейшем будут обновляться в рамках отдельного/специального типа обновления);
к минимальным версиям для установки обновления относятся версии 4.6.1 (и выше) и 5.2.x (и выше). Таблица с поддерживаемыми версиями обновления приведена ниже;
сторонние расширения (не входящие в состав продукта), а также запрещенные и не поддерживаемые новой версией СУБД Pangolin при обновлении СУБД Pangolin на версию 5.4.0:
должны быть заранее заменены аналогами из списка разрешенных расширений;
данные расширения в процессе обновления исключаются из
shared_preload_library;после миграции данных с помощью утилиты
pg_upgrade, версии расширений НЕ переносятся принудительно в схемуext, так как такое действие может вызвать нарушение функционала АС. При обнаружении расширений в схемеpublicустанавливается предупреждениеwarning;
в случае наличия утилиты haproxy, конфигурационный файл
haproxy.cfgне обновляется, остается его версия до обновления;требуется дополнительное дисковое пространство для создания резервной копии, которая необходима для автоматического восстановления версии СУБД в случае неудачной попытки обновления;
не настраивается защищенное SSL-соединение как между компонентами кластера (patroni, etcd, pgbouncer), так и для внешних подключений - SOC, KMS, WatchDog, Zabbix, Tenable, pg_cron, pg_profile. Для этих настроек может быть использован отдельный пользовательский сценарий, реализация которого будет осуществлена позже, или же обновление, отличное от рассматриваемого уровня сложности, подразумевающее обновление конфигурации СУБД;
службе СРК, ввиду того что происходит миграция данных в новую БД и, чтобы избежать неконсистентной РК на ленте СРК, процесс снятия РК (+wal) недоступен;
изменился подход к ограничению на снятие РК во время обновления. Вместо запрета на подключение к БД для УЗ
backup_userзапрещается выполнение функцииpg_start_backup. Также во время обновления происходит подмена скриптовmanage_backup.shиpg_se_archlogs.shна скрипты-заглушки при вызове которых будeт выдан код возврата 164 и сообщение[WARNING] На данный момент СУБД Pangolin находится в процессе обновления, снятие РК невозможно [WARNING], что позволяет запретить снятие РК и WAL-ов во время обновления. После окончания обновления или в процессе автоматического отката данные скрипты возвращаются обратно. При успешном обновлении скриптыmanage_backup.shиpg_se_archlogs.shбудут обновлены. После окончания обновления или в процессе автоматического отката будут возвращены права УЗbackup_userна выполнение функцииpg_start_backup;запрещено запускать скрипты обновления, если на стенде установлен TimescaleDB.
Обновление Pangolin#
Внимание!
Перед выполнением обновления рекомендуется сделать резервную копию базы данных до начала всех работ, чтобы избежать возможных проблем и иметь возможность откатиться к первоначальному состоянию в случае их возникновения.
Чтобы выполнить обновление Pangolin:
Скачайте и распакуйте дистрибутив на сервере.
Перейдите в каталог с распакованным дистрибутивом, а затем в каталог
installer.Перед запуском обновления заполните файл
hosts.iniв зависимости от установленного решения добавив информацию о хостах и учетных данных пользователя, которые будет использовать Ansible.Внимание!
Данные должны содержать те же параметры, что и при установке. Примеры заполнения файлов описаны в разделе «Установка».
Заполните настраиваемый конфигурационный файл
custom_file_sample.yml.Примечание:
При обновлении в секции
3.1.HBA RULESне поддерживаются следующие параметры:ldap_tls;cert_dir;openldap_config.
Заполнять их нет необходимости.
Заполните конфигурационный файл
all.yml.Выполните 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- абсолютный путь до загруженного и распакованного дистрибутива Platform V Pangolin;segment- сегмент сети;stand- dev или prom стенд.
Значения используемых в команде запуска Ansible ключей:
-i- путь до inventory-файла;--extra-vars- переменные, которые по приоритету важнее переменных из inventory;-t- теги для запуска;-v- уровень логирования Ansible. Может быть как пустым, так и -vvvvvv, где запуск без v - минимальное логирование.
После завершения обновления у пользователя postgres в его корневой директории будет сгенерирован файл с названием .process_work_statuses. В нем будет отображатьcя состояние корректности установленных обновлений.
Ниже приведен пример данного файла с конфигурации продукта 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 на версию 5.4.0 производится обновление установленных и доступных для СУБД Pangolin расширений с использованием sql-скрипта.