skalowalność przy błyskawicznym wzroście
DESCRIPTION
Pożegnanie z Panem Gąbką - czyli skalowalność przy błyskawicznym wzroście.TRANSCRIPT
POŻEGNANIE Z PANEM GĄBKĄskalowalność i wydajność przy
błyskawicznym
wzroście
Myślisz o biznesie czy tylko o zabawie ?
* Czy aplikacja ma się rozrastać o kolejne funkcjonalności ?
* Czy podczas projektowania uwzględniona została skalowalność ?
* Czy kod i infrastruktura serwerowa są dobrze udokumentowane ?
Nie trać czasu na problemy,których jeszcze nie masz!
Czy naprawdę potrzebujesz już teraz 12 wypasionych serwerów jeśli przez rok
możesz działać na dwóch?
Czy musisz martwić się o skalowalność wymaganą do obsługi 100 000 użytkowników już dziś, jeśli dotarcie do tego poziomu zajmie dwa lata?
NAJPROSTSZE ROZWIĄZANIASĄ NAJLEPSZE
Skoropiszą tak w
TO MUSI TO BYĆ PRAWDA !!!!11
3 miliony UU
Faza 1: Analiza
• KIEDY zamula?
• CO zamula?
• DLACZEGO zamula?
• jak to ODMULIĆ?
KIEDY zamula
CO zamula? (i DLACZEGO?)
• Serwer WWW?
• System operacyjny?
• Serwer MySQL?
• Skrypt PHP?
Serwer WWW ?
• ab - Apache HTTP server benchmarking tool
• httperf
• Selenium + Testing_Selenium z PEAR-a
require_once 'Testing/Selenium.php';
$this->selenium = new Testing_Selenium( "*iexplore", "http://www.nokaut.pl", Settings::get('selenium/ip'));$this->selenium->start();$this->selenium->open($url);$this->selenium->waitForPageToLoad("30000");
System operacyjny?
• load avg
• NFS
• free mem + swap
• RAID state
• configuration
Serwer MySQL?
Serwer MySQL?
Skrypt PHP?
register_shutdown_function('pageLoadTimeTracker');
function pageLoadTimeTracker() {
$page_load_time = time() - $_SERVER["REQUEST_TIME"];
if ($page_load_time > 10) {$perf_log = array (
'url' => (string)$_SERVER['REQUEST_URI'],'time_added' => date("Y-m-d H:i:s"),'page_load_time' => $page_load_time,'referring_url' => (string)$_SERVER['HTTP_REFERER'],'user_agent' => (string)$_SERVER['HTTP_USER_AGENT'],'user_ip' => (string)$_SERVER['REMOTE_ADDR']
);DB::insert('nokaut_perf_log.perf_log', $perf_log);
}}
Skrypt PHP?
Przyspieszamy!
Zmieniamy serwer WWW
albo
(HA)Proxy na przedzie
Memcache(d)
Statyczny cache stron
Mod_Magnet+ +
if (is_readable($cacheFilePath) && filesize($cacheFilePath) > 0) {header("X-Sendfile: ".$cacheFilePath);die();
}
if (Cache::isEnabled() && (false == UserAuth::isLogged())) {Cache::savePage(ob_get_contents());
}
FULL TEXT SEARCH ENGINE
• Nie przeciążaj bazy danychzbędnymi zapytaniami.
• Użyj na przykład Sphinxa, Lucene lub OpenFTS
Konfiguracja MySQL
• Dostosowanie Cache do własnych potrzeb
• Zwiększenie dostępnej pamięci dla MySQLa
• Dostrojenie kluczowych parametrów dlafunkcjonowaniabazy
Replikacja MySQL
• “A to dorzucimy kolejny serwer, włączy się replikację i wszystko będzie śmigać”
• Zamiast jednego zamulającego serwera mamy więcej zamulających serwerów!
Replikacja MySQL
• Obsługa master/slave po stronie aplikacji
• Synchronizacja on-demand
• Rsync, SELECT INTO OUTFILE, MAATKIT
Partycjonowanie• 1 duuuża tabela ze statystykami odwiedzin od
początku istnienia serwisu? NO WAI!
• Podzielmy tabelę według dni - każdy dzień to osobna tabela
Sharding
• rezerwujemy kilka(naście? dziesiąt?) serwerów dla MySQL
• dane zajmujące najwięcej miejsca, dzielimy między serwery na bazie wybranego kryterium (ID usera, czasu rejestracji, itd (lub funkcji)).
• główny serwer DB trzyma informacje, dzięki którym wiadomo, który slave trzyma jakie dane.
Rozwój infrastruktury
WWWDB
Rozwój infrastruktury
Przetwarzanie danych do importu
WWW
DB
Rozwój infrastruktury
Przetwarzanie danych do importu
WWW
DB Master
DB Slave
Rozwój infrastruktury
Przetwarzanie danych do importu
WWW
WWW
WWW – pliki statyczne
DB Master
DB Slave
Rozwój infrastruktury
Przetwarzanie danych do importu
WWW
WWW
WWW – pliki statyczne
DB Master
DB Slave
DB Slave
O czym NIE mówiliśmy?
• optymalizacja po stronie klienta (YSlow)
• HTTP caching
• Amazon S3 i EC2
• Google App Engine
Komentarze, krytyka i pytania
Przekonaj się jak to wszystko działa wPrzekonaj się jak to wszystko działa w
Dziękujemy za uwagę
3camp 22.04.2008