Установка в рамках микросервисной архитектуры#

В СУБД Pangolin возможно запускать докер-образы компонентов продукта в кластерных конфигурациях с одним главным узлом и произвольным числом узлов реплицирования. Для этого используются различные системы оркестрации, такие как Kubernetes (DropAPP) и docker-compose. Решение позволяет создавать многоконтейнерные приложения, где роль кластера базы данных берет на себя Pangolin DB, а управление пулом соединений обеспечивает Pangolin Pooler.

Docker-образ СУБД Pangolin#

По требованию имеется возможность запросить Docker-образ Pangolin на одной из двух ОС - SberLinux OS Server 9 или РЕД ОС 7.3.2 и 8.

Docker-образ может использоваться:

  • разработчиком АС для ускорения и упрощения процесса разработки;

  • пользователями, которые хотят познакомиться с Platform V Pangolin DB;

  • пользователями других облачных провайдеров.

Запуск Docker-образа Pangolin DB#

Примечание:

Имеется возможность использовать файл с переменными в формате key=value для минимизации заполнения манифестов запуска.

Внимание!

Docker-образ Pangolin DB работает только с UID 26.

Docker образ имеет стандартные значения для переменных окружения:

  • PGDATA=/pgdata/data;

  • PG_LICENSE_PATH=/opt/pangolin/license.json;

  • POSTGRES_PASSWORD=;

  • PANGOLIN_LIC_DATA=.

И следующие предустановленные параметры в файле postgresql.conf:

# Default settings in postgresql.conf template
port = '5433'
listen_addresses = '*'
authentication_proxy = 1
authentication_port = 5544
auth_activity_period = 60
enabled_extra_auth_methods ='trust,scram-sha-256'
psql_encrypt_password = 'on'
password_encryption = 'scram-sha-256'
pgaudit.log = 'ddl, role, connection, misc_set, protection'
autovacuum_work_mem = '-1'
effective_cache_size = '4GB'
maintenance_work_mem = '64MB'
max_connections = '300'
max_parallel_workers = '8'
max_parallel_workers_per_gather = '2'
max_prepared_transactions = '0'
max_worker_processes = '10'
timezone = 'Europe/Moscow'
autovacuum_max_workers = '3'
shared_buffers = '128MB'
work_mem = '4MB'
pg_plugins_path = '/usr/pangolin/lib'
# Features to enable
shared_preload_libraries = 'auto_explain,pg_stat_statements,pg_cron,pg_hint_plan,pg_outline'
# Included user configuration files
include_dir '/user_conf.d'

Файл pg_hba.conf имеет следующую стандартную настройку для внешних подключений:

host all all all scram-sha-256

Внимание

Для запуска контейнера с образом Pangolin DB укажите переменные окружения — пароль POSTGRES_PASSWORD и данные лицензии.

Лицензию можно передать двумя способами:

  1. Через переменную PANGOLIN_LIC_DATA, в JSON-формате, например:

    '{ "license" : { "end_date" : "xxx", "licensee" : "xxx", "type" : "xx" }, "sign" : "...{хеш}…"}'
    
  2. Через значение volume. Для этого необходимо файл лицензии в JSON-формате передать по пути стандартного расположения этого файла внутри контейнера (например, -v /path/to/license.json:/opt/pangolin/license.json). Пример команды запуска:

    docker run --name pangolin -e POSTGRES_PASSWORD=12345678 -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:6.5.0
    

Активация функциональностей СУБД Pangolin#

Начиная с версии 6.4.0, в Docker-образе включены следующие функциональности, не требующие конфигурирования:

  • маскирование парольной информации в запросах с указанием паролей;

  • очистка высвобождаемого дискового пространства в процессе работы СУБД;

  • контроль целостности конфигурации и объектов БД;

  • контроль загрузки динамических библиотек с проверкой контрольных сумм;

  • контроль использования процедурных языков;

  • глобальные индексы и глобальные констрейнты на партиционированные таблицы;

  • 64-битные идентификаторы транзакции;

  • параметры управления быстрыми блокировками;

  • нативное интервальное партиционирование.

Пользователю доступны преднастроенные функциональные возможности, которые активируются специальным ключом (2 столбец) при старте контейнера:

Наименование функциональности

Ключ активации

Применяемые конфигурационные параметры

Применяемые sql-скрипты

Включение оптимизации под работу с 1с (функциональность может быть активирована только при первом запуске образа с первичной инициализацией каталога базы данных для установки русской локали)

enable_1c_support

