Установка#

Автоматическая установка#

Установка СУБД Pangolin в автоматическом режиме осуществляется с помощью системы управления конфигурациями Ansible. Для того, чтобы выполнить установку Pangolin:

Внимание!

В процессе установки системы автоматически создается пользователь postgres, а также, в файл sudoerc, добавляется строка с правами для управления Pangolin.

  1. Скачайте и распакуйте дистрибутив на сервере (на отдельном сервере, который не будет в кластере).

  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 (для кластерной конфигурации).

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

    Примечание:

    Узнать подробнее о Ansible inventory можно в документации Ansible.

  4. Заполните настраиваемый конфигурационный файл custom_file_template.yml.

    Пример конфигурационного файла custom_config_template.yml, который можно использовать для развертывания продукта со значениями по умолчанию без корректировки, находится в каталоге templates. Поскольку custom_config_template.yml является примером и вариантом готового решения, некоторые секции и параметры были перенесены в custom_config_default.yml. custom_config_default.yml - конфигурационный файл, содержащий все динамически настраиваемые параметры СУБД Pangolin. При необходимости их можно переопределить в файле custom_config_default.yml.

    Примечание:

    Подробное описание всех существующих параметров файла custom_file_template.yml представлено здесь.

    Подробное описание всех существующих параметров файла custom_file_default.yml представлено здесь.

  5. Сгенерируйте сертификаты, в случае, если в настраиваемом конфигурационном файле выше было выставлено значение для параметра: ssl_mode: true.

    На текущий момент, кластер можно развернуть с включенной аутентификацией SSL и без нее. Для подключения к СУБД под УЗ postgres используются самоподписные сертификаты. Если данный параметр ssl_mode в положении false, то скрипты развертывания и обновления продукта сгенерируют временные сертификаты. Целью включения аутентификации является обеспечение безопасного взаимодействия компонент внутри кластера.

    При включенном параметре (ssl_mode: true) скрипты развертывания и обновления продукта осуществляют ряд проверок:

    • Определяют расположение сертификатов по путям из параметров соответствующего компонента (параметры из секции 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.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']}' -e '{"nolog": "false"}' --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 custom_config=templates/custom_config_template.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']}' \
      -e '{"nolog": "false"}' \
      --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']}' \
      -e '{"nolog": "false"}' \
      --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']}' \
      -e '{"nolog": "false"}' \
      --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']}' \
      -e '{"nolog": "false"}' \
      --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 \
                    custom_config=templates/custom_config_template.yml \
                    stand=${} \
                    manual_run=yes' \
      --ask-vault-pass
      

    Значения используемых в команде запуска Ansible ключей:

    • -i — путь до inventory-файла;

    • -t — теги для запуска;

    • -vv — уровень логирования Ansible. Может быть, как пустым, так и -vvvvvv, где запуск без v - минимальное логирование;

    • -e, --extra-vars — переменные, которые по приоритету важнее переменных из inventory;

    • --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]}';

    • nolog — параметр для выключения шифрования результата выполнения скриптов развертывания и обновления;

    • 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#

  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 /pgerrorlogs
    sudo chown postgres:postgres /pgerrorlogs/05
    
  6. Переключитесь на пользователя postgres (если такого нет, то создайте).

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

    Внимание!

    Убедитесь, что значение параметра max_worker_process в конфигурационном файле не превышает суммарного количества баз данных на узле (включая системные template1, postgres) + 6.

    Например, если количество БД = 26, то значение параметра должно быть не меньше 32.

  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.2.1/bin
    export MANPATH=$MANPATH:/usr/pangolin-5.2.1/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'
    

    Внимание!

    Убедитесь, что значение параметра max_worker_process в конфигурационном файле не превышает суммарного количества баз данных на узле (включая системные template1, postgres) + 6.

    Например, если количество БД = 26, то значение параметра должно быть не меньше 32.

  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=#
    

Примечание:

Помимо опций, предусмотренных оригинальным PostgreSQL, в СУБД Pangolin добавлена опция pg_ctl_custom_timeout, задающая timeout для утилиты pg_ctl.

Установка и настройка компонентов и расширений системы#

Примечание:

Установка и настройка дополнительных компонентов системы, не входящих в состав дистрибутива 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 во время bootstrap. При использовании нескольких кластеров позволяет избежать непреднамеренного взаимодействия между ними.

Обязательно рекурсивно смените владельца директории. Для этого выполните:

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 выполните шаги:

  1. Добавьте pg_pathman в настроечный параметр shared_preload_libraries в конфигурационном файле PostgreSQL.conf.

    Внимание!

    pg_pathman может конфликтовать с другими расширениями, которые используют те же функции для перехвата управления. В связи с этим необходимо всегда добавлять это расширение в конец списка shared_preload_libraries.

  2. Создайте расширение в БД:

    CREATE EXTENSION pg_pathman;
    

Расширение pg_cron#

Расширение позволяет создавать задачи cron, выполняющие команды Platform V Pangolin в заданной БД.

Настройка#

Расширение уже входит в поставку Platform V Pangolin. Чтобы начать его использовать:

  1. Пропишите в postgresql.conf:

