.. _system_check: Проверка Компонента ================== Проверка Компонента «Витрина данных» конфигурации Стандарт ------------------------------------------------------------- Процесс установки Компонента описан в разделе :ref:`install_guide_standart`. Проверка ПО Prostore ~~~~~~~~~~~~~~~~~~~~~~ Проверка ПО Prostore осуществляется путем отправки SQL-запросов к Prostore через клиентское JDBC-подключение и сопоставления ожидаемого эталонного и полученного результатов. Проверка осуществляется согласно следующим этапам: 1. Создайте Витрину в Prostore с помощью SQL-запроса: .. code-block:: sql CREATE DATABASE <имя несуществующей логической базы>, например, CREATE DATABASE testdb; 2. Создайте таблицу в Prostore со всеми типами колонок с помощью SQL-запроса: .. code-block:: sql CREATE TABLE <имя логической базы из п.1>.all_types ( - id int not null, - double_col double, - float_col float, - char_col varchar(36), - boolean_col boolean, - int_col int not null, - bigint_col bigint, - date_col date, - timestamp_col timestamp, - primary key (id) - ) - distributed by (id) 3. Проверьте существование и структуру созданной таблицы в Prostore с помощью SQL-запросов: .. code-block:: sql select \* from <имя логической базы из п.1>.all_types DATASOURCE_TYPE='ADG' select \* from <имя логической базы из п.1>.all_types DATASOURCE_TYPE='ADQM' select \* from <имя логической базы из п.1>.all_types DATASOURCE_TYPE='ADB' 4. Удалите таблицу со всеми типами колонок из Prostore с помощью SQL-запроса: .. code-block:: sql DROP TABLE <имя логической базы из п.1>.all_types 5. Удалите Витрину с помощью SQL-запроса: .. code-block:: sql DROP DATABASE <имя логической базы из п.1>. .. note:: Наличие сообщений об ошибках, а также отличие получаемых состояний Prostore на различных этапах проверки от ожидаемых состояний является индикатором неуспешного прохождения проверки. Проверка СМЭВ QL Сервера ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой СМЭВ QL Сервера .. include:: ../../modules/smev-ql/doc/smev_ql_check.rst Проверка СМЭВ3-адаптера ~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой СМЭВ-адаптер .. include:: ../../modules/smev3-adapter/doc/smev3_adapter_check.rst Проверка DATA-Uploder – Модуля исполнения асинхронных заданий ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой Data-uploder – Модуль исполнения асинхронных заданий .. include:: ../../modules/data-uploader/doc/data_uploader_check.rst Проверка REST-Uploader – Модуля асинхронной загрузки данных из сторонних источников ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой REST-uploader – Модуль асинхронной загрузки данных из сторонних источников .. include:: ../../modules/rest-uploader/doc/rest_uploader_check.rst Проверка BLOB-адаптера ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой BLOB-адаптер .. include:: ../../modules/blob-adapter/doc/blob_adapter_check.rst Проверка сервиса формирования документов ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой Сервис формирования документов .. include:: ../../modules/printable-form-service/doc/printable_form_service_check.rst Проверка стандартного загрузчика ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой стандартного загрузчика .. include:: ../../modules/standard-loader/doc/standard_loader_check.rst .. Проверка CSV-Uploader .. ---------------------------------------- .. Подключаем файл с проверкой CSV-Uploader .. .. include:: ../../modules/csv-uploader/doc/csv_uploader_check installation.rst Проверка Сервиса генерации уникального номера (Counter-provider) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой Сервиса генерации уникального номера .. include:: ../../modules/counter-provider/doc/counter_provider_check.rst Проверка Агента проверок ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Подключаем файл с проверкой Сервиса генерации уникального номера .. include:: ../../modules/check-adapter/doc/check_adapter_check.rst Проверка Компонента «Витрина данных» конфигурации Лайт -------------------------------------------------------- .. _check_install_prostore: Процесс установки Компонента описан в разделе :ref:`install_guide_lite`. Для проверки установки Компонента следует выполнить следующие действия: 1. Откройте в браузере веб-интерфейс Portainer для управления docker-контейнерами по адресу ``IP:9000``, где - ``IP`` - адрес сервера. - ``9000`` - порт сервера. 1. Введите логин и пароль администратора Portainer. По умолчанию - ``admin``/ ``LongPassword`` (:numref:`img_authorization_docker`). .. _img_authorization_docker: .. figure:: img/image5-1_lig.png :align: center :alt: Авторизация в Portainer Авторизация в Portainer 3. Чтобы определить и автоматически настроить локальную среду нажмите значок **Get Started** (:numref:`img_Portainer`). .. _img_Portainer: .. figure:: img/image5_lig.png :align: center :alt: Окно «Quick Setup» Окно «Quick Setup» 4. На главной странице нажмите ссылку **local** (:numref:`img_local_link`). .. _img_local_link: .. figure:: img/image6_lig.png :align: center :alt: Окно «Home» Окно «Home» 5. Нажмите значок **Containers** (:numref:`img_Containers`). .. _img_Containers: .. figure:: img/image7_lig.jpg :align: center :alt: Окно «Containers» Окно «Containers» 6. В разделе **Container list** сверьте наличие компонентов со списком компонентов дистрибутива Компонента, приведенных в :ref:`distr_components` документа «Техническое описание Компонента «Витрина данных»». 7. Подключитесь к Компоненту по SSH (например, через `Putty `_). Выполните запрос, согласно приведенному примеру ниже. Пример запроса: .. code-block:: bash curl -X 'GET' \ 'http://localhost:9090/api/v1/versions' \ -H 'x-request-id: 52a68e46-c062-45d7-bf3a-3fe77d0e14d3' Пример успешного ответа (:numref:`image9_link`). .. _image9_link: .. figure:: img/image9_lig.png :align: center :alt: Проверка подключения к базе данных Prostore Проверка подключения к базе данных Prostore 8. Подключитесь к Grafana. Для этого следует перейти по адресу: ``http://<имя сервера>:3000`` и выполнить авторизацию (указаны значения по умолчанию): - логин: admin; - пароль: admin. Проверьте, что показатели Healthcheck Leaviness и Readiness (дашборд Lite) работают (индикатор зеленого цвета). 9. Просмотрите лог-файл установки (ansible/ansible.log). Лог-файл не должен содержать записей с ошибками установки. Обновление Компонента ======================= Обновление Компонента конфигурации "Стандарт" с версии 1.х на 2.х ---------------------------------------------------------------------- Для обновления Компонента с версии 1.х на 2.х реализованы варианты, приведенные в :numref:`tab_update_options`. .. _tab_update_options: .. table:: Варианты обновления Компонента +----------------------+--------------------------------------------------------+--------------------------------------------+--------------------------------+--------------------------------------+ | **Вариант** | **Описание** | **Требования к ресурсам** | **Время простоя на запись** | **Время простоя на чтение** | +======================+========================================================+============================================+================================+======================================+ | С переиспользованием | Метаданные Prostore мигрируют из Zookeeper в Postgres, | Требуется минимальное число дополнительных | Весь процесс обновления | Время миграции метаданных Prostore + | | прикладной БД | | | | время перезапуска приложений | | | прикладные данные остаются в единственном экземпляре, | ресурсов на время переходного процесса. | | | | | | | | | | | с ними поочередно работают Prostore разных версий. | | | | +----------------------+--------------------------------------------------------+--------------------------------------------+--------------------------------+--------------------------------------+ | С поднятием 2 копий | Метаданные Prostore мигрируют из Zookeeper в Postgres, | Требуются дополнительные ресурсы для | Весь процесс обновления | Перезапуск Агента СМЭВ4, или 0 если | | витрины | | | | Агентов более 1 | | | создается копия прикладных данных. | создания копии прикладных данных и для | | | | | | | | | | | | поднятия второй копии витрины. | | | +----------------------+--------------------------------------------------------+--------------------------------------------+--------------------------------+--------------------------------------+ Обновление Компонента с переиспользованием прикладной БД ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ При использовании данного варианта обновления Компонента необходимо выполнить шаги, приведенные ниже. Проверка резервной копии ^^^^^^^^^^^^^^^^^^^^^^^^^^ Проверить наличие свежей резервной копии витрины: если отсутствует, создать резервную копию текущими средствами. В процессе обновления описаны шаги по сохранению настроек и формированию резервной копии на уровне базы данных, которые можно выполнить заранее. Подготовка служебной БД нового Prostore ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Подготовить служебную БД нового Prostore (dtm-query-execution-core). Запустить Prostore для инициализации и подготовки служебной БД Prostore. Перед запуском нового Prostore нужно определить его конфигурацию. В частности разделы ``servicedb``, ``raft``, ``failover``, временно нужно отключить публикацию компонент ``componentinfo.enabled: ${COMPONENT_INFO_ENABLED:false}``. Ниже приводятся примеры конфигурации старого и нового Prostore. В случае запуска обоих Prostore на одном сервере, для нового Prostore указываются обособленные порты (в примерах порты метрик меняются так 8080 -> 8081, а порты API меняются так 9090 -> 9091 (в разделах ``raft`` и ``core.http``)). .. Dropdown:: Пример конфигурации старого Prostore .. code-block:: yaml logging: level: ru.datamart.prostore: ${DTM_LOGGING_LEVEL:DEBUG} server: port: ${DTM_METRICS_PORT:8080} pnode: host: ${PNODE_HOST:} httpPort: ${PNODE_HTTP_PORT:} leaderlessEnabled: ${PNODE_LEADERLESS_ENABLED:false} springdoc: api-docs: enabled: false swagger-ui: url: /openapi.yml path: /swagger-ui management: endpoints: enabled-by-default: ${DTM_METRICS_ENABLED:true} web: exposure: include: ${DTM_METRICS_SCOPE:info, health} endpoint: health: show-components: always probes: enabled: true group: readiness: showDetails: always include: - readinessState - dtmState startup: showDetails: always include: - dtmState core: plugins: active: ${CORE_PLUGINS_ACTIVE:ADP} category: mapping: RELATIONAL: ${DTM_CORE_PLUGINS_RELATIONAL:ADB, ADP, ADQM, ADG} ANALYTICAL: ${DTM_CORE_PLUGINS_ANALYTICAL:ADQM, ADB, ADP, ADG} DICTIONARY: ${DTM_CORE_PLUGINS_DICTIONARY:ADG, ADB, ADP, ADQM} UNDEFINED: ${DTM_CORE_PLUGINS_UNDEFINED:ADB, ADP, ADQM, ADG} WITHOUT_FROM: ${DTM_CORE_PLUGINS_WITHOUT_FROM:ADP, ADB, ADQM, ADG} http: port: ${DTM_CORE_HTTP_PORT:9090} tcpNoDelay: ${DTM_CORE_HTTP_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_HTTP_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_HTTP_TCP_QUICK_ACK:true} http2WindowSize: ${DTM_CORE_HTTP2_WINDOW_SIZE:1048576} webclient: tcpNoDelay: ${DTM_CORE_WEBCLIENT_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_WEBCLIENT_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_WEBCLIENT_TCP_QUICK_ACK:true} connectionTimeoutMs: ${DTM_CORE_WEBCLIENT_CONNECTION_TIMEOUT_MS:30000} poolSize: ${DTM_CORE_WEBCLIENT_POOL_SIZE:20} http2PoolSize: ${DTM_CORE_WEBCLIENT_HTTP2_POOL_SIZE:20} http2KeepAliveSec: ${DTM_CORE_WEBCLIENT_HTTP2_KEEP_ALIVE_SEC:0} privateapiwebclient: tcpNoDelay: ${DTM_CORE_WEBCLIENT_LEADER_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_WEBCLIENT_LEADER_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_WEBCLIENT_LEADER_TCP_QUICK_ACK:true} connectionTimeoutMs: ${DTM_CORE_WEBCLIENT_LEADER_CONNECTION_TIMEOUT_MS:2000} poolSize: ${DTM_CORE_WEBCLIENT_LEADER_POOL_SIZE:20} http2PoolSize: ${DTM_CORE_WEBCLIENT_LEADER_HTTP2_POOL_SIZE:20} http2KeepAliveSec: ${DTM_CORE_WEBCLIENT_LEADER_HTTP2_KEEP_ALIVE_SEC:0} env: name: ${DTM_NAME:test} prometheus: enabled: ${PROMETHEUS_ENABLED:true} auth: jwksUri: ${AUTH_JWKS_URI:} defaultRoles: ${CORE_DEFAULT_ROLES:env_owner} restoration: autoRestoreState: ${AUTO_RESTORE_STATE:true} matviewsync: periodMs: ${MATERIALIZED_VIEWS_SYNC_PERIOD_MS:5000} retryCount: ${MATERIALIZED_VIEWS_RETRY_COUNT:10} maxConcurrent: ${MATERIALIZED_VIEWS_CONCURRENT:2} datacooling: periodMs: ${DATA_COOLING_RUN_PERIOD_MS:600000} maxConcurrent: ${DATA_COOLING_CONCURRENT:2} checkQueriesPeriodMs: ${DATA_COOLING_CHECK_QUERIES_PERIOD_MS:30000} checkTrimPeriodMs: ${DATA_COOLING_CHECK_TRIM_PERIOD_MS:30000} ddlqueue: enabled: ${CORE_DDL_QUEUE_ENABLED:true} tslog: maxDepth: ${TSLOG_MAX_DEPTH:2} pageSize: ${TSLOG_PAGE_SIZE:1600} jet: connectionString: ${KAFKA_JET_WRITERS:} consumerGroup: ${KAFKA_JET_CONSUMER_GROUP:jet-load} pollDurationMs: ${KAFKA_JET_POLL_DURATION_MS:1000} pollBufferSize: ${KAFKA_JET_POLL_BUFFER_SIZE:1000} dbBufferSize: ${KAFKA_JET_DB_BUFFER_SIZE:10000} getTimeoutMs: ${KAFKA_JET_GET_TIMEOUT_MS:5000} checkTimeoutMs: ${KAFKA_JET_CHECK_TIMEOUT_MS:2000} retryCount: ${KAFKA_JET_RETRY_COUNT:1} datasource: edml: defaultChunkSize: ${EDML_DEFAULT_CHUNK_SIZE:1000} pluginStatusCheckPeriodMs: ${EDML_STATUS_CHECK_PERIOD_MS:1000} firstOffsetTimeoutMs: ${EDML_FIRST_OFFSET_TIMEOUT_MS:15000} changeOffsetTimeoutMs: ${EDML_CHANGE_OFFSET_TIMEOUT_MS:10000} zookeeper: connection-string: ${ZOOKEEPER_DS_ADDRESS:localhost} connection-timeout-ms: ${ZOOKEEPER_DS_CONNECTION_TIMEOUT_MS:30000} session-timeout-ms: ${ZOOKEEPER_DS_SESSION_TIMEOUT_MS:86400000} chroot: ${ZOOKEEPER_DS_CHROOT:/adtm} connectionRetryCount: ${ZOOKEEPER_DS_CONNECTION_RETRY_COUNT:0} optimisticRetryCount: ${ZOOKEEPER_DS_OPTIMISTIC_RETRY_COUNT:20} writeOptimisticRetryCount: ${ZOOKEEPER_DS_WRITE_OPTIMISTIC_RETRY_COUNT:1000} maxSequenceSize: ${ZOOKEEPER_DS_MAX_SEQUENCE_SIZE:2000000000} streaming: upload: dbBatchSize: ${STREAMING_UPLOAD_DB_BATCH_SIZE:1000} dbBufferSize: ${STREAMING_UPLOAD_DB_BUFFER_SIZE:10000} inputBufferSizeMb: ${STREAMING_UPLOAD_INPUT_BUFFER_SIZE_MB:10} csvparser: separator: ${CSV_PARSER_SEPARATOR:;} quoteChar: ${CSV_PARSER_QUOTE_CHAR:"} escapeChar: ${CSV_PARSER_ESCAPE_CHAR:'} fieldAsNull: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS} kafka: getOffsetsRetryCount: ${ZOOKEEPER_KAFKA_GET_OFFSETS_RETRY_COUNT:3} getOffsetsRetryTimeoutMs: ${ZOOKEEPER_KAFKA_GET_OFFSETS_RETRY_TIMEOUT_MS:1000} producer: property: key.serializer: org.apache.kafka.common.serialization.StringSerializer value.serializer: org.apache.kafka.common.serialization.StringSerializer consumer: property: key.deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer value.deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer cluster: zookeeper: connection-string: ${ZOOKEEPER_KAFKA_ADDRESS:localhost} connection-timeout-ms: ${ZOOKEEPER_KAFKA_CONNECTION_TIMEOUT_MS:30000} session-timeout-ms: ${ZOOKEEPER_KAFKA_SESSION_TIMEOUT_MS:86400000} chroot: ${ZOOKEEPER_KAFKA_CHROOT:} connectionRetryCount: ${ZOOKEEPER_KAFKA_CONNECTION_RETRY_COUNT:1} admin: inputStreamTimeoutMs: ${KAFKA_INPUT_STREAM_TIMEOUT_MS:2000} status.event.publish: topic: ${KAFKA_STATUS_EVENT_TOPIC:status.event.topic} enabled: ${KAFKA_STATUS_EVENT_ENABLED:false} writeOperationsEnabled: ${KAFKA_STATUS_EVENT_WRITE_OPERATIONS_ENABLED:false} externalDDLEnabled: ${KAFKA_STATUS_EVENT_EXTERNAL_DDL_ENABLED:false} vertx: blocking-stacktrace-time: ${DTM_VERTX_BLOCKING_STACKTRACE_TIME:1} pool: worker-pool: ${DTM_CORE_WORKER_POOL_SIZE:20} event-loop-pool: ${DTM_CORE_EVENT_LOOP_POOL_SIZE:20} task-pool: ${DTM_CORE_TASK_POOL_SIZE:20} task-timeout: ${DTM_CORE_TASK_TIMEOUT:86400000} cache: initialCapacity: ${CACHE_INITIAL_CAPACITY:100000} maximumSize: ${CACHE_MAXIMUM_SIZE:100000} expireAfterAccessMinutes: ${CACHE_EXPIRE_AFTER_ACCESS_MINUTES:99960} delta: rollback-status-calls-ms: ${DELTA_ROLLBACK_STATUS_CALLS_MS:2000} rollbackRetryCount: ${DELTA_ROLLBACK_RETRY_COUNT:3} rollbackRetryTimeoutMs: ${DELTA_ROLLBACK_RETRY_TIMEOUT_MS:1000} rollbackOperationsTimeoutMs: ${DELTA_ROLLBACK_OPERATIONS_TIMEOUT_MS:29000} writeoperation: rollbackRetryCount: ${WRITE_OPERATION_ROLLBACK_RETRY_COUNT:3} rollbackRetryTimeoutMs: ${WRITE_OPERATION_ROLLBACK_RETRY_TIMEOUT_MS:1000} statistics: enabled: ${CORE_STATISTICS_ENABLED:true} threadsCount: ${CORE_STATISTICS_THREADS_COUNT:2} dataCountEnabled: ${CORE_STATISTICS_DATA_COUNT_ENABLED:true} dataCountPeriodMs: ${CORE_STATISTICS_DATA_COUNT_PERIOD_MS:0} poststatusevent: subscriberGroup: - endpointUrl: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_URL:} endpointTimeoutMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_TIMEOUT_MS:5000} endpointRetryTimeoutMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_RETRY_TIMEOUT_MS:5000} bufferingPeriodMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_BUFFERING_PERIOD_MS:0} bufferSize: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_BUFFER_SIZE:1000} writeOperationsEnabled: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_WRITE_OPERATIONS_ENABLED:false} externalDDLEnabled: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_EXTERNAL_DDL_ENABLED:false} adp: datasource: - name: ADP env: ${ADP_ENV_NAME:${DTM_NAME:test}} user: ${ADP_USERNAME:postgres} password: ${ADP_PASS:postgres} host: ${ADP_HOST:localhost} port: ${ADP_PORT:5432} poolSize: ${ADP_MAX_POOL_SIZE:3} executorsCount: ${ADP_EXECUTORS_COUNT:3} poolRequestTimeout: ${ADP_POOL_REQUEST_TIMEOUT:0} preparedStatementsCacheMaxSize: ${ADP_PREPARED_CACHE_MAX_SIZE:256} preparedStatementsCacheSqlLimit: ${ADP_PREPARED_CACHE_SQL_LIMIT:2048} preparedStatementsCache: ${ADP_PREPARED_CACHE:true} idleTimeoutMs: ${ADP_IDLE_TIMEOUT_MS:60000} maxLifetimeTimeoutMs: ${ADP_MAX_LIFETIME_TIMEOUT_MS:0} mppw: restStartLoadUrl: ${ADP_REST_START_LOAD_URL:http://localhost:8096/newdata/start} restStopLoadUrl: ${ADP_REST_STOP_LOAD_URL:http://localhost:8096/newdata/stop} restVersionUrl: ${ADP_MPPW_CONNECTOR_VERSION_URL:http://localhost:8096/versions} restGetEndpoint: ${ADP_MPPW_GET_ENDPOINT:/newdata/get} kafkaConsumerGroup: ${ADP_KAFKA_CONSUMER_GROUP:adp-load} restGetTimeoutMs: ${ADP_REST_GET_TIMEOUT_MS:5000} checkTimeoutMs: ${ADP_MPPW_CONNECTOR_CHECK_TIMEOUT_MS:2000} retryCount: ${ADP_MPPW_CONNECTOR_RETRY_COUNT:1} mppr: restLoadUrl: ${ADP_MPPR_QUERY_URL:http://localhost:8094/query} restVersionUrl: ${ADP_MPPR_CONNECTOR_VERSION_URL:http://localhost:8094/versions} checkTimeoutMs: ${ADP_MPPR_CONNECTOR_CHECK_TIMEOUT_MS:2000} retryCount: ${ADP_MPPR_CONNECTOR_RETRY_COUNT:1} .. Dropdown:: Пример конфигурации нового Prostore .. code-block:: yaml logging: level: ru.datamart.prostore: ${DTM_LOGGING_LEVEL:DEBUG} server: port: ${DTM_METRICS_PORT:8081} springdoc.swagger-ui: url: /openapi.yml path: /swagger-ui management: endpoints: enabled-by-default: ${DTM_METRICS_ENABLED:true} web: exposure: include: ${DTM_METRICS_SCOPE:info} core: plugins: active: ${CORE_PLUGINS_ACTIVE:ADP} category: mapping: RELATIONAL: ${DTM_CORE_PLUGINS_RELATIONAL:ADB, ADP, ADQM, ADG} ANALYTICAL: ${DTM_CORE_PLUGINS_ANALYTICAL:ADQM, ADB, ADP, ADG} DICTIONARY: ${DTM_CORE_PLUGINS_DICTIONARY:ADG, ADB, ADP, ADQM} UNDEFINED: ${DTM_CORE_PLUGINS_UNDEFINED:ADB, ADP, ADQM, ADG} WITHOUT_FROM: ${DTM_CORE_PLUGINS_WITHOUT_FROM:ADP, ADB, ADQM, ADG} http: port: ${DTM_CORE_HTTP_PORT:9091} tcpNoDelay: ${DTM_CORE_HTTP_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_HTTP_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_HTTP_TCP_QUICK_ACK:true} http2WindowSize: ${DTM_CORE_HTTP2_WINDOW_SIZE:1048576} maxRequestSize: ${DTM_CORE_HTTP_MAX_REQUEST_SIZE:-1} webclient: tcpNoDelay: ${DTM_CORE_WEBCLIENT_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_WEBCLIENT_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_WEBCLIENT_TCP_QUICK_ACK:true} priorKnowledgeHttp2: ${DTM_CORE_WEBCLIENT_PRIOR_KNOWLEDGE:true} connectionTimeoutMs: ${DTM_CORE_WEBCLIENT_CONNECTION_TIMEOUT_MS:30000} poolSize: ${DTM_CORE_WEBCLIENT_POOL_SIZE:20} http2PoolSize: ${DTM_CORE_WEBCLIENT_HTTP2_POOL_SIZE:20} http2KeepAliveSec: ${DTM_CORE_WEBCLIENT_HTTP2_KEEP_ALIVE_SEC:0} privateapiwebclient: tcpNoDelay: ${DTM_CORE_WEBCLIENT_LEADER_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_WEBCLIENT_LEADER_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_WEBCLIENT_LEADER_TCP_QUICK_ACK:true} priorKnowledgeHttp2: ${DTM_CORE_WEBCLIENT_LEADER_PRIOR_KNOWLEDGE:true} connectionTimeoutMs: ${DTM_CORE_WEBCLIENT_LEADER_CONNECTION_TIMEOUT_MS:2000} poolSize: ${DTM_CORE_WEBCLIENT_LEADER_POOL_SIZE:20} http2PoolSize: ${DTM_CORE_WEBCLIENT_LEADER_HTTP2_POOL_SIZE:20} http2KeepAliveSec: ${DTM_CORE_WEBCLIENT_LEADER_HTTP2_KEEP_ALIVE_SEC:0} env: name: ${DTM_NAME:test} prometheus: enabled: ${PROMETHEUS_ENABLED:true} auth: jwksUri: ${AUTH_JWKS_URI:} defaultRoles: ${CORE_DEFAULT_ROLES:env_owner} matviewsync: enabled: ${MATERIALIZED_VIEWS_SYNC_ENABLED:true} periodMs: ${MATERIALIZED_VIEWS_SYNC_PERIOD_MS:900000} maxConcurrent: ${MATERIALIZED_VIEWS_CONCURRENT:20} datacooling: periodMs: ${DATA_COOLING_RUN_PERIOD_MS:600000} maxConcurrent: ${DATA_COOLING_CONCURRENT:2} raft: myId: ${RAFT_ID:1} servers: pnode.1: ${RAFT_SERVER_1:127.0.0.1:9091} minTimeout: ${RAFT_MIN_TIMEOUT_MS:5000} maxTimeout: ${RAFT_MAX_TIMEOUT_MS:7000} heartbeatPeriod: ${RAFT_HEARTBEAT_PERIOD_MS:100} appendLogsBatchSize: ${APPEND_LOGS_BATCH_SIZE:1000} appendLogsBatchSizeBytes: ${APPEND_LOGS_BATCH_SIZE_BYTES:1048576} appendEntriesResendDelay: ${RAFT_APPEND_ENTRIES_RESEND_DELAY_MS:0} appendEntriesRetryDelay: ${RAFT_APPEND_ENTRIES_RETRY_DELAY_MS:10} snapshotPeriod: ${RAFT_SNAPSHOT_PERIOD_MS:600000} optimisticRetryCount: ${RAFT_OPTIMISTIC_RETRY_COUNT:40} writeOptimisticRetryCount: ${RAFT_WRITE_OPTIMISTIC_RETRY_COUNT:1000} callRetryCount: ${DTM_CORE_WEBCLIENT_LEADER_CALL_RETRY_COUNT:100} callRetryTimeoutMs: ${DTM_CORE_WEBCLIENT_LEADER_CALL_RETRY_TIMEOUT_MS:1000} logsCachingLimit: ${LOGS_CACHING_LIMIT:1000} servicedb: db: ${RAFT_SERVICEDB_DATABASE:test} schema: ${RAFT_SERVICEDB_SCHEMA:sys1} user: ${RAFT_SERVICEDB_USER:postgres} password: ${RAFT_SERVICEDB_PASS:postgres} host: ${RAFT_SERVICEDB_HOST:localhost} port: ${RAFT_SERVICEDB_PORT:5432} poolSize: ${RAFT_SERVICEDB_MAX_POOL_SIZE:3} executorsCount: ${RAFT_SERVICEDB_EXECUTORS_COUNT:3} poolRequestTimeout: ${RAFT_SERVICEDB_POOL_REQUEST_TIMEOUT:0} preparedStatementsCacheMaxSize: ${RAFT_SERVICEDB_PREPARED_CACHE_MAX_SIZE:256} preparedStatementsCacheSqlLimit: ${RAFT_SERVICEDB_PREPARED_CACHE_SQL_LIMIT:2048} preparedStatementsCache: ${RAFT_SERVICEDB_PREPARED_CACHE:true} idleTimeoutMs: ${RAFT_SERVICEDB_IDLE_TIMEOUT_MS:60000} maxLifetimeTimeoutMs: ${RAFT_SERVICEDB_MAX_LIFETIME_TIMEOUT_MS:0} fetchSize: ${RAFT_SERVICEDB_FETCH_SIZE:100} entityttl: checkPeriodMs: ${ENTITY_TTL_CHECK_PERIOD_MS:30000} datasource: edml: defaultChunkSize: ${EDML_DEFAULT_CHUNK_SIZE:1000} pluginStatusCheckPeriodMs: ${EDML_STATUS_CHECK_PERIOD_MS:1000} firstOffsetTimeoutMs: ${EDML_FIRST_OFFSET_TIMEOUT_MS:15000} changeOffsetTimeoutMs: ${EDML_CHANGE_OFFSET_TIMEOUT_MS:10000} streaming: upload: dbBatchSize: ${STREAMING_UPLOAD_DB_BATCH_SIZE:1000} dbBufferSize: ${STREAMING_UPLOAD_DB_BUFFER_SIZE:10000} inputBufferSizeMb: ${STREAMING_UPLOAD_INPUT_BUFFER_SIZE_MB:10} csvparser: separator: ${CSV_PARSER_SEPARATOR:;} quoteChar: ${CSV_PARSER_QUOTE_CHAR:"} escapeChar: ${CSV_PARSER_ESCAPE_CHAR:'} fieldAsNull: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS} kafka: getOffsetsRetryCount: ${ZOOKEEPER_KAFKA_GET_OFFSETS_RETRY_COUNT:3} getOffsetsRetryTimeoutMs: ${ZOOKEEPER_KAFKA_GET_OFFSETS_RETRY_TIMEOUT_MS:1000} producer: property: key.serializer: org.apache.kafka.common.serialization.StringSerializer value.serializer: org.apache.kafka.common.serialization.StringSerializer consumer: property: key.deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer value.deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer cluster: zookeeper: connection-string: ${ZOOKEEPER_KAFKA_ADDRESS:} connection-timeout-ms: ${ZOOKEEPER_KAFKA_CONNECTION_TIMEOUT_MS:30000} session-timeout-ms: ${ZOOKEEPER_KAFKA_SESSION_TIMEOUT_MS:86400000} chroot: ${ZOOKEEPER_KAFKA_CHROOT:} connectionRetryCount: ${ZOOKEEPER_KAFKA_CONNECTION_RETRY_COUNT:1} admin: inputStreamTimeoutMs: ${KAFKA_INPUT_STREAM_TIMEOUT_MS:2000} status.event.publish: topic: ${KAFKA_STATUS_EVENT_TOPIC:status.event.topic} enabled: ${KAFKA_STATUS_EVENT_ENABLED:false} writeOperationsEnabled: ${KAFKA_STATUS_EVENT_WRITE_OPERATIONS_ENABLED:false} externalDDLEnabled: ${KAFKA_STATUS_EVENT_EXTERNAL_DDL_ENABLED:false} vertx: blocking-stacktrace-time: ${DTM_VERTX_BLOCKING_STACKTRACE_TIME:1} pool: worker-pool: ${DTM_CORE_WORKER_POOL_SIZE:20} event-loop-pool: ${DTM_CORE_EVENT_LOOP_POOL_SIZE:20} cache: initialCapacity: ${CACHE_INITIAL_CAPACITY:100000} maximumSize: ${CACHE_MAXIMUM_SIZE:100000} expireAfterAccessMinutes: ${CACHE_EXPIRE_AFTER_ACCESS_MINUTES:99960} delta: rollback-status-calls-ms: ${DELTA_ROLLBACK_STATUS_CALLS_MS:2000} rollbackRetryCount: ${DELTA_ROLLBACK_RETRY_COUNT:0} rollbackRetryTimeoutMs: ${DELTA_ROLLBACK_RETRY_TIMEOUT_MS:1000} rollbackOperationsTimeoutMs: ${DELTA_ROLLBACK_OPERATIONS_TIMEOUT_MS:29000} writeoperation: rollbackRetryCount: ${WRITE_OPERATION_ROLLBACK_RETRY_COUNT:0} rollbackRetryTimeoutMs: ${WRITE_OPERATION_ROLLBACK_RETRY_TIMEOUT_MS:1000} activityCheckPeriodMs: ${WRITE_OPERATION_ACTIVITY_CHECK_PERIOD_MS:10000} activityCheckTimeoutMs: ${WRITE_OPERATION_ACTIVITY_CHECK_TIMEOUT_MS:120000} recover: loopTimeoutMs: ${RECOVER_LOOP_TIMEOUT_MS:60000} statistics: enabled: ${CORE_STATISTICS_ENABLED:true} threadsCount: ${CORE_STATISTICS_THREADS_COUNT:2} dataCountEnabled: ${CORE_STATISTICS_DATA_COUNT_ENABLED:true} dataCountCheckPeriodMs: ${CORE_STATISTICS_DATA_COUNT_CHECK_PERIOD_MS:10000} poststatusevent: subscriberGroup: - endpointUrl: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_URL:} endpointTimeoutMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_TIMEOUT_MS:5000} endpointRetryTimeoutMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_RETRY_TIMEOUT_MS:5000} bufferingPeriodMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_BUFFERING_PERIOD_MS:0} bufferSize: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_BUFFER_SIZE:1000} writeOperationsEnabled: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_WRITE_OPERATIONS_ENABLED:false} externalDDLEnabled: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_EXTERNAL_DDL_ENABLED:false} agent: endpointUrl: ${AGENT_ENDPOINT_URL:} endpointGetCnTimeoutMs: ${AGENT_ENDPOINT_GET_CN_TIMEOUT_MS:60000} endpointQueryTimeoutMs: ${AGENT_ENDPOINT_QUERY_TIMEOUT_MS:3600000} dbBatchSize: ${AGENT_DB_BATCH_SIZE:1000} dbBufferSize: ${AGENT_DB_BUFFER_SIZE:10000} inputBufferSizeMb: ${AGENT_INPUT_BUFFER_SIZE_MB:10} componentinfo: enabled: ${COMPONENT_INFO_ENABLED:false} datamart: ${COMPONENT_INFO_DATAMART:component_info} tableComponents: ${COMPONENT_INFO_TABLE_COMPONENTS:component_info} publishPeriodMs: ${COMPONENT_INFO_PUBLISH_PERIOD_MS:60000} timeoutActiveMs: ${COMPONENT_INFO_TIMEOUT_ACTIVE_MS:300000} secrets: core: raft: servicedb: user: password: adb: datasource: user: password: adg: datasource: user: password: adqm: datasource: user: password: adp: datasource: user: password: autofailover: enabled: ${AUTOFAILOVER_ENABLED:false} checkPeriodMs: ${AUTOFAILOVER_CHECK_PERIOD_MS:10000} waitTimeoutMs: ${AUTOFAILOVER_WAIT_TIMEOUT_MS:2000} failsLimit: ${AUTOFAILOVER_FAILS_LIMIT:3} healingConfirm: ${AUTOFAILOVER_HEALING_CONFIRM:3} startupDelayMs: ${AUTOFAILOVER_STARTUP_DELAY_MS:120000} execPeriodMs: ${AUTOFAILOVER_EXEC_PERIOD_MS:2000} minSyncReplicas: ${AUTOFAILOVER_MIN_SYNC_REPLICAS:1} recoverBatchPeriodMs: ${AUTOFAILOVER_RECOVER_BATCH_PERIOD_MS:10000} failedRetryTimeoutMs: ${AUTOFAILOVER_FAILED_RETRY_TIMEOUT_MS:60000} adp: datasource: - name: ADP env: ${ADP_ENV_NAME:${DTM_NAME:test}} user: ${ADP_USERNAME:postgres} password: ${ADP_PASS:postgres} host: ${ADP_HOST:localhost} port: ${ADP_PORT:5432} poolSize: ${ADP_MAX_POOL_SIZE:3} executorsCount: ${ADP_EXECUTORS_COUNT:3} poolRequestTimeout: ${ADP_POOL_REQUEST_TIMEOUT:0} preparedStatementsCacheMaxSize: ${ADP_PREPARED_CACHE_MAX_SIZE:256} preparedStatementsCacheSqlLimit: ${ADP_PREPARED_CACHE_SQL_LIMIT:2048} preparedStatementsCache: ${ADP_PREPARED_CACHE:true} idleTimeoutMs: ${ADP_IDLE_TIMEOUT_MS:60000} maxLifetimeTimeoutMs: ${ADP_MAX_LIFETIME_TIMEOUT_MS:0} autofailoverPriority: ${ADP_AUTOFAILOVER_PRIORITY:} Запустить новый Prostore для иницализации служебной БД. Новому Prostore (7.1+) нужна Java 17, в то время как старому Prostore нужна Java 8: .. code-block:: bash java --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.concurrent.atomic=ALL-UNNAMED -jar dtm-query-execution-core-7.4.0.jar .. attention:: В этот момент данном примере два экземпляра Prostore разных версий имеют общую прикладную базу, но различные служебные базы, любые действия в новом Prostore недопустимы, поскольку это приведет к рассинхронизации метаданных с данными в старом Prostore! Необходимо проверить, что создана схема для служебной БД, для кофигурации из примера база ``test``, схема ``sys1``, если не создана, нужно изучить настройки нового Prostore и лог на предмет ошибок, повторить запуск после устранения проблем. Выключить новый Prostore. Остановка Компонента версии 1.х ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Запомнить настройки модулей адаптера. В CSV-Uploader: - открыть веб интерфейс; - перейти на вкладку "Настройки"; - сохранить значения параметров: "Запуск по расписанию", "Забирать CSV из каталога", "Включить". 2. Снять резервную копию конфигурации Агента СМЭВ4. 3. Остановить загрузку данных: - отключить доступ всем пользователям к инструментам загрузки; - периодически проверять длину очереди на загрузку (когда длина очереди на згрузку будет равна 0, перейти к следующему пункту); 4. Выключить Агент СМЭВ4. 5. Выключить модули Компонента: - blob-adapter; - check-adapter; - counter-provider; - csv-uploader; - data-uploader; - dtm-uploader; - podd-adapter-group-repl; - podd-adapter-group-tp; - podd-adapter-import-tp; - podd-adapter-mppr; - podd-adapter-mppw; - podd-adapter-mppr; - podd-adapter-query; - podd-adapter-replicator; - podd-adapter-avro-defragmentator; - printable-form-service; - rest-adapter; - rest-uploader; - smev3-adapter; - smevql-server. Миграция метаданных Prostore ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Выполнить перенос метаданных (Серисной БД) из Zookeeper в Postgres-совместимые СУБД для обновления кластера Prostore с версии 6.х на версию 7.х согласно `инструкции `_, в том числе: - Выключить старый Prostore (новый выключен ранее); - Снять резервную копию прикладной БД средствами БД (нет в документации Prostore!). .. attention:: Резервную копию снять обязательно! Данный бекап может потребоваться если понадобится откатываться на предыдущую версию витрины. Пример команды бэкапирования: .. code-block:: bash sudo -u postgres pg_dump test > test.sql Можно воспользоваться командой ``pg_dumpall`` для дампа вместе с ролями, правами и т.д. Пример команды ``pg_dumpall``: .. code-block:: bash sudo pg_dumpall -u postgres > test.sql - Выполнить миграцию метаданных Prostore. Пример команды миграции метаданных приведен для настроек Prostore, приведенных выше: .. code-block:: bash java -jar dtm-tools-1.23.0.jar zk2pg --zk localhost:2181/adtm/test --datamarts foo --pg 'localhost:5432/tests?user=postgres&password=postgres' --schema sys1 .. attention:: Перед выполнением команды запрос ``get_delta_ok()`` должен возвращать ответ. Если ответ не возвращается, необходимо открыть и закрыть дельту. Также необходимо проверить наличие горячих дельт ``get_delta_hot()``, и активных операций записи ``get_write_operations()``. Команда выполняется из директории где расположен dtm-tools. Сервис dtm-tools необходимо брать из нового дистрибутива! При успешной миграции вывод завершается строкой "Transfer from zookeeper to pg successfully finished". В случае ошибок, необходимо выполнить анализ, устранить и повторить миграцию в соответствии с пунктом 7 `инструкции `_. 2. Обновить PostgreSQL. Для Prostore 6.x используется PostgreSQL 13.14, для Prostore 7.х нужен PostgreSQL 16.8. Включение Компонента версии 2.х ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Переключить новый Prostore на прежние порты (в примере 8081-> 8080 и 9091 -> 9090( в разделах ``raft`` и ``core.http``)), новый Prostore остается нацелен на прикладную базу данных, общую со старым Простором, чтобы не тратить время на переезд самих прикладных данных. 2. Включить публикации данных о компонентах, в секции ``componentinfo``. .. Dropdown:: Пример конфигурации с восстановленными портами .. code-block:: yaml logging: level: ru.datamart.prostore: ${DTM_LOGGING_LEVEL:DEBUG} server: port: ${DTM_METRICS_PORT:8080} springdoc.swagger-ui: url: /openapi.yml path: /swagger-ui management: endpoints: enabled-by-default: ${DTM_METRICS_ENABLED:true} web: exposure: include: ${DTM_METRICS_SCOPE:info} core: plugins: active: ${CORE_PLUGINS_ACTIVE:ADP} category: mapping: RELATIONAL: ${DTM_CORE_PLUGINS_RELATIONAL:ADB, ADP, ADQM, ADG} ANALYTICAL: ${DTM_CORE_PLUGINS_ANALYTICAL:ADQM, ADB, ADP, ADG} DICTIONARY: ${DTM_CORE_PLUGINS_DICTIONARY:ADG, ADB, ADP, ADQM} UNDEFINED: ${DTM_CORE_PLUGINS_UNDEFINED:ADB, ADP, ADQM, ADG} WITHOUT_FROM: ${DTM_CORE_PLUGINS_WITHOUT_FROM:ADP, ADB, ADQM, ADG} http: port: ${DTM_CORE_HTTP_PORT:9090} tcpNoDelay: ${DTM_CORE_HTTP_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_HTTP_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_HTTP_TCP_QUICK_ACK:true} http2WindowSize: ${DTM_CORE_HTTP2_WINDOW_SIZE:1048576} maxRequestSize: ${DTM_CORE_HTTP_MAX_REQUEST_SIZE:-1} webclient: tcpNoDelay: ${DTM_CORE_WEBCLIENT_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_WEBCLIENT_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_WEBCLIENT_TCP_QUICK_ACK:true} priorKnowledgeHttp2: ${DTM_CORE_WEBCLIENT_PRIOR_KNOWLEDGE:true} connectionTimeoutMs: ${DTM_CORE_WEBCLIENT_CONNECTION_TIMEOUT_MS:30000} poolSize: ${DTM_CORE_WEBCLIENT_POOL_SIZE:20} http2PoolSize: ${DTM_CORE_WEBCLIENT_HTTP2_POOL_SIZE:20} http2KeepAliveSec: ${DTM_CORE_WEBCLIENT_HTTP2_KEEP_ALIVE_SEC:0} privateapiwebclient: tcpNoDelay: ${DTM_CORE_WEBCLIENT_LEADER_TCP_NO_DELAY:true} tcpFastOpen: ${DTM_CORE_WEBCLIENT_LEADER_TCP_FAST_OPEN:true} tcpQuickAck: ${DTM_CORE_WEBCLIENT_LEADER_TCP_QUICK_ACK:true} priorKnowledgeHttp2: ${DTM_CORE_WEBCLIENT_LEADER_PRIOR_KNOWLEDGE:true} connectionTimeoutMs: ${DTM_CORE_WEBCLIENT_LEADER_CONNECTION_TIMEOUT_MS:2000} poolSize: ${DTM_CORE_WEBCLIENT_LEADER_POOL_SIZE:20} http2PoolSize: ${DTM_CORE_WEBCLIENT_LEADER_HTTP2_POOL_SIZE:20} http2KeepAliveSec: ${DTM_CORE_WEBCLIENT_LEADER_HTTP2_KEEP_ALIVE_SEC:0} env: name: ${DTM_NAME:test} prometheus: enabled: ${PROMETHEUS_ENABLED:true} auth: jwksUri: ${AUTH_JWKS_URI:} defaultRoles: ${CORE_DEFAULT_ROLES:env_owner} matviewsync: enabled: ${MATERIALIZED_VIEWS_SYNC_ENABLED:true} periodMs: ${MATERIALIZED_VIEWS_SYNC_PERIOD_MS:900000} maxConcurrent: ${MATERIALIZED_VIEWS_CONCURRENT:20} datacooling: periodMs: ${DATA_COOLING_RUN_PERIOD_MS:600000} maxConcurrent: ${DATA_COOLING_CONCURRENT:2} raft: myId: ${RAFT_ID:1} servers: pnode.1: ${RAFT_SERVER_1:127.0.0.1:9090} minTimeout: ${RAFT_MIN_TIMEOUT_MS:5000} maxTimeout: ${RAFT_MAX_TIMEOUT_MS:7000} heartbeatPeriod: ${RAFT_HEARTBEAT_PERIOD_MS:100} appendLogsBatchSize: ${APPEND_LOGS_BATCH_SIZE:1000} appendLogsBatchSizeBytes: ${APPEND_LOGS_BATCH_SIZE_BYTES:1048576} appendEntriesResendDelay: ${RAFT_APPEND_ENTRIES_RESEND_DELAY_MS:0} appendEntriesRetryDelay: ${RAFT_APPEND_ENTRIES_RETRY_DELAY_MS:10} snapshotPeriod: ${RAFT_SNAPSHOT_PERIOD_MS:600000} optimisticRetryCount: ${RAFT_OPTIMISTIC_RETRY_COUNT:40} writeOptimisticRetryCount: ${RAFT_WRITE_OPTIMISTIC_RETRY_COUNT:1000} callRetryCount: ${DTM_CORE_WEBCLIENT_LEADER_CALL_RETRY_COUNT:100} callRetryTimeoutMs: ${DTM_CORE_WEBCLIENT_LEADER_CALL_RETRY_TIMEOUT_MS:1000} logsCachingLimit: ${LOGS_CACHING_LIMIT:1000} servicedb: db: ${RAFT_SERVICEDB_DATABASE:tests} schema: ${RAFT_SERVICEDB_SCHEMA:sys1} user: ${RAFT_SERVICEDB_USER:postgres} password: ${RAFT_SERVICEDB_PASS:postgres} host: ${RAFT_SERVICEDB_HOST:localhost} port: ${RAFT_SERVICEDB_PORT:5432} poolSize: ${RAFT_SERVICEDB_MAX_POOL_SIZE:3} executorsCount: ${RAFT_SERVICEDB_EXECUTORS_COUNT:3} poolRequestTimeout: ${RAFT_SERVICEDB_POOL_REQUEST_TIMEOUT:0} preparedStatementsCacheMaxSize: ${RAFT_SERVICEDB_PREPARED_CACHE_MAX_SIZE:256} preparedStatementsCacheSqlLimit: ${RAFT_SERVICEDB_PREPARED_CACHE_SQL_LIMIT:2048} preparedStatementsCache: ${RAFT_SERVICEDB_PREPARED_CACHE:true} idleTimeoutMs: ${RAFT_SERVICEDB_IDLE_TIMEOUT_MS:60000} maxLifetimeTimeoutMs: ${RAFT_SERVICEDB_MAX_LIFETIME_TIMEOUT_MS:0} fetchSize: ${RAFT_SERVICEDB_FETCH_SIZE:100} entityttl: checkPeriodMs: ${ENTITY_TTL_CHECK_PERIOD_MS:30000} datasource: edml: defaultChunkSize: ${EDML_DEFAULT_CHUNK_SIZE:1000} pluginStatusCheckPeriodMs: ${EDML_STATUS_CHECK_PERIOD_MS:1000} firstOffsetTimeoutMs: ${EDML_FIRST_OFFSET_TIMEOUT_MS:15000} changeOffsetTimeoutMs: ${EDML_CHANGE_OFFSET_TIMEOUT_MS:10000} streaming: upload: dbBatchSize: ${STREAMING_UPLOAD_DB_BATCH_SIZE:1000} dbBufferSize: ${STREAMING_UPLOAD_DB_BUFFER_SIZE:10000} inputBufferSizeMb: ${STREAMING_UPLOAD_INPUT_BUFFER_SIZE_MB:10} csvparser: separator: ${CSV_PARSER_SEPARATOR:;} quoteChar: ${CSV_PARSER_QUOTE_CHAR:"} escapeChar: ${CSV_PARSER_ESCAPE_CHAR:'} fieldAsNull: ${CSV_PARSER_FIELD_AS_NULL:EMPTY_SEPARATORS} kafka: getOffsetsRetryCount: ${ZOOKEEPER_KAFKA_GET_OFFSETS_RETRY_COUNT:3} getOffsetsRetryTimeoutMs: ${ZOOKEEPER_KAFKA_GET_OFFSETS_RETRY_TIMEOUT_MS:1000} producer: property: key.serializer: org.apache.kafka.common.serialization.StringSerializer value.serializer: org.apache.kafka.common.serialization.StringSerializer consumer: property: key.deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer value.deserializer: org.apache.kafka.common.serialization.ByteArrayDeserializer cluster: zookeeper: connection-string: ${ZOOKEEPER_KAFKA_ADDRESS:} connection-timeout-ms: ${ZOOKEEPER_KAFKA_CONNECTION_TIMEOUT_MS:30000} session-timeout-ms: ${ZOOKEEPER_KAFKA_SESSION_TIMEOUT_MS:86400000} chroot: ${ZOOKEEPER_KAFKA_CHROOT:} connectionRetryCount: ${ZOOKEEPER_KAFKA_CONNECTION_RETRY_COUNT:1} admin: inputStreamTimeoutMs: ${KAFKA_INPUT_STREAM_TIMEOUT_MS:2000} status.event.publish: topic: ${KAFKA_STATUS_EVENT_TOPIC:status.event.topic} enabled: ${KAFKA_STATUS_EVENT_ENABLED:false} writeOperationsEnabled: ${KAFKA_STATUS_EVENT_WRITE_OPERATIONS_ENABLED:false} externalDDLEnabled: ${KAFKA_STATUS_EVENT_EXTERNAL_DDL_ENABLED:false} vertx: blocking-stacktrace-time: ${DTM_VERTX_BLOCKING_STACKTRACE_TIME:1} pool: worker-pool: ${DTM_CORE_WORKER_POOL_SIZE:20} event-loop-pool: ${DTM_CORE_EVENT_LOOP_POOL_SIZE:20} cache: initialCapacity: ${CACHE_INITIAL_CAPACITY:100000} maximumSize: ${CACHE_MAXIMUM_SIZE:100000} expireAfterAccessMinutes: ${CACHE_EXPIRE_AFTER_ACCESS_MINUTES:99960} delta: rollback-status-calls-ms: ${DELTA_ROLLBACK_STATUS_CALLS_MS:2000} rollbackRetryCount: ${DELTA_ROLLBACK_RETRY_COUNT:0} rollbackRetryTimeoutMs: ${DELTA_ROLLBACK_RETRY_TIMEOUT_MS:1000} rollbackOperationsTimeoutMs: ${DELTA_ROLLBACK_OPERATIONS_TIMEOUT_MS:29000} writeoperation: rollbackRetryCount: ${WRITE_OPERATION_ROLLBACK_RETRY_COUNT:0} rollbackRetryTimeoutMs: ${WRITE_OPERATION_ROLLBACK_RETRY_TIMEOUT_MS:1000} activityCheckPeriodMs: ${WRITE_OPERATION_ACTIVITY_CHECK_PERIOD_MS:10000} activityCheckTimeoutMs: ${WRITE_OPERATION_ACTIVITY_CHECK_TIMEOUT_MS:120000} recover: loopTimeoutMs: ${RECOVER_LOOP_TIMEOUT_MS:60000} statistics: enabled: ${CORE_STATISTICS_ENABLED:true} threadsCount: ${CORE_STATISTICS_THREADS_COUNT:2} dataCountEnabled: ${CORE_STATISTICS_DATA_COUNT_ENABLED:true} dataCountCheckPeriodMs: ${CORE_STATISTICS_DATA_COUNT_CHECK_PERIOD_MS:10000} poststatusevent: subscriberGroup: - endpointUrl: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_URL:} endpointTimeoutMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_TIMEOUT_MS:5000} endpointRetryTimeoutMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_ENDPOINT_RETRY_TIMEOUT_MS:5000} bufferingPeriodMs: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_BUFFERING_PERIOD_MS:0} bufferSize: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_BUFFER_SIZE:1000} writeOperationsEnabled: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_WRITE_OPERATIONS_ENABLED:false} externalDDLEnabled: ${POST_STATUS_EVENT_SUBSCRIBER_GROUP_EXTERNAL_DDL_ENABLED:false} agent: endpointUrl: ${AGENT_ENDPOINT_URL:} endpointGetCnTimeoutMs: ${AGENT_ENDPOINT_GET_CN_TIMEOUT_MS:60000} endpointQueryTimeoutMs: ${AGENT_ENDPOINT_QUERY_TIMEOUT_MS:3600000} dbBatchSize: ${AGENT_DB_BATCH_SIZE:1000} dbBufferSize: ${AGENT_DB_BUFFER_SIZE:10000} inputBufferSizeMb: ${AGENT_INPUT_BUFFER_SIZE_MB:10} componentinfo: enabled: ${COMPONENT_INFO_ENABLED:true} datamart: ${COMPONENT_INFO_DATAMART:component_info} tableComponents: ${COMPONENT_INFO_TABLE_COMPONENTS:component_info} publishPeriodMs: ${COMPONENT_INFO_PUBLISH_PERIOD_MS:60000} timeoutActiveMs: ${COMPONENT_INFO_TIMEOUT_ACTIVE_MS:300000} secrets: core: raft: servicedb: user: password: adb: datasource: user: password: adg: datasource: user: password: adqm: datasource: user: password: adp: datasource: user: password: autofailover: enabled: ${AUTOFAILOVER_ENABLED:false} checkPeriodMs: ${AUTOFAILOVER_CHECK_PERIOD_MS:10000} waitTimeoutMs: ${AUTOFAILOVER_WAIT_TIMEOUT_MS:2000} failsLimit: ${AUTOFAILOVER_FAILS_LIMIT:3} healingConfirm: ${AUTOFAILOVER_HEALING_CONFIRM:3} startupDelayMs: ${AUTOFAILOVER_STARTUP_DELAY_MS:120000} execPeriodMs: ${AUTOFAILOVER_EXEC_PERIOD_MS:2000} minSyncReplicas: ${AUTOFAILOVER_MIN_SYNC_REPLICAS:1} recoverBatchPeriodMs: ${AUTOFAILOVER_RECOVER_BATCH_PERIOD_MS:10000} failedRetryTimeoutMs: ${AUTOFAILOVER_FAILED_RETRY_TIMEOUT_MS:60000} adp: datasource: - name: ADP env: ${ADP_ENV_NAME:${DTM_NAME:test}} user: ${ADP_USERNAME:postgres} password: ${ADP_PASS:postgres} host: ${ADP_HOST:localhost} port: ${ADP_PORT:5432} poolSize: ${ADP_MAX_POOL_SIZE:3} executorsCount: ${ADP_EXECUTORS_COUNT:3} poolRequestTimeout: ${ADP_POOL_REQUEST_TIMEOUT:0} preparedStatementsCacheMaxSize: ${ADP_PREPARED_CACHE_MAX_SIZE:256} preparedStatementsCacheSqlLimit: ${ADP_PREPARED_CACHE_SQL_LIMIT:2048} preparedStatementsCache: ${ADP_PREPARED_CACHE:true} idleTimeoutMs: ${ADP_IDLE_TIMEOUT_MS:60000} maxLifetimeTimeoutMs: ${ADP_MAX_LIFETIME_TIMEOUT_MS:0} autofailoverPriority: ${ADP_AUTOFAILOVER_PRIORITY:} 3. В конфигурации нового Prostore указать адрес СМЭВ QL сервера при работе Витрины в режиме источника пуш-уведомлений СМЭВ QL (при необходимости через балансировщик). 4. Указать адрес агента для matview в конфигурации нового Prostore. 5. Запустить новый Prostore. 6. Подключиться к новому Prostore, например с помощью DBeaver: - Использовать новый драйвер Prostore, который поставляется в к комплекте дистрибутива Компонента; - Проверить версию Простора запросом ``check_versions()``; - Проверить данные запросом к прикладным данным, убедиться, что прежние прикладные данные имеются в новом Prostore. 7. Обновить конфигурации модулей (Обязательно сохранить прежние конфигурации модулей для возможности отката на предыдущую версию!): - blob-adapter; - check-adapter; - counter-provider; - csv-uploader; - printable-form-service; - rest-adapter; - rest-uploader; - data-uploader; - smev3-adapter; - smevql-server; 8. Определить конфигурацию для нового модуля "Стандартный загрузчик" (standard-loader). 9. Запустить модули Компонента (необходима Java 17): - blob-adapter; - check-adapter; - counter-provider; - csv-uploader; - printable-form-service; - rest-adapter; - smev3-adapter; - smevql-server; - standard-loader; - rest-uploader. Первый запуск rest-uploader рекомендуется выполнить с настройкой ``migration.enabled=true`` (отвечает за миграцию метаданных rest-uploader из zookeeper в PostgreSQL). При запуске rest-uploader важно, чтобы зукипер еще продолжал работать и его адрес был прописан в конфигурации приложения. Проверить успешность миграции правил ФЛК для нужных таблиц запросом (проверяются только таблицы с правилами): .. code-block:: bash curl -X 'GET' \ 'http://[host]:[port]/v2/conditions/[datamart]/[table]' \ -H 'accept: text/yaml' После миграции перезапустить rest-uploader с настройкой ``migration.enabled=false`` "Стандартный загрузчик" (standard-loader)конфигрурируется для поднятия необходимых сервисов. Состав сервисов определяется внедрением, за типовую основу можно принять: - manager; - deployer; - flk; - buffer; - uploader; - reader-rest-push; - dtm-fasade нужен для замещения dtm-uploader в части загрузки табличных данных, загрузка бинарных данных в новой версии витрины выполняется через blob-adapter. 10. Внести данные справочников и конфигураций. В CSV-Uploader: - открыть веб-интерфейс; - перейти на вкладку "Настройки"; - внести значения параметров "Запуск по расписанию", "Забирать CSV из каталога", "Включить", полученные из старой версии модуля. В standard-loader: - настроить правила ФЛК .. code-block:: bash curl -X 'POST' \ 'https://[host]:[port]/api/v3/conditions/[datamart]/[table]' \ -H 'accept: */*' \ -H 'Content-Type: application/yaml' \ -d 'fields: id: uniq: true ' - проверить успешность внесения правил ФЛК для нужных таблиц .. code-block:: bash curl -X 'GET' \ 'https://[host]:[port]/api/v3/conditions/[datamart]/[table]' \ -H 'accept: text/yaml' Включение взаимодействий Компонента ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 1. Запустить загрузку данных: - открыть доступ всем пользователям к стандартному загрузчику; - настроить всех клиентов, которые загружают данные, в том числе через dtm-uploader, на загрузку данных чере стандартный загрузчик (standard-loader). 2. Сконфигурировать Агента СМЭВ4 на работу по протоколу HTTP (необходимость балансировщика в зависимости от высокодоступности внедрения): - с Prostore в рамках SQL РЗ (JDBC не использует, обновление драйвера не требуется); - с printable-form-service; - с blob-adapter. Пример конфигурации Агента СМЭВ4 .. code-block:: yaml # Общие настройки витрины datamart: integration: type: HTTP http: client: protocolVersion: HTTP_2 # для h2 раскомментировать # ssl: true # useAlpn: true # trustAll: true retryCount: 3 retryTimeout: 3s prostore: host: 127.0.0.1 port: 9090 blobAdapter: host: 127.0.0.1 port: 1234 printableFormsService: host: 127.0.0.1 port: 1235 3. Запустить Агент СМЭВ4 4. Вместо каждой подписки версии 1.х, для которой эта Витрина является получателем (рекомендуется предварительно остановить каждую из подписок 1.х в АРМ ПОДД, до выключения модулей витрины, не важно является ли Витрина потребителем или получателем): - после обновления Витрины поставщика данных до версии 2.х; - создаются РЗ с признаком "подписка 2.х"; - запросом на Prostore потребителе формируется matview. Заключительные действия ^^^^^^^^^^^^^^^^^^^^^^^^^ Остановить Zookeeper и Kafka, удалять данные можно, когда будет подтверждена работоспособность и стабильность новой версии витрины, когда возврат на прежнюю версию уже точно не понадобится. Настроить резервное копирование на уровне PostgeSQL вместо backup-manager. Для приведенного выше примера нужно останавливать загрузку данных и выполнять резервное копирование базы данных test, в ней для нового Prostore (в приведенном примере) размещаются и прикладные и метаданные. Восстановление прежней версии Компонента ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Для восстановление прежней версии Компонента (обновления с 2.х на 1.х) необходимо выполнить шаги: 1. Остановить Агент СМЭВ4. 2. Остановить модули новой витрины. 3. Остановить новый Prostore. 4. Восстановить PostgreSQL 13.14. Восстановить прикладную базу данных из резевной копии, снятой при обновлении. 5. Запустить Zookeeper и Kafka, которые были остановлены при обновлении витрины. Zookeeper не должен быть модифицирован или очищен со времени обновления витрины. 6. Запусить старый Prostore. 7. Восстановить конфигурации модулей витрины. 8. Запустить набор модулей версии 1.х. 9. Восстановить конфигурацию Агента СМЭВ4. 10. Запустить Агент СМЭВ4. 11. Отключить бекапирование средствами PostgreSQL, вернуть использование backup-manager. Обновление Компонента с поднятием второй копии витрины ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Данный вариант отличается от предыдущего тем, что в случае недопустимо долгой миграции метаданных выполняется остановка старого Prostore, снятие резервной копии Zookeeper, затем старый Prostore поднимается и старая витрина продолжает работать на чтение. Параллельно выполняется миграция метаданных с копии Zookeeper, выполняется создание копии прикладной БД и рядом поднимается версия витрины 2.х. Агент СМЭВ4 перенаправляется на новую версию витрины. Ограничения ~~~~~~~~~~~~~~~~~ 1. Агент СМЭВ4 обновляется заранее, процесс обновления Агента СМЭВ4 приведен в документе "Руководство администратора Агента СМЭВ4". 2. Приведенные выше примеры соответствуют одному экземпляру Простора с одним датасортом ADP. Обновление Компонента конфигурации Лайт ----------------------------------------------------------- .. note:: Перед началом обновления выполните резервное копирование! Обновление с версии 1.0.0 до версии 1.0.1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: Данное обновление предусмотрено только для обновления с версии Компонента 1.0.0 до версии 1.0.1. Чтобы обновить Компонент необходимо выполнить следующие действия (подробная инструкция по обновлению ниже): #. Выполнить резервное копирование. #. Скопировать архив с обновлением Компонента на сервер. #. Распаковать архив с обновлением. #. Запустить процесс обновления. #. Проверить, что обновление прошло успешно. Резервное копирование ^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: Действия этого раздела необходимо выполнять под созданной учетной записью **datamart** (:numref:`datamart_user`). Для того чтобы выполнить резервное копирование создайте архив текущей версии с указанием актуальной даты копирования. Например: .. code-block:: bash tar -czvf dtm-lite-2022-01-17.tgz ansible/ images/ jdbc/ rpms/ Копирование архива с обновлением Компонента на сервер ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Для загрузки на сервер архива с файлами обновления Компонента используйте SFTP-клиент (например, WinSCP или Filezilla). Для авторизации используйте логин и пароль учетной записи администратора **datamart** созданной при установке ОС (:numref:`datamart_user`). 1. Подключитесь по SSH к серверу (:numref:`ssh_connect`), используя логин и пароль учетной записи администратора. 2. Загрузите файл с архивом в домашнюю директорию пользователя **datamart** командой: .. code-block:: bash mv ~/dtm-lite-1.0.1.tgz /home/datamart/ где, - ``dtm-lite-1.0.1.tgz`` - название архива Компонента. - ``datamart`` - имя пользователя. Распаковка архива с обновлением ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: Перед тем как выполнить разархивирование, рекомендуется просмотреть/скопировать значения переменных (IP-адрес сервера, префикс и т.д.), которые использовались в предыдущей версии Компонента в файле ``ansible/group_vars/all/main.yml``. После распаковки архива с обновлением Компонента данные из этого файла будут удалены. Чтобы распаковать архив, выполните команду:: tar -xzvf dtm-lite-1.0.1.tgz Процесс обновления Компонента ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Чтобы запустить процесс обновления Компонента с помощью Ansible, необходимо выполнить следующие действия: 1. Переименуйте файл ``custom.example.yml`` расположенный в папке ``ansible/group_vars/`` в ``custom.yml`` командой: .. code-block:: bash cp -n ansible/group_vars/custom.example.yml ansible/group_vars/custom.yml 2. В файле ``custom.yml`` укажите корректные значения для следующих переменных: - ``server_ip`` - адреса сервера. Укажите IP-адрес сервера, на который будет установлено обновление Компонента. Например: .. code-block:: bash server_ip: "172.16.10.59" - ``server_user_name`` - имя пользователя операционной системы. Укажите имя пользователя операционной системы сервера, под которым устанавливается обновление (:numref:`datamart_user`), например: .. code-block:: bash server_user_name: datamart - ``agentTopicPrefix`` - префикс перед именем топиков для СМЭВ4-агента (указывается опционально). Например: .. code-block:: bash agentTopicPrefix: "user_prefix." .. note:: В качестве префикса рекомендуется использовать мнемонику витрины. После определения параметра префикса следует обязательно ставить символ ``.`` (точка)! Пример: ``agentTopicPrefix: "prod_vitrina98."`` Чтобы запустить процесс обновления Компонента выполните команду: .. code-block:: bash docker-ansible-cmd ansible-playbook -i hosts install.yml Начнется процесс обновления Компонента (см. рис. ниже): .. figure:: img/progress_install_lig.png :align: center :alt: Обновление Компонента Обновление Компонента Установка обновления завершена. После завершения обновления убедитесь, что обновление Компонента прошло успешно. Проверка обновления Компонента до версии 1.0.1 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Для проверки обновления Компонента необходимо выполнить следующие действия: 1. Убедиться, что после установки обновления нет ошибок в работе Компонента. 2. Убедиться, что параметр ``failed`` (см. рис. выше) после установки обновления имеет значение - ``0``. Это значит, что все необходимые компоненты Компонента были обновлены, а необходимые взаимосвязи между ними настроены корректно. 3. Открыть **Portainer** и проверить, что версии модулей соответствуют указанным ниже: csv-uploader:1.0.12 podd-adapter:5.0.7 query-execution:5.2.2 Обновление до версии 2.5.0 и выше ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Чтобы обновить Компонента необходимо выполнить следующие действия: #. Выполнить резервное копирование. #. Скопировать архив с обновлением Компонента на сервер. #. Распаковать архив с обновлением. #. Запустить процесс обновления. #. Проверить, что обновление прошло успешно. Резервное копирование ^^^^^^^^^^^^^^^^^^^^^^^^ .. note:: Действия этого раздела необходимо выполнять под созданной учетной записью **datamart** (:ref:`datamart_user`). Чтобы выполнить резервное копирование, создайте архив текущей версии с указанием актуальной даты копирования: .. code-block:: bash tar -czvf dtm-lite-2022-01-17.tgz ansible/ images/ jdbc/ rpms/ Копирование архива с обновлением Компонента на сервер ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Для загрузки на сервер архива с файлами обновления Компонента используйте SFTP-клиент (например, WinSCP или Filezilla). Для авторизации используйте логин и пароль учетной записи администратора **datamart** созданной при установке ОС (:ref:`datamart_user`). 1. Подключитесь по SSH к серверу (:ref:`ssh_connect`), используя логин и пароль учетной записи администратора. 2. Загрузите файл с архивом в домашнюю директорию пользователя **datamart** командой: .. code-block:: bash mv ~/dtm-lite-<номер версии>.tgz /home/datamart/ где, - ``dtm-lite-<номер версии>.tgz`` - название архива Компонента. - ``datamart`` - имя пользователя. Распаковка архива с обновлением ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Чтобы распаковать архив, выполните команду: .. code-block:: bash tar -xzvf dtm-lite-<номер версии>.tgz Процесс обновления Компонента ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Чтобы запустить процесс обновления Компонента с помощью Ansible, необходимо выполнить следующие действия: 1. Переименуйте файл ``custom.example.yml`` расположенный в папке ``ansible/group_vars/`` в ``custom.yml`` командой: .. code-block:: bash cp -n ansible/group_vars/custom.example.yml ansible/group_vars/custom.yml 2. В файле ``custom.yml`` укажите корректные значения для следующих переменных: - ``server_ip`` - адреса сервера. Укажите IP-адрес сервера, на который будет установлено обновление Компонента. Например: .. code-block:: bash server_ip: "172.16.10.59" - ``server_user_name`` - имя пользователя операционной системы. Укажите имя пользователя операционной системы сервера, под которым устанавливается обновление (:ref:`datamart_user`), например: .. code-block:: bash server_user_name: datamart - ``agentTopicPrefix`` - префикс перед именем топиков для СМЭВ4-агента (указывается опционально). Например: .. code-block:: bash agentTopicPrefix: "user_prefix." .. note:: В качестве префикса рекомендуется использовать мнемонику витрины. После определения параметра префикса следует обязательно ставить символ ``.`` (точка)! Пример: ``agentTopicPrefix: "prod_vitrina98."`` Далее необходимо выполнить миграцию PostgreSQL: .. tab-set:: .. tab-item:: При локальной установке 1. Остановить Prostore .. code-block:: bash docker stop query-execution 2. Создать дамп данных в PostgreSQL, Заменить "dtm" на своего пользователя, если название отличается: .. code-block:: bash docker exec postgres pg_dumpall -U dtm > /tmp/pg13_dumpall.sql 3. Создать бекап данных в PostgreSQL .. code-block:: bash docker run --rm -v postgres:/var/lib/postgresql/data:ro -v /tmp:/backup registry.gosuslugi.local/proxy-docker.io/library/postgres:13.4 sh -c 'cd /var/lib/postgresql/data && tar czf /backup/pgdata_volume_backup.tgz .' 4. Остановить PostgreSQL .. code-block:: bash docker stop postgres 5. Удалить контейнер PostgreSQL .. code-block:: bash docker rm postgres 6. Удалить volume PostgreSQL .. code-block:: bash docker volume rm postgres 7. Создать volume PostgreSQL .. code-block:: bash docker volume create postgres 8. Загрузить образы PostgreSQL. Зайти в каталог, в котором распаковывали дистрибутив: .. code-block:: bash docker image load -i images/postgres-16.8.tar docker image load -i images/postgres-13.4.tar 9. Запустить контейнер PostgreSQL 16.8 .. code-block:: bash docker run -d --name pg16-migrate -e POSTGRES_PASSWORD=tmp -v postgres:/var/lib/postgresql/data registry.gosuslugi.local/proxy-docker.io/library/postgres:16.8 10. Восстановить данные в PostgreSQL 16.8 .. code-block:: bash cat /tmp/pg13_dumpall.sql | docker exec -i pg16-migrate psql -U postgres -d postgres 11. Установитеь пароли для пользователей PostgreSQL. .. code-block:: bash docker exec -i pg16-migrate psql -U postgres -d postgres -c "ALTER ROLE dtm WITH PASSWORD 'dtm';" Заменить "dtm" на своего пользователя, если его название отличается .. code-block:: bash docker exec -i pg16-migrate psql -U postgres -d postgres -c "ALTER ROLE repl WITH PASSWORD 'repl';" Заменить "repl" на своего пользователя, если его название отличается 12. Удалить контейнер PostgreSQL 16.8 .. code-block:: bash docker rm -f pg16-migrate 13. Запустить процесс обновления Компонента: .. code-block:: bash docker-ansible-cmd ansible-playbook -i hosts install.yml .. tab-item:: При установке на удаленном сервере 1. Остановить Prostore .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker stop query-execution" 2. Создать дамп данных в PostgreSQL 13 .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker exec postgres pg_dumpall -U dtm > /tmp/pg13_dumpall.sql" 3. Создать бекап volume с данными PostgreSQL .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker run --rm -v postgres:/var/lib/postgresql/data:ro -v /tmp:/backup registry.gosuslugi.local/proxy-docker.io/library/postgres:13.4 sh -c 'cd /var/lib/postgresql/data && tar czf /backup/pgdata_volume_backup.tgz .'" 4. Остановить PostgreSQL .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker stop postgres" 5. Удалить контейнер PostgreSQL .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker rm postgres" 6. Удалить volume PostgreSQL .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker volume rm postgres" 7. Создать volume PostgreSQL заново .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker volume create postgres" 8. Загрузить образы PostgreSQL. Заменить на папку, куда распаковывали дистрибутив .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "cd && docker image load -i images/postgres-16.8.tar" docker-ansible-cmd ansible -i hosts stand -b -m shell -a "cd && docker image load -i images/postgres-13.4.tar" 9. Запустить временный контейнер PostgreSQL 16.8 для миграции .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker run -d --name pg16-migrate -e POSTGRES_PASSWORD=tmp -v postgres:/var/lib/postgresql/data registry.gosuslugi.local/proxy-docker.io/library/postgres:16.8" 10. Восстановить дамп в PostgreSQL 16.8 .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "cat /tmp/pg13_dumpall.sql | docker exec -i pg16-migrate psql -U postgres -d postgres" 11. Установить пароли пользователям PostgreSQL. Заменить dtm, repl на свои, если имена отличаются. .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker exec -i pg16-migrate psql -U postgres -d postgres -c \"ALTER ROLE dtm WITH PASSWORD 'dtm';\"" docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker exec -i pg16-migrate psql -U postgres -d postgres -c \"ALTER ROLE repl WITH PASSWORD 'repl';\"" 12. Удалить временный контейнер PostgreSQL 16.8 .. code-block:: bash docker-ansible-cmd ansible -i hosts stand -b -m shell -a "docker rm -f pg16-migrate" 13. Запустить процесс обновления Компонента: .. code-block:: bash docker-ansible-cmd ansible-playbook -i hosts install.yml Начнется процесс обновления Компонента (см. рис. ниже): .. figure:: img/progress_install_lig.png :align: center :alt: Обновление Компонента Обновление Компонента Установка обновления завершена. После завершения обновления убедитесь, что обновление Компонента прошло успешно. Проверка обновления Компонента ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Для проверки обновления Компонента выполните следующие действия: 1. Убедитесь, что после установки обновления нет ошибок в работе Компонента. 2. Убедитесь, что параметр ``failed`` (см. рис. выше) после установки обновления имеет значение - ``0``. Это значит, что все необходимые части Компонента были обновлены, а необходимые взаимосвязи между ними настроены корректно. 3. Откройте Portainer и проверьте, что версии компонентов соответствуют указанным модулям для конфигурации Лайт.