autovacuum = „on“
max_locks_per_transaction = „256“;
synchronous_commit = „off“;
row_security = „False“;
temp_buffers = „256MB“;
bgwriter_delay = „20ms“;
bgwriter_lru_multiplier = „4.0“;
bgwriter_lru_maxpages = „400“;
autovacuum_max_workers = „4“;
autovacuum_naptime = „20s“;
from_collapse_limit = „8“;
join_collapse_limit = „8“;
geqo = „on“;
geqo_threshold = „12“;
standard_conforming_strings = „off“;
escape_string_warning = „off“;
plantuner.fix_empty_table = „on“;
online_analyze.enable = „off“;
online_analyze.table_type = „temporary“;
online_analyze.verbose = „off“;
online_analyze.threshold = „50“;
online_analyze.scale_factor = „0.1“;
online_analyze.local_tracking = „on“;
online_analyze.min_interval = „10000“;
shared_preload_libraries = „…fasttrun,fulleq,mchar,online_analyze,plantuner…“

Включение расширения pg_stat_kcache (Инструменты диагностики и анализа)

pg_stat_kcache

pg_stat_kcache.linux_hz = „-1“
shared_preload_libraries = „…,pg_stat_kcache,…“

Включение маскирования запросов

masking_mode

masking_mode = „full“

Включение трассировки сессий (Инструменты диагностики и анализа)

session_tracing

session_tracing_enable = „True“;
session_tracing_file_limit = „-1“;
session_tracing_default_path = „$PGDATA/tracing/“;
session_tracing_default_level = „0“;
session_tracing_roles = „“

Включение анализа производительности (Инструменты диагностики и анализа)

performance_insights

performance_insights.enable = „True“;
performance_insights.masking = „True“;
performance_insights.sampling_enable = „True“;
performance_insights.sampling_period = „5s“;
performance_insights.num_samples_in_ram = „12“;
performance_insights.num_samples_in_files = „17280“

Включение расширения pg_profile в БД postgres, в схеме PUBLIC

pg_profile

pg_profile.topn = „20“;
pg_profile.max_sample_age = „7“;
pg_profile.track_sample_timings = „off“

DO
$do$
BEGIN
IF EXISTS (
SELECT FROM pg_catalog.pg_roles
WHERE rolname = „profile_tuz“) THEN
RAISE NOTICE „Role «profile_tuz» already exists. Skipping.“;
ELSE
CREATE USER «profile_tuz» WITH ENCRYPTED PASSWORD „profiletuzPasssupertronG1212“ INHERIT VALID UNTIL „infinity“ CONNECTION LIMIT 5;
END IF;
END
$do$;

GRANT SELECT ON pg_nblocks TO «profile_tuz»;
GRANT EXECUTE ON FUNCTION get_nblocks TO «profile_tuz»;
GRANT EXECUTE ON FUNCTION get_nblocks_all TO «profile_tuz»;

CREATE EXTENSION IF NOT EXISTS «dblink» WITH SCHEMA «public»;
CREATE EXTENSION IF NOT EXISTS «plpgsql» WITH SCHEMA «pg_catalog»;
CREATE EXTENSION IF NOT EXISTS»pg_stat_statements» WITH SCHEMA «public»;
CREATE EXTENSION IF NOT EXISTS «pg_cron» WITH SCHEMA «public»;

– create schema for using with extension pg_profile
CREATE SCHEMA IF NOT EXISTS «pgse_profile» AUTHORIZATION :user;
COMMENT ON SCHEMA pgse_profile IS „Schema for pgse_profile extension only“;
– create pg_profile extension
CREATE EXTENSION IF NOT EXISTS «pg_profile» WITH SCHEMA «pgse_profile»;

GRANT USAGE ON SCHEMA pgse_profile, public TO «profile_tuz»;
GRANT pg_read_all_stats TO «profile_tuz»;
GRANT EXECUTE ON FUNCTION public.pg_stat_statements_reset TO «profile_tuz»;
GRANT ALL ON ALL TABLES IN SCHEMA public TO «profile_tuz»;
GRANT SELECT, USAGE ON ALL sequences IN SCHEMA public TO «profile_tuz»;
GRANT EXECUTE ON ALL functions IN SCHEMA public 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 public.dblink_pkey_results TO «profile_tuz»;

– set cron job settings
SELECT pgse_profile.drop_server(„local“);SELECT pgse_profile.create_server(„local“, „dbname=postgres host=127.0.0.1 port=5433 user=profile_tuz“);

DO
LANGUAGE plpgsql
$$
DECLARE r record;
BEGIN
FOR r IN SELECT table_schema, table_name
FROM information_schema.tables
WHERE table_schema = „pgse_profile“
LOOP
EXECUTE FORMAT(„ALTER TABLE %I.%I OWNER TO profile_tuz;“, r.table_schema, r.table_name);
END LOOP;
END
$$;

