Установка в рамках микросервисной архитектуры
В СУБД 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%