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 на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс по ClickHouse » Энциклопедия ClickHouse » clickhouse merge

clickhouse merge

 

Краткое введение

Эффективная организация хранения и обработки больших объемов данных требует управляемого процесса объединения данных. В контексте ClickHouse понятие "merge" относится к механизму слияния маленьких частей данных в большие части с целью оптимизации чтения, уменьшения фрагментации и ускорения аналитических запросов. Правильная настройка и мониторинг процесса merges позволяют уменьшить задержки при инференсе, снизить расход диска и избежать перегрузки кластера во время бурного ввода данных. Эта глава охватывает как теоретические основы, так и практические подходы к реализации, мониторингу и настройке merges в среде ClickHouse, включая репликацию, TTL и интеграцию с существующей инфраструктурой.

 

Введение

ClickHouse использует архитектуру MergeTree и производные движки (ReplicatedMergeTree, MergeTree) для хранения данных. В рамках этой архитектуры данные логически разбиты на «части» (parts). Со временем множество мелких частей образуется вследствие инкрементных загрузок, TTL-управления, мутаций и параллельной записи. Чтобы поддержать эффективный поиск и избежать большего числа операций чтения, система выполняет фоновые операции объединения частей: это и есть механизм merges.

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

Термины, которые часто встречаются в документации и в операционной практике:

  • Part (часть) - физический фрагмент данных на диске, созданный после загрузки или мутаций.
  • Merge (объединение) - операция, которая выбирает пару или более частей и создает новую, объединенную часть.
  • TTL (Time-To-Live) - механизм автоматического удаления устаревших данных по заданным правилам.
  • ReplicatedMergeTree - вариант MergeTree, обеспечивающий репликацию через внешнее согласование (ZooKeeper или ClickHouse Keeper).
  • ClickHouse Keeper - легковесная замена ZooKeeper, предназначенная для координации в кластерах ClickHouse.
  • system.merges, system.mutations, system.parts - системные таблицы ClickHouse, используемые для мониторинга фоновых операций и статуса частей.

     

Теоретические основы и терминология

  • MergeTree и его производные: архетип хранения, когда данные читаются по ключу ORDER BY и разделяются по PARTITION BY. Каждая партия данных хранится в виде набора файлов, названного по имени части, и имеет атрибуты min/max по ключу сортировки, размер, возраст.
  • Стратегии объединения:
    • Leveling (уровневые merges): система пытается привести количество активных частей в пределах разумного уровня за счет последовательного объединения частей одного partition и одного уровня.
    • Size- и time-oriented merging: объединение выполняется с учетом размеров частей и возрастных ограничений, чтобы минимизировать избыточные копирования.
  • TTL и мутации: TTL удаляет устаревшие данные, мутации применяют обновления или удаления в рамках существующих частей, и последующая переработка может запускать новые merges.
  • Репликация и консистентность: ReplicatedMergeTree синхронизирует данные между репликами через согласование, чтобы объединения представляли собой согласованный набор файлов на всех узлах.
  • Мониторинг и наблюдаемость: системные таблицы system.merges, system.mutations, system.parts позволяют отслеживать статус и влияние merges на кластер.

     

Почему важно понимать эти термины:

  • Правильная архитектура таблиц (разбиение по partition, ORDER BY, TTL) напрямую влияет на частоту и стоимость merges.
  • Неправильная конфигурация фоновых потоков может вызвать задержки чтения и деградацию QoS при пиковых нагрузках.
  • Репликация требует согласованности операций merges между репликами, иначе данные и запросы окажутся неустойчивыми к сбоям.

     

Методологии и подходы

  • Архитектурный подход:
    • Разбиение по времени (например, PARTITION BY toYYYYMM(date)) позволяет ограничить область merges конкретной Partition.
    • Выбор ORDER BY зависит от часто используемых запросов и фильтров.
    • TTL позволяет автоматически удалять старые данные, что может снижать частоту merges за счет уменьшения количества активных частей.
  • Инжинеринг обновлений и нагрузки:
    • Инъекция данных через буферы (Buffer, BufferMergeTree, Materialized views) может временно отделить ingestion от интенсивной активности merges.
    • Использование репликации для повышения доступности, но следует планировать merges на нескольких репликах синхронно.
  • Мониторинг и операционное управление:
    • Наблюдательные метрики: количество активных merges, среднее время выполнения, размер данных подлияций, задержки.
    • Введение правил алертинга на рост очередей merges, увеличение времени выполнения, снижение пропускной способности.
  • Архитектурные практики:
    • Разграничение по окружениям: тестовые окружения для проверки влияния изменений конфигураций merges.
    • Поэтапная миграция TTL и структур таблиц, чтобы избежать неожиданных пиков merges.
  • Примеры open-source и российских технологий:
    • Open-source: ClickHouse, ClickHouse Keeper, Apache ZooKeeper (для старых конфигураций), Apache Kafka интеграции.
    • Российские примеры: Яндекс.Метрика и другие крупные пользователи ClickHouse, которые применяют продвинутые схемы TTL и раскладки partitions для масштабируемых аналитических нагрузок.

       