SELECT CASE WHEN NOT EXISTS(SELECT jobid from cron.job where command like „%pgse_profile.take_sample%“) THEN (SELECT cron.schedule(„0,30 * * * *“, „SELECT pgse_profile.take_sample()“)) END;

UPDATE cron.job
SET database=“postgres“, username=“profile_tuz“
WHERE jobid = (
SELECT max(rownum)
FROM (
SELECT ctid, row_number() OVER () AS rownum, jobid
FROM cron.job
WHERE command=“SELECT pgse_profile.take_sample()“
) AS subquery
);
Если включено расширение pg_stat_kcache, дополнительно выполняется:
GRANT EXECUTE ON FUNCTION public.pg_stat_kcache_reset TO «profile_tuz»;
GRANT EXECUTE ON FUNCTION public.pg_stat_kcache TO «profile_tuz»;
GRANT SELECT ON public.pg_stat_kcache TO «profile_tuz»;
GRANT SELECT ON public.pg_stat_kcache_detail TO «profile_tuz»;

Включение ротации паролей

rotate_password

rotate_password.num_rounds = '20'

CREATE EXTENSION IF NOT EXISTS «psql_rotate_password» WITH SCHEMA «public»;

Пример:

docker run --name pangolin -e enable_1c_support=true -e POSTGRES_PASSWORD={Пароль} -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:6.5.0

Дополнительно можно самостоятельно активировать и настроить следующие функциональности:

  • управление парольными политиками;

  • использование транспортных паролей;

  • расширенные возможностей аудита действий пользователя;

  • набор дополнительных представлений для анализа (psql_diagpack);

  • аварийное завершение СУБД при отключении СХД;

  • очистка не используемых файлов в табличных пространствах;

  • корректировка, фиксация и подмена плана запроса;

  • резервирование подключений для служебных ролей;

  • контроль потребления ресурсов (оперативная память и CPU);

  • планировщик заданий;

  • дефрагментация таблиц;

Использование пользовательских скриптов и параметров#

Работа с директориями /user_scripts.d и /user_conf.d возможна только при запуске контейнера, поэтому, если содержимое примонтированных директорий на ОС узла изменилось, необходимо перезапустить контейнер.

При запуске контейнера поддерживается возможность использования собственных sql и sh-скрипты. Для этого необходимо директорию со скриптами смонтировать к контейнеру в директорию /user_scripts.d. Поддерживаются скрипты в формате *.sh, *.sql, *.sql.gz. Например:

docker run --name pangolin -v "/path/to/scripts:/user_scripts.d" -e POSTGRES_PASSWORD=1314124141 -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:6.5.0

Для передачи файла/файлов с параметрами для PostgreSQL можно использовать точку монтирования /user_conf.d. Если пользователь самостоятельно передает параметры, то значения в пользовательских файлах будет иметь более высокий приоритет. Например:

docker run --name pangolin -v "/path/to/configs:/user_conf.d" -e POSTGRES_PASSWORD=1314124141 -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:6.5.0

Подсказка

Поддерживаются файлы в формате *.conf.

Если необходимо изменить стандартные правила в конфигурации pg_hba, нужно перезаписать файл pg_hba.conf в контейнере, который по умолчанию расположен по пути /pgdata/data/pg_hba.conf, либо воспользоваться sh-скриптом и передать его точку монтирования /user_scripts.d. Пример sh-скрипта:

#!/usr/bin/env sh
 
echo "local all postgres trust" > $PGDATA/pg_hba.conf
echo "host all postgres ::1/128 trust" >> $PGDATA/pg_hba.conf
echo "host all postgres localhost trust" >> $PGDATA/pg_hba.conf
echo "hostssl all postgres localhost trust" >> $PGDATA/pg_hba.conf
echo "hostssl all test_user_ssl 0.0.0.0/0 cert clientcert=verify-full" >> $PGDATA/pg_hba.conf
echo "host all all 0.0.0.0/0 scram-sha-256" >> $PGDATA/pg_hba.conf
echo "hostssl all postgres 0.0.0.0/0 cert clientcert=verify-full" >> $PGDATA/pg_hba.conf

Пример запуска с использованием собственного файла pg_hba:

docker run --name pangolin -v "/path/to/pg_hba.conf:/pgdata/data/pg_hba.conf" -e POSTGRES_PASSWORD=1314124141 -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:6.5.0

Для использования Docker-образа в Kubernetes или DropApp можно воспользоваться примером манифеста:

apiVersion: apps/v1
kind: Deployment
metadata:
  namespace: da-dp01-db-pangolin-dev
  name: pangolin-image-demo
