Как аггрегировать данные с нескольких постгрессов?

Есть десяток независимых постгресов, примерно с такой структурой таблиц:
На одном:
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

Вообще сейчас это сделано питоно-скриптом который неспешно обходит по списку все постгресы, забирает данные за текущую дату, суммирует всё это, удаляет данные за последние сутки в мастер-базе и вставляет новые. И всё это крайне неспешно. И с каждым новым постгрессом это будет еще более неспешно.
А хотелось бы, если не реалтаймовой обработки, то минимальных задержек для пересчета. Когда была пара баз данных, всё было терпимо, а теперь, когда серверов больше десятка можно лечь поспать, пока всё сагрегируется.
  • Вопрос задан
  • 464 просмотра
Пригласить эксперта
Ответы на вопрос 3
sim3x
@sim3x
Хочется и нужно - две большие разницы

А хотелось бы, если не реалтаймовой обработки, то задержки не больше часа и отсуствие линейной сложности от кол-ва постгрессов.
такое наврятли получится без всяких хадупов

Вот забавное решение
stackoverflow.com/a/3200176/1346222
truncate table tableA;

insert into tableA
select *
from dblink('dbname=postgres hostaddr=xxx.xxx.xxx.xxx dbname=mydb user=postgres',
            'select a,b from tableA')
       as t1(a text,b text);


можно еще с WAL файлами поиграться и репликациями

Ну и неплохо иметь схему сервиса в общих чертах
Ответ написан
begemot_sun
@begemot_sun
Программист в душе.
На крайняк реализовать сервис на каком нибудь Erlang'e для которого параллельная работа делается очень легко и просто.
Ответ написан
@lega
В вашем случае наверно самым оптимальным будет параллельное вычерпывание сортированных данных (по одному проходу по каждому серверу и одной записи на каждую строку), если % пересечений высок.

А вообще почему не сделать шардинг?, сделать индекс (например) по 3-м полям и заливать данные в нужные сервера (типа всех alex на 1 сервер, max на 2-ой), что-б не было пересечений, таким образом данные мержить не нужно будет + экономия памяти.
Так же непонятно наличие мастер базы, вполне возможно её можно было избежать.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы