Денежный журнал разросся до сотен миллионов строк, и всё, что с ним работало, начинало тормозить. Мы оставили в основной базе одни сутки вместо сорока пяти, а всю историю отправили в отдельное хранилище — потоком, с задержкой в секунды. Каждый отчёт переводили на новое чтение по одному, маленькими релизами, и на каждом шаге сверяли старый ответ с новым: расхождение должно было быть нулевым. Так и вышло.
Переключение делали не одним релизом, а серией маленьких: каждый читатель денежного журнала переводился на новое чтение отдельно, под рантайм-переключателем, с возможностью мгновенно вернуть старый путь.
Приёмка каждого шага — сравнение «старый путь против нового» на боевых данных с требованием нулевого расхождения. Попутно пришлось решить три неочевидные задачи: классификацию строк-надгробий, фильтрацию легаси-свёрток и общий канон часовых поясов между MySQL и ClickHouse.
Данные едут в колоночное хранилище потоком из журнала репликации, задержка измеряется секундами. Горячая база держит сутки вместо сорока пяти дней, история доступна целиком, платежи не останавливались ни на минуту.