high availability su server dedicati economici parte 3: apache separato da mysql
Nel post precedente, ho spiegato come ottimizzare in modo separato Apache e MySQL potrebbe estendere di molto il range di utilizzabilità del vostro server.
Tuttavia fino a questo punto abbiamo considerato sempre un unico server dedicato ad una piattaforma LAMP; in questo post, invece, spiegherò perchè sia vantaggioso separare Apache e MySQL su due server differenti, ciascuno dedicato ad uno dei due servizi.
Perchè dovreste voler separare Apache da MySQL?
Innanzitutto perchè i due servizi hanno un modo differente di utilizzare le risorse del vostro server, ovvero a seconda del tipo di applicazione web che state eseguendo (wordpress, magento, joomla oppure un cms autocostruito), il sistema potrebbe avere come collo di bottiglia Apache oppure MySQL o magari entrambi.
In secondo luogo perchè iniziare a separare i servizi web dai servizi database è il passo essenziale per poi riuscire a scalare la tua applicazione web. Man mano che il traffico aumenta, infatti, un singolo server potrebbe non essere più in grado di gestire tutto da solo, indipendentemente da quanto è potente e da quanti soldi hai speso per comprarlo.
Il condizionale è d’obbligo: “potrebbe non essere in grado”.
Non tutte le applicazioni web sono le stesse e quale sia il limite fisico di erogazione della tua infrastruttura dipende sopratutto dal software che la compone, dalla sua organizzazione, dal tipo e dalla distribuzione di traffico e solo infine dall’infrastruttura stessa.
Come fate a capire che è necessario separare Apache da MySQL?
Non esiste una risposta univoca, visto che molto dipende dall’applicazione. Tuttavia, se invocando un comando “top” sulla shell della vostra macchina verificate che il sistema è molto carico (load average elevato, utilizzo dello spazio di swap, molti processi apache e/o mysql elevato utilizzo del processore, etc) allora bisogna iniziare ad indagare.
La cosa richiede un po di ‘virtualizzazione’.
Cominciate con il creare su di una macchina di test due macchine virtuali. L’importante è che sulla macchina di test utilizziate xenserver oppure vmware come ambiente di virtualizzazione: questi sono ampiamente diffusi e facili da scaricare, installare, utilizzare e sono ben documentati.
Inoltre gli hosting provider si appoggiano prevalentemente a vmware e a xenserver come base dei loro servizi di hosting dedicato in cloud oppure in vps.
Dopo che avete creato le due macchine virtuali configuratele all’interno di una rete privata in modo che si possano parlare a vicenda: il ping fatto su una deve raggiungere l’altra e viceversa.
Installate Apache su una e MySQL sull’altra dopodichè assicuratevi che:
- - la macchina MySQL possa rispondere (faccia il bind) all’interfaccia di rete
- - l’utente MySQL con il quale la vostra applicazione web effettua il login abbia un GRANT con wildcard e non una @’localhost’ (ovvero: GRANT ALL PRIVILEGES ON ‘user’@'%’ IDENTIFIED BY …..”.
- - gli script php siano impostati per conoscere l’indirizzo IP sul quale gira il server MySQL (e non localhost).
Se avete fatto tutto correttamente, una versione di test del sito dovrebbe girare localmente al vostro sistema di test. Se l’applicazione funziona normalmente è ora di iniziare i test.
Metti in crisi il sistema con AB
Adesso che Apache e Mysql sono su due macchine separate, è il momento di testare come il carico viene distribuito tra webserver e database.
Lo strumento adatto ad effettuare questo test è Apache Benchmark. Utilizzando AB puoi chiamare una pagina del tuo sito un numero arbitrario di volte e aprendo un numero arbitrario di connessioni contemporanee: ad esempio la index.php, ma perchè no, anche pagine specifiche.
Questo significa che puoi testare come una data pagina web performa sotto carichi bassi, medi, alti e folli!
Poichè la pagina che vai a richiamare con AB esegue delle query MySQL e poichè adesso apache gira su di una macchina diversa dal database, monitorando l’output del comando ‘top’ su entrambe le VM riuscirai a capire quale delle due componenti è più carica.
Se è più carica la macchina apache, una veloce ricerca su google potrebbe aiutarti a risolvere il problema, un esempio delle ottimizzazioni da fare potrebbe essere:
- - modificare il file di configurazione di apache in modo da mantenere più processi attivi, ad esempio quando ha molto più traffico di quanto il server sia configurato per gestire e la macchina ha abbastanza risorse di RAM e processore
- - modificare il file di configurazione di apache in modo da ridurre il consumo di RAM degli script php
- - passare a webserver alternativi, ad esempio nginx + php-fpm
- - eventualmente potresti scoprire che i tuoi script sono il collo di bottiglia, quindi ottimizzazione del tuo codice
Se invece è il database ad essere sotto carico la cosa si fa più complessa e la scalabilità dipende da come hai scritto il tuo codice.
Nella quarta parte di questo post parlerò un po più in dettaglio di MySQL, delle problematiche di carico e di ottimizzazione, e della possibiltà di scalare su più server dedicati al database.
Se nel frattempo hai bisogno di ottimizzare un server e hai bisogno di supporto contattami attraverso questo form. Sarò a tua disposizione per creare un’infrastruttura dedicata al tuo sito web, ottimizzata e scalabile.
