BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » Оптимизация производительности Trino: память, кэширование, cost-based optimizer » Кэширование в Trino: виды кэша, принципы и места применения

Кэширование в Trino: виды кэша, принципы и места применения

Trino выступает как система для интерактивных SQL-запросов к большим данным, где латентность доступа к данным играет критическую роль. Эффективное кэширование позволяет существенно сократить количество обращений к источникам данных, уменьшить сетевой трафик и ускорить повторяемые запросы. При этом кэш - это не панацея: он требует дисциплины в части инвалидации, согласованности и мониторинга, чтобы избежать устаревших результатов и перегрузки памяти. В данной главе изложены архитектурные принципы кэширования в Trino, типы кэша, сценарии применения и практические подходы к эксплуатации кэшей в продуктивной среде.

В условиях современной инфраструктуры корпоративной аналитики кэширование становится неотъемлемой частью стратегии оптимизации производительности. Однако неправильная настройка может привести как к ускорению выполнения запросов, так и к деградации времени отклика из-за устаревших данных. Поэтому ключевой задачей является настройка баланса между скоростью доступа и точностью результатов, а также выработка процессного подхода к инвалидации и мониторингу кэшей в рамках процессов Data & Digital Transformation.

  • Краткое содержание главы
  • Виды кэша в Trino и их роль в ускорении исполнения запросов.
  • Архитектура кэширования: как работает кэш на уровне сервиса, коннекторов и оптимизатора.
  • Механизмы инвалидации, синхронизации и мониторинга кэшей.
  • Практические сценарии внедрения и принципы эксплуатации.

     

Архитектура кэширования в Trino

Архитектура кэширования в Trino разделена на несколько уровней с чётким разграничением ответственностей. Это обеспечивает гибкость настройки и минимизацию риска устаревших данных при росте объёмов данных и числа пользователей.

  • Координатор и исполнители: основная логика кэширования перемещена в модуль Query Result Cache и системные кэши, которые доступны через общий интерфейс Cache. При выполнении запроса сначала осуществляется попытка получить результаты из кэша. Успешный hit возвращает данные напрямую, пропуская исполнение плана; неудачный hit приводит к компиляции плана и выполнению запроса, после чего результаты могут быть сохранены в кэш для повторного использования.

  • Метаданные и коннекторы: кэш метаданных применяется в слое коннекторов (например, Hive, Iceberg, Delta). Этот кэш кеширует схему таблиц, разделы, типы данных и другие метаданные, чтобы минимизировать запросы к внешним метastore и файловой системе. В результате снижаются задержки на этапе подготовки плана и чтения файлов.

  • Локальные и распределённые кэши: у Trino присутствуют как локальные кэши на уровне узла (in-memory), так и распределённые механизмы кэширования, которые позволяют делиться результатами между узлами. Распределённый кэш может быть реализован через внешние решения (Redis, Hazelcast и т.п.) для обеспечения консистентности результатов между ведущим координатором и воркерами, хотя в типичных конфигурациях достаточно локальных кэшей и встроенного кэша результатов.

  • Коннекторы и кэш-footers/посторонние данные: некоторые коннекторы реализуют собственные кэши на уровне файловой системы и форматов данных (например, кэш файловых футеров Parquet, списков файлов в каталоге и т.д.). Это снижает сетевые вызовы к хранилищу и ускоряет детекцию необходимых разделов и файлов.

  • Управление кэшами и инвалидации: механизм инвалидаций поддерживает консистентность кэшей в рамках операций DDL и обновления данных. При изменениях структуры таблиц, разделов или файлов система может помечать соответствующие элементы кэша как недействительные и пересоздавать их по мере необходимости.

Понимание тактики взаимодействия этих уровней позволяет выстроить эффективную стратегию кэширования под конкретные источники данных, характер нагрузки и требования по согласованности. В частности, следует различать случаи, когда более тяжёлая, но долгосрочная кэш-активация оправдана, и случаи, когда критична оперативная точность и инвалидация кэша должна происходить чаще.

 

