Temat: 1 master + 25 slaves - wydajnosc?

Przygotowuje grunt pod 1 godzinna akcje marketingowa online z przewidywalny ruchem 50000 userow jednoczesnie i mam pytanie o load master servera.

Korzystam z chmury amazon'a i mam taka konfiguracje:
1 x virtual load balancer
1 x cloud front CDN
1 x Web server + MySQL DB (master, 68GB ram, 26 EC2 CPU, tylko update, insert via API)
20 x Web server + localhost MySQL DB (slave, 68GB ram, 26 EC2 CPU, tylko select)

Wg moich testow powyzsza konfiguracja i ilosc instancji zapewnia mi stabilnosc, lokalne slave'y mysql zapewniaja mi szybki dostep do danych a do master zapisywane so jedynie update'y.

Moje pytanie dotyczny master'a i jego loadu podczas synchronizacji z 20 slave'ami i jednoczesna obsluga update'ow z webservera ktory ma API udostepnione dla webserwerow podlaczonych do load balancera?
Tabele myisam, kilka prostych i malych tabel z poprawnymi indexami, select'y brak join'ow, srednia ilosc rekordow ok 500

Jesli ktos ma doswiadczenie z podobna konfiguracja chetnie wyslucham sugestii, pozdrArkadiusz K. edytował(a) ten post dnia 02.08.10 o godzinie 19:54
Radosław Bułat

Radosław Bułat Ruby on Rails
developer,
Adtaily.com

Temat: 1 master + 25 slaves - wydajnosc?

Ja mam trochę inne pytanie. Co to za rodzaj ruchu będziesz mieć? 50k userów, ale w jakim czasie i jaka przewidywana aktywność. Co ci użytkownicy będą robić? Czy będą się logować? Czy będą widzieć unikalną zawartość?

Mam wrażenie, że takie rozproszenie mysql nic Ci nie da. Wydajność selectów można poprawić zupełnie poza bazą (memcache). Pierwszy raz spotykam się z tak rozbudowaną infrastrukturą pod mysql (zaryzykowałbym że taka nasza-klasa pod bazę nie musi tylu zasobów dawać).

Temat: 1 master + 25 slaves - wydajnosc?

Radosław Bułat:
Ja mam trochę inne pytanie. Co to za rodzaj ruchu będziesz mieć? 50k userów, ale w jakim czasie i jaka przewidywana aktywność. Co ci użytkownicy będą robić? Czy będą się logować? Czy będą widzieć unikalną zawartość?

Mam wrażenie, że takie rozproszenie mysql nic Ci nie da. Wydajność selectów można poprawić zupełnie poza bazą (memcache). Pierwszy raz spotykam się z tak rozbudowaną infrastrukturą pod mysql (zaryzykowałbym że taka nasza-klasa pod bazę nie musi tylu zasobów dawać).

Jest to 60 minutowa akcja marketingowa i ruch ma byc zagwarantowany dla 50tys userow, nie mozna przewidziec jak rozlozy sie ruch, nalezy zalozyc najgorszy przypadek czyli jednoczesnie przez 60 min. Przeniesienie wszystkich statycznych plikow na Amazon CDN CouldFront zredukowalo ilosc requestow z 21 na uzytkownika do jednego, czyli 1 user = 1 request do strony.

Strona w php po zainicjowaniu tresci z DB na starcie (2 x select) wysyla do DB updatey i inserty via ajax api. Uzytkownicy poprzez aktywnosc wyzwalaja ajaxowe requesty do web serwerow ktore updateuja mastera DB, odswiezanie strony odbywa sie zgodnie z harmonogramem przez select z lokalnej DB-slave ktora synchronizuje sie z masterem

- pomysl podpatrzony na flickr.com, update i insert leca do master, selecty leca ze slave'ow

Rozproszenie na 20 serwerow wynika z koniecznosci obslugi http requestow, max 1 maszyna daje rade obsluzyc ok 2500-3000 requestow/s czyli moj load balancer potrzebuje ok 20-25 serwerow EC2, kazdy to 68GB ram - mysqld smiga na tym bez problemow i widze jak LOAD ladnie sie rozklada, obserwujac zuzycie CPU i pamieci przez proces mysql widze ze dziala wysmienicie - testy AB i SIEGE

Pytanie jak zachowa sie master-DB gdy 20 slave'ow bedzie chcialo sie synchronizowac, jak wyglada kolejkowanie tego? Duzo danych bedzie cachowanych po 30-40 sekund wiec ilosc zapytan do db bedzie rowniez mniejsza ale moze zdarzyc sie ze w jednym momencie chec synchronizacji zglosi np 15 slave'ow... :)

Memcache chyba odpada.. chyba ze jest jakis mechanizm do synchronizacji memcachu pomiedzy wieloma serwerami z rozsadnym czasem wykonania?

BTW NK ma hardwerowe rozwiazania, ja nie mam na to budzetu, amazon jest tani i idealny na krotkotrwale akcjeArkadiusz K. edytował(a) ten post dnia 03.08.10 o godzinie 00:23

