Skip to content

Где живут данные: MongoDB, ClickHouse, Postgres

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

MongoDB — источник правды

Основное хранилище ядра: транзакции, мерчанты, счета, гейты, банки, балансировщики, списки и лог взаимодействия с гейтами. Пока данных о платеже нет здесь — платежа для системы не существует, независимо от того, что показывают остальные две базы.

Состояние транзакции меняет только ядро. Несколько соседних сервисов пишут в тот же кластер, но в свои собственные коллекции: сервис колбеков ведёт лог попыток доставки, сервис агрегации хранит там свои отчётные задачи. Ни один из них не трогает документ транзакции напрямую — это исключительная зона ядра, и любое чужое изменение здесь было бы состоянием, о котором ядро не знает.

Как данные попадают в остальные две базы

ClickHouse и Postgres billing не получают запись напрямую — их наполняет один общий конвейер, отдельный от очередей платёжного пути. Ядро создаёт и меняет документ в MongoDB, изменение подхватывается через механизм Change Streams, уходит в Kafka и оттуда разбирается двумя независимыми обработчиками — один кладёт данные в ClickHouse, другой в Postgres.

Важное следствие: это не та Kafka, о которой говорится в очередях платёжного пути — там Kafka осознанно не используется, платёж не ждёт эту репликацию ни на одном шаге. Конвейер работает асинхронно и с отставанием, поэтому если платёж уже виден в MongoDB через API, но ещё не появился в ClickHouse или в Postgres — это нормальная задержка репликации, а не потеря данных.

ClickHouse — аналитика

Не операционная база и не источник правды: сюда никто не ходит, чтобы принять решение по конкретному платежу. Здесь строятся дашборды мерчанта, отчёты по конверсии и другая аналитика, для которой важна скорость агрегирующих запросов по большому объёму транзакций, а не мгновенная актуальность одной записи.

Postgres billing — зеркало для отчётности

Тем же конвейером данные попадают в Postgres, где они лежат готовыми представлениями для биллинга и начислений. Как устроен сам биллинг — отдельная тема, которая пока не описана, см. Биллинг.

Кто переносит данные из Kafka и где это работает

Три процесса на pm2, у каждого своя роль и свой сервер:

ПроцессЧто делаетРепозиторийСервер (EC2)
mongo2mqЧитает Change Streams MongoDB, публикует в Kafkamongo2mq/index.jsmongo2mq-extractor-server (ip-10-0-3-158.eu-central-1.compute.internal)
mq2postgresРазбирает Kafka, пишет в Postgres billingmq2postgres/index.jsmongo2mq-extractor-server (ip-10-0-3-158.eu-central-1.compute.internal)
mq2clickhouseРазбирает Kafka, пишет в ClickHousemq2clickhouse/index.jsclickhouse-server (ip-10-0-2-182.eu-central-1.compute.internal) — тот же хост, что и сама база

Оба сервера доступны только через bastion. Если конвейер отстаёт сильнее обычного или совсем встал — смотреть логи pm2 нужно на одном из этих двух хостов, в зависимости от того, какая база не получает данных.

Как подключиться руками

Прямого доступа снаружи ни к одной из трёх баз нет — везде bastion.

  • MongoDB — Atlas, доступ через VPN без bastion; клиент — Studio 3T.
  • ClickHouse и Postgres billing — доступ через SSH-туннель на bastion (18.199.118.114) персональной учётной записью, дальше клиент — DBeaver. Учётка в bastion и в самой базе — не одно и то же: сначала пробрасывается порт через SSH, а на другом его конце уже спрашивают логин и пароль в саму базу.

Практическое правило

При разборе конкретного платежа источник ответа — всегда API ядра, то есть MongoDB, а не аналитические базы. ClickHouse и Postgres billing полезны для вопросов вида «сколько» и «как менялось со временем», а не «что сейчас происходит с этой транзакцией».

Redis в этот разговор не входит — он не хранилище данных о платеже, а механизм очередей и кэша, и у него отдельная страница: Очереди, таймеры и отложенные задачи.

Куда дальше

Внутренняя база знаний. Нашли неточность — поправьте страницу или заведите вопрос в разделе «Открытые вопросы».