spec:
  selector:
    matchLabels:
      app: Pangolin-DB
  replicas: 1
  template:
    metadata:
      labels:
        app: Pangolin-DB
    spec:
      containers:
        - image: {path}/pangolin-DB-sberlinux9:6.5.0
          name: pangolin-DB
          ports:
            - containerPort: 5433
              protocol: TCP
          env:
            - name: POSTGRES_PASSWORD
              value: '...'
            - name: PANGOLIN_LIC_DATA
              value: '{ "license" : { "end_date" : "...", "licensee" : "...", "type" : "..." }, "sign" : "lPNh...C4Xc" }'
            - name: enable_1c_support
              value: "false"
            - name: pg_stat_kcache_is_enable
              value: "false"
            - name: masking_mode
              value: "false"
            - name: autounite
              value: "false"
            - name: session_tracing
              value: "false"
            - name: performance_insights
              value: "false"
            - name: pg_profile
              value: "false"
            - name: rotate_password
              value: "false"
          livenessProbe:
            exec:
              command:
                - pg_isready
            initialDelaySeconds: 15
            periodSeconds: 60
          resources:
            requests:
              memory: "2048Mi"
              cpu: 1
            limits:
              memory: "4096Mi"
              cpu: 4
          volumeMounts:
            - name: postgresql-data
              mountPath: /pgdata
          securityContext:
            capabilities: {}
            privileged: false
      volumes:
        - name: postgresql-data
          emptyDir: {}
      imagePullSecrets:
        - name: image-pull-secret
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%

Ограничения#

У реализации возможности Docker-образа Pangolin DB присутствуют следующие ограничения:

  • Образ предназначен для использования только в DEV-средах - доработка функциональности обновления, резервного копирования и мониторинга не предусматривается. Для ПРОМ рекомендуется использовать совместно с оператором Pangolin CloudNative.

  • Некоторые инфраструктурнозависимые функциональности, например, работа с СЗИ, на текущий момент не доступны.

Docker-образ Pangolin Pooler#

Для работы с Pangolin Pooler устанавливаются дефолтные порты контейнеров - 6544 для пользовательских подключений и 5544 для связи с Pangolin DB. В качестве точки монтирования используется /user_conf.d для файлов пользовательских конфигураций.

В дефолтный файл конфигурации добавляется директива %include /user_conf.d для использования пользвоательских файлов конфигурации.

Используются переменные окружения (в скобках приведены значения по умолчанию):

  • max_client_conn (800);

  • pool_mode (transaction);

  • min_pool_size (0);

  • default_pool_size (105);

  • max_db_connections (105);

  • max_user_connections (105);

  • listen_port (6544);

  • db_host («»);

  • db_ port (5533).

Имя docker-образа устанавливается в формате Pangolin-pooler:*версия*. Пример - Pangolin-pooler:1.3.2.

Запуск образа#

Docker-образ имеет стандартные значения для переменных окружения:

PG_PLUGINS_PATH=/opt/pangolin-pooler/lib
LD_LIBRARY_PATH=/opt/pangolin-pooler/lib

Образ запускается со следующими параметрами в pangolin-pooler.ini:

[databases]
* = host=${DB_HOST:-NONE} port=${DB_PORT:-5433} auth_port=5544 auth_pool_size=1
 
[pgbouncer]
 listen_port = ${LISTEN_PORT:-6544}
 listen_addr = *
 auth_type = scram-sha-256
 auth_file = /etc/pangolin-pooler/userlist.txt
 auth_proxy = on
 auth_failure_threshold = 3
 auth_inactivity_period = 60
 auth_last_size = 10
 log_audit = 1
 admin_users = pgbouncer
 max_client_conn = ${MAX_CLIENT_CONN:-400}
 pool_mode = ${POOL_MODE:-transaction}
 min_pool_size = ${MIN_POOL_SIZE:-0}
 default_pool_size = ${DEFAULT_POOL_SIZE:-105}
 max_db_connections = ${MAX_DB_CONNECTIONS:-105}
 max_user_connections = ${MAX_USER_CONNECTIONS:-105}
 ignore_startup_parameters = extra_float_digits
 unix_socket_dir =
 ndc_suspending_timeout = 0
%include /user_conf.d/user_conf.ini

Параметры, заключенные в фигурные скобки, можно переопределить с помощью ENV в команде запуска образа.

Пример запуска с указанием параметра max_client_conn:

docker run --name pooler -e MAX_CLIENT_CONN=1000 -d pangolin-pooler:1.5.0

Внимание!

