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

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

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

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

По требованию имеется возможность запросить Docker-образ СУБД Pangolin на одной из двух ОС - SberLinux OS Server 9 или РЕД ОС 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,timescaledb'
# 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" : "...{hash}…"}'
  2. Через значение volume. Для этого необходимо файл лицензии в JSON-формате передать по пути стандартного расположения этого файла внутри контейнера (например, -v /path/to/license.json:/opt/pangolin/license.json). Пример команды запуска:

       docker run --name pangolin -e POSTGRES_PASSWORD=<password> -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:7.3.1

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

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

  • маскирование парольной информации в запросах с указанием паролей;
  • очистка высвобождаемого дискового пространства в процессе работы СУБД;
  • контроль целостности конфигурации и объектов БД;
  • контроль загрузки динамических библиотек с проверкой контрольных сумм;
  • контроль использования процедурных языков;
  • глобальные индексы и глобальные ограничения на партиционированные таблицы;
  • 64-битные идентификаторы транзакций;
  • параметры управления быстрыми блокировками;
  • нативное интервальное партиционирование.

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

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

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

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

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

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

enable_1c_support

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

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

pg_stat_kcache_is_enable

pg_stat_kcache.linux_hz = &#039;-1&#039;
shared_preload_libraries = &#039;...,pg_stat_kcache,...&#039;

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

masking_mode

masking_mode = &#039;full&#039;

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

session_tracing

session_tracing_enable = &#039;True&#039;;
session_tracing_file_limit = &#039;-1&#039;;
session_tracing_default_path = &#039;$PGDATA/tracing/&#039;;
session_tracing_default_level = &#039;0&#039;;
session_tracing_roles = &#039;&#039;

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

performance_insights

performance_insights.enable = &#039;True&#039;;
performance_insights.masking = &#039;True&#039;;
performance_insights.sampling_enable = &#039;True&#039;;
performance_insights.sampling_period = &#039;5s&#039;;
performance_insights.num_samples_in_ram = &#039;12&#039;;
performance_insights.num_samples_in_files = &#039;17280&#039;

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

pg_profile