Виды кэша в Trino

  • Результатный кэш запросов (Query Result Cache)

    • Что это: хранилище, где сохраняются результаты выполнения отдельных запросов. При повторном выполнить такого же запроса результаты можно вернуть «как есть», минуя повторное сканирование источников.
    • Как работает: после успешного выполнения запроса данные помещаются в кэш с ключом, зависящим от текста запроса, пользователей, сессии и параметров. При повторном обращении к этому ключу система возвращает данные из кэша, исключая исполнение плана.
    • Применение: особенно эффективно для повторяющихся запросов, панелей BI и дашбордов, где один и тот же SQL-вид выполняется многократно в течение коротких промежутков времени.
    • Принципы: TTL (время жизни cached-результатов), размер кэша, политики eviction, зависимость от обновлений источников, и пр.
  • Метаданные кэш (Metadata Cache)

    • Что это: кэширование схем, типов данных, списка разделов и другой информации, запрашиваемой коннекторами.
    • Как работает: коннектор оборачивает доступ к метаданным функциями кэширования, чтобы минимизировать обращения к внешнему источнику метаданных (например, Hive Metastore).
    • Применение: ускорение планирования и подготовки чтения данных, снижение задержек при повторных обращениях к тем же таблицам и разделам.
    • Принципы: TTL, валидность относительно изменений в метаданной инфраструктуре (DDL), реактивное обновление после событий.
  • Кэш данных на уровне коннекторов (Connector Data Cache)

    • Что это: кэш в коннекторах, помогающий снизить стоимость операций чтения, например, кэширование списков файлов, манифестов, футеров файлов форматов колоночного хранения и пр.
    • Как работает: коннектор накапливает в памяти копии часто запрашиваемых файловых структур или ярлыков файлов и манифестов, чтобы ускорить доступ к данным.
    • Применение: особенно полезно в случаях с большим числом мелких файлов в файловой системе или при чтении большого числа файлов из хранилищ типа S3, HDFS.
    • Принципы: внимательное управление размером кэша, согласованность с изменениями в файловой системе, контроль TTL.
  • Кэш статистик (Statistics Cache) и пр

    • Что это: кэшируeт статистику таблиц (количество строк, данные распределения, NDV и пр.), которая используется оптимизатором (CBO) для выбора плана.
    • Как работает: после получения статистики она сохраняется и повторно используется для схожих запросов, пока данные не обновятся.
    • Применение: ускорение планирования, особенно для больших таблиц и сложных запросов, где сбор статистики вручную занимает значительное время.
    • Принципы: обновление статистик, TTL статистики, влияние на точность плана.
  • Примечание по согласованности: кэш должен сохранять баланс между скоростью доступа и корректностью результатов. В случаях критичной актуальности данных необходимы более агрессивные политики инвалидации и контролируемая задержка обновления статистик и метаданных.

     

Места применения кэша и сценарии внедрения

  • Повторяемые исторически стабильные запросы

    • Сценарий: панели BI и дашборды, где один и тот же SQL выполняется многократно в течение часа и более.
    • Подход: активировать Query Result Cache с умеренным TTL, чтобы снизить задержку иConsistent latency.
  • Метаданные и объёмные каталоги

    • Сценарий: запросы к Hive/ Iceberg, где планирование часто повторяется, а метаданные больших таблиц обновляются редко.
    • Подход: включить Metadata Cache; разумно задать TTL, чтобы демонтировать устаревшие схемы и разделы после обновлений.
  • Константные по структуре данные в больших файловых хранилищах

    • Сценарий: чтение большого числа файлов в S3 или HDFS с повторной выборкой одних и тех же наборов файлов.
    • Подход: использовать Connector Data Cache для ускорения навигации по файловой системе и подготавливающих операций.
  • Тяжёлые операции аналитики и аналити негативности

    • Сценарий: кэш статистик для крупных таблиц, где планирование является продолжительным и переиспользование статистик заметно ускоряет планировочные решения.
    • Подход: применить Stats Cache и периодически обновлять статистику в зависимости от частоты изменений данных.
  • Временная оптимизация без риска устаревших данных

    • Сценарий: во время пиковых нагрузок можно увеличивать TTL кэша, но при этом обеспечить условную принудительную инвалидацию при DDL.
    • Подход: настройка TTL и политики вручную, а также мониторинг hit-rate, чтобы оценить влияние кэша на качество данных.
  • Взаимодействие с внешними кэшами

    • Сценарий: объединение локальных кэшей узлов со внешним distributed cache (Redis, Memcached, Hazelcast) для обмена результатами и согласованных данных.
    • Подход: внедрять поэтапно, оценивая overhead на сетевые вызовы и сложность администрирования.

       