В версии 6.5.0 сквозная аутентификация не поддерживается при использовании образа Pangolin Pooler совместно с оператором Pangolin CloudNative.

Кластерная конфигурация#

Для использования в среде оркестрации DropAPP (Kubernetes) вместе с оператором или без него, а также для возможности запуска в среде оркестрации docker-compose, начиная с версии 6.5.0 Pangolin DB включает в себя дополнительно установленный и настроенный RPM-пакет Pangolin Manager. Таким образом, обеспечивается потоковая репликация.

Pangolin Manager способен использовать объекты Kubernetes для хранения состояния кластера и управления ведущим ключом, что в свою очередь обеспечивает функциональность построения кластерной конфигурации без использования оператора, но в случае с docker-compose потребуется сервис DCS, который будет реализован через Pangolin DCS.

Примечание:

Начиная с версии 6.5.0 прослушиваются порты 2481 (Manager DCS) и 8009 (Manager REST API).

Запуск и настройка Pangolin Manager производится только после обнаружения скриптами entrypoint одной из переменной окружения, которые задаются пользователем как аргументы для запуска образа - PATRONI_KUBERNETES_POD_IP (для среды оркестрации DropAPP (Kubernetes) без оператора) или PARTNER_ADDRS (для среды оркестрации docker-compose).

Запуск в среде оркестрации docker-compose#

Для запуска docker-образа Pangolin DB в среде оркестрации docker-compose необходимо подготовить файл с обязательными переменными окружения pangolin.env. Пример заполнения файла с переменными окружения:

POSTGRES_PASSWORD=RandomTestP@ssw000rd!!
PANGOLIN_LIC_DATA='{ "license" : { "end_date" : "2", "licensee" : "Trial license...", "type" : "Trial" }, "sign" : "lPNh.." }'
PATRONI_SCOPE=demo
PATRONI_POSTGRESQL_LISTEN='0.0.0.0:5433'

Внимание!

Ввиду ограничений среды оркестрации docker-compose для поддержания постоянного подключения к основному узлу необходимо указать сервис балансировщика (SynGX, Ngix и т.п).

Ниже представлен пример файла docker-compose.yml кластерной конфигурации Pangolin DB с использования балансировщика трафика SynGX:

name: pangolin-cluster
 
networks:
    cluster:
 
services:
    pangolin1:
        image: pangolin-DB-sberlinux942:15.5-6.5.0
        networks: [ cluster ]
        env_file: pangolin.env
        hostname: pangolin1
        container_name: demo-pangolin1
        environment:
            PARTNER_ADDRS: pangolin2:2481,pangolin3:2481
            PATRONI_NAME: pangolin1
 
    pangolin2:
        image: pangolin-DB-sberlinux942:15.5-6.5.0
        networks: [ cluster ]
        env_file: pangolin.env
        hostname: pangolin2
        container_name: demo-pangolin2
        environment:
            PARTNER_ADDRS: pangolin1:2481,pangolin3:2481
            PATRONI_NAME: pangolin2
        depends_on:
            - pangolin1
 
    pangolin3:
        image: pangolin-DB-sberlinux942:15.5-6.5.0
        networks: [ cluster ]
        env_file: pangolin.env
        hostname: pangolin3
        container_name: demo-pangolin3
        environment:
            PARTNER_ADDRS: pangolin1:2481,pangolin2:2481
            PATRONI_NAME: pangolin3
        depends_on:
            - pangolin2
 
    balancer:
        image: {path}/sbel8:prefix-602-2.3.1-5701-repacked-602
        networks: [ cluster ]
        hostname: balancer
        container_name: demo-balancer
        volumes:
            - ${PWD}/syngx.conf:/opt/syngx/conf/syngx.conf
        ports:
            - "8080:8080"
            - "5433:5433"
        depends_on:
            - pangolin1
            - pangolin2
            - pangolin3

Для настройки балансировщика трафика SynGX был использован стандартный конфигурационный файл syngx.conf с добавлением специальной секции:

[...]
### Pangolin cluster name: pangolin_cluster
stream {
  upstream pangolin_cluster {
    server pangolin1:5433;
    server pangolin2:5433;
    server pangolin3:5433;
    check type=tcp port=8008 default_down=true interval=5000 timeout=1000 rise=2 fall=5;
    check_send "GET /master HTTP/1.0\r\n\r\n";
    check_expect_alive "HTTP/1.0 200";
  }
  server {
    listen 5433;
    proxy_pass pangolin_cluster;
  }
}

Запуск кластера выполняется следующей командой:

docker-compose up -d

Pangolin DB StatFulSet (DropApp/Kubernetes)#