Архитектура и технологическая реализация

Ниже приведена типовая архитектурная карта процесса merges в кластере на базе MergeTree:

  • Ингестия данных поступает в таблицу.
  • Партии данных создаются по Partition и по диапазону ключей ORDER BY.
  • Фоновая задача merges выбирает пары или группы частей и объединяет их, создавая новую часть.
  • При TTL старая часть может быть удалена, что приводит к обновлению графа merges.
  • В ReplicatedMergeTree реплики синхронизируют статусы объединений через координацию (ZooKeeper или ClickHouse Keeper).
  • Запросы читателя выбирают данные из актуальных, крупных частей, что ускоряет чтение.

ASCII-диаграмма процесса merges:

  • ingestion -> parts (part_1, part_2, part_3) -> selector -> merges (part_A) -> new part (part_A) -> read path.

Элементы реализации:

  • Фоновый исполнитель merges:
    • Назначает пары/группы частей с одинаковым partition и близкими min/max значениями.
    • Создает новую часть с объединенным диапазоном и сохраняет её как активную.
    • Удаляет исходные части после успешной замены.
  • Стадии и условия выбора:
    • Вариативность частоты merges зависит от количества мелких частей.
    • Учет возраста частей для предотвращения чрезмерной переработки.
  • Репликация и консистентность:
    • Механизм репликации не блокирует чтение, но merges должны быть согласованы между репликами.
    • В современных версиях можно использовать ClickHouse Keeper как альтернативу ZooKeeper.

       

Технические детали реализации (примерная схема):

  • Данные хранятся на уровне Part, где каждая часть имеет:
    • partition_id
    • min_value, max_value по ключу ORDER BY
    • size_bytes
    • rows
    • creation_time
  • Алгоритм объединения упрощённо:
    1. Собрать список мелких частей в partition.
    2. Найти пары/группы частей с близкими диапазонами.
    3. Объединить выбранные части в одну новую часть.
    4. Обновить метаданные и удалить исходные части после успешной записи новой части.
    5. Повторить цикл до достижения порога по частоте/размеру.

Пример упрощенного псевдокода выбора объединения:

def choose_merge(parts):

 

parts: список частей одного partition, отсортированных по min_value

for i in range(len(parts) - 1):
a, b = parts[i], parts[i+1]
if a.level == b.level: # уровень объединения
return (a, b)
return None

Этот псевдокод иллюстрирует базовую логику: искать пары на одном уровне и объединять их.

SQL-реализации и мониторинг:

  • Мониторинг merges
    • system.merges: представляет активные и завершенные операции merges.
    • system.parts: статус отдельных частей.
    • system.mutations: миграции и обновления в рамках частей.
  • Примеры запросов:
    • Просмотреть активные merges:
      SELECT event_time, database, table, merge_type, elapsed_ms, rows, bytes FROM system.merges WHERE is_done = 0;
    • Проверить активность частей в partition:
      SELECT partition, active, min_block, max_block, rows, bytes FROM system.parts WHERE active = 1;

       

Обеспечение отказоустойчивости и консистентности:

  • ReplicatedMergeTree обеспечивает автоматическую репликацию экспериментально и устойчивость к сбоям, но требует корректной настройки ZooKeeper или ClickHouse Keeper.
  • TTL и мутации в сочетании с merges требуют планирования: удаление данных может вызвать новые merges, поэтому мониторинг пиковых периодов важен.

Примеры конфигураций и практик:

  • Архитектурное планирование partitioning:
    • PARTITION BY toYYYYMM(date) или by billboard-ключ, чтобы ограничить scope merges по времени.
  • Настройки фоновой обработки:
    • Использование достаточного количества фоновых потоков и выделение ресурсов под merges.
    • Разнесение ingestion и merges во времени при пиковых нагрузках.

       

Примеры open-source и российских практик:

  • Open-source: ClickHouse Keeper и ZooKeeper-совместимые конфигурации для ReplicatedMergeTree.
  • Российские кейсы: крупные компании в России применяют архитектуру ClickHouse для телеком-аналитики, веб-аналитики и бизнес-аналитики, активно используя TTL, Partitions и репликацию для оптимизации merges и доступности данных.

     

