Перейти к основному содержимому

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

В СУБД Pangolin возможно запускать Docker-образы компонентов продукта в кластерных конфигурациях с одним главным узлом и произвольным числом узлов реплицирования. Для этого используются различные системы оркестрации, такие как 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_supportautovacuum = '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_kcachepg_stat_kcache.linux_hz = '-1'
shared_preload_libraries = '...,pg_stat_kcache,...'
Включение маскирования запросовmasking_modemasking_mode = 'full'
Включение трассировки сессий (Инструменты диагностики и анализа)session_tracingsession_tracing_enable = 'True';
session_tracing_file_limit = '-1';
session_tracing_default_path = '$PGDATA/tracing/';
session_tracing_default_level = '0';
session_tracing_roles = ''
Включение анализа производительности (Инструменты диагностики и анализа)performance_insightsperformance_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, в схеме PUBLICpg_profilepg_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_passwordrotate_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