Обновление#
Данный раздел рассматривает процесс обновления СУБД 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: реализация внутренних процессов#

Схема процесса обновления СУБД 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)%');убедитесь, что значение параметра
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 и выполнить команды из таблицы ниже. Результат выполнения зависит от названия, номера версии и платформы, для которой была выполнена сборка.
Действие |
Команда |
Тип значения |
Примеры выполнения команды |
|---|---|---|---|
Название продукта |
|
Строковое значение |
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 версии |
|
Строковое значение |
{postgres_version} |
|
Числовое значение |
110007 |
|
Номер Pangolin версии |
|
Строковое значение |
{version} |
|
Строковое значение |
Platform V Pangolin {version} |
Время обновления#
В данном разделе приведена информация о произведенных тестовых обновлениях СУБД Pangolin разной конфигурации и версии под нагрузкой.
Методика тестирования:
Установка и обновление продуктов версии:
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 - минорное обновление (патч).
Создание тестовой базы данных и генерация тестовых данных (~100ГБ).
Запуск сценария стабильной нагрузки на время обновления. Алгоритм:
запускается нагрузка, продолжается 5 минут (100TPS);
стартует обновление;
после окончания обновления запускается повторная нагрузка на протяжении 10 минут.
Сравнение результатов
Результаты обновления:
Вариант обновления |
Тип конфигурации |
Время обновления |
|---|---|---|
c 5.5.4 до 6.4.0 |
|
25.3 минут |
|
64.1 минут |
|
c 6.1.8 до 6.4.0 |
|
10.483 минут |
|
22.95 минут |
|
с 6.1.6 до 6.3.1 |
|
9.43 минут |
|
24.183 минут |
|
с 6.4.1 до 6.4.3 |
|
11.03 минут |
|
31.983 минут |
Проверка готовности к обновлению#
Внимание!
В случае, если все пароли указывались в открытом виде, параметры
--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=${} 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:
Скачайте и распакуйте дистрибутив на сервере.
Перейдите в каталог с распакованным дистрибутивом, а затем в каталог
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- абсолютный путь к загруженному и распакованному дистрибутиву 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 с использованием скрипта:
Убедитесь, что на стенде:
нет задержки репликации на узлах кластера Pangolin;
Pangolin работоспособный (есть доступ в базу данных);
отключен мониторинг (фоновых процессов и мониторинг статуса репликации) на время выполнения обновления бинарных файлов;
отсутствует активное резервное копирование.
Скачайте и распакуйте дистрибутив.
Из дистрибутива скопируйте rpm-файл файл
platform-v-pangolin-<Версия Pangolin>-<Версия ОС>.rpmPangolin на узлы кластера.Проверьте наличие утилиты перешифрования в директории
/etc/postgresна узлах Pangolin. Если файлы утилиты перешифрования есть, то скопируйте их из дистрибутиваpangolin-auth-reencryptв каталог/etc/postgresс правамиroot:root 755.Выполните команду для замены бинарных файлов от суперпользователя на узлах с Pangolin:
sudo yum install platform-v-pangolin-dbms-<Версия Pangolin>-<Версия ОС>.rpmУдалите старый каталог, затем создайте на него символьные ссылки:
sudo rm -rf /usr/pangolin-{version-from} sudo ln -sf /usr/pangolin-{version-to} /usr/pangolin-{version-from}Выполните перезапуск Pangolin (restart) в зависимости от типа установки с помощью сервиса
postgresql.serviceилиpatronictl.Проверьте работоспособность Pangolin.
Автоматическое обновление#
Руководство по автоматическому обновлению бинарных файлов Pangolin:
Проверьте, что на стенде:
нет задержки репликации на узлах кластера Pangolin;
Pangolin работоспособный (есть доступ в базу данных);
отключен мониторинг (фоновых процессов и мониторинг статуса репликации) на время выполнения обновления бинарных файлов;
отсутствует активное резервное копирование.
Скачайте и распакуйте дистрибутив.
Скопируйте RPM-файл Pangolin и бинарный файл утилиты
pangolin-auth-reencryptв папкуinstaller/scripts_external/pangolin_update_binary_script/roles/update_binary_script/files.Настройте узлы в
installer/scripts_external/pangolin_update_binary_script/inventories.Ознакомьтесь с переменными по умолчанию в файле
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 # язык интерфейса ОСПерейдите в каталог
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.
Для стендов с Pangolin Manager выполните:
sudo ls -la /usr/patroni/patroni_venv/lib/python3/site-packages/psycopg2_binary.libs/ | grep libpq.soСохраните имя символьной ссылки:
/usr/patroni/patroni_venv/lib/python3/site-packages/psycopg2_binary.libs/libpq-0929ced5.so.5.11В случае кластерной конфигурации переведите его в режим асинхронной потоковой репликации, предварительно проверив, какие значения установлены на стенде, чтобы по окончании обновления их вернуть:
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Безопасно остановите все компоненты СУБД:
# Если нет 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Убедитесь, что все компоненты остановлены:
sudo ps aux | grep -E "pgbouncer|postgres|etcd|patroni|pg_certs_rotate_agent|pangolin_reencrypt@postgres|pangolin_reencrypt@kmadmin_pg" | grep -v grepЕсли команда вернула результат, то выполните:
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Скопируйте бинарный файл утилиты
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/Скопируйте бинарный файл утилиты
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Скопируйте бинарный файл компонента
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Скорректируйте версию 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Скопируйте бинарный файл 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Скорректируйте версию 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Скопируйте бинарный файл 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Обновите СУБД 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Скопируйте сторонние библиотеки:
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 {} \;Установите права на каталоги, необходимые для работы СЗИ:
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Актуализируйте
.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Запустите поочередно каждую службу, проверяя после запуска их состояние. В случае кластерной конфигурации сначала выполните запуск на мастере:
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.
Для стендов с
pangolin-backup-toolsвыполните:sudo ls -la /opt/ansible_venv/lib/python3/site-packages/psycopg2_binary.libs/ | grep libpq.soСохраните имя символьной ссылки:
libpq-0929ced5.so.5.11 -> /usr/pangolin-{version}/lib/libpq.soТолько в случае кластерной конфигурации переведите его в ражим асинхронной потоковой репликации, предварительно проверив какие значения установлены на стенде, чтобы вернуть их в конце обновления:
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Безопасно остановите все компоненты СУБД:
# Если нет 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Убедитесь, что все компоненты остановлены:
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Если команда вернула результат, то выполните:
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Настройте права на каталог
pg_certs_rotate_agent:sudo chmod 0710 /pgerrorlogs/0{major_version}/pg_certs_rotate_agent/Внесите следующие изменения в
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Скопируйте утилиту
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Скопируйте бинарный файл утилиты
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Замените бинарные файлы
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Сохраните конфигурационный файл Pangolin Pooler:
sudo mkdir -p ~/pangolin/backup_pooler/config/ sudo find /etc/pangolin-pooler/ -name "*" -exec cp -r {} ~/pangolin/backup_pooler/config/ \;Обновите 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/*Создайте файл
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Обновите 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Обновите СУБД 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Скопируйте сторонние библиотеки:
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 {} \;Проверьте корректность прав на каталоги для работы СЗИ:
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Актуализируйте
.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Запустите поочередно каждую службу, проверяя после запуска их состояние. В случае кластерной конфигурации сначала выполните запуск на основном узле:
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)Для учета глобальных индексов выполните скрипт:
#!/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.
Для стендов с
pangolin-backup-toolsвыполните:sudo ls -la /opt/ansible_venv/lib/python3/site-packages/psycopg2_binary.libs/ | grep libpq.soСохраните имя символьной ссылки:
libpq-0929ced5.so.5.11 -> /usr/pangolin-{version}/lib/libpq.soПереведите кластер (только в случае кластерной конфигурации) в режим асинхронной потоковой репликации, предварительно зафиксировав значения, установленные на стенде для их возвращения в конце обновления:
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Безопасно остановите все компоненты СУБД:
# Если нет 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Убедитесь, что все компоненты остановлены:
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Если команда вернула результат, то выполните:
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Настройте права на каталог
pg_certs_rotate_agent:sudo chmod 0710 /pgerrorlogs/0{MAJOR_VER}/pg_certs_rotate_agent/Внесите изменения в
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Скопируйте утилиту
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Скопируйте бинарный файл утилиты
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Установите пакет
pangolin_backup_tools:sudo yum install ~/pangolin/pangolin-backup-tools-1.1.0-rhel7.9.x86_64.rpm -yЗаполните конфигурационный файл
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"Сохраните конфигурационный файл Pangolin Pooler:
sudo mkdir -p ~/pangolin/backup_pooler/config/ sudo cp -r /etc/pangolin-pooler/* ~/pangolin/backup_pooler/config/Обновите 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/*Создайте файл
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Обновите 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Обновите СУБД 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Скопируйте сторонние библиотеки:
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 {} \;Проверьте корректность прав на каталоги, необходимые для работы СЗИ:
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Актуализируйте
.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Запустите поочередно каждую службу, проверяя после запуска их состояние. В случае кластерной конфигурации сначала запустите основной узел:
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)Для учета глобальных индексов запустите скрипт:
#!/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. Подготовка ВМ к процедуре обновления ОС#
(Опционально для конфигурации с Pangolin Manager) Введите Pangolin Manager в режим паузы:
sudo -iu postgres pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=true' --force exitОстановите все компоненты СУБД 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Проверьте, что все компоненты корректно остановлены:
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Если на предыдущем шаге была выведена информация, то выполните:
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(Опционально) Для конфигурации с 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. Обновление ОС#
Установите утилиту:
dnf -y install leapp-upgradeСоздайте файл с репозиториями для использования утилиты:
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Замените строки в файле
/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']}, }Уберите проверку
checkinstalledkernels:mv /etc/leapp/repos.d/system_upgrade/common/actors/kernel/checkinstalledkernels /var/tmpОбновите с флагом перезагрузки после завершения:
leapp upgrade --no-rhsm --nogpgcheck –-rebootЗамените репозитории
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Убедитесь в том, что версия ОС была корректна изменена:
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 после обновления ОС#
Остановите все компоненты СУБД 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Обновите 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(Опционально) Восстановите 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/Запустите компоненты СУБД 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(Опционально для конфигурации с Pangolin Manager). Выведите Pangolin Manager из режима паузы:
sudo -iu postgres pangolin-manager-ctl -c /etc/pangolin-manager/postgres.yml edit-config --set 'pause=false' --force exitПерестройте все объекты баз данных, которые используют параметры сортировки по умолчанию:
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Проверьте корректность запуска компонентов.
Без функциональности «Отказ от 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
Возможные проблемы при миграции#
Если при миграции ОС возникла следующая ошибка на этапе проверки (
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)Для миграции есть минимальные требования к характеристикам КТС. Если КТС не соответствует каким-то из параметров, то может быть получена ошибка:
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. Резервное копирование рабочих файлов компонентов#
(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/
(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(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.(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
(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(master) Удалите строку
host replication postgres 127.0.0.1/32 scram-sha-256из файла/pgdata/05/data/pg_hba.confили из файла/etc/patroni/postgres.ymlдля конфигурации сpatroni.(master) Перечитайте обновленный конфигурационный файл БД.
Шаг 2. Подготовительные действия#
(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.shpangolin-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 "Набор проверок не является исчерпывающим. Для обновления рекомендуем использовать автоматизированные скрипты."Ожидаемый результат:

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

Предупреждение
Набор проверок не является исчерпывающим. Для обновления рекомендуется использовать автоматизированные скрипты.
(master, replica, arbiter) Скачайте дистрибутив в рабочий каталог и распакуйте его. Далее по инструкции путь к компонентам дистрибутива будет формироваться с использованием префикса
~/pangolin.Действие по скачиванию дистрибутива:
mkdir -p ~/pangolin tar -xzvf pangolin_6.tar.gz -C ~/pangolin(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(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)(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(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(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(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- имя БД, полученное в результате выполнения запроса выше.(master) Выполните проверку состояния близости БД к пороговому значению заморозки транзакций
autovacuum_freeze_max_age. Для этого выполните следующие действия:Получите возраст заморозки (
max_frozen_age) старейшей из баз:SELECT max(age(datfrozenxid)) max_frozen_age FROM pg_database;Получите системное значение параметра
autovacuum_freeze_max_age:SHOW autovacuum_freeze_max_age;Получите наименьшее значение параметра
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;Возьмите значение, полученное в пункте 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#
(master) В случае конфигурации с
patroniпереведитеpatroniв режим паузы:sudo -iu postgres /usr/patroni/patroni_venv/bin/patronictl -c /etc/patroni/postgres.yml edit-config --set 'pause=true' --force exit(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
(master, replica) Остановите сторонние компоненты:
sudo systemctl stop crond
Шаг 4. Обновление компонента pangolin-auth-reencrypt#
(master, replica) Обновите пакет компонента:
export PANGOLIN_VER=6.4.2 sudo dnf install -y ~/pangolin/utilities/pangolin-auth-reencrypt-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm(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(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#
(master, replica) Обновите пакет компонента:
export PANGOLIN_VER=6.4.2 sudo dnf install -y ~/pangolin/utilities/pangolin-certs-rotate-$PANGOLIN_VER-sberlinux8.8.x86_64.rpm(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#
(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#
(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#
(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(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#
(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(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#
(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#
(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#
(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/
(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(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(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(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(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(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(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>(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(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. Завершающие действия#
(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(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(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#
(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
(master) Запустите сторонние сервисы:
sudo systemctl restart crond(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(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