Технические детали реализации (практические советы):

  • Выбор стратегий partition и сортировки для уменьшения частоты merges.
  • Учет скорости ingest и обработки merges: баланс между нагрузкой на CPU, дисковую подсистему и задержками при чтении.
  • Влияние типа дисков и файловой системы на эффективность merges: SSD против HDD, файловая система, поддержка TRIM.
  • Встроенные механизмы компрессии (LZ4, ZSTD) и их влияние на скорость объединения.
  • Взаимодействие с TTL: TTL может снизить частоту merges, но требует мониторинга чтобы не повлиять на читаемость.

Риски, ограничения и типовые ошибки

  • Неоптимальная схема partitioning и ORDER BY приводит к слишком частым merges и деградации производительности.
  • Игнорирование TTL может привести к переполнению дискового пространства и затягиванию merges.
  • Слишком агрессивная настройка фоновых потоков может повлиять на ingestion и задержку запросов.
  • Неправильная настройка репликации может приводить к рассинхронизациям между репликами, что усложняет консистентность.
  • Недостаточная наблюдаемость: отсутствие мониторинга system.merges и system.parts может скрывать перегрузки и задержки.
  • Внедрение миграций и мутаций без учѐта диаграммы merges может вызвать неожиданные пики нагрузки.

Заключение

Понимание механизма clickhouse merge - это не просто фиксация абстрактного процесса. Это ключ к эффективной архитектуре аналитических систем, где данные постоянно инфлюируются, обновляются и требуют быстрой доступности. Умение проектировать PARTITION BY, выбирать ORDER BY, управлять TTL и настраивать фоновые потоки merges позволяет обеспечить баланс между записью и чтением, минимизировать падение производительности во время пиков, а также обеспечить устойчивость к сбоям в кластере.

Вопрос-Ответ (FAQ)

  1. Что такое clickhouse merge и зачем он нужен?
  • clickhouse merge - процесс фонового объединения частей в MergeTree-структуре. Он необходим для поддержания эффективного чтения, улучшения компрессии и уменьшения числа мелких частей, которые приводят к затяжкам при запросах. Без merges чтение из мелких частей становится неэффективным, особенно на больших объемах данных.
  1. Как работают merges внутри MergeTree?
  • Мerges выбирают пары или группы частей с одинаковым partition и близкими диапазонами min/max. Затем создается новая часть, объединяющая данные, после чего удаляются исходные части. Это повторяется регулярно, в зависимости от параметров и уровня загрузки.
  1. Какие параметры влияют на частоту и производительность merges?
  • Функционирование merges определяется количеством фоновых потоков (background pool size), количеством разрешённых merges за интервал (merges_per_interval), размером и возрастом частей, а также политикой TTL. Важны также параметры partitioning и выбор ORDER BY, так как они определяют, какие части попадают под merges.
  1. Влияние TTL на процесс merges?
  • TTL может снижать число активных частей, поскольку устаревшие данные удаляются. Это уменьшает нагрузку на merges и может привести к более редким, но более крупным merges. Однако TTL также может приводить к фрагментации, если данные удаляются нерегулярно, поэтому важно планировать TTL с учётом частоты merges.
  1. Как мониторить merges в продакшене?
  • Используйте системные таблицы system.merges, system.parts и system.mutations. Примеры запросов:
    • SELECT * FROM system.merges WHERE is_done = 0;
    • SELECT partition, part_name, rows, bytes FROM system.parts WHERE active = 1;
    • SELECT database, table, mutation_id, create_time, progress FROM system.mutations;
  1. Как репликация влияет на merges?
  • ReplicatedMergeTree требует согласованияMerge между репликами. Merge операции должны быть согласованы на всех узлах, чтобы данные оставались консистентными в рамках квази-ACID подхода. В случае с ClickHouse Keeper или ZooKeeper координация обеспечивает согласованность.
  1. Какие часто встречаются ошибки при настройке merges?
  • Недооцененная конфигурация фоновых потоков, приводящая к перегрузке CPU и дисков во время пиков.
  • Неправильное partitioning и ORDER BY приводят к частым маленьким merges.
  • Игнорирование TTL и мутаций, что вызывает неожиданную переработку большого объема данных.
  • Отсутствие мониторинга и алертинга по системным таблицам merges, mutations и parts.
  • Сложности с репликацией в кластерах dengan неправильной настройкой ZooKeeper/ClickHouse Keeper.
  1. Как оптимизировать merges без потери доступности?
  • Планируйте partitioning стратегически (например, по дате) для ограничения области merges.
  • Настройте TTL так, чтобы устаревающие данные удалялись предсказуемо и минимально влияли на merges.
  • Распределяйте ingestion и merges во времени, используя буферы или очереди.
  • Используйте достаточно фоновых потоков, но контролируйте их через мониторинг. Важно держать баланс между ingestion и фоновыми операциями.
  1. Какие практики в российских реалиях помогают управлять merges?
  • Использование ClickHouse Keeper в качестве координационного слоя для ReplicatedMergeTree.
  • ПрименениеPartitioning по времени в сочетании с TTL для локализации операций merges в рамках конкретного временного окна.
  • Внедрение мониторинга на уровне системных таблиц, интеграция с системой alerting (Prometheus, Grafana) и создание дашбордов по состоянию merges и активных частей.
  • Кейсы крупных российских компаний (например, Яндекс.Метрика, Сбербанк и др.) демонстрируют эффективную эксплуатацию TTL, репликации и решения для устойчивой аналитики в условиях больших временных рядов и больших нагрузок.
  1. Как связать merges с общими стратегиями данных и архитектуры?
  • Merge требует тесной связи с моделью данных: выбор Partitioning, ORDER BY, TTL влияет на частоту merges и на производительность чтения.
  • Архитектура должна учитывать баланс между ingestion throughput и фоновой обработкой merges.
  • Важно сочетать мониторинг, управление ресурсами и плановую стратегию масштабирования (горизонтальное expansion, настройка репликации) для стабильной аналитической инфраструктуры.

