Ograniczenia skalowalności PostgreSQL i MySQL

43

Słyszałem, że wydajność nieczeregowanej relacyjnej bazy danych, takiej jak MySQL lub PostgreSQL, „psuje się” powyżej 10 TB.

Podejrzewam, że takie ograniczenia istnieją, ponieważ nie wymyśliłby Netezza, Greenplum, Vertica itp., Ale chciałbym zapytać, czy ktoś tu ma odniesienie do jakiegokolwiek dokumentu badawczego lub formalnych studiów przypadku, w których limity te są określone ilościowo.

Edmon
źródło

Odpowiedzi:

52

Nie ma prostej odpowiedzi na twoje pytanie, ale oto kilka rzeczy do przemyślenia.

Po pierwsze, skala nie jest jedyną rzeczą, o którą należy się martwić. To, co robisz ze swoimi danymi, to. Jeśli masz 500 tabel 30 TB danych i wykonujesz prosty OLTP z bardzo małą liczbą raportów, nie sądzę, że będziesz miał zbyt wiele problemów. Tam są bazy danych 32 TB na PostgreSQL. Jednak w tym samym czasie wydajność nieco się obniży, ponieważ musi uderzać we wszystko dyskiem. Podobnie, jeśli masz 50 TB, jeśli dane, ale masz zwykle hit około 100 GB, możesz zbudować serwer z wystarczającą ilością pamięci RAM, aby zachować tę część db w pamięci i jesteś złoty.

Z drugiej strony, jeśli próbujesz usunąć tryb (najczęstszą wartość) z 1 TB danych, nie ma znaczenia, jakiego systemu używasz, będzie to bolesne z lub bez shardingu. (Edycja: Odłamki mogą w rzeczywistości pogorszyć ten problem ).

Główne problemy, na które natkniesz się z dużymi bazami danych na MySQL i PostgreSQL, polegają na tym, że żadne z nich nie obsługuje równoległości wewnątrz kwerendy. Innymi słowy, zapytanie jest uruchamiane jako pojedynczy blok przez jeden wątek i nie można go podzielić na części i uruchamiać osobno. Jest to najczęściej problem przy uruchamianiu dużych zapytań analitycznych na dużych ilościach danych. To tutaj Postgres-XC i Zielona Śliwka przybywają na ratunek, ponieważ oddzielają magazyn od egzekucji i mogą to zrobić na poziomie koordynatora. Zauważ, że Postgres-XC i Zielona Śliwka zasadniczo używają shardingu wewnętrznie, ale koordynatorzy egzekwują całą spójność na całym świecie.

Dzięki równoległości wewnątrz kwerendy można rozdzielić zapytanie, pozwolić, aby różne procesory / dyskowe kanały we / wy uruchamiały jego części, i zgłaszać z powrotem fragmenty zestawu wyników, które należy złożyć i przekazać z powrotem do aplikacji. Ponownie jest to zwykle najbardziej przydatne w przypadku obciążeń analitycznych, a nie przetwarzania transakcji.

Po drugie, niektóre systemy, takie jak Vertica lub Greenplum, przechowują kolumny informacji razem. Utrudnia to korzystanie z systemu z perspektywy OLTP i zmniejsza wydajność, ale drastycznie zwiększa wydajność w przypadku dużych obciążeń analitycznych. Jest to więc kompromis związany z obciążeniem.

Tak więc odpowiedź jest taka, że ​​po osiągnięciu rozmiaru powyżej 1-2 TB może pojawić się szereg kompromisów między systemami i obciążeniami. Znowu dotyczy to baz danych, wielkości zestawów roboczych itp. Jednak w tym momencie naprawdę musisz korzystać z systemów płatków śniegu, tj. Unikalnych i dostosowanych do obciążenia.

Oznacza to oczywiście, że limity nie są na ogół kwantyfikowalne.

Edycja : Pracowałem teraz z bazą danych 9 TB, która obsługuje połączenie obsługi decyzji i obciążeń związanych z przetwarzaniem transakcyjnym w PostgreSQL. Największym wyzwaniem jest to, że jeśli masz pytania, które uderzają w duże części zestawu danych, będziesz musiał chwilę poczekać na odpowiedź.

Jednak przy zwróceniu szczególnej uwagi na podstawy (w tym indeksy, próżnię automatyczną, sposób działania na niskim poziomie itp.) Oraz wystarczające zasoby obliczeniowe, są one w pełni możliwe do zarządzania (i szacuję, że można je zarządzać również w zakresie 30 TB w Pg).

Edycja2 : Po przejściu do 100 TB, co będzie działać, będzie zależeć od twojego zestawu danych. Pracuję teraz nad jednym, który nie będzie skalowany do tego zakresu, ponieważ najpierw osiągnie limit 32 TB na tabelę w PostgreSQL.

Chris Travers
źródło
2
Wygląda na to, że Postgres 9.6 otrzyma kilka ulepszeń równoległości zapytań (skanowanie równoległych sekwencji, łączenie równoległe).
a_horse_w_no_name
1
Myślę, że zajmie to kilka wydań, aby było to naprawdę przydatne.
Chris Travers
@ChrisTravers Czy istnieje inna baza danych, która lepiej obsługuje taką sytuację? Może niekoniecznie RDBMS? Dzięki
konung
1
@konung Nie wiem, żeby być szczerym. Myślę, że warto bawić się silnikami MapReduce na określoną skalę, ponieważ pomaga to kształtować sposób myślenia o danych. W bardzo dużych skalach naprawdę musisz wiedzieć, co robisz. Rozwiązania takie jak Teradata i Postgres-XL pomagają, ale są to rozwiązania, które wymagają jasnej wiedzy o tym, co robisz (i zawsze możesz zbudować własne w tym miejscu na dowolnym RDBMS).
Chris Travers
1
Również jednym z powodów, dla których zalecam grę z Mongo, jest to, że chociaż (być może nawet dlatego) nie skaluje się tak dobrze, uczy, jak myśleć o danych federacyjnych i MapReduce, gdy dojdziesz do tego punktu.
Chris Travers