Как аггрегировать данные с нескольких постгрессов?
Есть десяток независимых постгресов, примерно с такой структурой таблиц:
На одном:
name | date | url | shows | clicks
alex | 21.04.2015 | 1 | 21 | 42
max | 21.04.2015 | 4 | 34 | 21
max | 22.04.2015 | 4 | 34 | 21
На другом:
name | date | url | shows | clicks
alex | 21.04.2015 | 1 | 1 | 1
max | 21.04.2015 | 4 | 1 | 1
shows и clicks на каждом сервере ежесекундно растут, добавляются записи с новыми name и url, ну тут ясно.
Как наиболее быстро и просто взять все данные с них сгруппировать и просуммировать? Что бы на так называемом мастерском постгресе в таблице схожей струтуры появилось:
name | date | url | shows | clicks
alex | 21.04.2015 | 2 | 22 | 43
max | 21.04.2015 | 8 | 35 | 22
max | 22.04.2015 | 4 | 34 | 21
Вообще сейчас это сделано питоно-скриптом который неспешно обходит по списку все постгресы, забирает данные за текущую дату, суммирует всё это, удаляет данные за последние сутки в мастер-базе и вставляет новые. И всё это крайне неспешно. И с каждым новым постгрессом это будет еще более неспешно.
А хотелось бы, если не реалтаймовой обработки, то минимальных задержек для пересчета. Когда была пара баз данных, всё было терпимо, а теперь, когда серверов больше десятка можно лечь поспать, пока всё сагрегируется.
да. +1. Думал об этом, сносное решение. Но несколько велосипедное. Когда задавал вопрос, думал о том, что кто-нибудь порекомендует-расскажет об использовании Parallel Query из pg-pool2, druid или подобных известных и неизвестных мне надстройках, которые служат прослойкой для распределенных запросов
raiboon: если уж и пилить прослойку, то лучше на rabbitMQ, но умных историй бы тоже послушал
Последнее, что я слышал по теме -
как в badoo пилили агрегацию и анализ посетителей на хадупе. Там только текстовый лог был
Ну почему же, подконнектился ко всем серверам. В каждом процессе собрал данные и проинкрементил в ETS. В конце работы там будут лежать суммарные данные, которые можно выгрузить куда угодно.
В вашем случае наверно самым оптимальным будет параллельное вычерпывание сортированных данных (по одному проходу по каждому серверу и одной записи на каждую строку), если % пересечений высок.
А вообще почему не сделать шардинг?, сделать индекс (например) по 3-м полям и заливать данные в нужные сервера (типа всех alex на 1 сервер, max на 2-ой), что-б не было пересечений, таким образом данные мержить не нужно будет + экономия памяти.
Так же непонятно наличие мастер базы, вполне возможно её можно было избежать.