Docker-образы СУБД Pangolin
В СУБД 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
и данные лицензии.
Лицензию можно передать двумя способами:
-
Через переменную
PANGOLIN_LIC_DATA
, в JSON-формате, например:'{ "license" : { "end_date" : "xxx", "licensee" : "xxx", "type" : "xx" }, "sign" : "...{хеш}…"}'
-
Через значение
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);auth_type
(scram-sha-256);auth_file
(/etc/pangolin-pooler/userlist.txt);admin_users
(pgbouncer).
Имя 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 = ${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.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