Ниже приведен пример манифеста для запуска в среде оркестрации DropApp (Kubernetes) docker-образа Pangolin DB и Pangolin Pooler (в режиме сквозной аутентификации).

Pangolin_k8s_cluster.yml:

apiVersion: v1
kind: Service
metadata:
  name: pangolin-docker-cluster-config
  labels:
    application: pangolin
    cluster-name: pangolin-docker-cluster
spec:
  clusterIP: None
 
---
# Секция для добавления пользовательских параметров
kind: ConfigMap
apiVersion: v1
metadata:
  name: pangolin-config
  labels:
    application: pangolin
    cluster-name: pangolin-docker-cluster
data:
# Параметры для Pangolin DB
  DB: |-
    max_parallel_workers = '10'
    max_parallel_workers_per_gather = '4'
# Параметры для Pangolin Pooler
  pooler: |-
    [pgbouncer]
     verbose = 3
 
---
 #  Основной манифест для установки StatfulSet Pangolin DB
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: &cluster_name pangolin-docker-cluster
  labels:
    application: pangolin
    cluster-name: *cluster_name
spec:
  replicas: 3
  serviceName: *cluster_name
  selector:
    matchLabels:
      application: pangolin
      cluster-name: *cluster_name
  template:
    metadata:
      labels:
        application: pangolin
        cluster-name: *cluster_name
    spec:
      serviceAccountName: pangolin-cluster-demo
      containers:
        - image: pangolin-DB-sberlinux942:15.5-6.5.0
          name: pangolin-DB
          imagePullPolicy: IfNotPresent
          readinessProbe:
            httpGet:
              scheme: HTTP
              path: /readiness
              port: 8008
            initialDelaySeconds: 15
            periodSeconds: 10
            timeoutSeconds: 15
            successThreshold: 1
            failureThreshold: 3
          ports:
            - containerPort: 5433
              protocol: TCP
            - containerPort: 8008
              protocol: TCP
          env:
            # Активация параметра dubug позволяет выводить информацию о генерированных файлах конфигурации postgresql.conf, postgres.yaml и pg_hba.conf
            - name: debug
              value: "false"
            - name: TZ
              value: Europe/Moscow
            - name: PATRONI_KUBERNETES_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: PATRONI_KUBERNETES_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: PATRONI_KUBERNETES_BYPASS_API_SERVICE
              value: 'false'
            - name: PATRONI_KUBERNETES_USE_ENDPOINTS
              value: 'true'
            - name: PATRONI_SCOPE
              value: *cluster_name
            # В PATRONI_KUBERNETES_LABELS значения параметра должно соответствовать лейблам Statfulset
             - name: PATRONI_KUBERNETES_LABELS
              value: '{application: pangolin, cluster-name: pangolin-docker-cluster}'
            - name: PATRONI_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: PATRONI_POSTGRESQL_LISTEN
              value: '0.0.0.0:5433'
            - name: POSTGRES_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: *cluster_name
                  key: pg_pass
            - name: PATRONI_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: *cluster_name
                  key: patroni_password
            - name: PANGOLIN_LIC_DATA
              valueFrom:
                secretKeyRef:
                  name: *cluster_name
                  key: lic_data
            - name: PG_PROFILE_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: *cluster_name
                  key: pg_profile_pass
            # Ниже представлены параметры для активации уникальных преднастроенных фичей Pangolin DB
            - name: enable_1c_support
              value: "False"
            - name: pg_stat_kcache_is_enable
              value: "False"
            - name: masking_mode
              value: "False"
            - name: session_tracing
              value: "False"
            - name: performance_insights
              value: "False"
            - name: pg_profile
              value: "False"
            - name: rotate_password
              value: "False"
          resources:
            requests:
              memory: "1024Mi"
              cpu: 1
            limits:
              memory: "2048Mi"
              cpu: 2
          volumeMounts:
            - name: postgresql-data
              mountPath: /pgdata
            - name: pangolin-config-volume
              mountPath: /user_conf.d
          securityContext:
            privileged: false
        # Docker образ Pangolin DB работает только с UID 26.
            runAsUser: 26
            runAsGroup: 26
        - image: pangolin-pooler:1.5.0
          name: pooler
          ports:
            - containerPort: 6544
              protocol: TCP
              name: pooler
          env:
            # Активация параметра dubug позволяет выводить информацию о генерированных файле конфигурации pangolin-pooler.ini
            - name: debug
              value: "false"             
            - name: TZ
              value: Europe/Moscow
            - name: DB_HOST
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: MAX_CLIENT_CONN
              value: "400"
            - name: POOL_MODE
              value: "transaction"
            - name: MIN_POOL_SIZE
              value: "0"
            - name: DEFAULT_POOL_SIZE
              value: "105"
            - name: MAX_DB_CONNECTIONS
              value: "105"
            - name: MAX_USER_CONNECTIONS
              value: "105"
          resources:
            requests:
              memory: "256Mi"
              cpu: 1
            limits:
              memory: "512Mi"
              cpu: 1
          volumeMounts:
            - name: pangolin-config-volume
              mountPath: /user_conf.d
          securityContext:
            privileged: false
      volumes:
        - name: postgresql-data
          emptyDir: {}
        - name: pangolin-config-volume
          configMap:
            name: pangolin-config
            items:
              - key: DB
                path: user.conf
              - key: pooler
                path: user_conf.ini
      imagePullSecrets:
        - name: image-pull-secret
      terminationGracePeriodSeconds: 0
 
