Jaki jest nowoczesny sposób partycjonowania PostgreSQL na różnych komputerach, gdy dane można „naturalnie podzielić na partycje”

22

Po kilku latach przebywania w przestrzeni „NoSQL” mam teraz problem, który ma charakter „relacyjny”. Dzisiaj widzę magazyny danych o zupełnie innych oczach niż wcześniej. Takie rzeczy jak Riak zepsuły mnie w taki sposób, że nie mogę już dłużej tolerować pojedynczych punktów awarii, „z powodu konserwacji” itp. Oczywiście (lub mam nadzieję), nie straciłem całkowicie rozsądku. To osobisty projekt, który nie do końca (lub jeszcze) ma bardzo wysokie wymagania.

Większość rozwiązań shardingu nie daje mi tego, czego chcę (przynajmniej na pierwszy rzut oka), prawdopodobnie dlatego, że mój problem jest dość „łatwy” do rozwiązania. Przynajmniej na poziomie koncepcyjnym (ignorując ograniczenia, które same RDBM wprowadzają do tabeli).

  1. Mam niewielką ilość „udostępnionych” danych, które można dowolnie kopiować. Nie ma wymagań twardej konsystencji. Można to zapisać w bazie danych podobnej do dynamo i skalować w nieskończoność. Ale nadal chciałbym korzystać z jednej bazy danych, jeśli to możliwe.

  2. Mam dużo danych „na użytkownika”. To znaczy - wielu użytkowników, z których każdy ma dane o absolutnie rozsądnym rozmiarze, naprawdę nadaje się do przechowywania w jednym węźle PostgreSQL. Mówimy o maksymalnie 10 tysiącach rekordów.

  3. Nigdy nie muszę wysyłać zapytań do różnych użytkowników i nie potrzebuję atomowości między użytkownikami.

Brzmi to niezwykle łatwo do osiągnięcia. Przynajmniej kiedy patrzę na to moimi „oczami NoSQL”.

Oto moje naiwne pomysły na starter:

  1. Bardzo skrajnie, mogłem serializować całego użytkownika jako pojedynczy klucz / wartość w Riak. Oczywiście ciągłe usuwanie / serializowanie kilku megabajtów danych będzie powolne i dlatego rozważam użycie PostgreSQL. Wiele Riak K / Vs jest nie do przyjęcia, ponieważ potrzebuję atomowości / transakcji w danych każdego użytkownika.

  2. Mógłbym użyć bazy danych SQLite na użytkownika i użyć czegoś takiego jak GlusterFS w celu zapewnienia redundancji / dostępności. Prawdopodobnie jest to rozwiązanie, które wybiorę, jeśli nie mogę znaleźć czegoś równie dobrego za pomocą PostgreSQL. Plusy: Można naprawdę dobrze zmniejszać / zwiększać skalę; Minusy: Wolałbym mieć typy i ścisłość PostgreSQLa niż SQLite

Tak więc idealnie chciałbym poprosić o rozwiązanie do dzielenia PostgreSQL:

  1. Automatycznie przechowuj kilka kopii danych każdego użytkownika (na różnych komputerach). Być w stanie dynamicznie przełączać węzeł główny na użytkownika / odłamek (jeśli poprzedni master ulegnie awarii).
  2. Być w stanie dynamicznie zwiększać / zmniejszać skalę, dodając / usuwając węzły serwera. Głównie tak, jak potrafi Riak.
  3. Nie wymagaj od mojej aplikacji, aby wiedziała, z którymi węzłami rozmawiać i kiedy.
loxs
źródło
Cześć Loxs, jak ostatecznie rozwiązałeś ten problem?
Dikla,
Partycjonowanie na poziomie aplikacji z wieloma magazynami danych. Właściwie dość bałagan :(. Naprawdę smutne, że coś takiego nie istnieje ...
loxs,

Odpowiedzi:

5

Postgres-XL próbuje rozwiązać ten problem od 2014 roku. Celują bezpośrednio w duże zbiory danych w PostgreSQL i mają na pokładzie programistów ze Stado.

Mike Burton
źródło
To wygląda bardzo interesująco.
John Powell,
Jest też Postgres-XC: sourceforge.net/projects/postgres-xc
a_horse_w_na_nazwa
4

Myślę, że najlepszą opcją jest pgpool-II . Możesz mieć do 128 węzłów i

  1. Możliwe jest skonfigurowanie złożonych reguł partycjonowania i dystrybucji danych
  2. Wsparcie „Provisioning online”. Nie skaluje zapisów, ale jest skalowalny do odczytu
  3. Nie jestem pewien, jeśli to możliwe po wyjęciu z pudełka. Może musisz użyć LVS

Inną opcją może być Stado

mys
źródło