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

Есть десяток независимых постгресов, примерно с такой структурой таблиц:
На одном:
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-ой), что-б не было пересечений, таким образом данные мержить не нужно будет + экономия памяти.
Так же непонятно наличие мастер базы, вполне возможно её можно было избежать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы
22 нояб. 2024, в 08:04
1 руб./за проект
22 нояб. 2024, в 06:06
1500 руб./в час
22 нояб. 2024, в 06:04
1 руб./за проект