Pracowałem w firmie, która bardzo szybko zdobywała nowych klientów. Zaczynaliśmy od 1 serwera bazodanowego (postgres), gdzie była 1 baza z danymi wszystkich klientów. Specyfika była taka, że dane klienta A nie są w żadnej relacji z danymi klienta B, tzn. równie dobrze dane tych klientów mogłyby być na różnych bazach danych. Coś jak w systemach ERP, gdzie każdy klient może sobie definiować łancuchy dostaw, przypisywać swoich pracowników do określonych zadań, ale nie ma żadnego powiązania między danymi klienta A, a klienta B.
Bardzo szybko pozyskiwaliśmy nowych klientów, którzy generowali duży ruch (niektóre tabele miały po 2 mld nowych wpisów / msc). Pojawił się problem, że cały system zaczął działać ociężale. Np. w sytuacji, gdy 1 klient pousuwał miliardy danych ze swojego konta, aby postgres zwolnił miejsce należało użyć VACUUM FULL na tabeli, ale to powodowało blokowanie danych wszystkich innych klientów. Co wymyślili?
Założmy drugą bazę na innym serwerze, która będzie analogiczna do tej pierwszej. Podczas logowania będziemy strzelać zapytaniem do bazy wspólnej, w której będzie informacja na której bazie leżą dane klienta. No i część klientów była na 1 bazie, a część na drugiej. Klienci przybywali, więc dochodziły kolejne bazy. Niektórzy klienci mieli nawet swoje własne bazy. Łącznie baz było z 50, a wszystkie z identycznymi schematami.
No niby to działało, ale było straszne w zarządzaniu. Gdy trzeba było wyciągnąć dane dotyczące wszystkich klientów, trzeba było odpalić zapytanie na każdej bazie. Żeby dodać nową kolumnę to samo. No dramat..
Jakie rozwiązania by się sprawdziły w tej sytuacji? Jakoś ciężko mi sobie wyobrazić, by większe firmy radziły sobie w ten sam sposób. Musi być coś wygodniejszego.