konto usunięte

Temat: 1 master + 25 slaves - wydajnosc?

Czemu chcesz synchronizować memcached na kilka maszyn? Nie lepiej jest partycjonować dane na kilka memcached?
Dla przykładu masz 10 rekordów w bazie danych( id = 1..10), 4 serwery memcache (0..3):

id = 1, memcached 1
id = 2, memcached 2
id = 3, memcached 3
id = 4, memcached 0
id = 5, memcached 1
.....
.....
id = N, memcached = N mod 4

Pamiętaj też, że do memcached opłace się zapisywać duże rzeczy (zserializowany zbiór obiektów), a nie drobne, pojedyncze rekordy.

Temat: 1 master + 25 slaves - wydajnosc?

Kamil Grabowski:
Czemu chcesz synchronizować memcached na kilka maszyn? Nie lepiej jest partycjonować dane na kilka memcached?
Dla przykładu masz 10 rekordów w bazie danych( id = 1..10), 4 serwery memcache (0..3):

id = 1, memcached 1
id = 2, memcached 2
id = 3, memcached 3
id = 4, memcached 0
id = 5, memcached 1
.....
.....
id = N, memcached = N mod 4

Pamiętaj też, że do memcached opłace się zapisywać duże rzeczy (zserializowany zbiór obiektów), a nie drobne, pojedyncze rekordy.

synchronizacja memcache na kilka maszyn bylaby alternatywa dla slave-db, mozna by je wtedy wyeliminowac, teoretyczne rozwazania...

dane beda w cachu przecietnie kilkadziesiat sekund, niektore 2-3 minuty i musza byc odswiezone

konto usunięte

Temat: 1 master + 25 slaves - wydajnosc?

Ale przecież nie musisz synchronizować serwerów memcached pomiędzy sobą, ponieważ każdy z serwerów przechowuje inne dane.

Temat: 1 master + 25 slaves - wydajnosc?

Kamil Grabowski:
Ale przecież nie musisz synchronizować serwerów memcached pomiędzy sobą, ponieważ każdy z serwerów przechowuje inne dane.

juz tlumacze, mialem na mysli rozwiazanie gdy slaves-db beda wyeliminowane z webserwerow i zastapione memcachem, czyli zapytanie sql leci do master-db zamiast do local db i rezultat jest cachowany w lokalnym memcache webserwera - niestety webserwery beda odpytywac wielokrotnie o te same dane mastera mimo ze jeden z nich juz to zrobil, reszta o tym nie wie - wiec w tym konkretnym przypadku synchronizacja memcachow moglaby pomoc aby ograniczyc requesty do mastera, jeden slave webserwer odpytuje i propaguje dane do calej chmury

zastanawialem sie rowniez czy nie warto intensywnie cachowac master-db do memcache np cronem np co 10 sekund i dostarczyc API dla webserwerow w chmurze zeby nie odpytywaly bazy ale polegaly wylacznie na zcachowanej zawartosci w memcache ale rodzi to koniecznosc pracy apache'a na master-db w celu zapewnienia jakiegos API przez PHP

sprawa rozbija sie o master-db ktory moze byc przeciazony, czy to w wyniku http requestow z API czy tez w wyniku replikacji z 20 maszyn...

ten master-db wprowadza mi tu mala nerwowke jako single-point-of-failure :)
rozpoczalem wlasnie testy "Amazon Elastic IP" ktore podpialem do master-db na wypadek gdyby padl, wtedy moge szybko podmienic te IP "on-fly" do backupowego master-db

konto usunięte

Temat: 1 master + 25 slaves - wydajnosc?

Hmm nadal nie bardzo rozumiem. Nie prościej zrobić tak?

2 x loadbalancer (nginx)
N x APP (apache + php)
1 x master db (MySQL)
N x Memcached

App nie ma swoich lokalnych serwerów memcache, tylko wszystkie app korzystają z tych samych serwerów memcache. Co do adresacji ip to nie wiem czy o to Ci chodzi, ale sprawdź interfacy carpowe (carp) w BSD. Sprawdź też keepalived w linuksach.

Co do wypełniania cachu z crona to wszystko zależy od specyfiki aplikacji. Trudno powiedzieć, czy to się sprawdzi w Twoim przypadku.

Jeśli chcesz zapewnić bezawaryjność MySQL (master) pomyśl nad dwoma serwerami MySQL oraz wspólnym storage dla nich. Jeśli jeden MySQL padnie, to drugi wstaje i korzysta z wspólnego storage. Przełączanie możesz zrealizować właśnie dzięki carpom.

Temat: 1 master + 25 slaves - wydajnosc?

Kamil Grabowski:
2 x loadbalancer (nginx)
N x APP (apache + php)
1 x master db (MySQL)
N x Memcached

App nie ma swoich lokalnych serwerów memcache, tylko wszystkie app korzystają z tych samych serwerów memcache.

czyli sugerujesz zeby na serwerze ktory pracuje jako master-db uaktywnic kilka serwerow memcache, to rozumie wydaje sie rozsadnym rozwiazaniem ale pytanie co bedzie odswiezac ten memcache i jak on bedzie udostepniany pozostalym 20 publicznym webserwerom?

