Trochę tła
Od lat używam klejnotu Apartamentu do prowadzenia aplikacji wielodostępnej. Niedawno pojawiła się potrzeba skalowania bazy danych na osobne hosty, serwer db po prostu nie może już dłużej nadążać (zarówno odczyty, jak i zapisy stają się zbyt duże) - i tak, skalowałem sprzęt do maksimum (dedykowany sprzęt, 64 rdzenie, 12 napędów Nvm-e w RAID 10, 384 Gb RAM itp.).
Zastanawiałem się nad zrobieniem tego na dzierżawę (1 dzierżawca = 1 konfiguracja / pula połączenia z bazą danych), ponieważ byłby to „prosty” i skuteczny sposób na uzyskanie do- number-of-tenants
razy większej pojemności bez wprowadzania dużych zmian kodu aplikacji.
Teraz używam szyn 4.2 atm., Wkrótce aktualizuję do 5.2. Widzę, że szyny 6 dodają obsługę definicji połączeń dla poszczególnych modeli, ale to nie jest tak naprawdę potrzebne, ponieważ mam całkowicie dublowany schemat bazy danych dla każdego z moich 20 dzierżawców. Zazwyczaj przełączam „bazę danych” na żądanie (w oprogramowaniu pośrednim) lub na zadanie w tle (oprogramowanie pośrednie sidekiq), jednak jest to obecnie trywialne i obsługiwane jako klejnot mieszkania, ponieważ ustawia tylko search_path
Postgresql i tak naprawdę nie zmienia faktycznego połączenia. Podczas przełączania się na strategię hostingową dla każdego najemcy będę musiał zmienić całe połączenie na żądanie.
Pytania:
- Rozumiem, że mógłbym wykonać
ActiveRecord::Base.establish_connection(config)
zadanie na żądanie / w tle - jednak, jak rozumiem, to powoduje zupełnie nowy uścisk połączenia z bazą danych i nową pulę db odradza się w szynach - prawda? Sądzę, że byłoby to samobójstwem związanym z wydajnością, które spowodowałoby taki narzut przy każdym pojedynczym żądaniu mojej aplikacji. - Zastanawiam się więc, czy ktoś może zobaczyć opcję z szynami np. Wstępnego ustanawiania wielu (łącznie 20) połączeń / pul bazy danych od samego początku (np. Podczas uruchamiania aplikacji), a następnie po prostu przełączać się między tymi pulami na żądanie? Tak więc połączenia db są już wykonane i gotowe do użycia.
- Czy to wszystko jest kiepskim złym pomysłem i czy zamiast tego powinienem szukać innego podejścia? Np. 1 instancja aplikacji = jedno określone połączenie z jednym konkretnym najemcą. Albo coś innego.
master
gałęzi Rails . Czy uruchomienie Rails Egde byłoby opcją lub działaniem wstecznym dla tej wersji Rails?
ActiveRecord::Base.connected_to(shard: :shard_one) do ... end
oznacza, że pula zostanie (ponownie) użyta, zamiast tworzyć nowe połączenie za każdym razem?