Заключение

Глубокое понимание и грамотная настройка механизма clickhouse merge позволяют проектировать аналитические системы, которые выдерживают пиковые нагрузки, сохраняют доступность и обеспечивают эффективный ответ на запросы. В сочетании с корректной архитектурой Partitioning, TTL, репликацией и мониторингом merges превращаются в мощный инструмент для устойчивой и масштабируемой аналитики.

Приложение: примеры конфигураций и сценарии

  • Пример таблицы с ReplicatedMergeTree и TTL:
    CREATE TABLE analytics.events
    (
    event_date Date,
    user_id UInt64,
    event_type String,
    value Float64
    )
    ENGINE = ReplicatedMergeTree('/data/analytics/{shard}/events', '{replica}')
    PARTITION BY toYYYYMM(event_date)
    ORDER BY (event_date, user_id)
    TTL event_date + INTERVAL 1 MONTH;

  • Пример мониторинга merges (псевдо-SQL для иллюстрации):
    SELECT database, table, count() AS active_merges
    FROM system.merges
    WHERE is_done = 0
    GROUP BY database, table;

  • Пример псевдокода алгоритма merges (для обучающего слога):
    while true:
    parts = fetch_parts_for_partition()
    candidate = choose_merge(parts)
    if candidate:
    perform_merge(candidate)
    sleep(interval)

  • Пример конфигурации фоновых потоков (инстантно-обобщенный формат):

    8
    4
    500MB
    10000

Эта глава предоставила комплексное видение механизма merges в ClickHouse, охватив теорию, архитектуру, практику и типовыеOperating-model подходы, которые помогут analytics-инженерам и ИТ-директорам выстроить устойчивые и эффективные аналитические системы на базе ClickHouse.

← Предыдущая статья
clickhouse using
Следующая статья →
clickhouse window

 

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

Решения

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

Клиенты
  • АО «Евросиб СПб–транспортные системы» – оператор контейнерных сервисов с широкой сетью маршрутов на внутрироссийских и международных направлениях. Имеет успешный опыт управления парком фитинговых платформ, а также организации ускоренных контейнерных поездов, в основе которых точное расписание, оптимальные сроки доставки груза и экономическая целесообразность.

  • ПАО «Транснефть» – крупнейшая российская нефтепроводная компания. «Транснефть» обеспечивает транспортировку более 85% добываемых в России нефти и нефтепродуктов.

  • MoneyCare — кредитная платформа и сервис для ПОС-кредитования в магазинах, установленная в более чем 18 тысячах трейдинговых точек и сотрудничающая с 11 главными банками России.

  • ГК «Акрон Холдинг», одно из крупнейших в России промышленно-металлургических предприятий, запустил проект по модернизации управления данными. В качестве целевого решения для анализа ключевых данных компания выбрала систему PIX BI. В компании уже более 100 пользователей PIX BI, и в этом году в планах увеличить их число в два раза.

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • 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 и политикой конфиденциальности.