Установка#

Platform V Pangolin — система управления базами данных, основанная на PostgreSQL. В данном руководстве описываются аспекты Pangolin, связанные с установкой системы.

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

Примечание:

Перед прочтением документа рекомендуется ознакомиться с используемыми терминами и сокращениями.

Диаграмма процесса развертывания Pangolin#

Внимание!

В установке standalone-версии продукта участвуют две машины. Первая - откуда производится запуск ansible-установщика, вторая - целевая, куда разворачивается продукт.

Диаграмма процесса развертывания Pangolin:

Диаграмма процесса развертывания Pangolin

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

Перед началом установки сформируйте единый дистрибутив Platform V Pangolin из zip-пакета:

  1. Получите архив zip-пакета и выполните команду распаковки:

    unzip -q <имя zip-пакета>.zip
    
  2. Перейдите в каталог с распакованным 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.

  1. Выполните команду распаковки:

    tar -xzf <имя дистрибутива>.tar.gz
    

    Внимание!

    Установку необходимо запускать на отдельной машине, а не на одном из узлов кластера.

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

    cd /tmp/YourCatalog/installer
    
  3. Перед запуском установки заполните файл 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       # в случае установки по имени DNS
    

    hosts.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.

  4. Заполните настраиваемый конфигурационный файл 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 представлено здесь.

  5. Сгенерируйте сертификаты, в случае, если в настраиваемом конфигурационном файле выше было выставлено значение для параметра: 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 необходимо подписать данные сертификаты в удостоверяющем центре.

  6. Выполните 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, rhost ip-адрес хоста реплики (данный параметр является обязательным, так как используется для настройки расписания 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#

  1. Создайте директорию с дистрибутивом Pangolin.

    mkdir distrib
    
  2. Поместите дистрибутив Pangolin в директорию distrib.

  3. Распакуйте дистрибутив Pangolin.

    tar -xf docker-builds-altsp8-1638-distrib.tar.gz
    
  4. Установите пакет 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
    
  5. Создайте директорию $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
    
  6. Переключитесь на пользователя postgres (если такого нет, то создайте).

    sudo su - postgres
    
  7. Добавьте строку окружения в ~/.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
    
  8. Разверните СУБД.

    initdb -k -D /pgdata/05/data/
    
  9. Отредактируйте файл параметров vim $PGDATA/postgresql.conf.

    listen_addresses = '*'        
    port = 5433                  
    max_connections = 100        
    superuser_reserved_connections = 3
    
    enabled_extra_auth_methods = 'peer, trust'
    
  10. Отредактируйте файл параметров vim $PGDATA/pg_hba.conf.

    local   all             all                                     peer
    host    all             all             0.0.0.0/0               trust
    
  11. Запустите экземпляр Pangolin.

    pg_ctl -D /pgdata/05/data/ -l /pgerrorlogs/05/postgresql.log start
    
  12. Выполните команду:

    [16:41:22  postgres@srv-0-211 ~]$ psql
    psql (13.4)
    Type "help" for help.
    
    postgres=#
    

Установка на ОС Red Hat Enterprise Linux 7#

  1. Создайте директорию с дистрибутивом Pangolin.

    mkdir distrib
    
  2. Поместите дистрибутив Pangolin в директорию distrib.

  3. Распакуйте дистрибутив Pangolin.

    tar -xf docker-builds-rhel7-1654-distrib.tar.gz 
    
  4. Установите пакет 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
    
  5. Создайте директорию $PGDATA и /pgerrorlogs.

    sudo mkdir -p /pgdata/05/data
    sudo chown -R postgres:postgres /pgdata/05/
    sudo mkdir /pgerrorlogs
    sudo chown postgres:postgres /pgerrorlogs/05
    
  6. Переключитесь на пользователя postgres (если такого нет, то создайте).

    sudo su - postgres
    
  7. Добавьте строку окружения в ~/.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
    
  8. Разверните СУБД.

    initdb -k -D /pgdata/05/data/
    
  9. Отредактируйте файл параметров vim $PGDATA/postgresql.conf.

    listen_addresses = '*'        
    port = 5433                  
    max_connections = 100        
    superuser_reserved_connections = 3
    
    enabled_extra_auth_methods = 'peer, trust'
    
  10. Отредактируйте файл параметров vim $PGDATA/pg_hba.conf.

    local   all             all                                     peer
    host    all             all             0.0.0.0/0               trust
    
  11. Запустите экземпляр Pangolin.

    pg_ctl -D /pgdata/05/data/ -l /pgerrorlogs/05/postgresql.log start
    
  12. Выполните команду:

    [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/