Temat: Skalowanie aplikacji na wiele maszyn i związane z tym...

Witam,
mój pierwszy temat tutaj :) Jestem pod wrażeniem ilości informacji jakie można tutaj znaleźć, tak więc wykorzystam to i poradzę się w sprawie która nurtuje mnie już od dłuższego czasu.

Jestem obecnie od dłuższego czasu w trakcie konfigurowania serwera w chmurze Amazonu przeznaczonego do hostingu wymagających aplikacji webowych napisanych w Railsach i Django.
Chcę zaoferować użytkownikom maksymalną moc obliczeniową dla ich aplikacji, w tym celu zamierzam skorzystać z możliwości rozkładania obciążenia ich aplikacji na wiele maszyn jednocześnie z wykorzystaniem haproxy, nginx itd. Udostępnię też możliwość uruchamiania aplikacji "stand-alone", dobrym przykładem takich aplikacji będzie np. klient torrenta, mimo, że nie zamierzam udostępniać możliwości jego użycia.

Problemem dla mnie, który na pewno ma jakieś proste rozwiązanie, a jednak brakuje mi wiedzy w tym temacie, to odpalanie tych usług. Serwer z katalogiem domowym użytkowników, a więc także i z ich wszystkimi aplikacjami jest osobną maszyną wirtualną do której użytkownicy mają dostęp także przez SSH. Jednak chciałbym uniknąć możliwości uruchamiania aplikacji na tym serwerze by uniknąć jego przeciążenia, serwer ma służyć tylko i wyłącznie jako storage dla katalogów domowych.

Na chwilą obecną mam też już jeden serwer web do którego mam podpięte przez NFS katalogi domowe użytkowników z serwera storage. Chciałbym też stworzyć kolejną maszynę która by zajmowała się "hostowaniem" aplikacji nie związanych z http, czyli wszelakiego rodzaju klientów itd. Nie chcę jednak użytkownikom komplikować życia, wymuszając na nich wgrywanie plików na jedną maszynę, a odpalanie programów na drugiej, więc tutaj powstaje moje pytanie - jak umożliwić użytkownikom normalne uruchamianie aplikacji na serwerze storage, ale sprawienie, by te aplikacje wykonywały się zdalnie na zewnętrznym serwerze, transparentnie dla użytkowników? Nie mam pojęcia od której strony się za to zabrać, jakich technologii użyć, prawdę mówiąc moja wiedza w tym temacie jest równa zeru, a jednak zależy mi na udostępnieniu takiej możliwości by zapewnić użytkownikom raz, że wygodę, dwa, wydajność poprzez transparentny load-balancing, a sobie problemów w przyszłości z przeciążonym storage.

EDIT: Wyedytował bym temat, bo raczej bardzo średnio oddaje treść wypowiedzi, ale widzę, że nie ma tutaj takiej możliwości.Damian Usnarski edytował(a) ten post dnia 07.03.12 o godzinie 16:34

konto usunięte

Temat: Skalowanie aplikacji na wiele maszyn i związane z tym...

1. ile ma być tych katalogów domowych dla userów że musisz angażować do tego specjalną maszynę?

2. ogólnie ciężko mi wyobrazić sobie twój przypadek, może jakiś rysunek, schemat?

3. jaki system operacyjny?Dawid Rogaczewski edytował(a) ten post dnia 07.03.12 o godzinie 15:59

Temat: Skalowanie aplikacji na wiele maszyn i związane z tym...

1. Nie wydaje mi się, by była to jakaś ogromna ilość użytkowników, jednak myślę o przypadku gdzie aplikacje webowe są jedynie panelami do obsługi usług działających wewnątrz poprzez API które klient sobie zdefiniuje, a same te usługi będą wymagające i bardzo zasobożerne.

2. Naskrobię coś na szybko za chwilę, ale musisz mi wybaczyć jeśli dużo z mojego schematu nie odczytasz bo nie znam żadnych "ustandaryzowanych" sposobów ich tworzenia :)

EDIT:
Na chwilę obecną wygląda to tak, ujmując jeden serwer web: TinyPic
Docelowo mogło by wyglądać np. tak: TinyPic

3. Raczej Linuxowy, bo w tych systemach czuję się najlepiej i na nich nabierałem doświadczenia od lat. Na chwilę obecną Ubuntu Server z powodu wygody, w jakiejś dalszej lub bliższej przyszłości coś pokroju CentOSa.Damian Usnarski edytował(a) ten post dnia 07.03.12 o godzinie 16:31

konto usunięte

Temat: Skalowanie aplikacji na wiele maszyn i związane z tym...

No za bardzo nadal nie rozumiem jaki efekt chcesz osiągnąć. Chodzi o to by uruchamiać aplikację na innym serwerze niż się znajdują jej binarki?Dawid Rogaczewski edytował(a) ten post dnia 07.03.12 o godzinie 21:06
Stanisław P.

Stanisław P. Software designer

Temat: Skalowanie aplikacji na wiele maszyn i związane z tym...

Wydaje mi się, że dokładnie tak jak to narysowałeś w drugim przykładzie - API. Gdzie api to może być nawet jakiś wrapper w stylu sudo: `start_in_the_cloud /jakaś/aplikacja`. Sam mechanizm uruchomienia czegoś zdalnie możesz zrobić np. przez http://supervisord.org/ z interfejsem http/rpc, albo nawet standardową kolejkę zadań typu http://gearman.org/

Jak nie chcesz sam rzeźbić i masz dużą ilość maszyn, to popatrz też na gexec (teraz pod parasolem projektu ganglia). Możesz też pogooglać za książką "beowulf cluster computing with linux" - na pewno kilka ciekawych pomysłów znajdziesz.

Proponuję jeszcze na hoście docelowym każdy proces owijać w jakiś prosty sandbox (lxc przez libvirt na przykład). Tylko czy na pewno chcesz to robić? Pozwalając losowym userom zalogować się na system, praktycznie gwarantujesz sobie zrootowanie raz na rok czy dwa jakimś bardzo prostym sposobem. Jeśli nie jesteś pewien jak to ustawić i zaczynasz ze standardowego systemu, to raczej bałbym się o bezpieczeństwo takiego systemu na dłuższą metę...Stanisław P. edytował(a) ten post dnia 08.03.12 o godzinie 03:02
Dominik Żyła

Dominik Żyła Site Reliability
Engineer

Temat: Skalowanie aplikacji na wiele maszyn i związane z tym...

Zarządzać nodami możesz za pomocą mcollective, który korzysta z kolejek. Działa bardzo fajnie. Pisanie agentów pod niego jest proste i szybkie. Co do NFS i centralizacji storage, to co jeśli serwer z danymi zniknie? Co jeżeli NFS się w jakis sposób zalockuje, zniknie, cokolwiek? Jak zamierzasz obsłużyć takie przypadki? Jak zamierzasz się zabezpieczyć przed sytuacją, kiedy storage znika?



Wyślij zaproszenie do