Инвалидации, мониторинг и управление

  • Инвалидации и согласованность

    • Любые DDL-операции на уровне источников данных должны приводить к инвалидации соответствующих кэшей: кэш таблиц, разделов, манифестов и датасетов. В противном случае возможна работа с устаревшими данными.
    • В Trino инвалидации реализуются через механизм уведомления о изменениях в метаданной инфраструктуре и через TTL кэшей. Важно синхронизировать стратегию инвалидации между коннекторами и системой планирования.
  • Мониторинг и метрики

    • Основные метрики кэшей: hit-rate, size, eviction-rate, latency caches, TTL-эффекты. Они позволяют определить, когда кэши становятся узким местом или наоборот - неоправданно агрессивно занимают память.
    • Практические инструменты: JMX- или Prometheus-метрики, дашборды по кэш-эффективности, трассировка запросов для анализа влияния кэширования на конкретные запросы.
  • Управление размером и конфигурацией

    • Подход: устанавливать лимиты памяти для локального кэширования, а также лимиты по общему размеру кэша. Включение политики автоматического очищения и контроля объёма позволяет избежать перегрузки памяти и перегрева узлов.
    • Практика: начинать с умеренных TTL и постепенно увеличивать TTL при положительном влиянии на latency, следуя за изменениями в нагрузке и частоте обновления данных.
  • Конфигурационные примеры (информативно, версии и ключи могут различаться)

    • Пример конфигурации Hive-метаданных кэша:
      ## Hive connector: кэшируем метаданные на уровне TTL
      hive.metastore-cache-ttl=3600s
          
  • Пример конфигурации для кэша результатов запросов:

    ## Включение кеширования результатов запросов и настройка TTL
    query.cache-enabled=true
    query.cache-ttl=24h
    query.cache-max-entries=500000
        
  • Пример конфигурации базового кэша файловой системы коннектора:

    ## Кэш файловых метаданных на уровне коннектора
    connector.cache.enabled=true
    connector.cache.max-size=256MB
        
  • Интеграции и практическая эксплуатация

    • В реальных проектах целесообразно начинать с включения тайлами метаданных и результатов запросов на тестовом окружении, с постепенным переносом на продакшн после оценки влияния на latency и согласованность.
    • Важна координация между командами SRE/BI: политики кэширования должны документироваться, включая дефиниции TTL, правила инвалидации, и процесс проверки корректности выводов.

       

Key takeaways

  • Кэширование в Trino делится на несколько уровней: результатный кэш запросов, кэш метаданных, кэш данных коннекторов и кэш статистик. Каждый уровень решает свою задачу и имеет свои особенности инвалидации.
  • Эффективное использование кэша требует балансирования между скоростью доступа к данным и актуальностью результатов. TTL, политика инвалидации и мониторинг - ключевые элементы этой балансировки.
  • Метаданные и данные коннекторов существенно ускоряют планирование и чтение данных, но требуют аккуратной настройки TTL и согласованности с обновлениями данных.
  • Мониторинг кэшей, включая hit-rate и размер кэша, позволяет своевременно корректировать параметры и избегать перегрузки памяти или устаревших данных.
  • Практический подход: начинать с включения кэша метаданных и результатов, затем постепенно расширять применение кэширования на коннекторах и статистике, сопровождая изменения тщательным мониторингом и тестированием.

     

