Установка#
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:
Внимание!
В процессе установки системы автоматически создается пользователь
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_template.ymlпример файла тем же ключом, которым был зашифрован пароль для учетной записи в текущем шаге. Рекомендации по заданию паролей приведены в документе «Руководство по безопасности», раздел «Рекомендации по заданию стойких паролей».Примечание:
Узнать подробнее о Ansible inventory можно в документации Ansible.
Заполните настраиваемый конфигурационный файл
custom_file_template.yml.Пример конфигурационного файла
custom_config_sample.yml, который можно использовать для развертывания продукта со значениями по умолчанию без корректировки, находится в каталогеtemplates. Посколькуcustom_config_sample.ymlявляется примером и вариантом готового решения, некоторые секции и параметры были перенесены вcustom_config_initial.yml.custom_config_initial.yml- конфигурационный файл, содержащий все динамически настраиваемые параметры СУБД Pangolin. При необходимости их можно переопределить в файлеcustom_config_initial.yml.Примечание:
Подробное описание всех существующих параметров файла
custom_file_template.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.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=${} manual_run=yes' --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.
Запуск установки осуществляется из каталога
installer. Ниже приведены шаблоны ansible-сценариев для установки односерверного и кластерного решений:Установка односерверного решения Pangolin с pgBouncer:
ansible-playbook playbook.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=${} \ manual_run=yes' \ --ask-vault-passУстановка кластерного решения Pangolin с patroni, etcd и pgBouncer:
ansible-playbook playbook.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=${} \ manual_run=yes' \ --ask-vault-passУстановка кластерного решения Pangolin с patroni, etcd, pgBouncer и HAProxy:
ansible-playbook playbook.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.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=${} \ manual_run=yes' \ --ask-vault-pass
Значения используемых в команде запуска 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-стенд;manual_run— флаг ручной установки в venv.
Внимание!
В случае, если все пароли указывались в открытом виде, параметр
--ask-vault-passи--vault-password-file=название_файла_с_ключемдобавлять не нужно!
Внимание!
После установки будут созданы симлинки для следующих директорий:
- /pgdata/data -> /pgdata/05 - /usr/pangolin -> /usr/pangolin-5.2.1 - /usr/pgsql-se-05 -> /usr/pangolin-5.2.1
Действия, которые необходимо выполнить, в случае неудачной установки#
В случае, если установка прошла неудачно:
Перед началом новой установки необходимо зачистить КТС. Для этого выполните:
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 /pgerrorlogs sudo chown postgres:postgres /pgerrorlogs/05Переключитесь на пользователя postgres (если такого нет, то создайте).
sudo su - postgresДобавьте строку окружения в
~/.bash_profile.vim ~/.bash_profile export PATH=$PATH:/usr/pangolin-5.2.1/bin export MANPATH=$MANPATH:/usr/pangolin-5.2.1/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.2.1/bin export MANPATH=$MANPATH:/usr/pangolin-5.2.1/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=#
Установка и настройка компонентов и расширений системы#
Примечание:
Установка и настройка дополнительных компонентов системы, не входящих в состав дистрибутива Pangolin, описаны здесь.
etcd#
В кластере 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/
Расширение pg_pathman#
pg_pathman - это расширение, реализующее оптимизированное решение для секционирования больших и распределенных баз данных.
Секционированием данных называется разбиение одной большой логической таблицы на несколько меньших физических секций. Секционирование может принести следующую пользу:
В определённых ситуациях оно кардинально увеличивает быстродействие, особенно когда большой процент часто запрашиваемых строк таблицы относится к одной или лишь нескольким секциям. Секционирование может сыграть роль ведущих столбцов в индексах, что позволит уменьшить размер индекса и увеличит вероятность нахождения наиболее востребованных частей индексов в памяти.
Когда в выборке или изменении данных задействована большая часть одной секции, последовательное сканирование этой секции может выполняться гораздо быстрее, чем случайный доступ по индексу к данным, разбросанным по всей таблице.
Массовую загрузку и удаление данных можно осуществлять, добавляя и удаляя секции, если это было предусмотрено при проектировании секционированных таблиц. Операция
ALTER TABLE DETACH PARTITIONили удаление отдельной секции с помощью командыDROP TABLEвыполняются гораздо быстрее, чем массовая обработка. Эти команды также полностью исключают накладные расходы, связанные с выполнениемVACUUMпослеDELETE.Редко используемые данные можно перенести на более дешёвые и медленные носители.
Установка#
Для установки pg_pathman выполните шаги:
Добавьте pg_pathman в настроечный параметр
shared_preload_librariesв конфигурационном файлеPostgreSQL.conf.Внимание!
pg_pathman может конфликтовать с другими расширениями, которые используют те же функции для перехвата управления. В связи с этим необходимо всегда добавлять это расширение в конец списка
shared_preload_libraries.Создайте расширение в БД:
CREATE EXTENSION pg_pathman;
Расширение pg_cron#
Расширение позволяет создавать задачи cron, выполняющие команды Platform V Pangolin в заданной БД.
Настройка#
Расширение уже входит в поставку Platform V Pangolin. Чтобы начать его использовать:
Пропишите в
postgresql.conf:shared_preload_libraries = 'pg_cron' cron.database_name = 'Pangolin'где Pangolin - имя БД, в которой будет работать cron.
Включите расширения от пользователя с правами
superuser:CREATE EXTENSION pg_cron;Выдайте права на cron нужному пользователю:
GRANT USAGE ON SCHEMA cron TO marco;Пропишите имя и пароль пользователей, использующих cron, в файле
.pgpass, так как процессуpg_cronнеобходимо создавать соединение к БД.
Расширение pg_repack#
Утилита для реорганизации таблиц без блокировки обрабатываемых данных, удаления пустот в таблицах и индексах, восстановления физического порядка кластеризованных индексов.
Установка не требуется, включить расширение в PostgreSQL:
CREATE EXTENSION pg_repack;
Инструмент pgcompacttable#
Скрипт perl для уменьшения размера «раздутых» таблиц и индексов без применения Access Exclusive блокировки.
Требования к программному окружению:
библиотека Perl DBI с модулем поддержки PostgresSQL;
модуль pgstattuple (по умолчанию включен в Pangolin). Команда для установки:
CREATE EXTENSION pgstattuple;для запуска скрипта требуются права
superuser.
Установка не требуется.
Управление планами запросов#
Для фиксации и подмены планов запросов в Pangolin используются расширения pg_outline и pg_hint_plan. Расширения устанавливаются во время работы инсталятора Pangolin, по умолчанию они выключены. Для работы функций фиксации и подмены планов запросов включите расширения.
Подробнее о расширениях в документах:
«Детальная архитектура», раздел «Поведение», подраздел «Управление планами запросов»;
«Руководство по системному администрированию», раздел «Сценарии администрирования», подраздел «Управление планами запросов».
Установка в ручном режиме#
В некоторых случаях (например, создана новая база или расширения не были установлены во время работы инсталлятора Pangolin) установку расширений необходимо произвести вручную, для этого:
Добавьте значения
pg_stat_statements,pg_hint_planиpg_outlineв настроечный параметрshared_preload_librariesв конфигурационном файлеPostgreSQL.conf.Подключите расширения:
create extension pg_stat_statements; create extension pg_hint_plan; create extension pg_outline;Включите расширения
pg_outlineиpg_hint_plan(см. «Руководство по системному администрированию», раздел «Сценарии администрирования», подраздел «Управление планами запросов»).
Отчетность по нагрузке Pangolin#
Установка всех расширений и их первоначальная настройка производится инсталлятором.
Расширению
pg_profileтребуются расширенияplpgsql,dblink.Расширению
pg_stat_kcacheтребуетсяpg_stat_statements(устанавливается по умолчанию на всех серверах). Такжеpg_stat_statementsдолжен быть указан в параметреshared_preload_librariesраньше.
Параметры установщика#
Параметр |
Значение по умолчанию |
Описание |
|---|---|---|
|
true |
установка базы с установленным расширением |
|
20 |
количество основных объектов (statements, relations и т.д.), которые должны быть представлены в каждой отсортированной таблице отчета. Параметр влияет на размер выборки - чем больше объектов вы хотите отобразить в отчете, тем больше объектов нам нужно сохранить в выборке |
|
7 |
срок хранения выборок в днях |
|
off |
когда этот параметр включен, |
|
0,30 * * * * |
строка в стиле crontab для насторойки периодов сбора статистики, по умолчанию: раз в полчаса, каждый час в 0 и 30 минут |
|
on |
отслеживание выполняемых серверным процессом команд |
|
on |
контроль, собирается ли статистика о доступе к таблицам и индексам |
|
on |
отслеживание времени чтения и записи блоков |
|
off |
отслеживание использования пользовательских функций |
|
top |
контроль, какие операторы учитываются модулем |
|
5000 |
максимальное количество операторов, отслеживаемых модулем (то есть максимальное количество строк в представлении |
|
true |
установка базы с установленным расширением pg_kcache |
|
on |
включение механизма подсчета ( |
|
1000000 |
максимальное количество отношений (имеющих физические файлы на диске) в базе. В случае переполнения этого этого числа - новое отношение создать будет нельзя. Нужно помнить, что к этим отношениям относятся: таблица, индекс, генератор последовательности, таблица хранения сверхъбольших атрибутов, материализованное представление. Необходимо внимательно отнестись к этому параметру и взять достаточный запас |
|
1024 |
количество отношений (имеющих физические файлы на диске) в базе, на которые будет предаллоцирован кэш: в этом случае кэш таблица для отслеживания размеров объектов будет размещена одним выровненным куском памяти и поиск по ней будет быстрее |
Установка в ручном режиме#
При ручной установке необходимо выполнить следующие шаги:
Установите файлы расширения
pg_profileРаспакуйте файлы расширения в каталог с расширениями PostgreSQL, например:
tar xzf pg_profile-<version>.tar.gz --directory $(pg_config --sharedir)/extensionНеобходимо убедиться, что используется подходящая утилита
pg_config.Создайте расширения
pg_profileРекомендуется установка в отдельную схему – расширение создает свои собственные таблицы, представления, последовательности и функции. Создайте схему для сбора статистики и установите расширение в эту схему:
CREATE SCHEMA pgse_profile; CREATE EXTENSION dblink schema ext; CREATE EXTENSION plpgsql schema pgse_profile; CREATE EXTENSION pg_stat_statements schema ext; CREATE EXTENSION pg_profile SCHEMA pgse_profile;Настройте пользователя:
CREATE ROLE profile_tuz NOLOGIN; REVOKE ALL ON SCHEMA pgse_profile FROM public; GRANT USAGE ON SCHEMA ext TO profile_tuz; GRANT USAGE ON SCHEMA pgse_profile TO profile_tuz; GRANT pg_read_all_stats TO profile_tuz; GRANT EXECUTE ON FUNCTION pg_stat_statements_reset TO profile_tuz; GRANT all ON all TABLES IN SCHEMA ext TO profile_tuz; GRANT SELECT, USAGE ON all sequences IN SCHEMA ext TO profile_tuz; GRANT EXECUTE ON all functions in SCHEMA ext TO profile_tuz; GRANT all ON all tables in SCHEMA pgse_profile TO profile_tuz; GRANT SELECT, USAGE ON all sequences IN SCHEMA pgse_profile TO profile_tuz; GRANT EXECUTE ON all functions IN SCHEMA pgse_profile TO profile_tuz; GRANT USAGE ON TYPE dblink_pkey_results TO profile_tuz;Настройте права пользователя
as_admin.Настройте серверы
pg_profileи задачи cron:SELECT pgse_profile.create_server('master', 'dbname={{ db_name }} host={{ hostname }} port={{ port }} user=profile_tuz'); SELECT pgse_profile.create_server('slave', 'dbname={{ db_name }} host={{ hostname }} port={{ port }} user=profile_tuz'); (если установка - мастер + standalone)В общем случае, если на одном экземпляре есть несколько БД — достаточно добавить один сервер, который обойдет все базы.
SELECT cron.schedule('{{ pg_profile.stats_periods }}', 'SELECT pgse_profile.take_sample()');Обновите
pg_profileдо новой версииНовые версии
pg_profileбудут содержать скрипт миграции (когда это возможно). Так, в случае обновления, необходимо установить новые файлы расширения (см. шаг1) и обновить расширение:ALTER EXTENSION pg_profile UPDATE;Установите расширение
pg_stat_kcacheРаспакуйте файлы расширения в каталог с расширениями PostgreSQL:
tar xzf pg_stat_kcache-<version>.tar.gz --directory $(pg_config --sharedir)/extensionУбедитесь, что используется подходящая утилита
pg_config.Cоздайте расширение
pg_stat_kcacheПропишите расширение в параметр предзагружаемых библиотек:
shared_preload_libraries = 'pg_stat_statements,pg_stat_kcache'Внимание!
Расширение
pg_stat_kcacheдолжно идти послеpg_stat_statements, иначе база не запустится.Установите расширение в схему
ext:CREATE EXTENSION pg_stat_kcache schema ext; -- Настройте пользователя: GRANT EXECUTE ON FUNCTION ext.pg_stat_kcache_reset TO profile_tuz; GRANT EXECUTE ON FUNCTION ext.pg_stat_kcache TO profile_tuz; -- Настроить права пользователя as_admin: GRANT EXECUTE ON FUNCTION ext.pg_stat_kcache_reset to as_admin; GRANT EXECUTE ON FUNCTION ext.pg_stat_kcache to as_admin;Обновите
pg_stat_kcacheдо новой версии.Новые версии
pg_stat_kcacheбудут содержать скрипт миграции (когда это возможно). Так, в случае обновления, необходимо будет установить новые файлы расширения (см. шаг1) и обновить расширение:ALTER EXTENSION pg_profile UPDATE;
Расширение oracle_fdw#
oracle_fdw — это расширение PostgreSQL, которое представляет собой внешнюю оболочку данных для простого и эффективного доступа к базам данных Oracle из СУБД Pangolin, включая отображение условий WHERE и требуемых столбцов, а также всестороннюю поддержку EXPLAIN. Расширение позволяет получать доступ к таблицам и представлениям Oracle (включая материализованные представления) через сторонние таблицы.
Расширение появилось в СУБД Pangolin в версии 4.5.0.
Для использования расширения:
Установите
oracle clientверсии не ниже 11.2:sudo yum localinstall oracle-instantclient18.5-basic-18.5.0.0.0-3.x86_64.rpmДобавьте в систему библиотеки клиента. Для этого добавьте строку
/usr/lib/oracle/18.5/client64/lib/в файл/etc/ld.so.confи сохраните его.Выполните настройку необходимых переменных окружения:
echo "[ -n \"\$PATH\" ] && export PATH=\$PATH:/usr/lib/oracle/19.14/client64/bin || export PATH=/usr/lib/oracle/19.14/client64/bin" >> /etc/profile.d/ora2pg.sh export PATH="$PATH:/usr/lib/oracle/19.14/client64/bin" echo "export ORACLE_HOME=/usr/lib/oracle/19.14/client64" >> /etc/profile.d/ora2pg.sh export ORACLE_HOME="/usr/lib/oracle/19.14/client64" echo "export NLS_LANG=AMERICAN_AMERICA.AL32UTF8" >> /etc/profile.d/ora2pg.sh export NLS_LANG="AMERICAN_AMERICA.AL32UTF8" echo "[ -n \"\$LD_LIBRARY_PATH\" ] && export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:/usr/lib/oracle/19.14/client64/lib || export LD_LIBRARY_PATH=/usr/lib/oracle/19.14/client64/lib" >> /etc/profile.d/ora2pg.sh [ -n "$LD_LIBRARY_PATH" ] && export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/lib/oracle/19.14/client64/lib" || export LD_LIBRARY_PATH=/usr/lib/oracle/19.14/client64/libКогда библиотеки и файлы клиента Oracle появятся в системе, добавьте расширение в БД (необходимы права суперпользователя). После этого дайте права на использование расширения
oracle_fdwдля ролиas_admin:set role db_admin; create extension oracle_fdw schema ext; grant usage on foreign data wrapper oracle_fdw to as_admin;При необходимости обновите расширение:
ALTER EXTENSION oracle_fdw UPDATE;