shared_preload_libraries = 'pg_cron'
cron.database_name = 'Pangolin'
где Pangolin - имя БД, в которой будет работать cron.<!--Имя БД может быть любым? Если да, то лучше написать об этом явно. -->
  1. Включите расширения от пользователя с правами superuser:

    CREATE EXTENSION pg_cron;
    
  2. Выдайте права на cron нужному пользователю:

    GRANT USAGE ON SCHEMA cron TO marco;
    
  3. Пропишите имя и пароль пользователей, использующих 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) установку расширений необходимо произвести вручную, для этого:

  1. Добавьте значения pg_stat_statements, pg_hint_plan и pg_outline в настроечный параметр shared_preload_libraries в конфигурационном файле PostgreSQL.conf.

  2. Подключите расширения:

    create extension pg_stat_statements;
    create extension pg_hint_plan;
    create extension pg_outline;
    
  3. Включите расширения pg_outline и pg_hint_plan (см. «Руководство по системному администрированию», раздел «Сценарии администрирования», подраздел «Управление планами запросов»).

Отчетность по нагрузке Pangolin#

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

  • Расширению pg_profile требуются расширения plpgsql, dblink.

  • Расширению pg_stat_kcache требуется pg_stat_statements (устанавливается по умолчанию на всех серверах). Также pg_stat_statements должен быть указан в параметре shared_preload_libraries раньше.

Параметры установщика#

Параметр

Значение по умолчанию

Описание

pg_profile.is_enable

true

установка базы с установленным расширением pg_profile и настроенным в pg_cron заданием на сборку статистики

pg_profile.topn

20

количество основных объектов (statements, relations и т.д.), которые должны быть представлены в каждой отсортированной таблице отчета. Параметр влияет на размер выборки - чем больше объектов вы хотите отобразить в отчете, тем больше объектов нам нужно сохранить в выборке

pg_profile.max_sample_age

7

срок хранения выборок в днях

pg_profile.track_sample_timings

off

когда этот параметр включен, pg_profile будет отслеживать точное время сбора выборок

pg_profile.stats_periods

0,30 * * * *

строка в стиле crontab для настройки периодов сбора статистики, по умолчанию: раз в полчаса, каждый час в 0 и 30 минут

pg_stat_track_activities

on

отслеживание выполняемых серверным процессом команд

pg_stat_track_counts

on

контроль, собирается ли статистика о доступе к таблицам и индексам

pg_stat_track_io_timing

on

отслеживание времени чтения и записи блоков

pg_stat_track_functions

off

отслеживание использования пользовательских функций

pg_stat_statements_track

top

контроль, какие операторы учитываются модулем

pg_stat_statements_max

5000

максимальное количество операторов, отслеживаемых модулем (то есть максимальное количество строк в представлении pg_stat_statements)

pg_stat_kcache.is_enabled

true

установка базы с установленным расширением pg_kcache

relnblocks_enable

on

включение механизма подсчета (pg_profile автоматом подхватит значение из этого механизма, а не из pg_class). Изменение требует перезагрузки: в случае значения off память под кэш при старте выделена не будет

relnblocks_hash_max_size

1000000

максимальное количество отношений (имеющих физические файлы на диске) в базе. В случае переполнения этого числа – новое отношение создать будет нельзя. Нужно помнить, что к этим отношениям относятся: таблица, индекс, генератор последовательности, таблица хранения сверхбольших атрибутов, материализованное представление. Необходимо внимательно отнестись к этому параметру и взять достаточный запас

relnblocks_hash_init_size

1024

количество отношений (имеющих физические файлы на диске) в базе, на которые будет предаллоцирован кеш: в этом случае кеш таблица для отслеживания размеров объектов будет размещена одним выровненным куском памяти и поиск по ней будет быстрее

Установка в ручном режиме#

При ручной установке необходимо выполнить следующие шаги:

  1. Установите файлы расширения pg_profile

    Распакуйте файлы расширения в каталог с расширениями PostgreSQL, например:

        tar xzf pg_profile-<version>.tar.gz --directory $(pg_config --sharedir)/extension
    

    Необходимо убедиться, что используется подходящая утилита pg_config.

  2. Создайте расширения 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;
    
  3. Настройте пользователя:

    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;
    
  4. Настройте права пользователя as_admin.

  5. Настройте серверы 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()');
    
  6. Обновите pg_profile до новой версии

    Новые версии pg_profile будут содержать скрипт миграции (когда это возможно). Так, в случае обновления, необходимо установить новые файлы расширения (см. шаг1) и обновить расширение:

    ALTER EXTENSION pg_profile UPDATE;
    
  7. Установите расширение pg_stat_kcache

    Распакуйте файлы расширения в каталог с расширениями PostgreSQL:

    tar xzf pg_stat_kcache-<version>.tar.gz --directory $(pg_config --sharedir)/extension
    

    Убедитесь, что используется подходящая утилита pg_config.

  8. Создайте расширение pg_stat_kcache

    Пропишите расширение в параметр предзагружаемых библиотек:

    shared_preload_libraries = 'pg_stat_statements,pg_stat_kcache'
    

    Внимание!

    Расширение pg_stat_kcache должно идти после pg_stat_statements, иначе база не запустится.

  9. Установите расширение в схему 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;
    
  10. Обновите 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.

Для использования расширения:

  1. Установите oracle client версии не ниже 11.2:

    sudo yum localinstall oracle-instantclient18.5-basic-18.5.0.0.0-3.x86_64.rpm
    
  2. Добавьте в систему библиотеки клиента. Для этого добавьте строку /usr/lib/oracle/18.5/client64/lib/ в файл /etc/ld.so.conf и сохраните его.

  3. Выполните настройку необходимых переменных окружения:

    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
    
  4. Когда библиотеки и файлы клиента 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;
    
  5. При необходимости обновите расширение:

    ALTER EXTENSION oracle_fdw UPDATE;