pg_profile.topn = &#039;20&#039;;
pg_profile.max_sample_age = &#039;7&#039;;
pg_profile.track_sample_timings = &#039;off&#039;
DO
$DO$
BEGIN
IF EXISTS (
SELECT FROM pg_catalog.pg_roles
WHERE rolname = &#039;profile_tuz&#039;) THEN
RAISE NOTICE &#039;Role &quot;profile_tuz&quot; already exists. Skipping.&#039;;
ELSE
CREATE USER &quot;profile_tuz&quot; WITH ENCRYPTED PASSWORD &#039;profiletuzPasssupertronG1212&#039; INHERIT VALID UNTIL &#039;infinity&#039; CONNECTION LIMIT 5;
END IF;
END
$DO$;

GRANT SELECT ON pg_nblocks TO &quot;profile_tuz&quot;;
GRANT EXECUTE ON FUNCTION get_nblocks TO &quot;profile_tuz&quot;;
GRANT EXECUTE ON FUNCTION get_nblocks_all TO &quot;profile_tuz&quot;;

CREATE EXTENSION IF NOT EXISTS &quot;dblink&quot; WITH SCHEMA &quot;public&quot;;
CREATE EXTENSION IF NOT EXISTS &quot;plpgsql&quot; WITH SCHEMA &quot;pg_catalog&quot;;
CREATE EXTENSION IF NOT EXISTS&quot;pg_stat_statements&quot; WITH SCHEMA &quot;public&quot;;
CREATE EXTENSION IF NOT EXISTS &quot;pg_cron&quot; WITH SCHEMA &quot;public&quot;;

-- create schema for using with extension pg_profile
CREATE SCHEMA IF NOT EXISTS &quot;pgse_profile&quot; AUTHORIZATION :user;
COMMENT ON SCHEMA pgse_profile IS &#039;Schema for pgse_profile extension only&#039;;
-- create pg_profile extension
CREATE EXTENSION IF NOT EXISTS &quot;pg_profile&quot; WITH SCHEMA &quot;pgse_profile&quot;;

GRANT USAGE ON SCHEMA pgse_profile, public TO &quot;profile_tuz&quot;;
GRANT pg_read_all_stats TO &quot;profile_tuz&quot;;
GRANT EXECUTE ON FUNCTION public.pg_stat_statements_reset TO &quot;profile_tuz&quot;;
GRANT ALL ON ALL TABLES IN SCHEMA public TO &quot;profile_tuz&quot;;
GRANT SELECT, USAGE ON ALL sequences IN SCHEMA public TO &quot;profile_tuz&quot;;
GRANT EXECUTE ON ALL functions IN SCHEMA public TO &quot;profile_tuz&quot;;
GRANT ALL ON ALL tables IN SCHEMA pgse_profile TO &quot;profile_tuz&quot;;
GRANT SELECT, USAGE ON ALL sequences IN SCHEMA pgse_profile TO &quot;profile_tuz&quot;;
GRANT EXECUTE ON ALL functions IN SCHEMA pgse_profile TO &quot;profile_tuz&quot;;
GRANT USAGE ON TYPE public.dblink_pkey_results TO &quot;profile_tuz&quot;;

-- set cron job settings
SELECT pgse_profile.drop_server(&#039;local&#039;);SELECT pgse_profile.create_server(&#039;local&#039;, &#039;dbname=postgres host=127.0.0.1 port=5433 user=profile_tuz&#039;);

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

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

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

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

rotate_password

rotate_password.num_rounds = '20'

CREATE EXTENSION IF NOT EXISTS &quot;psql_rotate_password&quot; WITH SCHEMA &quot;public&quot;;

Пример:

docker run --name pangolin -e enable_1c_support=true -e POSTGRES_PASSWORD=<password> -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:7.3.1

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

  • управление парольными политиками;
  • использование транспортных паролей;
  • расширенные возможностей аудита действий пользователя;
  • набор дополнительных представлений для анализа (psql_diagpack);
  • аварийное завершение СУБД при отключении СХД;
  • очистка не используемых файлов в табличных пространствах;
  • управление планами запросов;
  • резервирование подключений для служебных ролей;
  • контроль потребления СУБД Pangolin вычислительных ресурсов;
  • планировщик заданий;
  • дефрагментация таблиц;
Подсказка

Данные функциональности можно настроить и активировать с помощью Helm-чартов в файле настройки values.yaml или непосредственным монтированием конфигурационных и исполняемых скриптов в специальные директории.

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

Работа с директориями /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=<password> -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:7.3.1

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

docker run --name pangolin -v "/path/to/configs:/user_conf.d" -e POSTGRES_PASSWORD=<password> -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:7.3.1
Подсказка

Поддерживаются файлы в формате *.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=<password> -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-sberlinux9:7.3.1
Подсказка

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

Для запуска 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:7.3.1
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"
- name: postgis
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-средах - доработка функциональности обновления, резервного копирования и мониторинга не предусматривается.
  • Некоторые инфраструктурнозависимые функциональности, например, работа с СЗИ, на текущий момент не доступны.

Docker-образ Pangolin DB with PostGIS

Данный образ создан из базового образа Pangolin DB, поддерживает полностью всю его функциональность. Дополнительно в нем предустановлены расширения и системные библиотеки для возможности установить расширение PostGIS.

Скрипт entrypoint образа содержит специальный ключ postgis, при его значении true происходит установка расширений:

ALTER ROLE current_user SET pgaudit.log='none';
CREATE EXTENSION IF NOT EXISTS postgis;
CREATE EXTENSION IF NOT EXISTS postgis_raster;
CREATE EXTENSION IF NOT EXISTS postgis_sfcgal;
CREATE EXTENSION IF NOT EXISTS postgis_tiger_geocoder CASCADE;
CREATE EXTENSION IF NOT EXISTS postgis_topology;
CREATE EXTENSION IF NOT EXISTS address_standardizer;
CREATE EXTENSION IF NOT EXISTS address_standardizer_data_us;
CREATE EXTENSION IF NOT EXISTS pgrouting;
ALTER ROLE current_user RESET pgaudit.log;

Пример запуска образа с установкой расширений для поддержки PostGIS:

docker run --name pangolin-postgis -e postgis=true -e POSTGRES_PASSWORD=<password> -v /path/to/license.json:/opt/pangolin/license.json -d pangolin-DB-postgis-sberlinux95:7.3.1

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);
  • auth_type (scram-sha-256);
  • auth_file (/etc/pangolin-pooler/userlist.txt);
  • admin_users (pgbouncer).

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

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 = ${AUTH_TYPE:-scram-sha-256}
auth_file = $auth_file
auth_proxy = on
auth_failure_threshold = 3
auth_inactivity_period = 60
auth_last_size = 10
log_audit = 1
admin_users = ${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 в команде запуска образа. Также можно задать пароль для администратора: для этого необходимо присвоить значения переменным ADMIN_USERS и ADMIN_PASSWORD.

Внимание!

В переменнойADMIN_PASSWORD допускается использование только пароля в формате md5 или plain. Для формата scram-sha-256 необходимо использовать монтирование файла аутентификации непосредственно в контейнер.

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

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

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

Для использования в среде оркестрации DropAPP (Kubernetes) вместе с оператором или без него, а также для возможности запуска в среде оркестрации docker-compose, начиная с версии 6.5.0 Pangolin DB включает в себя дополнительно установленный и настроенный rpm/deb-пакет 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=<password>
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:17.9-7.3.1
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:17.9-7.3.1
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:17.9-7.3.1
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
# Параметры для настрокий резервирования подключений для ролей
pg_quota: |-
user1 reserved_connections=3
user2 reserved_connections=8

---
# Основной манифест для установки 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:17.9-7.3.1
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
- containerPort: 5544
protocol: TCP
env:
# Активация параметра dubug позволяет выводить информацию о генерированных файлах конфигурации postgresql.conf, postgres.yml и 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: tuner_profile
value: "1c"
- 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"
- name: postgis
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.6.1
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
- key: pg_quota
path: pg_quota.conf.tmp
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: <password>
# Пароль для уз Patroni
patroni_password: <password>
# Пароль для уз pg_profile_tuz
pg_profile_pass: <password>
# Данные лицензии 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.

Данный чарт позволяет установить как single конфигурацию, так и cluster с произвольным количеством реплик.

Примечание

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

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

helm install pangolin-db-demo -n da-dp01-db-pangolin-dev \
--set type=cluster \
--set pangolin_license_secret_name=license-pg \
--set imageName.DB=pangolin-DB-sberlinux942:17.9-7.3.1 \
--set imageName.Pooler=pangolin-pooler:1.6.1\
--set pooler.enabled=true conf/helm/application/pangolin-db --atomic --timeout 5m