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).
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.
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.
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:
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.
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:
- 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).
- Być w stanie dynamicznie zwiększać / zmniejszać skalę, dodając / usuwając węzły serwera. Głównie tak, jak potrafi Riak.
- Nie wymagaj od mojej aplikacji, aby wiedziała, z którymi węzłami rozmawiać i kiedy.