Установка#
Platform V Pangolin — система управления базами данных, основанная на PostgreSQL. В данном руководстве описываются аспекты Pangolin, связанные с установкой системы.
Документ предназначен для администраторов и специалистов по безопасности, отвечающих за установку и обновление продукта.
Примечание:
Перед прочтением документа рекомендуется ознакомиться с используемыми терминами и сокращениями.
Диаграмма процесса развертывания Pangolin#
Внимание!
В установке standalone-версии продукта участвуют две машины. Первая - откуда производится запуск ansible-установщика, вторая - целевая, куда разворачивается продукт.
Диаграмма процесса развертывания Pangolin:

Подготовительные действия#
Перед началом установки сформируйте единый дистрибутив Platform V Pangolin из zip-пакета:
Получите архив zip-пакета и выполните команду распаковки:
unzip -q <имя zip-пакета>.zipПерейдите в каталог с распакованным zip-пакетом и выполните запуск скрипта по формированию единого дистрибутива:
sh PSQ-<version>-unpacker-distrib.sh
Результатом выполнения будет единый дистрибутив в формате tar.gz (пример: PSQ-<version>-distrib.tar.gz), предназначенный для установки Pangolin.
Автоматическая установка#
Установка СУБД Pangolin в автоматическом режиме осуществляется с помощью системы управления конфигурациями Ansible и состоит из этапов:
- развертывание Pangolin без дополнительных настроек (`playbook_install.yaml`);
- развертывание ролевой модели, пользовательской БД, схем и расширений (`installer/scripts_external/configure_roles/playbook_configure_roles.yaml`);
- развертывание пакетов для системы резервного копирования (СРК) (`installer/scripts_external/SRC/playbook_SRC.yaml`);
- развертывание rsyslog (`installer/scripts_external/rsyslog/playbook_rsyslog.yaml`);
- настройка monitoring (`installer/scripts_external/monitoring/playbook_monitoring.yaml`).
Внимание!
В процессе установки системы автоматически создается пользователь
postgres, а также, в файлsudoerc, добавляется строка с правами для управления Pangolin.
Выполните команду распаковки:
tar -xzf <имя дистрибутива>.tar.gzВнимание!
Установку необходимо запускать на отдельной машине, а не на одном из узлов кластера.
Перейдите в каталог с распакованным дистрибутивом, а затем в каталог
installer:cd /tmp/YourCatalog/installerПеред запуском установки заполните файл
hosts.iniв зависимости от конфигурационного решения (standalone/cluster). Добавьте информацию о хостах и учетных данных пользователя, которые будет использовать Ansible.Файл
hosts.iniзаполняется в соответствии с шаблоном:standalone (
installer/inventories/standalone/hosts.ini);cluster (
installer/inventories/cluster/hosts.ini).
Файл
hosts.iniсостоит из нескольких групп (имена определены в скобках), которые используются для классификации и определения того, какие хосты будут использоваться. Для установки необходимо заполнить переменные группыpostgres_nodesиetcd_nodes(для claster).ansible_host— в случае установки по ip-адресу указываем ip_address, в случае установки по имени DNS укажите hostname;ansible_user— имя пользователя для использования при подключении к хосту. Должен иметь права для эскалации доroot, то есть должен иметь возможность выполнять все команды от имениroot;переменная
ansible_passwordдолжна содержать пароль пользователя в чистом виде или имя переменной, которая будет содержать зашифрованный с помощьюansible-vaultпароль.
Внимание!
Конфигурационные файлы и сценарии, приведенные в данном руководстве являются примерами. Может потребоваться корректировка значений параметров и переменных, указанных в них, под каждый конкретный случай установки.
Ниже представлены шаблоны файла
hosts.iniдля standalone и cluster архитектур.hosts.ini для standalone:
[standalone:children] postgres_group [postgres_group:children] postgres_nodes [postgres_group:vars] ansible_connection=ssh [postgres_nodes] master ansible_host=host.local ansible_user=usertest ansible_password=passwordtest # в случае установки по имени DNShosts.ini для cluster:
[cluster:children] postgres_group etcd_group [postgres_group:children] postgres_nodes [etcd_group:children] etcd_nodes [postgres_group:vars] ansible_connection=ssh [etcd_group:vars] ansible_connection=ssh [postgres_nodes] master ansible_host=127.0.0.1 ansible_user=usertest ansible_password=passwordtest # в случае установки по IP-адресу replica ansible_host=127.0.0.2 ansible_user=usertest ansible_password=passwordtest # в случае установки по IP-адресу [etcd_nodes] etcd ansible_host=127.0.0.3 ansible_user=usertest ansible_password=passwordtest # в случае установки по IP-адресуВнимание!
Если в файле
hosts.iniпеременнаяansible_passwordсодержитansible-vault, то пароль необходимо зашифровать. Ниже приведен пример шифрования текстаpasswordtestс помощьюansible-vault:ansible-vault encrypt_string passwordtest New Vault password: Confirm New Vault password: !vault | $ANSIBLE_VAULT;1.1;AES256 37336564633635636235643262336362353963363639323737643166393764623266643033353263 3534346339646333613939333939666437346433353866370a393833346261326536396335623732 63303438393262333038373832646136313933623735646330366435343933653537353162613835 3230393434373439610a333533646331346163626633613362643131326531383835623030376634 3038 Encryption successfulВ случае, когда пароли для хостов групп
postgres_groupиetcd_groupсовпадают, достаточно вывод командыansible-vaultпоместить в inventory-файлсluster.yml/standalone.yml, расположенный в каталогеinventories/(standalone/cluster)/group_vars. Аналогичным образом необходимо перешифровать пароли в файлеcustom_file_sample.ymlпример файла тем же ключом, которым был зашифрован пароль для учетной записи в текущем шаге. Рекомендации по заданию паролей приведены в документе «Руководство по безопасности», раздел «Рекомендации по заданию стойких паролей».Примечание:
Узнать подробнее о Ansible inventory можно в документации Ansible.
Заполните настраиваемый конфигурационный файл
custom_file_sample.yml.Пример конфигурационного файла
custom_config_sample.yml, который можно использовать для развертывания продукта со значениями по умолчанию или с минимальными корректировками, находится в каталогеtemplates. Посколькуcustom_config_sample.ymlявляется примером и вариантом готового решения, некоторые секции и параметры были перенесены вcustom_config_initial.yml.custom_config_initial.yml- конфигурационный файл, содержащий все динамически настраиваемые параметры СУБД Pangolin. При необходимости их можно переопределить в файлеcustom_config_sample.yml.Примечание:
Подробное описание всех существующих параметров файла
custom_file_sample.ymlпредставлено здесь.Подробное описание всех существующих параметров файла
custom_config_initial.ymlпредставлено здесь.Сгенерируйте сертификаты, в случае, если в настраиваемом конфигурационном файле выше было выставлено значение для параметра:
ssl_mode: trueи/илиpkcs12_plugin_enable: true.На текущий момент кластер можно развернуть с включенной аутентификацией SSL и без нее. Для подключения к СУБД под УЗ postgres используются самоподписные сертификаты. Если данный параметр
ssl_modeв положенииfalse, то скрипты развертывания и обновления продукта сгенерируют временные сертификаты. Целью включения аутентификации является обеспечение безопасного взаимодействия компонентов внутри кластера.Если активирован параметр
pkcs12_plugin_enable: true, то сертификаты должны быть сгенерированы в формате PKCS#12 или будут получены из SecMan, в зависимости от заполненных значений в пользовательском конфигурационном файле. Подробнее читайте в документе «Руководстве по системному администрированию», раздел «Использование сертификатов PKCS#12 в кластере Pangolin»Для поиска или генерации сертификата в SecMan необходимо активировать параметр
use_remote_pki: trueи заполнить атрибуты в разделеp12_secman:для каждого сертификата.При включенном параметре (ssl_mode: true) скрипты развертывания и обновления продукта осуществляют ряд проверок для сертификатов в формате PEM:
Определяют расположение сертификатов по путям из параметров соответствующего компонента (параметры из секции 3.2.SECURITY SETTINGS (SSL) -
pg_certs_pwd) и проверяют их наличие.Проверяют CN в Subject сертификата. Для «серверных» осуществляется проверка соответствия CN=FQDN, для «клиентских» (postgres, patroni, patronietcd, pgbouncer) CN=login.
Проверяют актуальность сертификата по времени.
Если сертификаты являются недействительными или отсутствует директория с сертификатами, то будет выведена блокирующая ошибка. Примеры ошибок:
"{{ control_name }}.FAIL__Файл сертификата '/home/postgres/ssl/root.crt' не найден на хосте. Проверьте наличие файла и значение в пользовательском конфигурационном файле - 'custom_config.yml'__{{ control_name }}.FAIL" "{{ control_name }}.FAIL__Публичный сертификат 'server.crt' не соответствует приватному ключу 'server.key' на сервере master__{{ control_name }}.FAIL" "{{ control_name }}.FAIL__СommonName субъекта сертификата 'server.crt' не соответствует его идентификатору - 'common_name'__{{ control_name }}.FAIL" "{{ control_name }}.FAIL__Cертификат '/home/postgres/ssl/client.crt' на хосте master просрочен__{{ control_name }}.FAIL"Ниже приведен пример скрипта для генерации сертификатов и распространения их на указанные виртуальные машины:
#!/bin/sh # IP/DNS-записи хостов. hosts_list=(127.0.0.1 127.0.0.2 127.0.0.3) # Пароль пользователя с root правами. ssh_password=(TestPassword!) # Пользователь с root-правами. ssh_user=(admin_dev) mkdir ssl cd ssl ######Genera openssl req -new -nodes -text -out ./root.csr -keyout ./root.key -subj "/CN=PGSEdevCA" openssl x509 -req -in ./root.csr -text -days 3650 -extfile /etc/pki/tls/openssl.cnf -extensions v3_ca -signkey ./root.key -out ./root.crt openssl req -new -nodes -text -out ./client.csr -keyout ./client.key -subj "/CN=postgres" openssl x509 -req -in ./client.csr -text -days 3650 -CA ./root.crt -CAkey ./root.key -CAcreateserial -out ./client.crt openssl req -new -nodes -text -out ./patroni.csr -keyout ./patroni.key -subj "/CN=patroni" openssl x509 -req -in ./patroni.csr -text -days 3650 -CA ./root.crt -CAkey ./root.key -CAcreateserial -out ./patroni.crt openssl req -new -nodes -text -out ./patronietcd.csr -keyout ./patronietcd.key -subj "/CN=patronietcd" openssl x509 -req -in ./patronietcd.csr -text -days 3650 -CA ./root.crt -CAkey ./root.key -CAcreateserial -out ./patronietcd.crt openssl req -new -nodes -text -out ./pgbouncer.csr -keyout ./pgbouncer.key -subj "/CN=pgbouncer" openssl x509 -req -in ./pgbouncer.csr -text -days 3650 -CA ./root.crt -CAkey ./root.key -CAcreateserial -out ./pgbouncer.crt rm *.csr ######Copy_certs_on_nodes_and_generate_server_cert for host in ${hosts_list[@]} do sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'sudo rm -rf /pg_ssl && sudo mkdir /pg_ssl && sudo chown $(whoami):$(whoami) /pg_ssl' sshpass -p ${ssh_password} scp ./* ${ssh_user}@${host}:/pg_ssl sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'cat << EOT >> /pg_ssl/server.conf [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] [ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names [ ssl_client ] extendedKeyUsage = clientAuth, serverAuth basicConstraints = CA:FALSE subjectKeyIdentifier=hash authorityKeyIdentifier=keyid,issuer subjectAltName = @alt_names [ v3_ca ] basicConstraints = CA:TRUE keyUsage = nonRepudiation, digitalSignature, keyEncipherment subjectAltName = @alt_names authorityKeyIdentifier=keyid:always,issuer [alt_names] EOT' sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'cd /pg_ssl && echo DNS.1 = $(hostname -f) >> server.conf && echo IP.1 = $(hostname -i) >> server.conf && openssl req -new -nodes -text -out ./server.csr -keyout ./server.key -subj "/CN=$(hostname -f)" -config $(echo ./server.conf)' sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'cd /pg_ssl && openssl x509 -req -in ./server.csr -text -days 3650 -CA ./root.crt -CAkey ./root.key -CAcreateserial -out ./server.crt -extensions ssl_client -extfile $(echo ./server.conf)' sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'sudo chmod 0600 /pg_ssl/*.key && sudo chmod 0644 /pg_ssl/*.crt' sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'cd /pg_ssl && cat server.key server.crt >> haproxy.crt' ###/etc/pki/ca-trust/source/anchors/ - 'RedHat' /etc/pki/tls/openssl.cnf\ - 'Altlinux' ### sshpass -p ${ssh_password} ssh -o StrictHostKeyChecking=no -p 22 ${ssh_user}@${host} 'sudo cp /pg_ssl/root.crt /etc/pki/ca-trust/source/anchors/ && sudo update-ca-trust' doneДанные сертификаты не будут подписаны, но будут являться минимальными требуемыми для установки. После установки продукта Pangolin необходимо подписать данные сертификаты в удостоверяющем центре.
Выполните ansible-сценарий. Пример:
ansible-playbook playbook_install.yaml -i inventories/cluster/hosts.ini -t always,cluster-patroni-etcd-pgbouncer -vv -e '{"as_admins":['admin_1', 'admin_2']}' -e '{"as_TUZ":['tuz_1']}' --extra-vars 'local_distr_path=/root/nv installation_type=cluster PGPORT=5433 PGDATA=/pgdata/05/data PGLOGS=/pgerrorlogs/05 tablespace_name=tbl_name tablespace_location=/pgdata/05/tablespaces schema_name=shema tag=cluster-patroni-etcd-pgbouncer db_name=first_db clustername=clustername segment=sbercloud custom_config=templates/custom_config_sample.yml stand=${}' --ask-become-pass --ask-vault-passСкрипты развертывания и обновления поддерживают следующие виды конфигураций:
standalone-postgresql-only;
standalone-postgresql-pgbouncer;
standalone-patroni-etcd-pgbouncer;
cluster-patroni-etcd-pgbouncer;
cluster-patroni-etcd-pgbouncer-haproxy.
Внимание!
Начиная с версии 6.x.x Pangolin установка версии cluster-patroni-etcd-pgbouncer-haproxy будет выполняться без автоматической настройки HAProxy. На текущий момент скрипты развертывания HAProxy помещены в компоненте
installerв директориюdeprecated_scriptsи в дальнейшем будут удалены. Роль развертывания HAProxy расположена в компонентеinstallerв директориюscripts_external/HAProxy.Запуск установки осуществляется из каталога
installer. Ниже приведены шаблоны ansible-сценариев для установки односерверного и кластерного решений:Установка односерверного решения Pangolin с pgBouncer:
ansible-playbook playbook_install.yaml \ -i inventories/standalone/hosts.ini \ -t always,standalone-postgresql-pgbouncer \ -vv \ -e '{"as_admins":['test_admin']}' \ -e '{"as_TUZ":['test_tuz']}' \ --extra-vars 'local_distr_path=${} \ installation_type=standalone \ PGPORT=${} \ PGDATA=${} \ PGLOGS=${} \ tablespace_name=${} \ tablespace_location=${} \ schema_name=${} \ tag=standalone-postgresql-pgbouncer \ db_name=${} \ clustername=${} \ segment=${} \ custom_config=${} \ stand=${}' \ --ask-vault-passУстановка кластерного решения Pangolin с patroni, etcd и pgBouncer:
ansible-playbook playbook_install.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer \ -vv \ -e '{"as_admins":['test_admin']}' \ -e '{"as_TUZ":['test_tuz']}' \ --extra-vars 'local_distr_path=${} \ installation_type=cluster \ PGPORT=${} \ PGDATA=${} \ PGLOGS=${} \ tablespace_name=${} \ tablespace_location=${} \ schema_name=${} \ tag=cluster-patroni-etcd-pgbouncer \ db_name=${} \ clustername=${} \ segment=${} \ custom_config=${} \ stand=${}' \ --ask-vault-passУстановка кластерного решения Pangolin с patroni, etcd, pgBouncer и HAProxy:
ansible-playbook playbook_install.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer-haproxy \ -vv \ -e '{"as_admins":['test_admin']}' \ -e '{"as_TUZ":['test_tuz']}' \ --extra-vars "local_distr_path=${} \ installation_type=cluster \ PGPORT=${} \ PGDATA=${} \ PGLOGS=${} \ tablespace_name=${} \ tablespace_location=${} \ schema_name=${} \ tag=cluster-patroni-etcd-pgbouncer-haproxy \ db_name=${} \ clustername=${} \ segment=${} \ custom_config=${} \ stand=${}' \ manual_run=yes' \ --ask-vault-passПример рабочего ansible-сценария для установки кластерного решения Pangolin с patroni, etcd, pgBouncer:
ansible-playbook playbook_install.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer \ -vv \ -e '{"as_admins":['admin_1', 'admin_2']}' \ -e '{"as_TUZ":['tuz_1']}' \ --extra-vars 'local_distr_path=/home/admin/521 \ installation_type=cluster \ PGPORT=5433 \ PGDATA=/pgdata/05/data \ PGLOGS=/pgerrorlogs/05 \ tablespace_name=tbl_name \ tablespace_location=/pgdata/05/tablespaces \ schema_name=shema \ tag=cluster-patroni-etcd-pgbouncer \ db_name=first_db \ clustername=clustername \ segment=sbercloud \ custom_config=templates/custom_config_sample.yml \ stand=${}' \ --ask-vault-passВнимание!
После установки будут созданы символические ссылки для следующих директорий:
- /pgdata/data -> /pgdata/05 - /usr/pangolin -> /usr/pangolin-5.4.0 - /usr/pgsql-se-05 -> /usr/pangolin-5.4.0
Значения используемых в команде запуска Ansible ключей:
-i— путь до inventory-файла;-t— теги для запуска;-vv— уровень логирования Ansible. Может быть как пустым, так и-vvvvvv, где запуск безv- минимальное логирование;-e,--extra-vars— переменные, которые по приоритету важнее переменных из inventory;--ask-become-pass– запрос пароля на запуск командsudo(повышение привилегий на выполнение команд). Пароль используется для всех хостов;--ask-vault-passили--vault-password-file— расшифровка зашифрованных файлов во время выполнения.
Внимание!
Для зашифровки паролей в примерах выше, использовался следующий ansible-vault пароль:
postgreSQL_SE_654321.
Используемые переменные:
as_admins— Active Directory логин или логины будущих администраторов АС. Если логинов несколько, то они указываются через запятую, без пробелов. Например-e '{"as_admins":['admin, test_admin]}';as_TUZ— логины ТУЗ, которые будут созданы в результате установки. Если логинов несколько, то они указываются через запятую, без пробелов. Например-e '{"as_TUZ":['tuz, test_tuz]}';local_distr_path— абсолютный путь до загруженного и распакованного дистрибутива Platform V Pangolin;PGPORT— порт для взаимодействия с базой данных Pangolin;PGDATA— полный путь до каталога, где будет расположена инициализированная база данных;PGLOGS— полный путь до каталога, где будут расположены логирующие файлы;tablespace_name— имя табличного пространства, которое будет создано в результате установки;tablespace_location— полный путь до каталога, где будет расположено созданное табличное пространство;schema_name— имя схемы, которая будет создана в результате установки;db_name— имя базы данных, которая будет создана в результате установки;clustername— название кластера;segment— сегмент сети;custom_config— абсолютный путь до файла конфигурацииcustom_file.yml;stand— DEV/PROM-стенд;
Внимание!
В случае, если все пароли указывались в открытом виде, параметр
--ask-vault-passи--vault-password-file=название_файла_с_ключемдобавлять не нужно!
Внимание!
В случае, если вам необходимо развернуть стенд с дополнительными настройками ролевой модели, пользовательской БД, схемами и расширениями необходимо отдельно запустить
playbook_configure_roles.yamlили sh-скриптrun_configure.shразвертывания ролевой модели, который располагается в компонентеinstallerпо путиscripts_external/configure_roles/configure_roles/templates/role_BASIC/run_configure.sh. Ролевая модель и скрипты ее настройки описаны в документе «Руководство по системному администрированию», раздел «Ролевая модель и права доступа».
Пример рабочего ansible-сценария развертывания дополнительных настроек ролевой модели, пользовательской БД и расширений с помощью ansible роли:
ansible-playbook playbook_configure_roles.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer \ -vv \ -e '{"as_admins":['test_admin']}' \ -e '{"as_TUZ":['test_tuz']}' \ --extra-vars "local_distr_path=${} \ PGPORT=${} \ PGDATA=${} \ PGLOGS=${} \ tablespace_name=${} \ tablespace_location=${} \ schema_name=${} \ tag=cluster-patroni-etcd-pgbouncer \ db_name=${} \ custom_config=${} \ --ask-vault-passИспользуемые переменные:
as_admins— Active Directory логин или логины будущих администраторов АС. Если логинов несколько, то они указываются через запятую, без пробелов. Например-e '{"as_admins":['admin, test_admin]}';as_TUZ— логины ТУЗ, которые будут созданы в результате установки. Если логинов несколько, то они указываются через запятую, без пробелов. Например-e '{"as_TUZ":['tuz, test_tuz]}';local_distr_path— абсолютный путь до загруженного и распакованного дистрибутива Platform V Pangolin;PGPORT— порт для взаимодействия с базой данных Pangolin;PGDATA— полный путь до каталога, где будет расположена инициализированная база данных;PGLOGS— полный путь до каталога, где будут расположены логирующие файлы;tablespace_name— имя табличного пространства, которое будет создано в результате установки;tablespace_location— полный путь до каталога, где будет расположено созданное табличное пространство;schema_name— имя схемы, которая будет создана в результате установки;db_name— имя базы данных, которая будет создана в результате установки;custom_config— абсолютный путь до файла конфигурацииcustom_file.yml;
Внимание!
В случае, если не планируется использовать
custom_config, есть возможность настройки параметров запуска через файлvariables.yml, расположенный в ролиconfigure_roles(scripts_external/configure_roles/group_vars/variables.yml).Пример рабочего сценария развертывания дополнительных настроек ролевой модели, пользовательской БД и расширений с помощью запускаемого bash-скрипта:
sh ./role_BASIC/run_configure.sh -d First_db -s Sch1 -t Tbl_t -l /pgdata/05/tablespaces -m srv-0-xxx.db.dev.sbt -r srv-0-xxx.db.dev.sbt -p 5433 -a 'user1 user2' -u 'user3 user4' -w /home/postgres/role_BASIC -c "0,30 * * * *" -g "'as_admin_pass':SCRAM-SHA-256$4096:2H6ypfV3DJP0LUZLrSnPsA==$yOIhGySEsNiY9p91PkJ5a2/kUQhxAwzUAQcjwCHov3A=:gd7X+KDJ+4GY44H9Xelan5dkhLwLLyDZLrhw4LhmDo8= 'as_tuz_pass':SCRAM-SHA-256$4096:TTysuRbQcMM3tOQAoR7LWg==$t89DzT7Y92HXMQxolmGXxG8AGQPvu/yDWV4leOAXiO0=:0vZGdq40uKFLLzfzB2JJ9SD1Ei8rxSObHUlPUcdHByM=" -f "'pg_profile':True 'rotate_password':True 'psql_lockmon_is_enable':True" -e 'infinity' -v 'TEMPORARY' -k 'backup_user' -z false -o 'en_US.UTF-8' -n 'postgres'Используемые параметры:
d,dbname– имя пользовательской БД;s,schname– имя пользовательской схемы;t,tsname– имя пользовательского табличного пространства;l,tsloc- путь до табличного пространства;m,mhost- ip-адрес хоста мастера (данный параметр является обязательным, так как используется для настройки расписания pg_cron);r,rhostip-адрес хоста реплики (данный параметр является обязательным, так как используется для настройки расписания pg_cron);p,port- порт postgres;a,asadm– список ТУЗ as_admin;u,astuz- список ТУЗ as_TUZ;w,way- путь до папки со скриптами конфигурирования (данный параметр является обязательным);c,cronp- период времени для cron job pg_profile;g,grpas- список паролей для УЗ (передается в виде словаря, например:as_admin_pass':passwd1 'zabbix_pass':passwd2);f,fchlst- список включаемой функциональности при развертывании (передается в виде словаря, например:'pg_profile':True 'rotate_password':False);e,expdt- параметр времени жизни УЗ (expire date);v,vrpas- флаг, указывающий на использование временных паролей;k,backusname- имя пользователя для бекапирования( по умолчанию backup_user);z,tdeadm- включить/выключить TDE;o,locale- параметр для определения locale при создании пользовательской БД( должен совпадать с параметром, установленным при развертывании);n,prdbname- имя пользовательской БД, где будет создан pg_profile;
Внимание!
В случае, если необходимо развернуть стенд с дополнительными настройками системы резервного копирования (СРК), необходимо отдельно запустить
playbook_SRC.yaml, который располагается в компонентеinstallerпо путиscripts_external/SRC.Пример рабочего ansible-сценария развертывания СРК с помощью ansible роли:
ansible-playbook playbook_SRC.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer \ -vv \ --extra-vars "local_distr_path=${} \ installation_type=cluster \ operation_type = initialize_pg_server \ PGPORT=${} \ PGDATA=${} \ PGLOGS=${} \ tablespace_name=${} \ tablespace_location=${} \ schema_name=${} \ tag=cluster-patroni-etcd-pgbouncer \ db_name=${} \ clustername=${} \ custom_config=${} \ --ask-vault-pass
> **Внимание!**
>
> В случае, если необходимо развернуть стенд с дополнительными настройками rsyslog, необходимо отдельно запустить `playbook_rsyslog.yaml`, который располагается в компоненте `installer` по пути `scripts_external/rsyslog`.
Пример рабочего ansible-сценария развертывания СРК с помощью ansible роли:
ansible-playbook playbook_rsyslog.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer \ -vv \ --extra-vars "local_distr_path=${} \ installation_type=cluster \ tag=cluster-patroni-etcd-pgbouncer \ --ask-vault-pass
> **Внимание!**
>
>
> В случае, если необходимо развернуть стенд с дополнительными настройками monitoring, необходимо отдельно запустить `playbook_monitoring.yaml`, который располагается в компоненте `installer` по пути `scripts_external/monitoring`.
Пример рабочего ansible-сценария развертывания СРК с помощью ansible роли:
ansible-playbook playbook_monitoring.yaml \ -i inventories/cluster/hosts.ini \ -t always,cluster-patroni-etcd-pgbouncer \ -vv \ --extra-vars "local_distr_path=${} \ installation_type=cluster \ tag=cluster-patroni-etcd-pgbouncer \ monitoring_zabbix = True \ diuid=value_id --ask-vault-passИспользуемые параметры:
monitoring_zabbix- параметр для установки стенда на мониторинг;duid- уникальный идентификатор, генерируемый на портале ДИ.
Действия, которые необходимо выполнить, в случае неудачной установки#
В случае, если установка прошла неудачно:
Перед началом новой установки необходимо зачистить КТС. Для этого выполните:
sudo systemctl stop patroni; sudo systemctl stop pgbouncer; sudo systemctl stop etcd; sudo systemctl stop confd; sudo yum remove python-psycopg2 -y; sudo pip uninstall psycopg2-binary -y; sudo yum remove postgresql-sber-edition -y; sudo yum remove etcd -y; sudo pip uninstall patroni -y; sudo yum remove confd -y; sudo yum remove haproxy -y; sudo rm -rf /usr/local/pgsql/; sudo rm -rf /usr/pgsql-se-04.003.00/; sudo rm -rf /usr/pgsql-se-04/; sudo rm -rf /usr/pgsql-se-05/; sudo yum remove -y etcd postgresql-sber-edition; sudo su -c "rm -rf /pgsql/"; etcdctl rm service/clustername/initialize; sudo rm -rf /etc/etcd; sudo rm -rf /etc/confd; sudo rm -rf /etc/pgbouncer; sudo rm -rf /etc/patroni; sudo rm -rf /pgdata/; sudo rm -rf /pgerrorlogs/; sudo rm -rf /pgbackup/; sudo yum remove pg_probackup-11 -y; sudo rm -rf /pgarclogs/; sudo userdel -r postgres; sudo rm -rf /home/postgres/; sudo rm -rf /var/lib/etcd/; sudo sed -i '/\/usr\/local\/sbin\/dynmotd.sh/d' /etc/profile; sudo sed -i '/# Dynamic motd/d' /etc/profile; sudo sed -i '/postgres ALL=(ALL) NOPASSWD: \/usr\/bin\/systemctl stop postgresql/d' /etc/sudoers; sudo rm -rf /etc/postgres/*; sudo rm -rf /usr/patroni/; sudo rm -rf /opt/confd; sudo rm -rf /tmp/PGSE/; sudo yum remove -y rh-python36-python; sudo rm -rf /etc/postgres/; sudo rm -f /etc/systemd/system/confd.service; sudo rm -f /etc/systemd/system/etcd.service; sudo rm -f /etc/systemd/system/patroni.service; sudo rm -f /etc/systemd/system/pgbouncer.service; sudo rm -f /etc/systemd/system/postgresql.service; sudo rm -f /etc/systemd/system/haproxy.service; sudo rm -rf /usr/pgsql-se-old/; sudo rm -rf /usr/pangolin-5.2.0/; sudo systemctl stop pangolin_reencrypt@kmadmin_pg; sudo systemctl stop pangolin_reencrypt@postgres; sudo rm -f /etc/systemd/system/pangolin_reencrypt@.service; sudo rm -rf /var/run/pangolin_reencrypt; sudo systemctl daemon-reload; sudo userdel -r kmadmin_pg; sudo rm -f /usr/local/bin/pgbouncer; sudo rm -rf /opt/pangolin-common; sudo rm -rf /usr/pangolin*;Необходимо очистить файл
./installer/cache.json, а также добавить ключ--flush-cacheпри повторном запуске установки (см. пункт 6 раздела «Автоматическая установка»).
Установка в ручном режиме#
Установка на ОС Альт СП 8#
Создайте директорию с дистрибутивом Pangolin.
mkdir distribПоместите дистрибутив Pangolin в директорию
distrib.Распакуйте дистрибутив Pangolin.
tar -xf docker-builds-altsp8-1638-distrib.tar.gzУстановите пакет
platform-v-pangolin-dbms-05.002.01-rhel7.9.x86_64.rpm.sudo apt-get install platform-v-pangolin-dbms-05.002.01-altlinux8.2.x86_64.rpmСоздайте директорию
$PGDATAи/pgerrorlogs.sudo mkdir -p /pgdata/05/ sudo chown -R postgres:postgres /pgdata/05/ sudo mkdir -p /pgerrorlogs/05 sudo chown postgres:postgres /pgerrorlogs/05Переключитесь на пользователя postgres (если такого нет, то создайте).
sudo su - postgresДобавьте строку окружения в
~/.bash_profile.vim ~/.bash_profile umask 022 export LD_LIBRARY_PATH=/usr/pangolin-5.4.0/lib export PATH=$PATH:/usr/pangolin-5.4.0/bin export PG_PLUGINS_PATH=/usr/pangolin-5.4.0/lib export PGHOME=/usr/pangolin-5.4.0 export PGDATABASE=postgres export PGUSER=postgres export PGHOST=10.40.0.93 export PGPORT=5433 export PGCLIENTENCODING=UTF8 export CLNAME=clustername export PGSSLCERT=/pg_ssl/client.crt export PGSSLKEY=/pg_ssl/client.key export PGSSLROOTCERT=/pg_ssl/root.crt NOW=$(date +"%Y-%m-%d") export PGDATA=/pgdata/05/data export MANPATH=$MANPATH:$PGHOME/share/man . ~/.bash_profileРазверните СУБД.
initdb -k -D /pgdata/05/data/Отредактируйте файл параметров
vim $PGDATA/postgresql.conf.listen_addresses = '*' port = 5433 max_connections = 100 superuser_reserved_connections = 3 enabled_extra_auth_methods = 'peer, trust'Отредактируйте файл параметров
vim $PGDATA/pg_hba.conf.local all all peer host all all 0.0.0.0/0 trustЗапустите экземпляр Pangolin.
pg_ctl -D /pgdata/05/data/ -l /pgerrorlogs/05/postgresql.log startВыполните команду:
[16:41:22 postgres@srv-0-211 ~]$ psql psql (13.4) Type "help" for help. postgres=#
Установка на ОС Red Hat Enterprise Linux 7#
Создайте директорию с дистрибутивом Pangolin.
mkdir distribПоместите дистрибутив Pangolin в директорию
distrib.Распакуйте дистрибутив Pangolin.
tar -xf docker-builds-rhel7-1654-distrib.tar.gzУстановите пакет
platform-v-pangolin-dbms-05.002.01-rhel7.9.x86_64.rpm.sudo yum -y install platform-v-pangolin-dbms-05.002.01-rhel7.9.x86_64.rpmСоздайте директорию
$PGDATAи/pgerrorlogs.sudo mkdir -p /pgdata/05/data sudo chown -R postgres:postgres /pgdata/05/ sudo mkdir /pgerrorlogs sudo chown postgres:postgres /pgerrorlogs/05Переключитесь на пользователя postgres (если такого нет, то создайте).
sudo su - postgresДобавьте строку окружения в
~/.bash_profile.vim ~/.bash_profile export PATH=$PATH:/usr/pangolin-5.4.0/bin export MANPATH=$MANPATH:/usr/pangolin-5.4.0/share/man . ~/.bash_profileРазверните СУБД.
initdb -k -D /pgdata/05/data/Отредактируйте файл параметров
vim $PGDATA/postgresql.conf.listen_addresses = '*' port = 5433 max_connections = 100 superuser_reserved_connections = 3 enabled_extra_auth_methods = 'peer, trust'Отредактируйте файл параметров
vim $PGDATA/pg_hba.conf.local all all peer host all all 0.0.0.0/0 trustЗапустите экземпляр Pangolin.
pg_ctl -D /pgdata/05/data/ -l /pgerrorlogs/05/postgresql.log startВыполните команду:
[16:41:22 postgres@srv-0-211 ~]$ psql psql (13.4) Type "help" for help. postgres=#
etcd#
Примечание:
Установка и настройка дополнительных компонентов системы, не входящих в состав дистрибутива Pangolin, описаны здесь.
В кластере Platform V Pangolin для хранения информации о состоянии кластера patroni используется хранилище etcd версии 3.3.11 (устанавливается инсталлятором).
sudo systemctl yum install etcd
Настройка etcd#
Для настройки сервиса откройте файл параметров etcd.service и укажите в нем следующие параметры:
Sudo vi /etc/systemd/system/etcd.service
[Unit]
Description=etcd Server
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
Type=notify
WorkingDirectory=/var/lib/etcd/
EnvironmentFile=-/etc/etcd/etcd.conf
User=etcd
### set GOMAXPROCS to number of processors
ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd"
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
node-1 /etc/etcd/etcd.conf
[pprb_dev@tkle-pprb0100 ~]$ sudo cat /etc/etcd/etcd.conf | grep -v ^#
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node-01"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://${HOST_VM1}:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://${HOST_VM1}:2379"
ETCD_INITIAL_CLUSTER="node-01=http://${HOST_VM1}:2380,node-02=http://${HOST_VM2}:2380,node-03=http://${HOST_VM3}:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
node-02 /etc/etcd/etcd.conf
[pprb_dev@tkle-pprb0095 ~]$ sudo cat /etc/etcd/etcd.conf | grep -v ^#
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node-02"
`ETCD_HEARTBEAT_INTERVAL`="1000"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://${HOST_VM2}:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://${HOST_VM2}:2379"
ETCD_INITIAL_CLUSTER="node-01=http://${HOST_VM1}:2380,node-02=http://${HOST_VM2}:2380,node-03=http://${HOST_VM3}:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
node-03 /etc/etcd/etcd.conf
[pprb_dev@tkle-pprb0081 ~]$ sudo cat /etc/etcd/etcd.conf | grep -v ^#
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_NAME="node-03"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="5000"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://${HOST_VM3}:2380"
ETCD_ADVERTISE_CLIENT_URLS="http://${HOST_VM3}:2379"
ETCD_INITIAL_CLUSTER="node-01=http://${HOST_VM1}:2380,node-02=http://${HOST_VM2}:2380,node-03=http://${HOST_VM3}:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_INITIAL_CLUSTER_STATE="new"
Описание параметров etcd.service:
ETCD_LISTEN_PEER_URLS— список ссылок, с которых собирается трафик пиров;ETCD_LISTEN_CLIENT_URLS— список ссылок, с которых собирается трафик клиентов;ETCD_HEARTBEAT_INTERVAL— время (мс) периода проверки (heartbeat);ETCD_ELECTION_TIMEOUT— время (в мс) таймаута алгоритма выбора;ETCD_INITIAL_ADVERTISE_PEER_URLS— список ссылок пиров этого элемента кластера для передачи другим элемента кластера;ETCD_ADVERTISE_CLIENT_URLS— список ссылок клиентов этого элемента кластера для публичной передачи. Передаваемые ссылки клиентов будут доступны системам, взаимодействующим с кластером etcd. Клиентские библиотеки обрабатывают эти ссылки для подключения к кластеру etcd;ETCD_INITIAL_CLUSTER— исходная конфиугурация кластера для бутстрапинга;ETCD_INITIAL_CLUSTER_STATE— исходное состояние кластера (newилиexisting);ETCD_INITIAL_CLUSTER_TOKEN— исходный токен кластера etcd во время бутстрапа. При использовании нескольких кластеров позволяет избежать непреднамеренного взаимодействия между ними.
Обязательно рекурсивно смените владельца директории. Для этого выполните:
sudo chown -R etcd:etcd /var/lib/etcd/
Затем запустите на каждом узле кластера:
sudo systemctl daemon-reload
sudo systemctl start etcd.service
sudo systemctl status etcd.service
sudo journalctl -xe
Полезные функции#
Для быстрого просмотра проблем с кластером:
etcdctl cluster-health
Для просмотра структуры хранилища:
etcdctl ls --recursive --sort -p /service/clustername
где clustername - имя кластера базы.
Для просмотра всей структуры:
etcdctl ls --recursive /
Пример:
[pprb_dev@tkle-pprb0066 ~]$ etcdctl ls -r /
/service
/service/clus
/service/clus/members
/service/clus/members/pg02
/service/clus/members/pg01
/service/clus/initialize
/service/clus/config
/service/clus/optime
/service/clus/optime/leader
/service/clus/history
/service/clus/leader
Для получения значения из параметра:
etcdctl -o extended get /service/clustername/leader
etcdctl -o extended get /service/clustername/members/