Установка RPLW в DropApp#
Порядок установки#
Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права).
Проверьте и подготовьте параметры в common репозитории стенда для консоли.
Выполните развертывание объектов базы данных (playbook
DB_UPDATE).Используя средства Pipeline, выполните миграцию конфигурационных файлов GraDeLy на узел.
Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения.
Рекомендуется убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц.
Создайте техническую таблицу в БД приемника для старта с GraDeLyID.
Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System.
Настройте механизм для ограничения входящих запросов Rate Limiter
Шаг 1. Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права (обязательный)#
Последовательность действий#
CREATE ROLE gdl WITH
LOGIN
ENCRYPTED PASSWORD '${password.placeholder}'
VALID UNTIL '${time.placeholder}';
CREATE SCHEMA IF NOT EXISTS AUTHORIZATION gdl;
ALTER ROLE gdl SET search_path = "$user",ext,public;
GRANT USAGE ON SCHEMA ext TO gdl;
commit;
Примечания:
замените
${password.placeholder}актуальным паролем;замените
${time.placeholder}на timestamp срока действия пароля или на значение infinity для бессрочного пароля.
Проверка результата#
Пользователь и схема gdl созданы в БД модуля управления
Шаг 2. Создайте tablespace grdl_ts_data и grdl_ts_idx (обязательный)#
Последовательность действий#
create tablespace grdl_ts_data owner gdl location '${YYY_location.placeholder}';
create tablespace grdl_ts_idx owner gdl location '${ZZZ_location.placeholder}';
commit;
GRANT ALL ON TABLESPACE grdl_ts_data TO gdl;
GRANT ALL ON TABLESPACE grdl_ts_idx TO gdl;
commit;
Примечания:
замените
${YYY_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_data (папка должна существовать на момент создания табличного пространства);замените
${ZZZ_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_idx (папка должна существовать на момент создания табличного пространства).
Проверка результата#
Tablespace созданы
Шаг 3. Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права (обязательный)#
Последовательность действий#
Роль для БД источника:
CREATE ROLE gdl_worker WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;Роль для БД приемника (выдача прав на репликацию не требуется):
CREATE ROLE gdl_worker WITH LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;> Примечания: > > - замените `${password.placeholder}` актуальным паролем; > - замените `${time.placeholder}` на timestamp срока действия пароля или на значение infinity для бессрочного пароля.Выдача минимально необходимых прав репликатору на объекты приемника (для всех DML операций и на использование схемы):
GRANT USAGE ON SCHEMA ${schema_name} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA ${schema_name} TO gdl_worker; ALTER DEFAULT PRIVILEGES IN SCHEMA ${schema_name} GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO gdl_worker; commit;Для использования обязательных технических таблиц со стороны репликатора (
$GRADELY_APPLY_POSITION$и$CONFLICT_RESOLUTION_TX$) выдайте дополнительные права:GRANT USAGE ON SCHEMA ${schema_name} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE ON $GRADELY_APPLY_POSITION$, $CONFLICT_RESOLUTION_TX$ IN SCHEMA ${schema_name} TO gdl_worker;Примечания:
воркер по умолчанию ожидает значение
${schema_name}= public, однако можно указать другую схему через параметр apply_position_schema в Опциях соединения с БД приемника (см Руководство администратора);достаточно создать одну таблицы $GRADELY_APPLY_POSITION$ и $CONFLICT_RESOLUTION_TX$ на каждой БД приемника.
выдача дополнительных прав репликатору на объекты источника не требуется.
Проверка результата#
Роли пользователей в БД источника и приемника созданы
Шаг 4. Проверьте и подготовьте параметры в common репозитории стенда для воркера (RPLW) (обязательный)#
Последовательность действий#
параметры
${стенд}/installer/system/efs/config/parameters/ssl.confДля RPLW:
ssl.ose.istio.rplw.kafka.fqdns - FQDN серверов kafka через запятую ssl.ose.istio.rplw.kafka.ips - IP-адреса серверов kafka через запятую в порядке, совпадающем с предыдущем значением; если IP не используется, выставляется значение none ssl.ose.istio.rplw.psql.fqdns - FQDN серверов БД источников/приемников Postgres через запятую ssl.proxy.type - тип proxy на ингресс-контроллере (nginx или haproxy) ssl.ose.secman.host - адрес сервера secman ssl.ose.secman.port - порт для подключения к серверу secman rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.namespace - имя namespace в vault, где хранятся секреты проекта rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.role.module - имя роли в vault, от которой будут выполняться API-вызовы vault-agent для namespace module rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.client-max-retries - максимальное количество попыток переподключения к серверу vault rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-cpu - максимальное значение ресурсов по CPU для sidecar vault-agent rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-limits-mem - максимальное значение ресурсов по RAM для sidecar vault-agent rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-cpu - минимальное значение ресурсов по CPU для sidecar vault-agent rplw.ose.deployment.spec.template.metadata.annotations.vault.hashicorp.com.agent-requests-mem - минимальное значение ресурсов по CPU для sidecar vault-agentпараметры
${стенд}/parameters/common.conf.ymlДля RPLW:
DB_SCHEMA_worker - схема БД приемника, для проливки скриптов LB RPLW_POSTGRES_DB_URL_worker - адрес в БД приемника в формате jdbc:postgresql://x.x.x.x:port/db_name, если кластер БД то jdbc:postgresql://x.x.x.x:port,x.x.x.x:port/db_name?targetServerType=master&prepareThreshold=0 registry - адрес registry registry_path - путь до директории с компонентом в registry registry_path_igeg - путь до компонента образа istio registry_path_otts - путь до компонента образа ott registry_path_loga - путь до компонента образа fluent-bitпараметры
${стенд}/installer/system/efs/config/parameters/_global.resources.confglobal.platform.auth.host - адреса backend IAM через запятую global.platform.iam.auth.host - адрес IAM global.platform.iam.auth.port - порт IAM global.platform.audit.proxy.https.host - адрес Audit c ОТТ global.platform.audit.proxy.https.host_no_ott - адрес Audit без ОТТ global.platform.audit.proxy.https.port - порт Audit global.platform.audit.proxy.https.url.path - путь до endpoint аудита PVM global.platform.secman.kv.basepath - адрес хранилища секретов kv в Secman global.platform.secman.pki.basepath - адрес хранилища секретов pki в Secman global.platform.secman.kv.jdbcpath - имя секрета сертификатов БД конфигураций в kv Secman global.platform.secman.kv.auditpath - имя секрета сертификатов Audit конфигураций в kv Secman global.platform.secman.kv.ottpath - имя секрета сертификатов OTT конфигураций в kv Secman global.platform.secman.pki.ott- путь до секрета в PKI (OTT) global.platform.secman.kv.ingresspath - путь до KV Ingress global.platform.secman.pki.audit - путь до секрета в PKI (Audit) global.platform.secman.pki.logger - путь до секрета в PKI (Logger) global.platform.secman.kv.iamsecret - секрет от IAM global.platform.secman.kv.loggerpath - путь до секрета в KV (Logger)параметры
${стенд}/installer/system/efs/config/parameters/_global.ott.confДля RPLW:
global.platform.rplw.ott.module.id - Имя модуля, указанное в поле CN запроса и сертификата клиента ОТТ global.platform.rplw.ott.service.hosts - Адрес сервера OTTSпараметры
${стенд}/installer/system/efs/config/parameters/openShift.confglobal.platform.logger.kafka.bootstrap.servers global.platform.logger.kafka.topic #Лимит использования Pod-ами эфемерного хранилища global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storageпараметры для каждого из двух namespaces
{ "datacenters": { "${nameCluster}": { #имя кластера k8s "openshiftCluster": "${url}", #адрес кластера k8s "openshiftSATokenCred": "${token}", #токен с доступом для деплой в namspace "openshiftProjectName": "${namespace}", #имя namespace k8s "openshiftControlPlaneProject": "${nameCP}", #имя controlPanel k8s "openshiftControlPlaneIstiodPort": "${portCP}", #порт controlPanel k8s "openshiftControlPlaneIstiodService": "${istiodName}", #имя istiod k8s "openshiftControlPlaneJaegerPort": "${jaegerPort}", #порт jaeger k8s "openshiftControlPlaneJaegerService": "${jaegerService}", #имя jaegerService k8s "openshiftNewRoute": "${routeFQDN}", #часть имени FQDN для формирования Route "openshiftAppsDomain": "apps.dap.devpub-02.solution.sbt", "openshiftRoutersFQDN": [ "${addressCluster}" ], #адрес кластера k8s "overrides": [] } } }параметры из глобальных переменных помещаются в config maps и не требуют переопределения (если данные переменные существуют):
global.multiClusters.openshiftControlPlaneIstiodService global.multiClusters.openshiftControlPlaneJaegerPort global.multiClusters.openshiftControlPlaneIstiodPort global.multiClusters.openshiftControlPlaneJaegerService global.multiClusters.openshiftControlPlaneProject global.platform.ose.kafka.ports
Проверка результата#
Параметры в common репозитории стенда для консоли подготовлены.
Шаг 5. Выполните развертывание объектов базы данных (обязательный)#
Последовательность действий#
Выполните файл сценария DB_UPDATE, используя устанавливаемый дистрибутив.
Для загрузки на несколько БД или кластеров БД скриптов LB требуется заново запустить сценарий, изменив перед запуском значение параметра RPLW_POSTGRES_DB_URL_worker.
Проверка результата#
Сценарий выполнен
Шаг 6. Мигрируйте конфигурационные файлы GraDeLy (обязательный)#
Последовательность действий#
Перед развертыванием самого приложения необходимо произвести шаблонизацию и миграцию параметров из дистрибутива на среду (параметров среды и параметров программного обеспечения).
Данные для шаблонизации и миграции находятся в папке дистрибутива conf/config/parameters.
Параметры в конфигурационных файлах дистрибутива могут содержать плейсхолдеры на общие параметры установки, конкретные значения которых должны подставляться при установке. Конкретные значения параметров установки хранятся отдельно в файлах стендов, наличие этих данных обеспечивается администраторами стендов, куда производится установка продукта.
Для RPLW:
└── conf
└── config
└── parameters
├── rplw.all.conf
├── rplw.istio.all.conf
└── rplw-module.conf
Проверка результата#
Конфигурационные файлы мигрированы.
Шаг 7. Внесите в конфигурационные файлы GraDeLy на узле необходимые изменения (обязательный)#
Последовательность действий для развертывания в k8s (RPLW)#
Для реализации поддержки нескольких схем доступа к секретам приложения и потребителей нужно заполнить нижеследующие параметры:
# Для каждой интеграции адрес секрета KV, хранимый в vault, представляется в виде конкатинации двух параметров <имя_модуля>.ose.secman.kv.<имя_интеграции>.basepath и <имя_модуля>.ose.secman.kv.<имя_интеграции>.secret_name
# Для каждой интеграции секрета PKI, генерируемы vault, происходит по двум параметрам: <имя_модуля>.ose.secman.pki.<имя_интеграции>.basepath - движок PKI (имеет список разрешенных common names) и <имя_модуля>.ose.secman.pki.<имя_интеграции>.common_name - common name
# Для входящего трафика и интеграции с ОТТ, внесен тогглер (true/false) <имя_модуля>.ose.secman.kv.<ingress/ott>.add-old-ca-chain, который контролирует подключение KV секрета, для добавления цепочки сертивикатов в корневой сертификат (согласно архитектуре: на grdl-console-ui нет ОТТ!)RV
# Для интеграции с БД, кафки и "из консоли в воркера" KV конкатинация состоит из <имя_модуля>.ose.secman.kv.<имя_интеграции>.basepath и FQDN имени сервиса интеграции, соотвественно данных параметров в ConfigMap нет
rplw-module.ose.secman.kv.psql-cred.basepath=
rplw-module.ose.secman.pki.ingress.basepath=
rplw-module.ose.secman.pki.ingress.common_name=
rplw-module.ose.secman.kv.ingress.add-old-ca-chain=
rplw-module.ose.secman.kv.ingress.old-ca-chain.secret_name=
rplw-module.ose.secman.kv.ingress.old-ca-chain.secret_path=
rplw-module.ose.secman.kv.ingress.basepath=
rplw-module.ose.secman.pki.ott.basepath=
rplw-module.ose.secman.pki.ott.common_name=
rplw-module.ose.secman.kv.ott.add-old-ca-chain=
rplw-module.ose.secman.kv.ott.old-ca-chain.secret_name=
rplw-module.ose.secman.kv.ott.old-ca-chain.secret_path=
rplw-module.ose.secman.kv.ott.basepath=
rplw-module.ose.secman.kv.ott.secret_name=
rplw-module.ose.secman.pki.audit.basepath=
rplw-module.ose.secman.pki.audit.common_name=
rplw-module.ose.secman.kv.audit.basepath=
rplw-module.ose.secman.kv.audit.secret_name=
rplw-module.ose.secman.pki.to_console.basepath=
rplw-module.ose.secman.pki.to_console.common_name=
rplw-module.ose.secman.kv.to_console.basepath=
rplw-module.ose.secman.kv.to_console.secret_name=
rplw-module.ose.secman.pki.logger.basepath=
rplw-module.ose.secman.pki.logger.common_name=
rplw-module.ose.secman.kv.logger.basepath=
rplw-module.ose.secman.kv.logger.secret_name=
rplw-module.ose.secman.pki.psql-eg.basepath=
rplw-module.ose.secman.pki.psql-eg.common_name=
rplw-module.ose.secman.kv.psql-eg.basepath=
rplw-module.ose.secman.pki.kafka.basepath=
rplw-module.ose.secman.pki.kafka.common_name=
rplw-module.ose.secman.kv.kafka.basepath=
rplw-module.conf:#Имя приложения. Изменять не требуется. application-module.name=rplw-module #Автоматическое формирование FQDN. Изменять не требуется. rplw-module.ose.istio.ingress.route.spec.host.http.consoleFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ lookup('custom_vars', 'global.multiClusters.openshiftNewRoute') }} #Url для подключения module к console при старте rplw-module.console.url=http://{{ lookup('custom_vars', 'rplw-module.ose.istio.ingress.route.spec.host.http.consoleFQDN') }}/ #Параметры логирования rplw-module.log.root.level=info rplw-module.logger.root.level=INFO rplw-module.logger.org.springframework.level=INFO rplw-module.logger.org.springframework.web.level=INFO rplw-module.logger.ru.gradely.level=INFO rplw-module.label= #Rate limiter #Включение Rate limiter rplw-module.rate-limiter-enabled=false #Префикс метрик rplw-module.rate-limiter-metric-prefix=grdl_module rplw-module.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}]rplw.istio.all.conf:#Включение/отключение sidecar istio-proxy rplw.ose.deployment.spec.template.annotations.istio.inject=true #Включение/отключение секретов для pull image из docker registry rplw.ose.deployment.spec.template.spec.imagePullSecrets.enabled=true #Имя секрета rplw.ose.deployment.spec.template.spec.imagePullSecrets.name={registry_name}rplw.fluentbit-sidecar.all.conf:fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.cpu=200m fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.memory=600Mi fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.ephemeral-storage=${global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage|2Gi} fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.cpu=200m fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.memory=600Mi fluent-bit-sidecar.kafka.bootstrap.servers=${global.platform.logger.kafka.bootstrap.servers} fluent-bit-sidecar.kafka.topic=${global.platform.logger.kafka.topic}
Проверка результата#
Изменения в конфигурационные файлы внесены.
Шаг 8. Проверьте и подготовьте параметры k8s в namespace (обязательный)#
Последовательность действий#
Для этого создайте imagePullSecret:
kind: Secret
apiVersion: v1
metadata:
name: ${rplw.ose.deployment.spec.template.spec.imagePullSecrets.name}'
data:
.dockerconfigjson: >-
"Строка подключения к docker registry в base64"
type: kubernetes.io/dockerconfigjson
Проверка результата#
Параметры k8s подготовлены.
Шаг 9. Удалите устаревшие ресурсы Kubernetes (обязательный)#
Последовательность действий#
Routes:
ingress-grdl-console-mTLS-unver
ingress-grdl-console-ui-mTLS-unver
ingress-grdl-module-mTLS-unver
Gateways:
ingress-gw-grdl-console-unver
ingress-gw-grdl-console-ui-unver
ingress-gw-grdl-module–unver
Virtual Services:
ingress-vs-ufs-si-console-bh-unver
ingress-vs-ufs-si-platform-bh-unver
ingress-vs-ufs-si-replicator-bh-unver
Проверка результата#
Устаревшие ресурсы k8s удалены.
Шаг 10. Произведите полную установку GraDeLy инструментом CDJE (обязательный)#
Последовательность действий для развертывания в k8s#
При выполненных предыдущих пунктах файлы сценария миграции, обновления БД повторно можно не выполнять.
Полный список файлов сценария для установки:
MIGRATION_FP_CONF;
FP_CONF_CHECK;
DB_UPDATE;
OPENSHIFT_DEPLOY;
OPENSHIFT_INGRESS_EGRESS_DEPLOY.
Проверка результата#
Установка проведена
Шаг 11. Убедиться, что в БД источника создаются публикации для выбора реплицируемых таблиц (обязательный)#
Последовательность действий#
Зайдите в клиентский терминал psql, в БД источника и создайте публикацию: create PUBLICATION {имя_публикации} FOR ALL TABLES;, чтобы реплицировать все таблицы или create PUBLICATION {имя_публикации} FOR TABLE {имя_таблицы1}, {имя_таблицы2}...;для репликации отдельных таблиц.
Механизм публикации в PostgreSQL позволяет выбирать таблицы для репликации. Выбрать таблицы также можно с помощью визуального редактора маппинга (подробнее в «Руководстве пользователя интерфейса консоли управления», однако для лучшей производительности, рекомендуется использовать механизм публикаций.
Проверка результата#
Публикация создаются.
Шаг 12. Создайте техническую таблицу в БД приемника для старта с GraDeLyID и репликации из нескольких источников в один приемник (обязательный)#
Последовательность действий#
Разверните в БД получателя архив воркера package/db/db_archive_receiver.zip для запуска на БД получателя.
Архив консоли package/db/db_archive_console.zip разворачивается на БД конфигураций по умолчанию.
Для этого в параметрах в репозитории с конфигурацией стенда, параметры ${стенд}/parameters/common.conf.yml установите переключатель «YES» для триггера на дополнительные таблицы на БД получателя.
Или пропишите и выполните в редакторе СУБД SQL-скрипт:
CREATE TABLE schema."$GRADELY_APPLY_POSITION$" (
thread_id int4 NOT NULL,
trx_id int8 NULL,
source_id int8 NOT NULL,
internal_id int8 NULL,
"offset" int8 NULL,
kafka_id varchar(255) NULL,
CONSTRAINT grdl_pk_apply_position_id PRIMARY KEY (source_id)
);
Запуск сценария (playbook) DB_UPDATE создает таблицу $CONFLICT_RESOLUTION_TX$.
Также ее можно создать вручную, выполнив следующую SQL команду:
```
CREATE TABLE public."$CONFLICT_RESOLUTION_TX$" (
source_id bigint NOT NULL,
gradely_id bigint NOT NULL,
change_vector_seq int NOT NULL,
transaction_id bigint NOT NULL,
table_schema varchar(128) NOT NULL,
table_name varchar(128) NOT NULL,-
opcode char(1) NOT NULL,
error_code char(1) NOT NULL,
error_message text,
vector_data jsonb NOT NULL,
error_handle_action char(1) NOT NULL
PRIMARY KEY (source_id, gradely_id, change_vector_seq)
);
```
Проверка результата#
Технические таблицы созданы.
Шаг 13. Включите КВР, контроль второй рукой (обязательный)#
Последовательность действий#
Для этого в параметрах в репозитории с конфигурацией консоли /grdl-console-config.yaml добавьте строку: grdl-task-control-enable: "${grdlTaskControlEnable}".
Параметр
task_control enable:trueзадается один раз при развертывании приложения. По умолчанию значение параметра false, то есть КВР отключен.Если приложение уже развернуто и при развертывании было задано значение false, чтобы включить контроль второй рукой, нужно повторно развернуть приложение.
Проверка результата#
КВР включен.
Шаг 14. Настройте секреты в системе управления секретами HashiCorp Vault/Secret Management System (обязательный)#
Последовательность действий#
Воспользуйтесь Руководством администратора.
Проверка результата#
Секреты настроены.
Шаг 15. Назначьте роли в СУДИР (обязательный)#
Последовательность действий#
Проведите интеграцию с СУДИР в соответствии с документацией СУДИР и назначьте роль PROJECT_CREATOR.
Проверка результата#
Роли в СУДИР назначены
Шаг 16. Создайте новый проект (обязательный)#
Последовательность действий#
Создайте проект под ролью PROJECT_CREATOR.
Проверка результата#
Проект создан.
Шаг 17. Определите максимальную производительность (обязательный)#
Последовательность действий#
Определите максимальную производительность.
Определение максимальной нагрузки
Для определения максимальной нагрузки, которую следует задать с помощью механизма Rate Limiter, проведите тест определения максимальной производительности.
Нагрузка должна быть ограничена с помощью механизма Rate Limiter на уровне, не превышающем показатели теста максимальной производительности.
Сценарий тестирования
При тестировании происходит пошаговое увеличение нагрузки с нуля до предельной (с шагом 20% от плановой). Пошаговое увеличение происходит до тех пор, пока не нарушится критерий успешности по количеству ошибок и/или времени отклика (что наступит раньше). Время работы теста на каждом шаге после стабилизации нагрузки составляет 10 минут.
Цель тестирования
По результатам тестирования устанавливается:
уровень нагрузки L0 — последний шаг нагрузки, на котором не были нарушены критерии успешности;
уровень нагрузки Llim — предельный уровень нагрузки, при котором не был нарушен критерий по количеству ошибок;
уровень утилизации CPUlim — утилизация CPU на уровне нагрузки Llim.
Ожидаемый результат
Определен уровень максимальной производительности. L0 удовлетворяет одному из следующих уровней нагрузки (при использовании ресурсов всеми подами не больше, чем на OSE):
Lmax для предыдущего релиза;
Запросите аналитическую оценку команды по плановой нагрузке на сервис на год вперед, если не достигнут Lmax (при суммарных ресурсах как на OSE);
Используйте критерий 10х от промышленной нагрузки на сервис, если не достигнута плановая нагрузка на год вперед.
Определен уровень нагрузки Llim.
Определен уровень утилизации CPUlim.
Проверка результата#
Максимальная производительность определена
Шаг 18. Настройте механизм для ограничения входящих запросов Rate Limiter (обязательный)#
Последовательность действий#
Настройте механизм для ограничения входящих запросов Rate Limiter.
Настройка механизма для ограничения входящих запросов Rate Limiter
Для Java-based:
Задайте следующие параметры в configmap консоли или воркера:
Параметр |
Тип |
Значение по умолчанию |
Описание |
|---|---|---|---|
|
boolean |
|
Включает и выключает Rate Limiter для консоли |
|
string |
|
Приставка для имени метрики, которая показывает, сколько запросов прошли через Rate Limiter на консоли. |
|
json |
|
Конфигурация Rate Limiter для каждого endpoint консоли |
|
boolean |
|
Включает и выключает Rate Limiter для воркера |
|
string |
|
Приставка для имени метрики, которая показывает, сколько запросов прошли через Rate Limiter на воркере. |
|
json |
|
Конфигурация Rate Limiter для каждого endpoint воркера |
Json-конфигурация endpoints позволяет точечно определить ограничение по количеству вызовов для каждого endpoint.
Эта конфигурация представляет массив объектов, в каждом из которых указывается:
uri — endpoint, который необходимо защитить. Поддерживаются regexp, например,
/module/.*/state. Есть ключевое значение/general, с помощью него все endpoints, которые не заданы явно, объединяются в одну группу с общим лимитом;maxTokens — максимальное количество запросов, которое пользователь разрешает к endpoint;
refillIntervalSec — интервал в секундах, за который доступное количество запросов восстанавливается.
Если
maxTokens=1000, аrefillIntervalSec=1, пользователь не ждет, пока пройдет секунда, — при каждом запросе увеличиваем доступное количество запросов на величину, пропорциональную прошедшему времени. Например, если с момента прошлого запроса прошло пол секунды, к доступному лимиту добавляется 500 запросов.
Важно, чтобы этот json представлял из себя одну строку без пробелов.
Для SRLS-based:
Задайте следующие параметры в configmap консоли или воркера:
Параметр |
Тип |
Значение по умолчанию |
Описание |
|---|---|---|---|
|
boolean |
|
Включает и выключает Rate Limiter для консоли |
|
string |
|
Название заголовка которая идентифицирует уникального пользователя |
|
string |
|
Название заголовка которая идентифицирует запросы для api console |
|
string |
|
Название заголовка которая идентифицирует запросы от модулей |
|
string |
|
Дескриптор для определения правил SRLS Rate Limits |
|
string |
|
Версия Envoy для SRLS |
|
string |
`` |
Адрес сервиса для подключения к SRLS |
|
string |
|
Порт для подключения к SRLS |
|
string |
`` |
Namespace k8s SRLS |
|
json |
|
Конфигурация Rate Limiter by header для endpoint консоли |
|
boolean |
|
Включает и выключает защиту от DDOS для консоли |
|
string |
|
Список доступных доменов, которые не блокируются, через запятую |
Json-конфигурация endpoints позволяет гибко настравить Rate Limits для endpoint.
Эта конфигурация представляет массив объектов, которые соотвествуют спецификации SRLS.
В примере, указанном в дистрибутиве - в SRLS ставится дескриптор grdl и любой трафик которые не будет иметь ниодного из заголовков iv-user,x-console-srlsx-srls будет заблокирован, в обратном случее применится общий rate limit - 500 запрос в сек (значение по умолчанию), если один из заголовков будет иметь значение «1» или «2» то квота для него будет пересмотрена.
Защита от DDoS ораганизована через EnvoyFilter lua скриптом, поэтому при формировании списка grdl-console.envoy-cn-list нужно учитывать синтаксис lua (например изоляцию спецсимволов через %), поддерживает регулярные выражения, в значении по умолчанию wildcard для определенных доменов 1 и 2-го уровня.
Проверка результата#
Rate Limiter настроен
Шаг 19. Интеграция с компонентом граничного прокси (IGEG) (обязательный)#
Последовательность действий RPLW#
Интеграция с граничным прокси настраивается Администратором стенда в ${стенд}/multiClusters.json
Убедитесь, что в конфигурации ConfigMap rplw.istio.all.conf установлен параметр: rplw.ose.deployment.spec.template.annotations.istio.inject=true и эта аннотация применена в Deployment для module.
Проверка результата#
Интеграция с IGEG настроена.
Шаг 20. Интеграция с сервисом сбора, обработки и записи данных в каналы вывода (COTE) (обязательный)#
Последовательность действий#
Интеграция с Аудитом настраивается Администратором стенда в файле ${стенд}/conf/config/parameters/grdl-console.conf по шаблону:
#Режим работы аудита
grdl-console.union-audit.mode
# REST endpoint Platform V Monitor (AUD)
grdl-console.union-audit.baseUrl
# IP и FQDN (через пробел) узла АС или FQDN namespace АС в OpenShift,
# с которого происходит отправка событий аудита
grdl-console.union-audit.nodeId
# проект, необходимый для отправки сообщений аудита в Push-Collector
grdl-console.union-audit.project:ms-audt
# необходимые сертификаты и закрытый ключ
grdl-console.union-audit.alias
# Путь до файла с секретом из Secman
grdl-console.hot-reload-audit-secret-path
# Путь к хранилищу с сертификатами УЦ(формат jks)
grdl-console.union-audit.kafka.sslTruststoreLocation
# Путь к хранилищу с сертификатами приложения(формат jks)
grdl-console.union-audit.kafka.sslKeystoreLocation
#REST endpoint Platform V Audit SE (AUD)
grdl-console.audit2-http-proxy
Проверка результата#
Интеграция с COTE настроена.
Шаг 21. Интеграция с компонентом IAM Proxy (AUTH) (обязательный)#
Последовательность действий#
Пример config файлов для интеграции с AUTH:
grdl-console.conf:#Имя приложения. Изменять не требуется. application-console.name=grdl-console #Автоматическое формирование FQDN. Изменять не требуется. grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} #URL до БД grdl-console.db.url={{ GRDL_POSTGRES_DB_URL }} #Имя схемы БД grdl-console.db.schema=gdl #Адрес logout IAM grdl-console.logoutPath=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/openid-connect-auth/logout #Адрес login IAM grdl-console.loginPath=https://{{ lookup('custom_vars', 'global.platform.iam.auth.host') }}/login #Путь до KV Ingress grdl-console.ose.secman.kv.ingresspathgrdl-console-ui.conf:#Имя приложения. Изменять не требуется. application-console-ui.name=grdl-console-ui #Автоматическое формирование FQDN. Изменять не требуется. grdl-console-ui.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console-ui.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }} grdl-console-ui.x.entry.point.url=“entrypoint-url”/gradely-console/
Проверка результата#
Интеграция с AUTH настроена.
Шаг 22. Интеграция с СУДИР (обязательный)#
Последовательность действий#
GraDeLy интегрируется с СУДИР через SCIM. Путь: <url_gradely>/scim/.
При интеграции из репозитория GraDeLy в СУДИР подгружается ролевая модель. В дальнейшем заданные роли назначаются пользователям в СУДИР в соответствии с документацией СУДИР.
Перечень пользователей и назначенных им ролей синхронизируется с репозиторием GraDeLy по инициативе СУДИР в соответствии с документацией СУДИР.
Проверка результата#
Интеграция с СУДИР настроена.
Шаг 23. Интеграция с компонентом Журналирование (LOGA) (обязательный)#
Последовательность действий RPLW#
Пример rplw.fluentbit-sidecar.all.conf файла для интеграции с LOGA:
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.cpu=200m
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.memory=600Mi
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.limits.ephemeral-storage=${global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage|2Gi}
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.cpu=200m
fluent-bit-sidecar.ose.deployment.spec.template.spec.containers.fluent-bit-sidecar.resources.requests.memory=600Mi
fluent-bit-sidecar.kafka.bootstrap.servers=${global.platform.logger.kafka.bootstrap.servers}
fluent-bit-sidecar.kafka.topic=${global.platform.logger.kafka.topic}
Проверка результата#
Интеграция с LOGA настроена.
Шаг 24. Интеграция с компонентом Объединенный мониторинг Unimon (MONA) (обязательный)#
Последовательность действий#
Для интеграции с компонентом MONA требуется предварительная настройка стенда администраторами.
Параметры берутся из настроек стенда.
Проверка результата#
Интеграция с MONA настроена.
Шаг 25. Интеграция с компонентом Platform V Pangolin DB (PSQL) (обязательный)#
Последовательность действий#
Пример grdl-console.conf файла для интеграции с PSQL:
#Имя приложения. Изменять не требуется.
application-console.name=grdl-console
#Автоматическое формирование FQDN. Изменять не требуется.
grdl-console.ose.istio.ingress.route.spec.host.http.appFQDN={{ lookup('custom_vars', 'application-console.name') }}-{{ lookup('custom_vars', 'distrib.release.version') }}.{{ global.multiClusters.openshiftNewRoute }}
#URL до БД
grdl-console.db.url={{ GRDL_POSTGRES_DB_URL }}
#Имя схемы БД
grdl-console.db.schema=gdl
#Адрес logout IAM
grdl-console.logoutPath=https://{{ lookup('vars', 'global.platform.iam.auth.host') }}/openid-connect-auth/logout
#Адрес login IAM
grdl-console.loginPath=https://{{ lookup('custom_vars', 'global.platform.iam.auth.host') }}/login
В Platform V Pangolin DB 6 параметр
wal_keep_size, задающий минимальный объем сегментов, который будет сохраняться в каталоге pg_wal, по умолчанию составляет 8 ГБ.
Проверка результата#
Интеграция с PSQL настроена.
Шаг 26. Интеграция с компонентом Corax (KFKA) (обязательный)#
Последовательность действий#
Для интеграции с компонентом KFKA требуется предварительная настройка стенда Администраторами.
Параметры берутся из настроек стенда.
Проверка результата#
Интеграция с KFKA настроена.
Шаг 27. Интеграция с компонентом OTTS (обязательный)#
Последовательность действий#
Настройка интеграции производится на подах Ingress Gateway и Egress Gateway каждого Namespace.
Пример grdl.all.conf :
# Container limits
grdl.ott.limits.cpu = 200m
grdl.ott.limits.memory = 600Mi
grdl.ott.limits.ephemeral-storage = 1Gi
grdl.ott.requests.cpu = 200m
grdl.ott.requests.memory = 600Mi
# App vars
grdl.ott.module.id = {{ lookup('vars','global.platform.grdl.ott.module.id') }}
grdl.ingress.ott.audit2.proxy.url = http://localhost:6992
grdl.egress.ott.audit2.proxy.url = http://localhost:6991
Пример ConfigMap для Ingress Gateway:
kind: ConfigMap
apiVersion: v1
metadata:
name: grdl-console-ott-ingress-cm
labels:
owner: ott-sidecar
data:
OTT_CERTSTORE_TYPE: PEM
OTT_MODULE_ID: ott-client-grdl
OTT_CLIENT_CRT: /vault/secrets/certs/ott/ott_cert.pem
OTT_CLIENT_PRIVATE_KEY: /vault/secrets/certs/ott/ott_key.pem
OTT_SERVICE_TLS_CRT: /vault/secrets/certs/ott/ott_root.pem
OTT_SERVICE_CRT: /vault/secrets/certs/ott/ott-service.pem # обеспечение обратной совместимости с OTT сервером версии до 4.3.1
OTT_SERVICE_CLIENT_TRUSTED_CRT_RATE: '60' # период обновления кеша сертификатов серверов OTT, в секундах (при подключении к OTT серверу 4.3.1+)
OTT_OPER_MODE: validate # <mode> = "sign" для egress GW, "validate" - для ingress GW; не задавать этот параметр при интеграции со сборкой envoy от synapse security
OTT_SERVICE_HOSTS: >-
ott-server-host1:port,ott-server-host2:port # список серверов:портов сервиса OTTS для балансировки нагрузки, или аналогичный список nginx OTTS
JAVA_TOOL_OPTIONS: -Dlogging.config=/mnt/ott-logback/logback.xml -Dlogback.configurationFile=/mnt/ott-logback/logback.xml -XX:MaxRAMPercentage=55.0 -Dspring.profiles.active=probes
OTT_AUTH_TLS_TRUST_MODE: 'true'
# изменить значения параметров ниже при необходимости, по умолчанию - не менять
OTT_CLIENT_MMT-COMPATIBILITY-MODE: 'false' #режим совместимости с ММТ 3 поколения, включать для взаимодействия с Платформой 3-го поколения, ожидаемая структура path HTTP-запроса: /<receiver_id>/<api.name>/<api.method> или /<api.name>/<api.method>
OTT_GRPC_PORT: /mnt/ott-uds-socket/ott.socket
OTT_SERVICE_URL: 'https://stub-host:stub-port/ott-service/rest/token' #шаблон URL сервиса OTTS, при балансировке значения будут подставляться из OTT_SERVICE_HOSTS
OTT_AUTHZ_VERSION: '1.0' #версия метода авторизации
OTT_AUTHZ_REALM: ott
OTT_HTTP_PORT: '8090' # порт OTTS Sidecar для readiness probe, при необходимости можно выбрать любой другой свободный порт
OTT_ANONYMOUS_REQUESTS_ENABLED: 'false' # анонимный режим, для включения необходимо выставить в 'true'
OTT_CLIENT_DEFAULT_REALM: mmt
OTT_CLIENT_MMT_RESOURCE_ATTRID: 'urn:censored:names:censored:1.0:api:interface:fullname'
OTT_CLIENT_MMT_ACTION_ATTRID: 'urn:censored:names:censored:1.0:action:id'
OTT_APPLICATION_ATTRIBUTE_ID: 'urn:censored:names:censored:1.0:module:id' #здесь строка остается неизменной, на свой идентификатор приложения менять не нужно
При использовании IAM необходимо указать параметр
OTT_AUTH_TLS_TRUST_MODE: 'true'
Пример ConfigMap для Egress Gateway:
kind: ConfigMap
apiVersion: v1
metadata:
name: grdl-console-ott-egress-cm
labels:
owner: ott-sidecar
data:
OTT_CERTSTORE_TYPE: PEM
OTT_MODULE_ID: ott-client-grdl
OTT_CLIENT_CRT: /vault/secrets/certs/ott/ott_cert.pem
OTT_CLIENT_PRIVATE_KEY: /vault/secrets/certs/ott/ott_key.pem
OTT_SERVICE_TLS_CRT: /vault/secrets/certs/ott/ott_root.pem
OTT_SERVICE_CRT: /vault/secrets/certs/ott/ott-service.pem # обеспечение обратной совместимости с OTT сервером версии до 4.3.1
OTT_SERVICE_CLIENT_TRUSTED_CRT_RATE: '60' # период обновления кеша сертификатов серверов OTT, в секундах (при подключении к OTT серверу 4.3.1+)
OTT_OPER_MODE: sign # <mode> = "sign" для egress GW, "validate" - для ingress GW; не задавать этот параметр при интеграции со сборкой envoy от synapse security
OTT_SERVICE_HOSTS: >-
ott-server-host1:port,ott-server-host2:port # список серверов:портов сервиса OTTS для балансировки нагрузки, или аналогичный список nginx OTTS
JAVA_TOOL_OPTIONS: -Dlogging.config=/mnt/ott-logback/logback.xml -Dlogback.configurationFile=/mnt/ott-logback/logback.xml -XX:MaxRAMPercentage=55.0 -Dspring.profiles.active=probes
# изменить значения параметров ниже при необходимости, по умолчанию - не менять
OTT_CLIENT_MMT-COMPATIBILITY-MODE: 'false' #режим совместимости с ММТ 3 поколения, включать для взаимодействия с Платформой 3-го поколения, ожидаемая структура path HTTP-запроса: /<receiver_id>/<api.name>/<api.method> или /<api.name>/<api.method>
OTT_GRPC_PORT: /mnt/ott-uds-socket/ott.socket
OTT_SERVICE_URL: 'https://stub-host:stub-port/ott-service/rest/token' #шаблон URL сервиса OTTS, при балансировке значения будут подставляться из OTT_SERVICE_HOSTS
OTT_AUTHZ_VERSION: '1.0' #версия метода авторизации
OTT_AUTHZ_REALM: ott
OTT_HTTP_PORT: '8090' # порт OTTS Sidecar для readiness probe, при необходимости можно выбрать любой другой свободный порт
OTT_ANONYMOUS_REQUESTS_ENABLED: 'false' # анонимный режим, для включения необходимо выставить в 'true'
OTT_CLIENT_DEFAULT_REALM: mmt
OTT_CLIENT_MMT_RESOURCE_ATTRID: 'urn:censored:names:censored:1.0:api:interface:fullname'
OTT_CLIENT_MMT_ACTION_ATTRID: 'urn:censored:names:censored:1.0:action:id'
OTT_APPLICATION_ATTRIBUTE_ID: 'urn:censored:names:censored:1.0:module:id' #здесь строка остается неизменной, на свой идентификатор приложения менять не нужно
Подробное описание интеграции доступно в документации на продукт One-Time Password (OTP)/OTT (версия 5.15)
Проверка результата#
Интеграция с OTTS настроена.
Шаг 28. Интеграция с HashiCorp Vault (SecMan) (обязательный)#
Последовательность действий для развертывания в k8s#
HashiCorp Vault (SecMan) — это система управления секретами и шифрованием на основе идентификационных данных. Взаимодействие с сервером SecMan производится с помощью Vault Agent sidecar, который поставляется в целевой pod с помощью инжектора.
Пример инжектора в Deployment:
… template: metadata: labels: secman-injector: enabled …
Инжектор Vault Agent изменяет спецификации pod, чтобы включить контейнеры Vault Agent, которые отображают секреты Vault в разделяемом томе памяти с использованием шаблонов Vault Agent. Выводя секреты на общий том, контейнеры внутри модуля могут использовать секреты Vault, не зная о Vault.
Инжектор — это Kubernetes Mutation Webhook Controller. Контроллер перехватывает события модуля и применяет изменения к модулю, если в запросе существуют аннотации. Эта функциональность предоставляется проектом vault-k8s и может быть автоматически установлена и настроена с помощью диаграммы Vault Helm.
Параметры инжектора и действий с секретами SecMan передаются в блоке аннотаций.
Пример записи сертификата из Key Value хранилища SecMan в файловую систему пода с использованием языка шаблонов GO Template:
template:
metadata:
labels:
...
annotations:
...
vault.hashicorp.com/agent-inject-secret-ott_root.pem: 'true'
vault.hashicorp.com/secret-volume-path-ott_root.pem: /vault/secrets/certs/ott
vault.hashicorp.com/agent-inject-file-ott_root.pem: ott_root.pem
vault.hashicorp.com/agent-inject-template-ott_root.pem: |
{{ '{{- with secret "' +
'DEV_censored/A/IFT3/GRDL/KV2/' +
'ott' +
'" -}}' }}
{{ '{{ .Data.data.cacert }}' }}
{{ '{{ end -}}' }}
...
GraDeLy поддерживает два типа секретов:
PKI — секреты, сгенерированные с движком SberCA;
KV-секреты — секреты, сгенерированные с движком KV Secrets Engine.
Конфигурационные параметры генерации секретов:
rplw-module.k8s.secman.engine.ott=KV
rplw-module.k8s.secman.engine.ingress=PKI
rplw-module.k8s.secman.engine.audit=KV
rplw-module.k8s.secman.engine.toconsole=PKI
rplw-module.k8s.secman.engine.logger=KV
rplw-module.k8s.secman.engine.psql=PKI
rplw-module.k8s.secman.engine.kafka=KV
Подготовка БД источника и БД приемника для работы с GraDeLy#
Подготовьте конфигурационный файл
postgresql.confБД источника, выставите необходимые параметры:Установите расширенное журналирование с помощью параметра
wal_level = logical.Установите необходимое максимальное количество слотов репликации с помощью параметра
max_replication_slots = 1(один слот на потребителя).Установите необходимое количество одновременно работающих процессов передачи WAL с помощью параметра
max_wal_senders = 1(один процесс на каждый слот).
Создайте пользователя (роль) и схему gdl в БД модуля управления и выдайте ему необходимые права:
CREATE ROLE gdl WITH LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; CREATE SCHEMA IF NOT EXISTS AUTHORIZATION gdl; ALTER ROLE gdl SET search_path = "$user",ext,public; GRANT USAGE ON SCHEMA ext TO gdl; commit;Примечание:
замените
${password.placeholder}актуальным паролем;замените
${time.placeholder}на timestamp срока действия пароля или на значение infinity для бессрочного пароля.
Создайте tablespace grdl_ts_data и grdl_ts_idx:
create tablespace grdl_ts_data owner gdl location '${YYY_location.placeholder}'; create tablespace grdl_ts_idx owner gdl location '${ZZZ_location.placeholder}'; commit; GRANT ALL ON TABLESPACE grdl_ts_data TO gdl; GRANT ALL ON TABLESPACE grdl_ts_idx TO gdl; commit;Примечания:
замените
${YYY_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_data (папка должна существовать на момент создания табличного пространства);замените
${ZZZ_location.placeholder}на абсолютный путь к папке для табличного пространства grdl_ts_idx (папка должна существовать на момент создания табличного пространства).
Создайте пользователя (роль) в БД источника и приемника для выполнения репликации и выдайте ему необходимые права:
Роль для БД источника:
CREATE ROLE gdl_worker WITH REPLICATION LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;Роль для БД приемника (выдача прав на репликацию не требуется):
CREATE ROLE gdl_worker WITH LOGIN ENCRYPTED PASSWORD '${password.placeholder}' VALID UNTIL '${time.placeholder}'; commit;
Примечания:
замените
${password.placeholder}актуальным паролем;замените
${time.placeholder}на timestamp срока действия пароля или на значение infinity для бессрочного пароля.
Выдача минимально необходимых прав репликатору на объекты приемника (для всех DML-операций и на создание собственной схемы):
GRANT USAGE ON SCHEMA ${schema_name} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA ${schema_name} TO gdl_worker; GRANT SELECT, INSERT, UPDATE, DELETE, TRUNCATE ON $GRADELY_APPLY_POSITION$, $CONFLICT_RESOLUTION_TX$ IN SCHEMA ${schema_name} TO gdl_worker; ALTER DEFAULT PRIVILEGES IN SCHEMA ${schema_name} GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO gdl_worker; commit;Примечания:
воркер по умолчанию ожидает значение
${schema_name}= public, однако можно указать другую схему через параметр apply_position_schema в Опциях соединения с БД приемника (см Руководство администратора);достаточно создать одну таблицы $GRADELY_APPLY_POSITION$ и $CONFLICT_RESOLUTION_TX$ на каждой БД приемника.
выдача дополнительных прав репликатору на объекты источника не требуется.
Для настройки двунаправленной репликации выдайте дополнительные права на публикацию логических слотов.
Создайте в клиентском терминале psql в БД источника публикацию и слот репликации:
CREATE PUBLICATION {имя_публикации} FOR ALL TABLES; SELECT * FROM pg_create_logical_replication_slot('{имя слота}', 'pgoutput');Создайте новое соединение и настройте параметры соединений с БД, Kafka или файловым хранилищем на вкладке Соединения.
Для каждого из используемых соединений заполните набор обязательных параметров:
name: Человекочитаемое имя type: Из списка [DB, QUEUE] driver: Используемый драйвер url: Строка соединения credentials: Информация для идентификации пользователя user: password:Наполнение соединения Source:
В таблице источника пропишите и запустите
select * from pg_get_replication_slots();найдите свободный слот, т.е. тот, где статус столбца
activeравенfalse(отсутствует галочка);добавьте следующий JSON в опции создаваемого соединения в UI:
{ "slot": "{имя слота}", "publication_names": "{имя_публикации}", }пропишите имя свободного слота на месте Слот;
пропишите название необходимой публикации;
пропишите адрес БД источника в поле URL;
пропишите логин и пароль пользователя с правами на запись в базу в полях Пользователь и Пароль;
укажите «База данных» в поле Тип.
Наполнение соединения Target:
Пропишите адрес БД приемника в поле URL;
пропишите логин и пароль пользователя с правами на запись в базу в полях Пользователь и Пароль;
укажите «База данных» в поле Тип.
Разверните два воркера в рекомендуемой среде контейнеризации.
Убедитесь, что воркеры появились во вкладке Воркеры в статусе
Ready, аProcess_idотсутствует.Создайте граф репликации: DB Source Connection (Source) → Capture Module (Capture) → Kafka Connection (Queue) → Apply Module (Apply) → DB Target Connection (Target).
Подготовьте конфигурации для модуля во вкладке Конфигурации (настройте маппинг и фильтрацию) и примените их к соответствующим модулям в графе.
Проверка результата#
Интеграция с SecMan настроена
Шаг 29. Предустановленные конфигурации (обязательный)#
Последовательность действий для развертывания RPLW#
rplw.all.conf :
rplw.worker.count = 2 # количество подов воркера при деплое
rplw.ose.deployment.spec.template.spec.containers.ott-sidecar.startupProbe.failureThreshold=30
rplw.ose.deployment.spec.template.spec.containers.ott-sidecar.livenessProbe.failureThreshold=30
rplw.ose.deployment.spec.template.spec.containers.ott-sidecar.readinessProbe.failureThreshold=15
rplw.fluentbit-sidecar.all.conf :
fluent-bit-sidecar.kafka.cn.server=ext-abyss-kafka-*.opsmon.sbt
# Параметры fluent-controller
# Перечитать конфигурацию fluent-bit
rplw.fluentbit-sidecar.conf.reload.enabled=true
# Использовать механизм Secman Hotreload
rplw.fluentbit-sidecar.vault.reload.enabled=true
rplw.istio.all.conf :
#Управление приоритетом компонентов
istio.ose.deployment.spec.template.spec.priorityClassName=
# количество реплик ingress/egress
istio.ose.istio.ingress.deployment.spec.replicas=2
# Istio control plane
rplw.ose.istio.control-plane-project={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneProject') }}
rplw.ose.istio.control-plane-istiod-service={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneIstiodService') }}
rplw.ose.istio.control-plane-istiod-port={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneIstiodPort') }}
# Jaeger collector
rplw.ose.istio.control-plane-jaeger-service={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneJaegerService') }}
rplw.ose.istio.control-plane-jaeger-port={{ lookup('custom_vars', 'global.multiClusters.openshiftControlPlaneJaegerPort') }}
rplw.ose.deployment.spec.template.spec.containers.istio-proxy.readinessProbe.failureThreshold=30
#Kafka ports
rplw.ose.istio.egress.se.tcp.kafka.number={{ lookup('custom_vars', 'global.platform.ose.kafka.ports') }}
rplw.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=1000m
rplw.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
rplw.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=1000m
rplw.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
rplw.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
rplw.ose.istio.vault-token.aud=vault
rplw-module.conf :
#Управление приоритетом компонентов
rplw-module.ose.deployment.spec.template.spec.priorityClassName=
# Параметр добавляющий аргументы запуска приложения через jvm переменную JAVA_OPTS. Будут помещены в конфигмап someFpName1. conf;
rplw-module.ose.configmap.javaArguments=-XX:+UseContainerSupport -XX:InitialRAMPercentage=40.0 -XX:MaxRAMPercentage=80.0 -XX:+UseSerialGC
# количество реплик
rplw-module.ose.deployment.spec.replicas=2
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.limits.cpu=2000m
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.limits.memory=4000Mi
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.limits.ephemeral-storage={{ lookup('custom_vars', 'global.ose.deployment.spec.template.spec.containers.resources.limits.ephemeral-storage', default='500Mi') }}
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.requests.cpu=2000m
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.resources.requests.memory=4000Mi
rplw-module.ose.kafka.port=9093
rplw-module.kafka.message-format=PARSED
rplw-module.label=
rplw-module.hot-reload-enable=true
rplw-module.hot-reload-poll-interval=5000
rplw-module.hot-reload-retry-count=10
rplw-module.hot-reload-fail-safe-enable=true
rplw-module.hot-reload-dir-postgres=/vault/secrets/databases
rplw-module.capture-cache-size=12000
rplw-module.apply-cache-size=15
rplw-module.kafka-consumer-queue-size=12000
rplw-module.ose.deployment.spec.template.spec.containers.resources.limits.cpu=1000m
rplw-module.ose.deployment.spec.template.spec.containers.resources.limits.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.resources.requests.cpu=1000m
rplw-module.ose.deployment.spec.template.spec.containers.resources.requests.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.limits.cpu=400m
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.limits.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.requests.cpu=400m
rplw-module.ose.deployment.spec.template.spec.containers.egress.resources.requests.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.limits.cpu=200m
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.limits.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.requests.cpu=200m
rplw-module.ose.deployment.spec.template.spec.containers.ingress.resources.requests.memory=200Mi
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.livenessProbe.failureThreshold=3
rplw-module.ose.deployment.spec.template.spec.containers.rplw-module.readinessProbe.failureThreshold=3
rplw-module.feature.SelfAntiAffinity.enabled=false
# Rate limiter
rplw-module.rate-limiter-buckets=[{"uri":"/general","maxTokens":1000,"refillIntervalSec":1}]
#Список БД находящихся на том же ЦОД что и воркер
rplw-module.db.urls=["fqdn1","fqdn2"]
Проверка результата#
Конфигурации предустановлены.