---
apiVersion: v1
kind: Endpoints
metadata:
  name: &cluster_name pangolin-docker-cluster
  labels:
    application: pangolin
    cluster-name: *cluster_name
subsets: []
 
---
# Сервис для подключения к мастер-узлу
apiVersion: v1
kind: Service
metadata:
  name: &cluster_name pangolin-docker-cluster
  labels:
    application: pangolin
    cluster-name: *cluster_name
spec:
  type: ClusterIP
  selector:
    application: pangolin
    cluster-name: *cluster_name
    role: master  
  ports:    
    - protocol: TCP
      port: 5433
      targetPort: 5433
      name: db
    - protocol: TCP
      port: 6544
      targetPort: 6544
      name: pooler
 
---
# Сервис для подключения к узлу реплика
apiVersion: v1
kind: Service
metadata:
  name: pangolin-cluster-demo-repl
  labels:
    application: pangolin
    cluster-name:  &cluster_name pangolin-docker-cluster
    role: replica
spec:
  type: ClusterIP
  selector:
    application: pangolin
    cluster-name: *cluster_name
    role: replica
  ports:
  - port: 5433
    targetPort: 5433
 
---
# Файл с паролями в кодировке Base64
apiVersion: v1
kind: Secret
metadata:
  name: &cluster_name pangolin-docker-cluster
  labels:
    application: pangolin
    cluster-name: *cluster_name
type: Opaque
data:
# Пароль для уз Postgres
  pg_pass: UEBzc3dvcmRGb3JUZXN0cyEhMTE=
# Пароль для уз Patroni
  patroni_password: UGF0cm9uaVRlc3RQYXNzd29yZDEwMjkhQA==
# Пароль для уз pg_profile_tuz
  pg_profile_pass: cHJvZmlsZXR1elBhc3NzdXBlcnRyb25HMTIxMg==
# Данные лицензии Pangolin
  lic_data:
 
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: pangolin-cluster-demo
 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pangolin-cluster-demo
  namespace: da-dp01-db-pangolin-dev
rules:
- apiGroups:
  - ""
  resources:
  - configmaps
  verbs:
  - create
  - get
  - list
  - patch
  - update
  - watch
  # delete and deletecollection are required only for 'patronictl remove'
  - delete
  - deletecollection
- apiGroups:
  - ""
  resources:
  - endpoints
  verbs:
  - get
  - patch
  - update
  # the following three privileges are necessary only when using endpoints
  - create
  - list
  - watch
  # delete and deletecollection are required only for 'patronictl remove'
  - delete
- apiGroups:
  - ""
  resources:
  - pods
  verbs:
  - get
  - list
  - patch
  - update
  - watch
# The following privilege is only necessary for creation of headless service
# for pangolin-config endpoint, in order to prevent cleaning it up by the
# k8s master. You can avoid giving this privilege by explicitly creating the
# service like it is done in this manifest (lines 2..10)
- apiGroups:
  - ""
  resources:
  - services
  verbs:
  - create
 
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pangolin-cluster-demo
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pangolin-cluster-demo
subjects:
- kind: ServiceAccount
  name: pangolin-cluster-demo

Команда запуска манифеста:

kubectl apply -n pangolin-demo-cluster -f pangolin_k8s_cluster.yaml

Можно воспользоваться helm-чартом pangolin-db, который находится внутри дистрибутива с продуктом Pangolin по пути conf/helm/application/pangolin-db.

Примечание:

helm чарт pangolin-db доступен только в дистрибутива для OS Sberlinux 9, RedOS 7 и RedOS 8.

Пример вызова helm-чарта:

helm install pangolin-db-demo -n da-dp01-db-pangolin-dev \
--set imageName.DB=pangolin-DB-sberlinux942:15.5-6.5.0 \
--set imageName.Pooler=pangolin-pooler:1.5.0 \
--set pooler.enabled=true --set-file lic_data=license_trial.json conf/helm/application/pangolin-db --atomic --timeout 5m

