Architektura Skalowalnych Serwisow Internetowych

28
Architektura skalowalnych serwisów internetowych Michal Gruchala

description

 

Transcript of Architektura Skalowalnych Serwisow Internetowych

Page 1: Architektura Skalowalnych Serwisow Internetowych

Architektura skalowalnych serwisów internetowych

Michał Gruchała

Page 2: Architektura Skalowalnych Serwisow Internetowych

Architektura skalowalnych serwisów internetowych

Serwis Wprowadzamy zmiany

Modularność Cache Shardowanie

Podsumowanie

Page 3: Architektura Skalowalnych Serwisow Internetowych

O mnie

2005-2011 GG Network S.A. 2011 Politechnika Warszawska 2011 scaleIT

Page 4: Architektura Skalowalnych Serwisow Internetowych

Serwis

Page 5: Architektura Skalowalnych Serwisow Internetowych

Serwis

Dodaj wpis Zobacz

Ostatnie wpisy (wszystkich) Wpisy moich znajomych (stream) Wpisy (blog) danej osoby

Obserwuj

Page 6: Architektura Skalowalnych Serwisow Internetowych

Serwis

Struktura bazy

Page 7: Architektura Skalowalnych Serwisow Internetowych

Serwis

Blogselect * from User where id=ID

select * from Message where id=ID order by ts desc limit …

Streamselect * from User where id=JA

select Message.*, User.* from Message join Follow on Message.owner_id=Follow.whom_id join User on Message.owner_id=User.id where Follow.who_id=JA; (!)

Dodaj wpisinsert into Message(`owner_id`,`message`) values ...

Page 8: Architektura Skalowalnych Serwisow Internetowych

Serwis

Gdzie jesteśmy?

użytkownik PHP MySQLReplikacja danych HaProxy

Page 9: Architektura Skalowalnych Serwisow Internetowych

Serwis

Gdzie jesteśmy? LB i workery ”dokładamy w nieskończoność” Kolejne repliki bazy zwiększają odczyt

Nie zapis Nie pojemność

full-mesh

Page 10: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Page 11: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Rozdzielamy ma moduły

Page 12: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Rozdzielamy ma moduły Partycjonowanie funkcjonalne User (API) Message (API) Front

Moduł stanowy (sesja) Prezentacja Agregacja danych z API

użytkownik

Front

Moduł

User Message

Page 13: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Moduły są niezależne Ma swój zestaw maszyn

Load balancery, Workery, Bazy Jedna maszyna = jedna rola

Moduł A nie wie jak zorganizowany jest moduł B Wie tylko jak go używać (API)

Komunikacja między modułami tylko za pomocą API (dostępne przez LB)

Page 14: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Blog Front => User (podaj dane użytkownika X) Front => Message (podaj wpisy użytkownika X)

Stream Front => User (podaj listę obserwowanych przez

użytkownika X) Front => Message (podaj ostatnie wpisy

użytkowników o zadanych id) Zrób join na liscie użytkowników i wpisów

Page 15: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Zalety Moduł Front prostszy Wiemy gdzie są wąskie gardła Separacja obowiązków

Wady Więcej maszyn Workery Front robią joiny

Odciąża bazy, workery można dokładać Jest wolniej Spójność danych (skasowanie użytkownika?)

Page 16: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Dodajemy cache

Page 17: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Dodajemy cache Każdy moduł zarządza swoim cache Dwa poziomy cache

Loadbalancery (zamieniamy haproxy na varnisha) ”chroni” workery, memcached, DB

Memcached ”chroni” DB

Dwie metody Odczyt z DB, zapis do cache na X sekund Odczyt z DB, zapis do cache ”w nieskończoność” (!)

Page 18: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Blog Front => Message (podaj wpisy użytkownika X)

Message API LB (cache) MessageAPI Worker => DB Lista wiadomości zapisana w

Memcached ? Varnish ?

Page 19: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Stream Front=> User (podaj listę obserwowanych) Front => Message (podaj blogi użytkowników z

listy) Message: dla każdego użytkownika z listy

pobierz wpisy użytkownika (blog) join w workerze

Tak zwane pull on demand

Page 20: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Dodaj wpis Front => Message (dodaj wpis użytkownika X)

Worker Message dodaje wpis do bazy Worker Message dodaje wpis do memcached Worker niszczy (łatwiej) listę wpisów (blog)

ze swojego varnisha ze swojego memcached

troche się skomplikowało....

Page 21: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Zalety Jest szybciej Odciążamy DB i sieć(!) Duże hit-ratio na memcached przy blogach Brak dog-pile effect (varnish)

Wady Trudniej (więcej worker-side) Spójność cache i baz danych Im więcej lb, tym mniejsze hit-ratio

Page 22: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Shardujemy

Page 23: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Shardujemy Partycjonowanie horyzontalne Shardy są niezależne

Mają inne dane Nic nie wiedzą o sobie

Funkcja(klucz) = numer sharda

Page 24: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Shardujemy Tabela Follow

Klucz who_id Funkcja who_id modulo liczba shardów

Tabela Message Klucz owner_id Funkcja owner_id modulo liczba shardów

Tabela User Bez shardowania

Page 25: Architektura Skalowalnych Serwisow Internetowych

Wprowadzamy zmiany

Zalety Zwiększamy wydajność zapisów (i odczytów) Zwiększamy pojemność bazy Więcej mniejszych baz (zarządzanie, szybkość)

Wady Komplikacja logiki Kto mnie obserwuje

Cross-shard query Dokładanie shardów

Page 26: Architektura Skalowalnych Serwisow Internetowych

Podsumowanie

Page 27: Architektura Skalowalnych Serwisow Internetowych

Podsumowanie

Prosty serwis Zrobił się skomplikowany Skomplikowanie wydelegowane do modułów ;) Dodaliśmy sporo maszyn Optymalizacja jeszcze ważniejsza (IO) Sieć dostaje w kość Dużo pracy

może scale-up ?

Page 28: Architektura Skalowalnych Serwisow Internetowych

Dziękuję

Pytania?