obawiam sie ze ilosc requestow do tego niepublicznego webserwera moze byc zbyt duza z 20 publicznych?
Jeśli chcesz zapewnić bezawaryjność MySQL (master) pomyśl nad dwoma serwerami MySQL oraz wspólnym storage dla nich.

to juz mam zrobione, wczoraj ustawilem elastic IP na master-db i postawilem osobna instancje ktora synchronizuje sie masterem-db, jak tylko master padnie to elastic ip podpina sie pod rezerwowy serwer

bede wdzieczny jednak za sugestie jak propagowac memcache/db do publicznych webserwerow bez ryzyka przeciazenia mastera-db

konto usunięte

Temat: 1 master + 25 slaves - wydajnosc?

Prrr powoli. Jak to na serwerze, na którym pracuje master-db uaktywnić kilka memcache. Na memcache rezerwujesz osobną maszynę - jeden memcache = jedna maszyna fizyczna.

Powiedz jeszcze co rozumiesz przez "propagowac memcache/db do publicznych webserwerow bez ryzyka przeciazenia mastera-db".

Temat: 1 master + 25 slaves - wydajnosc?

Kamil Grabowski:
Prrr powoli. Jak to na serwerze, na którym pracuje master-db uaktywnić kilka memcache. Na memcache rezerwujesz osobną maszynę - jeden memcache = jedna maszyna fizyczna.

Powiedz jeszcze co rozumiesz przez "propagowac memcache/db do publicznych webserwerow bez ryzyka przeciazenia mastera-db".

teraz rozumie o czym myslisz, kazdy memcache to osobny serwer, nie do konca zrozumialem poprzedni post ale wracajac do twojej sugestii:

1.jak mialoby wygladac odswiezanie memcachowego serwera? byc moze regularny cron odpytujacy spokojnie i regularnie master-db i aktualizujacy memcache w stalych odstepach czasu, to moze sie udac..

2.wspomniales wczesniej o rozbiciu danych do roznych memcache serwerow ale czy to nie powoduje nadmiernej komunikacji pomiedzy webserwerami a memcache-serwerami? wydaje mi sie ze webserwery beda musialy odpytac rozne memcacheserwery zeby miec komplet danych, moze lepiej byloby miec load balancer przed memcacheserwerami i miec tam identyczne dane - no w miare identyczne, biorac pod uwage poslizgi w aktualizacji

twoje rozwiazanie wydaje sie rozsadne jesli dobrze zrozumialem ale daje mi to 2x25 maszyn zamiast 25 maszyn...

konto usunięte

Temat: 1 master + 25 slaves - wydajnosc?

Arkadiusz K.:
Kamil Grabowski:
Prrr powoli. Jak to na serwerze, na którym pracuje master-db uaktywnić kilka memcache. Na memcache rezerwujesz osobną maszynę - jeden memcache = jedna maszyna fizyczna.

Powiedz jeszcze co rozumiesz przez "propagowac memcache/db do publicznych webserwerow bez ryzyka przeciazenia mastera-db".

teraz rozumie o czym myslisz, kazdy memcache to osobny serwer, nie do konca zrozumialem poprzedni post ale wracajac do twojej sugestii:

1.jak mialoby wygladac odswiezanie memcachowego serwera? byc moze regularny cron odpytujacy spokojnie i regularnie master-db i aktualizujacy memcache w stalych odstepach czasu, to moze sie udac..

Odświerzanie może wyglądać tak: aplikacja pyta się memcached o dane, jeśli nie dostaje ich to pyta się bazy i uzupełnia dane w memcached.

Następnym razem aplikacja pyta się o dane i wybiera je z memcached. Jeśli dane wyekspirowały to uzupełnia je.
2.wspomniales wczesniej o rozbiciu danych do roznych memcache serwerow ale czy to nie powoduje nadmiernej komunikacji pomiedzy webserwerami a memcache-serwerami? wydaje mi sie ze webserwery beda musialy odpytac rozne memcacheserwery zeby miec komplet danych, moze lepiej byloby miec load balancer przed memcacheserwerami i miec tam identyczne dane - no w miare identyczne, biorac pod uwage poslizgi w aktualizacji

Możesz grupować dane na pojedyncze memcached, albo trzymać wszystkie dane w jednej puli.
Jak Ci wygodniej.
twoje rozwiazanie wydaje sie rozsadne jesli dobrze zrozumialem ale daje mi to 2x25 maszyn zamiast 25 maszyn...

Możesz postawić mysql-a w replikacji master-master, a przed nim dużo memcached.

Podobne rozwiązanie u nas działa i dziła dobrze. Sama baza nie wytrzymała by nawet po za godzinami szczytu.

konto usunięte

Temat: 1 master + 25 slaves - wydajnosc?

Odważnie w mysql replikacje master-master :)
NDB?

Następna dyskusja:

[mysql] 1 master + 25 slave...




Wyślij zaproszenie do