Запуск c использованием оператора Pangolin CloudNative#

Pangolin CloudNative#

Для построения кластерной конфигурации в среде оркестрации DropAPP (kubernetes) используется оператор Cloudnative-PG, который в составе продукта называется Pangolin CloudNative. Схема оркестрации кластера Pangolin с использованием оператора Pangolin CloudNative отвечает требованиям к решению для применения в частных (отчуждаемых) облаках.

Возможности Pangolin CloudNative:

  • Прямая интеграция с сервером Kubernetes API для обеспечения высокой доступности без использования внешних инструментов.

  • Обеспечение отказоустойчивости основного экземпляра за счет выбранной реплики.

  • Возможность переключения с основного экземпляра на выбранную реплику.

  • Возможность работы произвольного количества экземпляров (минимальное значение 1 соответствует основному серверу).

  • Определение службы на чтение и запись для подключения приложений только к основному серверу кластера.

  • Определение службы только на чтение для подключения приложений к любым экземплярам.

  • Декларативное управление ролями, пользователями и группами.

  • Поддержка локальных хранилищ данных с шаблонами запросов к ним.

  • Переиспользование постоянных хранилищ в подах.

  • Отдельное хранилище для WAL-файлов.

  • Поддержка минорных версий PostgreSQL (если не был изменен системный каталог).

  • Постоянные обновления или обновления «на лету» для операторов.

  • Поддержка TLS-соединений и аутентификации клиента по сертификату.

  • Поддержка пользовательских сертификатов TLS (включая интеграцию с cert-manager).

  • Непрерывное резервное копирование в хранилище объектов.

  • Полное восстановление и восстановление в определенный момент времени из существующей резервной копии в хранилище объектов.

  • Автономный импорт существующих баз данных PostgreSQL.

  • Переход в спящий режим кластера PostgreSQL декларативным способом.

  • Поддержка синхронных реплик.

  • Поддержка двух слотов физической репликации на уровне кластера.

  • Резервное копирование из режима ожидания.

  • Политики хранения резервных копий (на основе окна восстановления).

  • Параллельное архивирование и восстановление WAL, чтобы база данных могла успевать за генерацией WAL в системах с высокой интенсивностью записи.

  • Поддержка тегов для файлов резервных копий, загружаемых в хранилище объектов, для включения дополнительного управления хранением на уровне хранилища объектов.

  • Развертывание PostgreSQL на нескольких кластерах Kubernetes, позволяющее использовать частные, общедоступные, гибридные и мультиоблачные архитектуры.

  • Объединение в пул соединений с помощью Pangolin Pooler.

  • Поддержка привязки к узлу через nodeSelector.

  • Настраиваемый экспортер пользовательских метрик для Prometheus через порт metrics (9187).

  • Стандартное протоколирование сообщений об ошибках PostgreSQL в формате JSON.

  • Автоматическая настройка readOnlyRootFilesystem контекста безопасности для модулей.

  • cnpg плагин для kubectl.

Примечание:

Оператор Pangolin CloudNative не использует скрипты Entrypoint внутри docker-образов Pangolin DB и Pangolin Pooler. Конфигурация уникальных функциональностей Pangolin DB доступна только при использовании helm-чарта.

Архив оператора pcloudn-1.20.6-distrib.tar.gz расположен в дистрибутиве продукта Pangolin в архиве 3rdparty. Внутри архива расположены:

  • бинарный файл оператора;

  • плагин kubectl для работы с оператором;

  • Docker-файл для самостоятельной сборки docker-образа оператора;

  • манифест для установки оператора;

  • helm-чарт для установки Pangolin DB с помощью оператора.

Внимание!

В манифесте cnpg-1.20.6.yaml в строках 13660 и 13667 вместо pangolin-cloudnative:1.20.6-121 необходимо указать путь к Docker-образу Pangolin CloudNative.

Для установки оператора необходимо применить манифест cnpg-1.20.6.yaml:

kubectl apply -f cnpg-1.20.6.yaml --namespace=cnpg-system

Для установки кластера Pangolin DB с помощью оператора Pangolin CloudNative необходимо воспользоваться helm-чартом, расположенным в архиве pcloudn-1.20.6-distrib.tar.gz, имя чарта cnpg-cluster.

Пример запуска helm-чарта:

helm install pangolin-demo-cl -n pangolin-demo --atomic --timeout 3m \
-f ./helm_charts/cnpg-cluster/dev_values.yaml ./helm_charts/cnpg-cluster