FAQ

  1. Что такое кэш результатов в Trino и как он работает?
  • Кэш результатов сохраняет результаты выполнения отдельных запросов под уникальным ключом, который учитывает текст запроса, параметры, пользователя и сессию. При повторном запросе с тем же ключом данные возвращаются напрямую из кэша, что позволяет мгновенно получить результат без повторного сканирования источников. Важна корректная инвалидация: при изменениях в данных или метаданных кэш должен быть очищен, чтобы не возвращать устаревшие данные. TTL кэша обеспечивает ограниченный срок хранения, а eviction-стратегии управляют использованием памяти.

 

  1. Какие типы кэша существуют в Trino и чем они отличаются?
  • Результатный кэш: ускоряет повторное выполнение идентичных запросов за счет сохранения и повторного использования результатов.
  • Метаданные кэш: ускоряет доступ к схемам, спискам разделов и другим метаданным, уменьшая обращения к метастору.
  • Кэш данных коннекторов: ускоряет чтение за счёт хранения часто запрашиваемых файловых структур и манифестов на уровне коннектора.
  • Кэш статистик: ускоряет планирование за счёт повторного использования статистик таблиц и колонок.
  • Каждый тип кэша имеет свои политики инвалидации и TTL, зависящие от характера источника данных и требований к актуальности.

 

  1. Как выбрать параметры TTL и размер кэша?
  • TTL должен соответствовать частоте обновления данных в источнике. Для стабильных источников можно применять более длинный TTL, но при этом требуются более агрессивные инвалидации при DDL. Для данных с частыми обновлениями TTL должен быть коротким. Размер кэша нужно подбирать исходя из доступной памяти и объёма данных; не следует допускать нехватки памяти на выполнение других задач. Практика - начать с умеренного TTL и постепенно адаптировать под фактическую нагрузку и задержку.

 

  1. Какие риски связаны с кэшированием и как их избегать?
  • Основной риск - устаревшие данные. Чтобы снизить риск, применяют TTL и инвалидацию по изменениям метаданных, а также неглубокую выборку по ключам, чтобы кэш не служил устаревшими данным.
  • Проблемы с памятью: чрезмерное кэширование может вытеснить рабочую нагрузку. Решение - лимиты памяти и автоматические политики очистки.
  • Сложности интеграции: внешние кэши требуют согласования с политиками безопасности и мониторинга. Необходимо документировать правила использования и процедуры.

 

  1. Как активировать кэш метаданных для Hive/ Iceberg в продакшене?
  • Включить кэш метаданных на уровне конфигурации коннектора и задать разумный TTL. В Hive-подключении это обычно делается через hive.metastore-cache-ttl. Мониторинг hit-rate и частоты обновления метаданных поможет корректировать параметры.

 

  1. Какие конфигурационные подходы лучше применяют в многоузловом кластере?
  • В старте - локальные кэши на узлах вместе с TTL. При необходимости - внедрить распределённый кэш для координации между узлами, особенно если имеются частые повторные запросы по одному и тому же набору данных. Важно обеспечить консистентность и безопасность доступа к кэшу в рамках общей инфраструктуры.

 

  1. Как мониторить эффективность кэша?
  • Основные метрики: hit-rate (доля попаданий в кэш), latency cache lookups, время жизни элементов, размер кэша, количество эвикций, нагрузка на память. Построение дашбордов в Prometheus/Grafana, сопровождение логами и алертов поможет своевременно реагировать на изменения.

 

  1. Что делать, если кэш не приносит ожидаемого эффекта?
  • Причины могут быть разнообразны: TTL слишком маленький или слишком большой, данные обновляются слишком часто, неверно сконфигурированы ключи кэша, или политики инвалидации слишком агрессивны. Рекомендуется провести аудит конфигураций, проверить логи кэша и провести тесты c вариациями TTL и размера кэша, а также измерить hit-rate на тестовой нагрузке.

 

  1. Насколько безопасно использовать кэш при критичных к точности данных сценариях?
  • При критичной точности данных кэш использовать нужно с повышенной осторожностью: применяйте строгую инвалидацию, короткие TTL, явные механизмы принудительной очистки после DDL, и мониторинг, подтверждающий отсутствие устаревших данных. В продуктивной среде разумна практика отключать кэш для отдельных чувствительных запросов или включать только для заранее проверенных сценариев.

 

  1. Какие шаги предпринять для внедрения кэширования в существующую архитектуру?
  • Шаги: (1) оценить текущую нагрузку и повторяющиеся запросы; (2) включить кэш метаданных и кэш результатов на тестовом окружении; (3) определить TTL и лимиты памяти; (4) запустить мониторинг и измерить improvement; (5) постепенно расширять использование кэша на критических источниках данных и запросах; (6) документировать политики инвалидации и проводить регулярные ревью конфигураций.

 

Подводя итог, кэширование в Trino - мощный инструмент для повышения производительности аналитических рабочих нагрузок, но требует контроля над инвалидацией, согласованностью и ресурсами. Привязка к стратегической архитектуре данных и четкий процесс эксплуатации - залог устойчивого прироста производительности при сохранении достоверности и своевременности результатов.

← Предыдущая статья
Влияние памяти на производительность: задержки, пропускная способность и throughput
Следующая статья →
Кэш плана и кэш результатов: механизмы ускорения повторяющихся запросов

 

Узнать стоимость решенияЗапросить видео презентацию

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • ООО "Уральская транспортная компания" — это транспортно-логистическая компания, специализирующаяся на железнодорожных перевозках грузов, создана в 2009 году.

  • Компания ООО "Комус" - один из лидеров российского рынка оптовых продаж офисных товаров и техники. Компания поставляет широкий ассортимент продукции - от канцелярских принадлежностей до компьютерной техники и офисной мебели.

  • ООО «Модум-Транс» — независимый оператор грузовых железнодорожных перевозок, лидирующий по количеству инновационного парка на сети РЖД.

  • Авиакомпания NordStar (АО «АК «НордСтар») – работает под данным брендом с 2008 г. и сейчас входит в топ-15 крупнейших российских авиакомпаний (данные Росавиации) с пассажирооборотом более 1 млн человек в год. АО «АК «НордСтар» выполняет и внутренние, и внешние рейсы, а ее основные хабы - Домодедово, Пулково и Емельяново. С 2021 года компания является базовым перевозчиком аэропорта Норильск.

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.