Κάθετη και οριζόντια κλιμάκωση. Μια άποψη από επιχειρηματικές εφαρμογές. Κοινό Τίποτα και Έννοιες Απάτριδων

Λοιπόν έχετε φτιάξει έναν ιστότοπο. Είναι πάντα ενδιαφέρον και συναρπαστικό να παρακολουθείς πώς ο επισκέπτης μετράει αργά αλλά σταθερά, δείχνοντας τα πάντα κάθε μέρα κορυφαίες βαθμολογίες. Αλλά μια μέρα, όταν δεν το περιμένετε, κάποιος θα δημοσιεύσει έναν σύνδεσμο προς τον πόρο σας σε κάποια Reddit ή Hacker News (ή στο Habré - περίπου λωρίδα) και ο διακομιστής σας θα καταρρεύσει.

Αντί να αποκτήσετε νέους τακτικούς χρήστες, θα σας μείνουν κενή σελίδα. Σε αυτό το σημείο, τίποτα δεν θα σας βοηθήσει να επαναφέρετε τη λειτουργικότητα του διακομιστή και η κυκλοφορία θα χαθεί για πάντα. Πώς να αποφύγετε τέτοια προβλήματα; Σε αυτό το άρθρο θα μιλήσουμε για βελτιστοποίηση και κλιμάκωση.

Λίγα λόγια για τη βελτιστοποίηση

Όλοι γνωρίζουν τις βασικές συμβουλές: ενημέρωση σε τελευταία έκδοση PHP (5.5 έχει πλέον ενσωματωμένο OpCache), ασχολείται με ευρετήρια στη βάση δεδομένων, κρυφή στατικά δεδομένα (σπάνια επεξεργάσιμες σελίδες, όπως «Σχετικά με εμάς», «Συχνές Ερωτήσεις» κ.λπ.).

Αξίζει επίσης να αναφερθεί μια ιδιαίτερη πτυχή της βελτιστοποίησης - η εξυπηρέτηση στατικού περιεχομένου με έναν διακομιστή που δεν είναι Apache, όπως για παράδειγμα το Nginx Ρύθμιση παραμέτρων του Nginx για να χειρίζεται όλο το στατικό περιεχόμενο (*.jpg, *.png, *.mp4, *.html. ..) και στείλτε αρχεία που απαιτούν επεξεργασία διακομιστή σε βαρύ Apache. Ονομάζεται αντίστροφος διακομιστής μεσολάβησης.

Απολέπιση

Υπάρχουν δύο τύποι κλιμάκωσης - κάθετη και οριζόντια.
Κατά τη γνώμη μου, ένας ιστότοπος είναι επεκτάσιμος εάν μπορεί να χειριστεί την κυκλοφορία χωρίς να αλλάξει το λογισμικό.

Κάθετη κλιμάκωση.

Φανταστείτε έναν διακομιστή που εξυπηρετεί μια εφαρμογή Ιστού. Διαθέτει 4GB RAM, επεξεργαστή i5 και HDD 1TB. Κάνει καλά τη δουλειά του, αλλά για να αντιμετωπίσετε καλύτερα την υψηλότερη επισκεψιμότητα, αποφασίζετε να αυξήσετε τη μνήμη RAM στα 16 GB, να εγκαταστήσετε έναν επεξεργαστή i7 και να διαχωρίσετε Μονάδα SSD. Τώρα ο διακομιστής είναι πολύ πιο ισχυρός και μπορεί να αντιμετωπίσει υψηλά φορτία. Αυτό είναι κατακόρυφη κλιμάκωση.

Οριζόντια κλιμάκωση.

Η οριζόντια κλιμάκωση είναι η δημιουργία ενός συμπλέγματος διασυνδεδεμένων (συχνά όχι πολύ ισχυρών) διακομιστών που μαζί εξυπηρετούν τον ιστότοπο. Σε αυτή την περίπτωση, χρησιμοποιείται εξισορροπητής φορτίου(γνωστός και ως εξισορροπητής φορτίου) - ένα μηχάνημα ή ένα πρόγραμμα του οποίου η κύρια λειτουργία είναι να καθορίσει σε ποιον διακομιστή θα στείλει ένα αίτημα. Οι διακομιστές σε ένα σύμπλεγμα μοιράζονται τη συντήρηση της εφαρμογής χωρίς να γνωρίζουν τίποτα ο ένας για τον άλλον, αυξάνοντας έτσι σημαντικά την απόδοση και την ανοχή σφαλμάτων του ιστότοπού σας.

Υπάρχουν δύο τύποι εξισορροπητών - υλικό και λογισμικό. Λογισμικό - εγκατεστημένο σε κανονικό διακομιστή και λαμβάνει όλη την κίνηση, μεταβιβάζοντάς την στους κατάλληλους διαχειριστές. Ένας τέτοιος εξισορροπητής θα μπορούσε να είναι, για παράδειγμα, το Nginx. Στην ενότητα "Βελτιστοποίηση", υποκλοπή όλων των αιτημάτων για στατικά αρχεία, και εξυπηρέτησε τα ίδια τα αιτήματα, χωρίς να επιβαρύνει τους Apache. Ένα άλλο δημοφιλές λογισμικό για την εφαρμογή εξισορρόπησης φορτίου είναι το Squid. Προσωπικά το χρησιμοποιώ πάντα γιατί... παρέχει μια εξαιρετική, φιλική προς το χρήστη διεπαφή για τον έλεγχο των βαθύτερων πτυχών της εξισορρόπησης.

Ένας εξισορροπητής υλικού είναι ένα αποκλειστικό μηχάνημα του οποίου ο μοναδικός σκοπός είναι να κατανείμει το φορτίο. Συνήθως, αυτό το μηχάνημα δεν εκτελεί πλέον κανένα άλλο λογισμικό εκτός από αυτό που αναπτύχθηκε από τον κατασκευαστή. Μπορείτε να διαβάσετε σχετικά με τους εξισορροπητές φορτίου υλικού.

Σημειώστε ότι αυτές οι δύο μέθοδοι δεν αλληλοαποκλείονται. Μπορείτε να κλιμακώσετε κάθετα οποιοδήποτε μηχάνημα (γνωστός και ως Nodu) στο σύστημά σας.
Σε αυτό το άρθρο συζητάμε την οριζόντια κλιμάκωση επειδή... είναι φθηνότερο και πιο αποτελεσματικό, αν και πιο δύσκολο να εφαρμοστεί.

Μόνιμη σύνδεση

Κατά την κλιμάκωση Εφαρμογές PHP, προκύπτουν αρκετά δύσκολα προβλήματα. Ένα από αυτά είναι η εργασία με δεδομένα συνεδρίας χρήστη. Σε τελική ανάλυση, εάν έχετε συνδεθεί στον ιστότοπο και ο εξισορροπητής έστειλε το επόμενο αίτημά σας σε άλλο μηχάνημα, τότε καινούριο αυτοκίνητοδεν θα γνωρίζει ότι είστε ήδη συνδεδεμένοι. Σε αυτήν την περίπτωση, μπορείτε να χρησιμοποιήσετε μια μόνιμη σύνδεση. Αυτό σημαίνει ότι ο εξισορροπητής θυμάται σε ποιον κόμβο στάλθηκε το αίτημα του χρήστη την τελευταία φορά και στέλνει εκεί το επόμενο αίτημα. Ωστόσο, αποδεικνύεται ότι ο εξισορροπητής είναι πολύ υπερφορτωμένος με λειτουργίες, εκτός από την επεξεργασία εκατοντάδων χιλιάδων αιτημάτων, πρέπει επίσης να θυμάται πώς ακριβώς τις επεξεργάστηκε, με αποτέλεσμα ο ίδιος ο εξισορροπητής να γίνεται. κώλυμαστο σύστημα.

Τοπική ανταλλαγή δεδομένων.

Η κοινή χρήση δεδομένων συνεδρίας χρήστη μεταξύ όλων των κόμβων στο σύμπλεγμα φαίνεται καλή ιδέα. Και παρόλο που αυτή η προσέγγιση απαιτεί κάποιες αλλαγές στην αρχιτεκτονική της εφαρμογής σας, αξίζει τον κόπο - ο εξισορροπητής φορτίου εκφορτώνεται και ολόκληρο το σύμπλεγμα γίνεται πιο ανεκτικό σε σφάλματα. Ο θάνατος ενός από τους διακομιστές δεν επηρεάζει καθόλου τη λειτουργία ολόκληρου του συστήματος.
Όπως γνωρίζουμε, τα δεδομένα συνεδρίας αποθηκεύονται σε υπερσφαιρική συστοιχία $_SESSION, το οποίο γράφει και ανακτά δεδομένα από ένα αρχείο στο δίσκο. Εάν αυτή η μονάδα δίσκου βρίσκεται σε έναν διακομιστή, προφανώς άλλοι διακομιστές δεν μπορούν να έχουν πρόσβαση σε αυτήν. Πώς μπορούμε να το κάνουμε διαθέσιμο σε πολλά μηχανήματα;
Πρώτον, σημειώστε ότι Ο χειριστής συνεδρίας στην PHP μπορεί να παρακαμφθεί. Μπορείτε να εφαρμόσετε τη δική σας τάξη συνεδρίας.

Χρήση βάσης δεδομένων για την αποθήκευση συνεδριών

Χρησιμοποιώντας το δικό μας πρόγραμμα χειρισμού συνεδριών, μπορούμε να τα αποθηκεύσουμε στη βάση δεδομένων. Η βάση δεδομένων μπορεί να βρίσκεται σε ξεχωριστό διακομιστή (ή ακόμα και σε ένα σύμπλεγμα). Συνήθως αυτή η μέθοδος λειτουργεί εξαιρετικά, αλλά όταν πραγματικά υψηλή κίνηση, Η βάση δεδομένων γίνεται εμπόδιο(και αν χαθεί η βάση δεδομένων, χάνουμε εντελώς τη λειτουργικότητα), επειδή πρέπει να εξυπηρετεί όλους τους διακομιστές, καθένας από τους οποίους προσπαθεί να γράψει ή να διαβάσει δεδομένα περιόδου λειτουργίας.

Κατανεμημένο σύστημα αρχείων

Ίσως σκέφτεστε ότι θα ήταν καλή ιδέα να δημιουργήσετε ένα δίκτυο σύστημα αρχείων, όπου όλοι οι διακομιστές μπορούσαν να γράψουν δεδομένα περιόδου σύνδεσης. Μην το κάνεις αυτό!Αυτή είναι μια πολύ αργή προσέγγιση, που οδηγεί σε ζημιά ή ακόμα και απώλεια δεδομένων. Εάν, για κάποιο λόγο, εξακολουθείτε να αποφασίσετε να χρησιμοποιήσετε αυτήν τη μέθοδο, σας προτείνω το GlusterFS

Memcached

Μπορείτε επίσης να χρησιμοποιήσετε το memcached για την αποθήκευση δεδομένων περιόδου λειτουργίας στη μνήμη RAM. Ωστόσο, αυτό δεν είναι ασφαλές, επειδή τα δεδομένα στο memcached αντικαθίστανται εάν εξαντληθούν ελεύθερο μέρος. Εσύ, μάλλον, αναρωτιούνται, η RAM δεν χωρίζεται ανά μηχανή; Πώς εφαρμόζεται σε ολόκληρο το σύμπλεγμα; Το Memcached έχει τη δυνατότητα να συνδυάζει τη μνήμη RAM που είναι διαθέσιμη σε διαφορετικά μηχανήματα σε ένα pool.

Όσο περισσότερα μηχανήματα έχετε, τόσο περισσότερα μπορείτε να διαθέσετε σε αυτήν τη δεξαμενή μνήμης. Δεν χρειάζεται να συγκεντρώσετε όλη τη μνήμη των μηχανημάτων, αλλά μπορείτε και μπορείτε να δωρίσετε μια αυθαίρετη ποσότητα μνήμης από κάθε μηχανή στην πισίνα. Άρα, υπάρχει ευκαιρία να φύγουμε β Οτο μεγαλύτερο μέρος της μνήμης για κανονική χρήση, και εκχωρήστε ένα κομμάτι για την προσωρινή μνήμη, το οποίο θα σας επιτρέψει να αποθηκεύσετε προσωρινά όχι μόνο περιόδους λειτουργίας, αλλά και άλλες σχετικές πληροφορίες. Το Memcached είναι μια εξαιρετική και διαδεδομένη λύση.

Για να χρησιμοποιήσετε αυτήν την προσέγγιση, πρέπει να επεξεργαστείτε λίγο το php.ini

Session.save_handler = memcache session.save_path = "tcp://path.to.memcached.server:port"

Συστάδα Redis

Redis - αποθήκευση δεδομένων NoSQL. Αποθηκεύει τη βάση δεδομένων σε μνήμη τυχαίας προσπέλασης. Σε αντίθεση με το memcached, υποστηρίζει μόνιμη αποθήκευση δεδομένων και πιο σύνθετους τύπους δεδομένων. Το Redis δεν υποστηρίζει ομαδοποίηση, επομένως η χρήση του για οριζόντια κλιμάκωση είναι κάπως δύσκολη, ωστόσο, αυτό είναι προσωρινό και η άλφα έκδοση της λύσης συμπλέγματος έχει ήδη κυκλοφορήσει.

Άλλες λύσεις

Σύνολο

Όπως μπορείτε να δείτε, οριζόντια Κλιμάκωση PHPοι εφαρμογές δεν είναι τόσο απλό θέμα. Υπάρχουν πολλές δυσκολίες, οι περισσότερες λύσεις δεν είναι εναλλάξιμες, επομένως πρέπει να επιλέξετε μία και να μείνετε σε αυτήν μέχρι το τέλος, γιατί όταν η κίνηση είναι εκτός κλίμακας, δεν υπάρχει πλέον η ευκαιρία να μεταβείτε ομαλά σε κάτι άλλο.

Ελπίζω ότι αυτός ο μικρός οδηγός θα σας βοηθήσει να επιλέξετε μια προσέγγιση κλιμάκωσης για το έργο σας.

Στο δεύτερο μέρος του άρθρου θα μιλήσουμε για κλιμάκωση της βάσης δεδομένων.

Με την αυξανόμενη δημοτικότητα μιας διαδικτυακής εφαρμογής, η υποστήριξή της αρχίζει αναπόφευκτα να απαιτεί όλο και περισσότερα μεγάλους πόρους. Στην αρχή, το φορτίο μπορεί (και αναμφίβολα πρέπει) να αντιμετωπιστεί με τη βελτιστοποίηση των αλγορίθμων ή/και της αρχιτεκτονικής της ίδιας της εφαρμογής. Ωστόσο, τι να κάνετε εάν όλα όσα θα μπορούσαν να βελτιστοποιηθούν έχουν ήδη βελτιστοποιηθεί, αλλά η εφαρμογή εξακολουθεί να μην μπορεί να αντιμετωπίσει το φορτίο;

Βελτιστοποίηση

Το πρώτο πράγμα που πρέπει να κάνετε είναι να καθίσετε και να σκεφτείτε αν έχετε ήδη καταφέρει να βελτιστοποιήσετε τα πάντα:
  • Είναι βέλτιστα τα ερωτήματα της βάσης δεδομένων (ΕΞΗΓΗΣΗ ανάλυση, χρήση ευρετηρίων);
  • τα δεδομένα αποθηκεύονται σωστά (SQL έναντι NoSQL);
  • χρησιμοποιείται προσωρινή αποθήκευση;
  • Υπάρχουν περιττά αιτήματα προς το σύστημα αρχείων ή τη βάση δεδομένων;
  • Είναι οι αλγόριθμοι επεξεργασίας δεδομένων βέλτιστοι;
  • Είναι οι ρυθμίσεις περιβάλλοντος βέλτιστες: Apache/Nginx, MySQL/PostgreSQL, PHP/Python;
Θα μπορούσε να γραφτεί ξεχωριστό άρθρο για καθένα από αυτά τα σημεία, επομένως η λεπτομερής εξέταση τους στο πλαίσιο αυτού του άρθρου είναι σαφώς περιττή. Είναι σημαντικό μόνο να καταλάβετε ότι πριν ξεκινήσετε την κλιμάκωση μιας εφαρμογής, είναι πολύ επιθυμητό να βελτιστοποιήσετε τη λειτουργία της όσο το δυνατόν περισσότερο - τελικά, ίσως τότε δεν θα απαιτείται κλιμάκωση.

Απολέπιση

Και έτσι, ας πούμε ότι η βελτιστοποίηση έχει ήδη πραγματοποιηθεί, αλλά η εφαρμογή εξακολουθεί να μην μπορεί να αντιμετωπίσει το φορτίο. Σε αυτήν την περίπτωση, η λύση στο πρόβλημα μπορεί προφανώς να είναι η διανομή του σε πολλούς κεντρικούς υπολογιστές προκειμένου να αυξηθεί συνολική απόδοσηεφαρμογές αυξάνοντας τους διαθέσιμους πόρους. Αυτή η προσέγγιση έχει το επίσημο όνομα - "κλιμάκωση" της εφαρμογής. Πιο συγκεκριμένα, η «κλιμάκωση» αναφέρεται στην ικανότητα ενός συστήματος να αυξάνει την απόδοσή του καθώς αυξάνεται ο αριθμός των πόρων που του διατίθενται. Υπάρχουν δύο μέθοδοι κλιμάκωσης: κάθετη και οριζόντια. Η κάθετη κλιμάκωση συνεπάγεται αύξηση της απόδοσης της εφαρμογής κατά την προσθήκη πόρων (επεξεργαστής, μνήμη, δίσκος) σε έναν μόνο κόμβο (κεντρικό υπολογιστή). Η οριζόντια κλιμάκωση είναι χαρακτηριστική για κατανεμημένες εφαρμογές και συνεπάγεται αύξηση της απόδοσης της εφαρμογής κατά την προσθήκη ενός άλλου κόμβου (κεντρικού υπολογιστή).

Είναι σαφές ότι τα περισσότερα με απλό τρόποθα γίνει μια απλή αναβάθμιση υλικού (επεξεργαστής, μνήμη, δίσκος) - δηλαδή κάθετη κλιμάκωση. Επιπλέον, αυτή η προσέγγιση δεν απαιτεί τροποποιήσεις στην εφαρμογή. Ωστόσο, η κατακόρυφη κλιμάκωση φτάνει πολύ γρήγορα στα όριά της, μετά την οποία ο προγραμματιστής και ο διαχειριστής δεν έχουν άλλη επιλογή από το να προχωρήσουν στην οριζόντια κλιμάκωση της εφαρμογής.

Αρχιτεκτονική εφαρμογών

Οι περισσότερες διαδικτυακές εφαρμογές είναι a priori κατανεμημένες, αφού τουλάχιστον τρία επίπεδα διακρίνονται στην αρχιτεκτονική τους: διακομιστής web, επιχειρηματική λογική (εφαρμογή), δεδομένα (βάση δεδομένων, στατική).

Κάθε ένα από αυτά τα στρώματα μπορεί να κλιμακωθεί. Επομένως, εάν στο σύστημά σας η εφαρμογή και η βάση δεδομένων ζουν στον ίδιο κεντρικό υπολογιστή, το πρώτο βήμα, φυσικά, θα πρέπει να είναι η διανομή τους σε διαφορετικούς κεντρικούς υπολογιστές.

Κώλυμα

Όταν ξεκινάτε να κλιμακώνετε το σύστημα, το πρώτο βήμα είναι να προσδιορίσετε ποιο στρώμα είναι το «σημείο συμφόρησης» - δηλαδή, λειτουργεί πιο αργά από το υπόλοιπο σύστημα. Αρχικά, μπορείτε να χρησιμοποιήσετε κοινά βοηθητικά προγράμματα όπως το top (htop) για την εκτίμηση της κατανάλωσης επεξεργαστή/μνήμης και το df, iostat για την εκτίμηση της κατανάλωσης δίσκου. Ωστόσο, συνιστάται να διαθέσετε έναν ξεχωριστό κεντρικό υπολογιστή με εξομοίωση φορτίου μάχης (χρησιμοποιώντας ή JMeter), στον οποίο θα είναι δυνατή η προβολή προφίλ της λειτουργίας της εφαρμογής χρησιμοποιώντας βοηθητικά προγράμματα όπως το xdebug και ούτω καθεξής. Για να προσδιορίσετε στενά ερωτήματα στη βάση δεδομένων, μπορείτε να χρησιμοποιήσετε βοηθητικά προγράμματα όπως το pgFouine (είναι σαφές ότι είναι καλύτερο να το κάνετε αυτό με βάση τα αρχεία καταγραφής από τον διακομιστή παραγωγής).

Συνήθως εξαρτάται από την αρχιτεκτονική της εφαρμογής, αλλά οι πιο πιθανοί υποψήφιοι για ένα bottleneck γενικά είναι η βάση δεδομένων και ο κώδικας. Εάν η εφαρμογή σας λειτουργεί με μεγάλο όγκο δεδομένων χρήστη, τότε πιθανότατα το σημείο συμφόρησης θα είναι η στατική αποθήκευση.

Κλιμάκωση βάσεων δεδομένων

Όπως αναφέρθηκε παραπάνω, συχνά το σημείο συμφόρησης σύγχρονες εφαρμογέςείναι μια βάση δεδομένων. Τα προβλήματα με αυτό συνήθως χωρίζονται σε δύο κατηγορίες: απόδοση και ανάγκη αποθήκευσης μεγάλου όγκου δεδομένων.

Μπορείτε να μειώσετε το φόρτο στη βάση δεδομένων κατανέμοντάς το σε πολλούς κεντρικούς υπολογιστές. Ταυτόχρονα, γίνεται οξύ το πρόβλημα του συγχρονισμού μεταξύ τους, το οποίο μπορεί να λυθεί με την εφαρμογή ενός σχήματος master/slave με σύγχρονη ή ασύγχρονη αναπαραγωγή. Στην περίπτωση του PostgreSQL, μπορείτε να εφαρμόσετε σύγχρονη αναπαραγωγή χρησιμοποιώντας Slony-I, ασύγχρονη αναπαραγωγή χρησιμοποιώντας PgPool-II ή WAL (9.0). Το πρόβλημα του διαχωρισμού των αιτημάτων ανάγνωσης και εγγραφής, καθώς και η εξισορρόπηση του φορτίου μεταξύ των υπαρχόντων υποτελών, μπορεί να λυθεί με τη δημιουργία ενός ειδικού επιπέδου πρόσβασης στη βάση δεδομένων (PgPool-II).

Το πρόβλημα της αποθήκευσης μεγάλου όγκου δεδομένων όταν χρησιμοποιείται σχεσιακό DBMSμπορεί να λυθεί χρησιμοποιώντας τον μηχανισμό διαμερισμάτων (“διαμέριση” στην PostgreSQL), ή με την ανάπτυξη της βάσης δεδομένων σε κατανεμημένα συστήματα αρχείων όπως το Hadoop DFS.

Ωστόσο, για αποθήκευση μεγάλους όγκουςδεδομένα η καλύτερη λύσηΘα υπάρχει "κοινή χρήση" των δεδομένων, το οποίο είναι ένα ενσωματωμένο πλεονέκτημα των περισσότερων βάσεων δεδομένων NoSQL (για παράδειγμα, MongoDB).

Επιπλέον, οι βάσεις δεδομένων NoSQL γενικά λειτουργούν γρηγορότερα από τους αδερφούς τους SQL λόγω της απουσίας επιβάρυνσης για ανάλυση/βελτιστοποίηση ερωτημάτων, έλεγχο της ακεραιότητας της δομής δεδομένων κ.λπ. Το θέμα της σύγκρισης βάσεων δεδομένων σχεσιακών και NoSQL είναι επίσης αρκετά εκτεταμένο και αξίζει ένα ξεχωριστό άρθρο.

Ξεχωριστά, αξίζει να σημειωθεί η εμπειρία του Facebook, που χρησιμοποιεί MySQL χωρίς επιλογές JOIN. Αυτή η στρατηγική τους επιτρέπει να κλιμακώνουν τη βάση δεδομένων πολύ πιο εύκολα, ενώ μεταφέρουν το φορτίο από τη βάση δεδομένων στον κώδικα, ο οποίος, όπως θα περιγραφεί παρακάτω, κλιμακώνεται πιο εύκολα από τη βάση δεδομένων.

Κλιμάκωση κώδικα

Η δυσκολία στην κλιμάκωση του κώδικα εξαρτάται από το πόσους κοινόχρηστους πόρους χρειάζονται οι οικοδεσπότες για την εκτέλεση της εφαρμογής σας. Θα είναι μόνο περίοδοι λειτουργίας ή θα απαιτεί κοινόχρηστη κρυφή μνήμη και αρχεία; Σε κάθε περίπτωση, το πρώτο βήμα είναι η εκτέλεση αντιγράφων της εφαρμογής σε πολλούς κεντρικούς υπολογιστές με το ίδιο περιβάλλον.

Στη συνέχεια, πρέπει να διαμορφώσετε την εξισορρόπηση φορτίου/αιτήματος μεταξύ αυτών των κεντρικών υπολογιστών. Αυτό μπορεί να γίνει τόσο σε επίπεδο TCP (haproxy), όσο και σε HTTP (nginx) ή DNS.

Το επόμενο βήμα είναι να βεβαιωθείτε ότι τα στατικά αρχεία, η προσωρινή μνήμη και οι συνεδρίες εφαρμογών ιστού είναι διαθέσιμα σε κάθε κεντρικό υπολογιστή. Για περιόδους σύνδεσης, μπορείτε να χρησιμοποιήσετε έναν διακομιστή που τρέχει μέσω του δικτύου (για παράδειγμα, memcached). Είναι πολύ λογικό να χρησιμοποιείτε το ίδιο memcached ως διακομιστή cache, αλλά, φυσικά, σε διαφορετικό κεντρικό υπολογιστή.

Στατικά αρχεία μπορούν να προσαρτηθούν από κάποια κοινά αποθήκευση αρχείωνμέσω NFS/CIFS ή χρησιμοποιήστε ένα κατανεμημένο σύστημα αρχείων (HDFS, GlusterFS, Ceph).

Μπορείτε επίσης να αποθηκεύσετε αρχεία σε μια βάση δεδομένων (για παράδειγμα, Mongo GridFS), επιλύοντας έτσι τα προβλήματα διαθεσιμότητας και επεκτασιμότητας (λαμβάνοντας υπόψη το γεγονός ότι για βάσεις δεδομένων NoSQL το πρόβλημα επεκτασιμότητας επιλύεται λόγω διαμοιρασμού).

Ξεχωριστά, αξίζει να σημειωθεί το πρόβλημα της ανάπτυξης σε πολλαπλούς κεντρικούς υπολογιστές. Πώς να το κάνετε έτσι ώστε ο χρήστης να μην βλέπει όταν κάνει κλικ στο "Ενημέρωση" διαφορετικές εκδόσειςεφαρμογές; Η απλούστερη λύση, κατά τη γνώμη μου, θα ήταν να εξαιρεθούν οι μη ενημερωμένοι κεντρικοί υπολογιστές από τη διαμόρφωση εξισορρόπησης φορτίου (διακομιστής ιστού) και να τους ενεργοποιούνται διαδοχικά καθώς ενημερώνονται. Μπορείτε επίσης να συνδέσετε τους χρήστες με συγκεκριμένους κεντρικούς υπολογιστές μέσω cookie ή IP. Εάν η ενημέρωση απαιτεί σημαντικές αλλαγές στη βάση δεδομένων, ο ευκολότερος τρόπος είναι να κλείσετε προσωρινά εντελώς το έργο.

Κλιμάκωση FS

Εάν είναι απαραίτητο να αποθηκεύσετε μεγάλο όγκο στατικών δεδομένων, μπορούν να εντοπιστούν δύο προβλήματα: έλλειψη χώρου και ταχύτητα πρόσβασης στα δεδομένα. Όπως ήδη γράφτηκε παραπάνω, το πρόβλημα με την έλλειψη χώρου μπορεί να λυθεί με τουλάχιστον τρεις τρόπους: ένα κατανεμημένο σύστημα αρχείων, την αποθήκευση δεδομένων σε μια βάση δεδομένων με υποστήριξη διαμοιρασμού και την οργάνωση του διαμοιρασμού «χειροκίνητα» σε επίπεδο κώδικα.

Ταυτόχρονα, αξίζει να καταλάβουμε ότι η κατανομή των στατικών δεν είναι επίσης η καλύτερη απλή εργασία, όταν πρόκειται για υψηλά φορτία. Επομένως, είναι πολύ λογικό να υπάρχουν πολλοί διακομιστές αφιερωμένοι στη διανομή στατικών αρχείων. Επιπλέον, εάν έχουμε κοινόχρηστο χώρο αποθήκευσης δεδομένων (κατανεμημένο σύστημα αρχείων ή βάση δεδομένων), κατά την αποθήκευση ενός αρχείου, μπορούμε να αποθηκεύσουμε το όνομά του χωρίς να λάβουμε υπόψη τον κεντρικό υπολογιστή και να αντικαταστήσουμε το όνομα του κεντρικού υπολογιστή τυχαία κατά τη δημιουργία της σελίδας (εξισορροπώντας τυχαία το φορτίο μεταξύ διακομιστές Ιστού που διανέμουν στατικά αρχεία) . Στην περίπτωση που η κοινή χρήση υλοποιείται με μη αυτόματο τρόπο (δηλαδή, η λογική στον κώδικα είναι υπεύθυνη για την επιλογή του κεντρικού υπολογιστή στον οποίο θα μεταφορτωθούν τα δεδομένα), οι πληροφορίες σχετικά με τον κεντρικό υπολογιστή μεταφόρτωσης πρέπει είτε να υπολογίζονται με βάση το ίδιο το αρχείο είτε να δημιουργούνται με βάση σε τρίτα δεδομένα (πληροφορίες για τον χρήστη, χώρο στους δίσκους αποθήκευσης) και αποθηκεύονται μαζί με το όνομα του αρχείου στη βάση δεδομένων.

Παρακολούθηση

Είναι σαφές ότι μεγάλο και ένα πολύπλοκο σύστημααπαιτεί συνεχής παρακολούθηση. Η λύση, κατά τη γνώμη μου, είναι τυπική εδώ - το zabbix, το οποίο παρακολουθεί το φορτίο/λειτουργία των κόμβων του συστήματος και παρακολουθεί τους δαίμονες για δημιουργία αντιγράφων ασφαλείας.

συμπέρασμα

Τα παραπάνω συζητούν εν συντομία πολλές επιλογές για την επίλυση των προβλημάτων της κλιμάκωσης μιας διαδικτυακής εφαρμογής. Κάθε ένα από αυτά έχει τα δικά του πλεονεκτήματα και μειονεκτήματα. Δεν υπάρχει συνταγή για το πώς να κάνετε τα πάντα καλά και ταυτόχρονα - για κάθε εργασία υπάρχουν πολλές λύσεις με τα δικά τους πλεονεκτήματα και μειονεκτήματα. Ποιο να διαλέξετε εξαρτάται από εσάς.

Κάθετη κλιμάκωση— κλιμάκωση — αύξηση του αριθμού των διαθέσιμων πόρων στο λογισμικό αυξάνοντας την ισχύ που χρησιμοποιείται από τους διακομιστές.

— κλιμάκωση — αύξηση του αριθμού των κόμβων που συνδυάζονται σε ένα σύμπλεγμα διακομιστών όταν υπάρχει έλλειψη CPU, μνήμης ή χώρου στο δίσκο.

Και οι δύο είναι λύσεις υποδομής που απαιτούνται σε διαφορετικές καταστάσεις όταν αναπτύσσεται ένα έργο web.

Κατακόρυφη και οριζόντια κλιμάκωση, κλιμάκωση για web

Για παράδειγμα, εξετάστε τους διακομιστές βάσης δεδομένων. Για μεγάλες εφαρμογέςαυτό είναι πάντα το πιο φορτωμένο στοιχείο του συστήματος.

Οι δυνατότητες κλιμάκωσης για διακομιστές βάσης δεδομένων καθορίζονται από τα ισχύοντα λύσεις λογισμικού: πιο συχνά αυτές είναι σχεσιακές βάσεις δεδομένων (MySQL, Postgresql) ή NoSQL(, Κασσάνδρα κ.λπ.).

Η οριζόντια κλιμάκωση για διακομιστές βάσης δεδομένων κάτω από μεγάλα φορτία είναι πολύ φθηνότερη

Ένα έργο Ιστού ξεκινά συνήθως σε έναν διακομιστή, οι πόροι του οποίου εξαντλούνται καθώς μεγαλώνει. Σε μια τέτοια περίπτωση, υπάρχουν 2 επιλογές:

  • μετακινήστε τον ιστότοπο σε έναν πιο ισχυρό διακομιστή
  • προσθέστε έναν άλλο διακομιστή χαμηλής κατανάλωσης και συνδυάστε μηχανές σε ένα σύμπλεγμα

Το MySQL είναι το πιο δημοφιλές RDBMS και, όπως οποιοδήποτε από αυτά, απαιτεί πολλούς πόρους διακομιστή για να εκτελεστεί υπό φόρτωση. Η κλιμάκωση είναι δυνατή κυρίως προς τα πάνω. Υπάρχει διαμοιρασμός (για τον οποίο απαιτούνται αλλαγές κώδικα για τη διαμόρφωση) και διαμοιρασμός, που μπορεί να είναι δύσκολο να υποστηριχθεί.

Κάθετη κλιμάκωση

Το NoSQL κλιμακώνεται εύκολα και η δεύτερη επιλογή, για παράδειγμα, με το MongoDB θα είναι πολύ πιο κερδοφόρα οικονομικά και δεν θα απαιτεί ρυθμίσεις έντασης εργασίας και υποστήριξη για τη λύση που προκύπτει. Η κοινή χρήση πραγματοποιείται αυτόματα.

Έτσι, με τη MySQL θα χρειαστείτε έναν διακομιστή με μεγάλη ποσότητα CPU και RAM τέτοιοι διακομιστές έχουν σημαντικό κόστος.

Οριζόντια κλιμάκωση
Με το MongoDB μπορείτε προσθέστε ένα ακόμα μέσο διακομιστή και η προκύπτουσα λύση θα λειτουργεί σταθερά, δίνοντας πρόσθετη ανοχή σφαλμάτων.


Scale-outή αποτελεί φυσικό στάδιο ανάπτυξης υποδομών. Οποιοσδήποτε διακομιστής έχει περιορισμούς και όταν προσεγγιστούν ή όταν το κόστος ενός πιο ισχυρού διακομιστή αποδειχθεί αδικαιολόγητα υψηλό, προστίθενται νέα μηχανήματα. Το φορτίο κατανέμεται μεταξύ τους. Παρέχει επίσης ανοχή σφαλμάτων.

Θα πρέπει να αρχίσετε να προσθέτετε διακομιστές μεσαίου μεγέθους και να δημιουργείτε συμπλέγματα όταν έχουν εξαντληθεί οι δυνατότητες αύξησης των πόρων ενός μηχανήματος ή όταν η αγορά ενός ισχυρότερου διακομιστή αποδεικνύεται ασύμφορη

Το δεδομένο παράδειγμα με σχεσιακές βάσεις δεδομένωνδεδομένα και NoSQL είναι η κατάσταση που εμφανίζεται πιο συχνά. Οι διακομιστές frontend και backend είναι επίσης επεκτάσιμοι.

Διαβάστε για τον εξισορροπητή

9 Ιουλίου 2015 στις 09:10

Οριζόντια κλιμάκωση διακομιστών βάσεων δεδομένων για συστήματα OLTP ή ό,τι κυκλοφορεί στην αγορά

  • Διαχείριση βάσεων δεδομένων,
  • Βελτιστοποίηση διακομιστή

Κατά κανόνα, οι μεγάλες και μεσαίες εταιρείες διαθέτουν συστήματα πληροφοριών συναλλαγών με υψηλή φόρτωση, τα οποία αποτελούν το πιο σημαντικό στοιχείο της επιχείρησης και ονομάζονται συστήματα OLTP. Καθώς η επιχείρηση αναπτύσσεται, το φορτίο αυξάνεται πολύ γρήγορα, επομένως το έργο της αύξησης της παραγωγικότητας των υπαρχόντων πόρων για διακομιστές βάσεων δεδομένων είναι πολύ επείγον. Συχνά, για την επίλυση του προβλήματος της αύξησης της απόδοσης των διακομιστών βάσεων δεδομένων, αγοράζεται πιο ισχυρός εξοπλισμός (η λεγόμενη "κάθετη" κλίμακα), αλλά αυτή η μέθοδος έχει ένα πολύ σημαντικό μειονέκτημα: αργά ή γρήγορα η εταιρεία θα αγοράσει έναν διακομιστή βάσης δεδομένων με μέγιστο απόδοση σε προσιτή τιμή και τι να κάνετε στη συνέχεια; Οι περαιτέρω προοπτικές για τις επιχειρήσεις μπορεί να μην είναι τόσο ρόδινες - σε πολλές περιπτώσεις μιλάμε για επιδείνωση της φήμης της εταιρείας, αδυναμία εξυπηρέτησης πελατών σε περιόδους αυξημένης ζήτησης και σημαντική απώλεια κερδών.

Να εξαιρέσεις παρόμοιες καταστάσειςκαι διασφαλίζοντας τη λειτουργικότητα των συστημάτων OLTP, πολλές εταιρείες ακολουθούν τον δρόμο της «οριζόντιας» κλιμάκωσης των διακομιστών βάσεων δεδομένων. Σε αντίθεση με την αύξηση της απόδοσης του κύριου διακομιστή («κάθετη» κλίμακα), με την «οριζόντια» κλίμακα οι διακομιστές συνδυάζονται σε ένα σύμπλεγμα (σύνολο) και το φορτίο στους διακομιστές της βάσης δεδομένων κατανέμεται μεταξύ τους. Αυτή η προσέγγιση είναι πιο προηγμένη τεχνολογικά, γιατί εκτός από προφανή πλεονεκτήματαμε τη μορφή της δυνατότητας αύξησης της παραγωγικότητας με την προσθήκη νέων διακομιστών, επιλύεται το πρόβλημα της επίτευξης ανοχής σφαλμάτων και καταστροφών.

Πολλές εταιρείες πληροφορικής στη Ρωσία και στον κόσμο αναπτύσσουν παρόμοιες λύσεις παρακάτω. Θα προσπαθήσω να μιλήσω για αυτές με περισσότερες λεπτομέρειες.

Πρώτη λύση - Oracle RAC (Real Application Cluster)- εμφανίστηκε το 2001 στην έκδοση 9i για να αυξήσει τη διαθεσιμότητα και την απόδοση σε συστήματα υψηλής φόρτωσης που βασίζονται σε Oracle DBMS. Σας επιτρέπει να διανείμετε το φορτίο σε μια βάση δεδομένων με υψηλή φόρτωση μεταξύ διακομιστών βάσεων δεδομένων και έτσι να αυξήσετε τις δυνατότητες του συστήματος OLTP για την ομαλή ανάπτυξη των ροών πληροφοριών. Για πιο λεπτομερείς πληροφορίες, ανατρέξτε στην τεκμηρίωση ή σε βιβλία από την Oracle Press. Ως εκ τούτου, θα σταθώ σε ορισμένα σημεία που είναι ενδιαφέροντα από την άποψη της αρχής της λειτουργίας.

Επειδή Το Oracle RAC εφαρμόζει την αρχιτεκτονική Shared-Everything (με όλα τα εγγενή πλεονεκτήματα και μειονεκτήματα) και στη συνέχεια για κάθε διακομιστή στο Oracle RAC υπάρχει η δική του προσωρινή μνήμη, η οποία περιλαμβάνει Δεδομένα SQLερωτήματα που εκτελούνται σε αυτό. Υπάρχει επίσης μια παγκόσμια κρυφή μνήμη συμπλέγματος, που υλοποιείται χρησιμοποιώντας την τεχνολογία Cache Fusion, η οποία συγχρονίζεται με τις τοπικές κρυφές μνήμες διακομιστή με βάση δεδομένα. Ένας ιδιαίτερος ρόλος στον συντονισμό των πόρων συμπλέγματος και της συγκέντρωσης κρυφής μνήμης διαδραματίζει η δομή δεδομένων Global Resource Directory, η οποία καταγράφει σε ποιο διακομιστή, ποια δεδομένα και ποια αντικείμενα είναι σχετικά. ποια είναι η λειτουργία κλειδώματος για το αντικείμενο στο στιγμιότυπο. Όλες αυτές οι πληροφορίες βοηθούν να αποφασίσετε ποιος διακομιστής είναι καλύτερος να στείλει ένα ερώτημα SQL από άποψη απόδοσης, καθώς σε περίπτωση λάθος απόφασηΟ χρόνος ερωτήματος SQL θα αυξηθεί λόγω του χρόνου που χρειάζεται για να συγχρονιστούν τα δεδομένα μεταξύ των κρυφών μνήμων.

Ένα σημαντικό χαρακτηριστικό αυτής της προσέγγισης για τη διανομή φόρτωσης μεταξύ διακομιστών βάσης δεδομένων είναι η ανάγκη να ληφθεί υπόψη η «διαφορετικότητα» της κίνησης SQL από το σύστημα OLTP. Σε περιπτώσεις όπου τα ερωτήματα SQL ανακτούν δεδομένα από πολλούς πίνακες ταυτόχρονα και ο ρυθμός αλλαγής σε αυτούς τους πίνακες είναι μεγάλος, μπορεί να χαθεί χρόνος συγχρονίζοντας δεδομένα προσωρινής μνήμης μεταξύ διαφορετικών διακομιστών στο σύμπλεγμα (γι' αυτό μια γρήγορη και αξιόπιστη διασύνδεση μεταξύ διακομιστών απατείται). Αυτό, με τη σειρά του, μπορεί να οδηγήσει σε κακή απόκριση του συστήματος OLTP και τα πλεονεκτήματα από τη χρήση του Oracle RAC ενδέχεται να ακυρωθούν εντελώς.

Πλεονεκτήματα:

  • Ενεργό/Ενεργό σύμπλεγμα
  • Εξισορρόπηση φορτίου
  • Κλιμάκωση με αυξημένη απόδοση αλλά και αυξημένη διαθεσιμότητα
  • Σχεδόν γραμμική αύξηση στην απόδοση κατά την προσθήκη νέων κόμβων στο σύμπλεγμα
  • Εφαρμογή-διαφανής κλιμάκωση

Μειονεκτήματα:

  • Λειτουργεί μόνο με Oracle DBMS
  • Για τη λειτουργία απαιτείται διασύνδεση υψηλής απόδοσης με χαμηλή καθυστέρηση
  • Το σύστημα αποθήκευσης μπορεί να είναι ΜΟΝΑΔΙΚΟ σημείοάρνηση. Για την παροχή υψηλό επίπεδοΗ ανοχή σφαλμάτων RAC πρέπει να συνδυάζεται με τον κατοπτρισμό αναμονής ή αποθήκευσης.

Δεύτερη λύση - Citrix NetScaler– υλοποιεί οριζόντια κλιμάκωση διακομιστών βάσεων δεδομένων για συστήματα OLTP που βασίζονται σε MS SQL Server και MySQL διαφορετικά από το Oracle RAC. ΜΕ τεχνικά χαρακτηριστικάμπορείτε να βρείτε ακολουθώντας τον σύνδεσμο.

Εάν οι διακομιστές βάσης δεδομένων Oracle RAC συγχρονίζονται αυτόματα, τότε το Citrix NetScaler πρέπει να χρησιμοποιεί τεχνολογίες τρίτων για συγχρονισμό: AlwaysOn από τη Microsoft, αναπαραγωγή MySQL. Η ίδια η λύση Citrix NetScaler είναι ένας διακομιστής μεσολάβησης μεταξύ του επιπέδου εφαρμογής (διακομιστής εφαρμογών, διακομιστής web) και των διακομιστών βάσης δεδομένων, επομένως όλα τα αιτήματα SQL προς τον διακομιστή βάσης δεδομένων περνούν από αυτό.

Σύμφωνα με τις προδιαγραφές, η λύση μπορεί να αναγνωρίσει την υπογραφή των ερωτημάτων SQL (για ανάγνωση ή εγγραφή δεδομένων) και να τα ανακατευθύνει στα απαιτούμενα ( ορίζεται από τις ρυθμίσεις) διακομιστές σε ένα σύμπλεγμα. Η καθυστέρηση για την επεξεργασία ενός ερωτήματος SQL από τον διακομιστή μεσολάβησης είναι ελάχιστη, επομένως η απόκριση του συστήματος OLTP δεν θα πρέπει να επιδεινώνεται μετά την εφαρμογή. Παρά αυτό το πλεονέκτημα, η δυνατότητα φόρτωσης ερωτημάτων SQL ισορροπίας εξαρτάται επίσης από τα χαρακτηριστικά κίνησης του συστήματος OLTP. Σε πολλά συστήματα OLTP, τα αλλαγμένα δεδομένα σε μια συναλλαγή διαβάζονται αμέσως από το ακόλουθο ερώτημα SQL για περισσότερη δουλεια. Λαμβάνοντας υπόψη τα χαρακτηριστικά μιας τέτοιας τεχνολογίας, όπως το MS AlwaysOn, τα δεδομένα σε πρόσθετους διακομιστές υστερούν από τον κύριο για κάποιο χρονικό διάστημα (σε σύγχρονη και ασύγχρονη λειτουργία). Χωρίς να λαμβάνεται αυτό υπόψη, η εφαρμογή και ο χρήστης μπορεί να καταλήξουν σε μια κατάσταση όπου τα προστιθέμενα δεδομένα δεν θα ληφθούν στο επόμενο ερώτημα SQL. Κατά κανόνα, η τεχνολογία Citrix NetScaler συνιστάται για χρήση όχι σε αυτόματη λειτουργία, αλλά χειροκίνητα, επομένως το πεδίο εφαρμογής του περιορίζεται σε απλά ερωτήματα στη βάση δεδομένων σε εφαρμογές web.

Τρίτη τεχνολογία - Σύμπλεγμα δεδομένων SoftpointΡωσική ανάπτυξη, το οποίο είναι παρόμοιο με τα δύο προηγούμενα, αλλά με διάφορους τρόπους είναι περισσότερο εφαρμόσιμο σε πρακτικά προβλήματα «οριζόντιας» κλίμακας διακομιστών βάσεων δεδομένων για συστήματα OLTP. Περισσότερο λεπτομερείς πληροφορίεςπληροφορίες σχετικά με το προϊόν μπορείτε να βρείτε στον ιστότοπο του πωλητή.

Με την πρώτη ματιά, η τεχνολογία είναι παρόμοια με το Citrix NetScaler, καθώς είναι ένας διακομιστής μεσολάβησης μεταξύ του επιπέδου εφαρμογής και του επιπέδου βάσης δεδομένων και είναι επίσης στενά ενσωματωμένος με τεχνολογίες συγχρονισμού βάσεων δεδομένων (για παράδειγμα, MS AlwaysOn), αλλά σε αντίθεση με το Citrix NetScaler παρακολουθεί τη βάση δεδομένων αποσυγχρονίζει διακομιστή σε σύμπλεγμα και εγγυάται πλήρως τη συνέπεια των δεδομένων σε δείγματα, ανεξάρτητα από το πού εκτελείται το ερώτημα SQL στους διακομιστές. Αυτή η δυνατότητα σάς επιτρέπει να παρέχετε αυτόματη εξισορρόπηση φορτίου χωρίς προσαρμογή στην κίνηση της εφαρμογής.

Η τεχνολογία διασφαλίζει επίσης τον συγχρονισμό των προσωρινών πινάκων μεταξύ των διακομιστών στο σύμπλεγμα, κάτι που είναι πολύ σημαντικό για καλύτερη εξισορρόπηση, συμπεριλαμβανομένων των ερωτημάτων SQL που χρησιμοποιούν προσωρινούς πίνακες. Ένα σημαντικό πλεονέκτημα της χρήσης του Softpoint Data Cluster είναι η ευκαιρία να εξοικειωθείτε με παραδείγματα υλοποιήσεων για

Ο Alexander Makarov, προγραμματιστής του δημοφιλούς πλαισίου Yii, θα μιλήσει για την κλιμάκωση των διαδικτυακών έργων.

Κλιμάκωση - η δυνατότητα επέκτασης του συστήματος επεξεργασίας περισσότεροκυκλοφορία χωρίς απώλεια των ιδιοτήτων του χρήστη: ταχύτητα και ανταπόκριση.

Υπάρχουν δύο τύποι κλιμάκωσης: κάθετη ( περισσότερη μνήμη, δίσκος, καλύτερος επεξεργαστής) και οριζόντια ( περισσότερους διακομιστέςστο σύμπλεγμα).

  • Γιατί χρειάζεται αν όλα λειτουργούν έτσι;
  • Οταν? Παρακολούθηση, βιαστικές αποφάσεις, βελτιστοποίηση και ζωή με έναν διακομιστή.
  • Τυπικό σχήμα.
  • Εξισορρόπηση φορτίου.
  • Ποια είναι τα προβλήματα στην πλευρά της εφαρμογής γενικά;
  • Γιατί η PHP είναι τόσο καλή για κλιμάκωση.
  • Συνεδρίες.
  • Βάση δεδομένων.
  • Αρχεία.
  • Τι γίνεται με τα στατιστικά;

Alexander Makarov (Yii, Stay.com)

Γειά σου! Είμαι ο Alexander Makarov και ίσως με γνωρίζετε από το πλαίσιο Yii - είμαι ένας από τους προγραμματιστές του. Έχω επίσης μια δουλειά πλήρους απασχόλησης - και αυτό δεν είναι πλέον μια startup - το Stay.com, το οποίο ασχολείται με τα ταξίδια.

Σήμερα θα μιλήσω για οριζόντια κλιμάκωση, αλλά με πολύ, πολύ γενικούς όρους.

Τι είναι η κλιμάκωση, τέλος πάντων; Αυτή είναι μια ευκαιρία να αυξηθεί η παραγωγικότητα του έργου για ελάχιστος χρόνοςμε την προσθήκη πόρων.

Συνήθως, η κλιμάκωση δεν περιλαμβάνει την επανεγγραφή κώδικα, αλλά είτε την προσθήκη διακομιστών είτε την αύξηση των πόρων ενός υπάρχοντος. Αυτός ο τύπος περιλαμβάνει κάθετη και οριζόντια κλιμάκωση.

Κάθετη είναι όταν προστίθενται περισσότερη μνήμη RAM, δίσκοι κ.λπ. ήδη υπάρχον διακομιστή, και οριζόντια είναι όταν τοποθετούν περισσότερους διακομιστές σε κέντρα δεδομένων και οι διακομιστές εκεί ήδη αλληλεπιδρούν με κάποιο τρόπο.

Η πιο ενδιαφέρουσα ερώτηση που κάνουν είναι: γιατί χρειάζεται αν όλα λειτουργούν καλά για μένα σε έναν διακομιστή; Στην πραγματικότητα, πρέπει να ελέγξουμε τι θα συμβεί. Δηλαδή λειτουργεί τώρα, αλλά τι θα γίνει μετά; Υπάρχουν δύο υπέροχα βοηθητικά προγράμματα - το ab και το siege, τα οποία φαίνεται να φτάνουν τη διαφορά με ένα σύννεφο χρηστών ανταγωνιστών που αρχίζουν να χτυπούν τον διακομιστή, προσπαθούν να ζητήσουν σελίδες, να στείλουν κάποια αιτήματα. Πρέπει να τους πείτε τι να κάνουν και τα βοηθητικά προγράμματα δημιουργούν αναφορές όπως αυτή:

Οι δύο κύριες παράμετροι: n - ο αριθμός των αιτημάτων που πρέπει να γίνουν, c - ο αριθμός των ταυτόχρονων αιτημάτων. Με αυτόν τον τρόπο ελέγχουν τον ανταγωνισμό.

Στην έξοδο παίρνουμε RPS, δηλ. τον αριθμό των αιτημάτων ανά δευτερόλεπτο που μπορεί να επεξεργαστεί ο διακομιστής, από τον οποίο θα γίνει σαφές πόσους χρήστες μπορεί να χειριστεί. Όλα, φυσικά, εξαρτώνται από το έργο, ποικίλλει, αλλά συνήθως απαιτεί προσοχή.

Υπάρχει μια ακόμη παράμετρος - Χρόνος απόκρισης - ο χρόνος απόκρισης κατά τον οποίο ο διακομιστής εξυπηρέτησε μια σελίδα κατά μέσο όρο. Διαφέρει, αλλά είναι γνωστό ότι περίπου 300 ms είναι ο κανόνας, και οτιδήποτε υψηλότερο δεν είναι πολύ καλό, επειδή αυτά τα 300 ms επεξεργάζονται από τον διακομιστή και προστίθενται άλλα 300-600 ms σε αυτό, τα οποία επεξεργάζεται ο πελάτης , δηλ. Ενώ όλα φορτώνονται - στυλ, εικόνες και τα υπόλοιπα - περνάει και ο χρόνος.

Συμβαίνει ότι στην πραγματικότητα δεν χρειάζεται να ανησυχείτε ακόμα για την κλιμάκωση - πηγαίνουμε στον διακομιστή, ενημερώνουμε την PHP, λαμβάνουμε 40% αύξηση στην απόδοση και όλα είναι ωραία. Στη συνέχεια, διαμορφώνουμε το Opcache και το συντονίζουμε. Το Opcache, παρεμπιπτόντως, είναι συντονισμένο με τον ίδιο τρόπο όπως το APC, με ένα σενάριο που μπορεί να βρεθεί στο αποθετήριο του Rasmus Lerdorf και το οποίο εμφανίζει επιτυχίες και αστοχίες, όπου τα χτυπήματα είναι πόσες φορές η PHP πήγε στην κρυφή μνήμη και οι αστοχίες πόσες φορές πήγε στο σύστημα αρχείων λήψη αρχείων. Εάν τρέξουμε ολόκληρο τον ιστότοπο, ή εκτελέσουμε κάποιο είδος ανιχνευτή στους συνδέσμους, ή το σπρώξουμε χειροκίνητα, τότε θα έχουμε στατιστικά στοιχεία για αυτές τις επιτυχίες και τις αστοχίες. Εάν υπάρχουν 100% επισκέψεις και 0% αστοχίες, τότε όλα είναι εντάξει, αλλά εάν υπάρχουν αστοχίες, τότε πρέπει να διαθέσουμε περισσότερη μνήμη, ώστε όλος ο κώδικάς μας να χωράει στο Opcache. Αυτό είναι ένα συνηθισμένο λάθος που γίνεται - φαίνεται ότι το Opcache είναι εκεί, αλλά κάτι δεν λειτουργεί...

Επίσης συχνά αρχίζουν να κλιμακώνονται, αλλά δεν το κοιτούν καθόλου, γι' αυτό όλα λειτουργούν αργά. Τις περισσότερες φορές μπαίνουμε στη βάση δεδομένων, κοιτάμε - δεν υπάρχουν ευρετήρια, βάζουμε ευρετήρια - όλα λειτουργούν αμέσως, αρκετά για άλλα 2 χρόνια, ομορφιά!

Λοιπόν, πρέπει επίσης να ενεργοποιήσετε την προσωρινή μνήμη, να αντικαταστήσετε το apache με nginx και php-fpm για εξοικονόμηση μνήμης. Όλα θα είναι υπέροχα.

Όλα τα παραπάνω είναι αρκετά απλά και σου δίνουν χρόνο. Υπάρχει χρόνος για το γεγονός ότι κάποια μέρα αυτό δεν θα είναι αρκετό, και πρέπει να προετοιμαστούμε για αυτό τώρα.

Πώς, γενικά, μπορείτε να καταλάβετε ποιο είναι το πρόβλημα; Είτε έχετε ήδη υψηλό φορτίο, και αυτό δεν είναι απαραίτητα ένας τρελός αριθμός αιτημάτων, κ.λπ., είναι όταν το έργο σας δεν μπορεί να αντεπεξέλθει στο φορτίο και αυτό δεν μπορεί πλέον να λυθεί με ασήμαντους τρόπους. Πρέπει να αναπτυχθείτε είτε ευρύτερα είτε ψηλότερα. Κάτι πρέπει να γίνει και, πιθανότατα, υπάρχει λίγος χρόνος για κάτι που πρέπει να εφευρεθεί.

Ο πρώτος κανόνας είναι ότι δεν πρέπει ποτέ να κάνετε τίποτα στα τυφλά, δηλ. χρειαζόμαστε εξαιρετική παρακολούθηση. Πρώτον, κερδίζουμε χρόνο σε κάποια προφανή βελτιστοποίηση, όπως η ενεργοποίηση μιας προσωρινής μνήμης ή η προσωρινή αποθήκευση της αρχικής σελίδας κ.λπ. Μετά ρυθμίζουμε την παρακολούθηση, μας δείχνει τι λείπει. Και όλα αυτά επαναλαμβάνονται πολλές φορές - δεν μπορείτε ποτέ να σταματήσετε την παρακολούθηση και τη βελτίωση.

Τι μπορεί να δείξει η παρακολούθηση; Μπορούμε να στηριχθούμε στον δίσκο, δηλ. στο σύστημα αρχείων, στη μνήμη, στον επεξεργαστή, στο δίκτυο... Και μπορεί να φαίνονται όλα λίγο-πολύ, αλλά εμφανίζονται κάποια σφάλματα. Όλα αυτά επιλύονται με διαφορετικούς τρόπους. Μπορείτε να λύσετε ένα πρόβλημα, για παράδειγμα, με έναν δίσκο προσθέτοντας έναν νέο δίσκο στον ίδιο διακομιστή ή μπορείτε να εγκαταστήσετε έναν δεύτερο διακομιστή που θα ασχολείται μόνο με αρχεία.

Τι πρέπει να προσέχετε αυτή τη στιγμή κατά την παρακολούθηση; Αυτό:

  1. προσβασιμότητα, δηλ. αν ο διακομιστής είναι ζωντανός ή όχι.
  2. έλλειψη πόρων δίσκου, επεξεργαστή κ.λπ.
  3. Σφάλματα.

Πώς να παρακολουθήσετε όλα αυτά;

Ακολουθεί μια λίστα με εξαιρετικά εργαλεία που σας επιτρέπουν να παρακολουθείτε τους πόρους και να εμφανίζετε τα αποτελέσματα με πολύ βολικό τρόπο:

  • Monit - http://mmonit.com/monit/
  • Zabbix - http://www.zabbix.com/
  • Munin - http://munin-monitoring.org/
  • Nagios - http://www.nagios.org/
  • ServerDensity - https://www.serverdensity.com/

Τα πρώτα 4 εργαλεία μπορούν να εγκατασταθούν στον διακομιστή, είναι ισχυρά και δροσερά. Και το ServerDensity φιλοξενείται από κάποιον, π.χ. πληρώνουμε χρήματα για αυτό και μπορεί να συλλέξει όλα τα δεδομένα από τους διακομιστές και να τα εμφανίσει για ανάλυση.

Για την παρακολούθηση σφαλμάτων υπάρχουν δύο καλη εξυπηρετηση:

  • Rollbar - https://rollbar.com/
  • Sentry - https://getsentry.com/

Συνήθως παρακολουθούμε σφάλματα όπως αυτό - είτε γράφουμε τα πάντα στο αρχείο καταγραφής και μετά τα κοιτάμε, είτε επιπλέον αρχίζουμε να στέλνουμε email ή SMS στους προγραμματιστές. Αυτό είναι φυσιολογικό, αλλά μόλις έχουμε πλήθος ανθρώπων έρχονται στην υπηρεσία, και υπάρχει κάποιο είδος - ένα λάθος, αρχίζει να επαναλαμβάνεται πολύ μεγάλο πολλές φορές, το email αρχίζει να στέλνει τρελά ανεπιθύμητα μηνύματα ή γεμίζει εντελώς ή ο προγραμματιστής χάνει εντελώς την προσοχή του και αρχίζει να αγνοεί τα μηνύματα ηλεκτρονικού ταχυδρομείου. Οι παραπάνω υπηρεσίες λαμβάνουν και συλλέγουν σφάλματα του ίδιου τύπου σε ένα μεγάλο πακέτο, καθώς και πόσες φορές σημειώθηκαν σφάλματα κατά τη διάρκεια Πρόσφατακαι το όλο θέμα τίθεται αυτόματα στις προτεραιότητες.

Το Sentry μπορεί να εγκατασταθεί στον διακομιστή σας, υπάρχει ένας πηγαίος κώδικας, αλλά το Rollbar όχι, αλλά το Rollbar είναι καλύτερο γιατί χρεώνει χρήματα για τον αριθμό των σφαλμάτων, π.χ. τα ενθαρρύνει να τα διορθώσουν.

Όσον αφορά τις ειδοποιήσεις, θα επαναλάβω ότι δεν πρέπει να στέλνετε ανεπιθύμητα μηνύματα, καθώς θα χαθεί η προσοχή σας.

Τι χρειάζεται γενικά να αναλυθεί;

RPS και χρόνος απόκρισης - εάν ο χρόνος απόκρισης αρχίσει να μειώνεται, τότε πρέπει να κάνουμε κάτι.

Ο αριθμός των διεργασιών, των νημάτων και των μεγεθών ουρών - αν όλα αυτά αρχίσουν να πολλαπλασιάζονται, να φράζουν κ.λπ., τότε κάτι δεν πάει καλά εδώ ξανά, πρέπει να το αναλύσουμε λεπτομερέστερα και να αλλάξουμε με κάποιο τρόπο την υποδομή.

Αξίζει επίσης να εξετάσετε την ανάλυση των επιχειρήσεων. Google AnalyticsΕίναι εξαιρετικό για τύπους ιστότοπων και το mixpanel είναι εξαιρετικό για την καταγραφή συμβάντων, λειτουργεί σε εφαρμογές επιτραπέζιου υπολογιστή, εφαρμογές για κινητά και στον ιστό. Μπορείτε να γράψετε με βάση κάποια δικά σας δεδομένα, αλλά θα πρότεινα έτοιμες υπηρεσίες. Το θέμα είναι ότι η παρακολούθησή μας μπορεί να δείξει ότι η υπηρεσία είναι ζωντανή, ότι όλα λειτουργούν, ότι ο συνολικός χρόνος απόκρισης είναι κανονικός, αλλά όταν, ας πούμε, αρχίζουμε να παρακολουθούμε εγγραφές στο mixpanel, δείχνει ότι κατά κάποιο τρόπο δεν είναι αρκετές. Σε αυτήν την περίπτωση, πρέπει να εξετάσετε πόσο γρήγορα επεξεργάζονται ορισμένα συμβάντα και σελίδες και ποια είναι τα προβλήματα Το έργο πρέπει πάντα να "κρεμιέται" με ανάλυση για να γνωρίζετε πάντα τι συμβαίνει και να μην λειτουργεί στα τυφλά.

Το φορτίο, γενικά, προκύπτει είτε προγραμματισμένο είτε όχι, μπορεί να προκύψει σταδιακά, μπορεί όχι σταδιακά:

Πώς να αντιμετωπίσετε το φορτίο; Οι επιχειρήσεις αποφασίζουν τα πάντα και μόνο η τιμή του θέματος είναι σημαντική. Σπουδαίος:

  1. προς την η υπηρεσία λειτούργησε,
  2. για να μην είναι πολύ ακριβό και να μην χαλάσει την εταιρεία.

Τα υπόλοιπα δεν είναι πολύ σημαντικά.

Εάν είναι φθηνότερο το προφίλ, η βελτιστοποίηση, η εγγραφή στην κρυφή μνήμη, η διόρθωση ορισμένων παραμέτρων, τότε αυτό πρέπει να γίνει, χωρίς να σκεφτόμαστε την κλιμάκωση ή την αγορά πρόσθετου υλικού κ.λπ. Αλλά συμβαίνει ότι το υλικό γίνεται φθηνότερο από τη δουλειά ενός προγραμματιστή, ειδικά αν οι προγραμματιστές είναι πολύ έξυπνοι. Σε αυτήν την περίπτωση, η κλιμάκωση αρχίζει ήδη.

Στην εικόνα, το μπλε είναι το Διαδίκτυο από το οποίο προέρχονται τα αιτήματα. Έχει εγκατασταθεί ένας εξισορροπητής, το μόνο καθήκον του οποίου είναι η διανομή αιτημάτων σε ξεχωριστούς διακομιστές front-end, η αποδοχή απαντήσεων από αυτούς και η αποστολή τους στον πελάτη. Το θέμα εδώ είναι ότι 3 διακομιστές μπορούν να επεξεργαστούν (ιδανικά) 3 φορές περισσότερα αιτήματα, εξαιρουμένων των γενικών εξόδων για το δίκτυο και της εργασίας του ίδιου του εξισορροπητή.

Τι μας δίνει αυτό; Η προαναφερθείσα ικανότητα επεξεργασίας περισσότερων αιτημάτων, καθώς και αξιοπιστία. Αν μέσα παραδοσιακό σχέδιοΤο Nginx ή η εφαρμογή κολλάει ή έχει κολλήσει ο δίσκος κλπ, μετά σταματούν όλα. Εδώ, αν ένα από τα frontend μας αποτύχει, τότε δεν πειράζει, ο εξισορροπητής πιθανότατα θα το καταλάβει και θα στείλει αιτήματα στους υπόλοιπους 2 διακομιστές. Μπορεί να είναι λίγο πιο αργό, αλλά αυτό δεν είναι μεγάλη υπόθεση.

Σε γενικές γραμμές, η PHP είναι ιδανική για κλιμάκωση επειδή ακολουθεί την αρχή του Share τίποτα από προεπιλογή. Αυτό σημαίνει ότι αν πάρουμε, ας πούμε, Java για το web, τότε η εφαρμογή ξεκινά από εκεί, διαβάζει όλο τον κώδικα, γράφει όσο το δυνατόν περισσότερα δεδομένα στη μνήμη του προγράμματος, όλα περιστρέφονται εκεί, λειτουργεί, πολύ λίγος χρόνος ξοδεύεται στο αίτημα , πολύ λίγο επιπρόσθετοι πόροι. Ωστόσο, υπάρχει μια ενέδρα – γιατί. Η εφαρμογή είναι γραμμένη με τέτοιο τρόπο ώστε να πρέπει να εκτελείται σε μία περίπτωση, να αποθηκευτεί προσωρινά, να διαβαστεί από τη δική της μνήμη, τότε δεν θα προκύψει τίποτα καλό κατά την κλιμάκωση. Αλλά στην PHP δεν υπάρχει τίποτα κοινό από προεπιλογή, και αυτό είναι καλό. Οτιδήποτε θέλουμε να μοιραστούμε, το βάζουμε σε memcached και το memcached μπορεί να διαβαστεί από πολλούς διακομιστές, οπότε όλα είναι υπέροχα. Εκείνοι. Η χαλαρή σύζευξη επιτυγχάνεται για το επίπεδο διακομιστή εφαρμογών. Αυτό είναι υπέροχο.

Πώς να εξισορροπήσετε το φορτίο γενικά;

Τις περισσότερες φορές αυτό γινόταν από το Squid ή το HAProxy, αλλά αυτό ήταν πριν. Τώρα ο συγγραφέας του nginx πήρε και διαχώρισε τον εξισορροπητή από το nginx+ σε nginx, οπότε τώρα μπορεί να κάνει ό,τι έκανε το Squid ή το HAProxy. Εάν αρχίσει να αποτυγχάνει, μπορείτε να εγκαταστήσετε κάποιο δροσερό ακριβό εξισορροπητή υλικού.

Τα προβλήματα που επιλύει ο εξισορροπητής είναι πώς να επιλέξετε έναν διακομιστή και πώς να αποθηκεύσετε τις συνεδρίες; Το δεύτερο πρόβλημα είναι καθαρά PHP και ο διακομιστής μπορεί να επιλεγεί είτε ένας προς έναν από τη λίστα, είτε από τη γεωγραφία κάποιων IP, είτε από κάποια στατιστικά στοιχεία (το nginx υποστηρίζει το λιγότερο συνδεδεμένο, δηλαδή ποιος διακομιστής έχει λιγότερες συνδέσεις , θα πετάξει πάνω του). Μπορούμε να γράψουμε κάποιο κώδικα για τον εξισορροπητή που θα επιλέξει πώς θα λειτουργήσει.

Κι αν χτυπήσουμε έναν ισορροπιστή;

Υπάρχει κάτι όπως το DNS Round robin - αυτό είναι ένα υπέροχο κόλπο που μας επιτρέπει να μην ξοδεύουμε χρήματα σε εξισορροπητή υλικού. Τι κάνουμε? Παίρνουμε έναν διακομιστή DNS (συνήθως κανείς δεν φιλοξενεί διακομιστή DNS, είναι ακριβός, όχι πολύ αξιόπιστος, αν αποτύχει, τότε δεν θα βγει τίποτα καλό, όλοι χρησιμοποιούν κάποιο είδος εταιρείας), καταχωρούμε περισσότερους από έναν διακομιστές στο Α ρεκόρ, αλλά λίγα. Αυτά θα είναι A-records από διαφορετικούς εξισορροπητές. Όταν το πρόγραμμα περιήγησης πηγαίνει εκεί (στην πραγματικότητα, δεν υπάρχουν εγγυήσεις, αλλά τα πάντα σύγχρονα προγράμματα περιήγησηςΈτσι λειτουργούν), επιλέγει με τη σειρά του μια διεύθυνση IP από τις εγγραφές Α και καταλήγει είτε σε έναν εξισορροπητή είτε στον δεύτερο. Το φορτίο, φυσικά, μπορεί να μην κατανέμεται ομοιόμορφα, αλλά σύμφωνα με τουλάχιστον, λερώνει και ο εξισορροπητής αντέχει λίγο παραπάνω.

Τι να κάνετε με τις συνεδρίες;

Έχουμε συνεδρίες σε αρχεία από προεπιλογή. Αυτό δεν συμβαίνει, επειδή κάθε ένας από τους διακομιστές μας στο front-end θα διατηρεί τις συνεδρίες στο δικό του σύστημα αρχείων και ο χρήστης μπορεί να πάει πρώτα στο ένα, μετά στο δεύτερο και μετά στο τρίτο, δηλ. θα χάνει συνεδρίες κάθε φορά.

Υπάρχει μια προφανής επιθυμία να δημιουργηθεί ένα κοινό σύστημα αρχείων και να συνδεθεί το NFS. Αλλά δεν χρειάζεται να το κάνετε αυτό - είναι τρομερά αργό.

Μπορείτε να το γράψετε στη βάση δεδομένων, αλλά επίσης δεν αξίζει τον κόπο, γιατί Η βάση δεδομένων δεν είναι η βέλτιστη για αυτήν τη δουλειά, αλλά αν δεν έχετε άλλη επιλογή, τότε, καταρχήν, θα γίνει.

Μπορείτε να γράψετε στο memcached, αλλά πολύ, πολύ προσεκτικά, γιατί το memcached είναι, τελικά, μια κρυφή μνήμη και τείνει να διαγραφεί μόλις έχει λίγους πόρους ή δεν υπάρχει πού να γράψετε νέα κλειδιά - τότε αρχίζει να χάνει παλιά χωρίς προειδοποίηση, οι συνεδρίες αρχίζουν να χάνονται. Πρέπει είτε να το παρακολουθήσετε είτε να επιλέξετε το ίδιο Redis.

Το Redis είναι μια καλή λύση. Το θέμα είναι ότι έχουμε το Redis σε έναν ξεχωριστό διακομιστή, και όλα τα frontends μας σπεύδουν και αρχίζουν να διαβάζουν τις συνεδρίες τους από το Redis Το ίδιο nginx είναι εγκατεστημένο και ενημερώνεται ότι πρέπει να κάνει μια συνεδρία, ώστε όταν ο χρήστης έρθει στον διακομιστή και του δοθεί ένα cookie περιόδου λειτουργίας, στη συνέχεια να μεταβεί μόνο σε αυτόν τον διακομιστή αποδεικνύεται ότι εάν ο Redis είναι σε κάθε περίπτωση αναλόγως, υπάρχουν οι δικές τους συνεδρίες, και διακίνησηΗ ανάγνωση-εγγραφή θα είναι πολύ καλύτερη.

Τι γίνεται με τα cookies; Μπορείτε να γράψετε σε cookies, δεν θα υπάρχει χώρος αποθήκευσης, όλα είναι εντάξει, αλλά, πρώτον, πρέπει να βάλουμε κάπου τα δεδομένα της περιόδου σύνδεσης και, αν αρχίσουμε να γράφουμε σε cookies, μπορεί να αναπτυχθούν και να μην χωρούν στον αποθηκευτικό χώρο, αλλά , δεύτερον, μόνο τα αναγνωριστικά μπορούν να αποθηκευτούν στα cookies και θα πρέπει να επικοινωνήσουμε με τη βάση δεδομένων για ορισμένα δεδομένα περιόδου σύνδεσης. Κατ 'αρχήν, αυτό είναι φυσιολογικό, λύνει το πρόβλημα.

Υπάρχει ένα ωραίο πράγμα - ένας διακομιστής μεσολάβησης για το memcached και το Redis:

Φαίνονται να υποστηρίζουν την παραλληλοποίηση από το κουτί, αλλά αυτό γίνεται με τρόπο που δεν θα έλεγα ότι είναι πολύ βέλτιστο. Αλλά αυτό το πράγμα - twemproxy - λειτουργεί περίπου όπως το nginx με την PHP, δηλ. μόλις ληφθεί η απάντηση, στέλνει αμέσως τα δεδομένα και κλείνει τη σύνδεση στο παρασκήνιο, βγαίνει πιο γρήγορα και καταναλώνει λιγότερους πόρους. Πολύ καλό πράγμα.

Πολύ συχνά αυτό το σφάλμα «ποδηλασίας» συμβαίνει όταν αρχίζουν να γράφουν, όπως «Δεν χρειάζομαι συνεδρίες, τώρα θα φτιάξω ένα υπέροχο διακριτικό που θα μεταφερθεί πέρα ​​δώθε»... Αλλά, αν το σκεφτείς, τότε! αυτή είναι πάλι μια συνεδρία.

Η PHP έχει έναν τέτοιο μηχανισμό ως χειριστή συνεδρίας, π.χ. μπορούμε να βάλουμε το δικό μας πρόγραμμα χειρισμού και να γράψουμε σε cookies, στη βάση δεδομένων, στο Redis - οπουδήποτε, και όλα αυτά θα λειτουργήσουν με την τυπική έναρξη περιόδου λειτουργίας κ.λπ.

Οι συνεδρίες θα πρέπει να κλείσουν χρησιμοποιώντας αυτήν την υπέροχη μέθοδο.

Από τη στιγμή που έχουμε διαβάσει τα πάντα από τη συνεδρία, δεν πρόκειται να γράψουμε εκεί, πρέπει να κλείσει, γιατί η συνεδρία συχνά μπλοκάρεται. Μάλιστα, θα πρέπει να αποκλειστεί, γιατί χωρίς αποκλεισμό θα υπάρξουν προβλήματα με τον ανταγωνισμό. Αυτό είναι άμεσα ορατό σε αρχεία σε άλλους αποθηκευτικούς χώρους, οι αποκλειστές δεν είναι διαθέσιμοι για ολόκληρο το αρχείο ταυτόχρονα και αυτό είναι λίγο πιο εύκολο.

Τι να κάνετε με τα αρχεία;

Μπορείτε να τα αντιμετωπίσετε με δύο τρόπους:

  1. κάποια εξειδικευμένη λύση που παρέχει μια αφαίρεση και εργαζόμαστε με αρχεία ως σύστημα αρχείων. Είναι κάτι σαν NFS, αλλά το NFS δεν χρειάζεται.
  2. "sharding" με χρήση PHP.

Εξειδικευμένες λύσεις από αυτό που πραγματικά λειτουργεί είναι το GlusterFS. Αυτό είναι κάτι που μπορείτε να ορίσετε στον εαυτό σας. Λειτουργεί, είναι γρήγορο, δίνει την ίδια διεπαφή με το NFS, μόνο που λειτουργεί σε κανονική ανεκτή ταχύτητα.

Και το Amazon S3 είναι, αν βρίσκεστε στο Amazon cloud, επίσης ένα καλό σύστημα αρχείων.

Εάν υλοποιείτε από την πλευρά της PHP, υπάρχει μια υπέροχη βιβλιοθήκη Flysystem, καλυμμένη με εξαιρετικά τεστ, μπορεί να χρησιμοποιηθεί για εργασία με όλα τα είδη συστημάτων αρχείων, κάτι που είναι πολύ βολικό. Εάν γράψετε αμέσως όλη την εργασία με αρχεία με αυτήν τη βιβλιοθήκη, τότε η μεταφορά από το τοπικό σύστημα αρχείων στο Amazon S3 ή σε άλλα θα είναι απλή - ξαναγράψτε τη γραμμή στη διαμόρφωση.

Πως δουλεύει? Ένας χρήστης κατεβάζει ένα αρχείο από ένα πρόγραμμα περιήγησης, μπορεί είτε να μεταβεί στη διεπαφή και από εκεί να εξαπλωθεί σε διακομιστές αρχείων ή σε κάθε διακομιστή αρχείωνΓίνεται ένα σενάριο μεταφόρτωσης και το αρχείο μεταφορτώνεται απευθείας στο σύστημα αρχείων. Λοιπόν, παράλληλα, γράφεται στη βάση δεδομένων ποιο αρχείο βρίσκεται σε ποιο διακομιστή και μπορούμε να το διαβάσουμε απευθείας από εκεί.

Είναι καλύτερο να διανέμετε αρχεία με nginx ή Varnish, αλλά είναι καλύτερο να κάνετε τα πάντα με το nginx, γιατί όλοι το αγαπάμε και το χρησιμοποιούμε - μπορεί να το χειριστεί, είναι καλό.

Τι συμβαίνει με τη βάση δεδομένων μας;

Εάν όλα καταλήγουν στον κώδικα PHP, φτιάχνουμε ένα σωρό frontends και εξακολουθούμε να στρέφουμε σε μία βάση δεδομένων - θα αντεπεξέλθει για πολύ καιρό. Εάν το φορτίο δεν είναι τρομερό, τότε η βάση δεδομένων ζει καλά. Για παράδειγμα, κάναμε JOIN 160 εκατομμυρίων σειρών σε έναν πίνακα και όλα ήταν υπέροχα, όλα πήγαν καλά, αλλά εκεί, ωστόσο, θα πρέπει να διατεθεί περισσότερη RAM σε buffers, στην προσωρινή μνήμη...

Τι να κάνουμε με τη βάση δεδομένων αν την αντιμετωπίσουμε; Υπάρχουν τεχνικές όπως η αναπαραγωγή. Συνήθως υπάρχει αντιγραφή master-slave και υπάρχει master-master replication. Μπορείτε να κάνετε αναπαραγωγή χειροκίνητα, μπορείτε να κάνετε διαμοιρασμό και μπορείτε να κάνετε κατάτμηση.

Τι είναι ο κύριος σκλάβος;

Ένας διακομιστής επιλέγεται ως κύριος και μια δέσμη διακομιστών επιλέγονται ως δευτερεύοντες. Είναι γραμμένο στον κύριο, και μπορούμε να διαβάσουμε από τον κύριο, ή μπορούμε και από τους σκλάβους (στην εικόνα τα κόκκινα βέλη είναι αυτά που γράφουμε, τα πράσινα είναι αυτά που διαβάζουμε). Σε ένα τυπικό έργο, έχουμε πολύ περισσότερες ανάγνωση παρά γραφή. Υπάρχουν άτυπα έργα.

Στην περίπτωση ενός τυπικού έργου, ένας μεγάλος αριθμός υποτελών σάς επιτρέπει να ανακουφίσετε και τον κύριο και, γενικά, να αυξήσετε την ταχύτητα ανάγνωσης.

Αυτό παρέχει επίσης ανοχή σφαλμάτων - εάν ένας από τους σκλάβους αποτύχει, τότε δεν χρειάζεται να γίνει τίποτα. Εάν ο κύριος πέσει, μπορούμε γρήγορα να κάνουμε έναν από τους σκλάβους κύριο. Είναι αλήθεια ότι αυτό συνήθως δεν γίνεται αυτόματα, πρόκειται για κατάσταση έκτακτης ανάγκης, αλλά υπάρχει πιθανότητα.

Λοιπόν, και αντίγραφα ασφαλείας. Ο καθένας κάνει αντίγραφα ασφαλείας της βάσης δεδομένων διαφορετικά, μερικές φορές αυτό γίνεται με μια ένδειξη MySQL και παγώνει ολόκληρο το έργο, κάτι που δεν είναι πολύ καλό. Αλλά αν δημιουργήσετε ένα αντίγραφο ασφαλείας από κάποιο slave, έχοντας πρώτα το σταματήσει, ο χρήστης δεν θα παρατηρήσει τίποτα. Αυτό είναι υπέροχο.

Επιπλέον, βαρείς υπολογισμοί μπορούν να γίνουν σε σκλάβους για να μην επηρεαστεί η κύρια βάση, το κύριο έργο.

Υπάρχει κάτι σαν διαχωρισμός ανάγνωσης/εγγραφής Υπάρχουν 2 ομάδες διακομιστών - κύριος, υποτελής, σύνδεση κατά παραγγελία και η λογική επιλογής σύνδεσης ποικίλλει. Το θέμα είναι ότι αν διαβάζουμε πάντα από σκλάβους και γράφουμε πάντα στον αφέντη, τότε θα υπάρχει μια μικρή ενέδρα:

εκείνοι. Η αναπαραγωγή δεν πραγματοποιείται αμέσως και δεν υπάρχει καμία εγγύηση ότι έχει ολοκληρωθεί όταν κάνουμε οποιοδήποτε αίτημα.

Υπάρχουν δύο τύποι δειγμάτων:

  1. για ανάγνωση ή έξοδο.
  2. για εγγραφή, δηλ. όταν έχουμε επιλέξει κάτι και μετά αυτό το κάτι πρέπει να αλλάξει και να γραφτεί πίσω.

Εάν το δείγμα προορίζεται για εγγραφή, τότε μπορούμε πάντα να διαβάζουμε από τον κύριο και να γράφουμε στον κύριο, ή μπορούμε να εκτελέσουμε το "SHOW SLAVE STATUS" και να δούμε το Seconds_Behind_Master εκεί (για PostgreSQL υπάρχει επίσης ένα υπερ-ερώτημα στην εικόνα) - θα μας δείξει τον αριθμό. Εάν είναι 0 (μηδέν), τότε όλα έχουν ήδη αναπαραχθεί και μπορείτε να διαβάσετε με ασφάλεια από το slave. Εάν ο αριθμός είναι μεγαλύτερος από το μηδέν, τότε πρέπει να εξετάσουμε την τιμή - είτε θα πρέπει να περιμένουμε λίγο και μετά να διαβάσουμε από το slave, είτε να διαβάσουμε αμέσως από τον κύριο. Εάν έχουμε NULL, σημαίνει ότι δεν το έχουμε αναπαραγάγει ακόμα, κάτι έχει κολλήσει και πρέπει να δούμε τα αρχεία καταγραφής.

Οι λόγοι για μια τέτοια καθυστέρηση είναι είτε αργό δίκτυο, είτε το αντίγραφο δεν μπορεί να αντεπεξέλθει, είτε υπάρχουν πάρα πολλοί σκλάβοι (περισσότεροι από 20 ανά 1 κύριο). Εάν το δίκτυο είναι αργό, τότε είναι σαφές ότι πρέπει με κάποιο τρόπο να επιταχυνθεί, να συλλεχθεί σε μεμονωμένα κέντρα δεδομένων κ.λπ. Εάν ένα αντίγραφο αποτύχει, τότε πρέπει να προσθέσετε αντίγραφα. Εάν υπάρχουν πάρα πολλοί σκλάβοι, τότε πρέπει να καταλήξετε σε κάτι ενδιαφέρον, πιθανότατα, να δημιουργήσετε κάποιο είδος ιεραρχίας.

Τι είναι ο τεχνίτης;

Αυτή είναι μια κατάσταση όπου υπάρχουν πολλοί διακομιστές, και τα πάντα γράφονται και διαβάζονται παντού. Το πλεονέκτημα είναι ότι μπορεί να είναι πιο γρήγορο, είναι ανεκτικό σε σφάλματα. Κατ 'αρχήν, όλα είναι ίδια όπως για τους σκλάβους, αλλά η λογική είναι γενικά απλή - απλώς επιλέγουμε μια τυχαία σύνδεση και δουλεύουμε μαζί της. Μειονεκτήματα: η καθυστέρηση αναπαραγωγής είναι μεγαλύτερη, υπάρχει πιθανότητα να ληφθούν κάποιου είδους ασυνεπή δεδομένα και εάν συμβεί κάποιο είδος ανάλυσης, τότε αρχίζει να εξαπλώνεται σε όλα τα κύρια και κανείς δεν ξέρει ποιος κύριος είναι κανονικός, ποιος είναι σπασμένο... Εδώ αρχίζει το όλο θέμα να επαναλαμβάνεται σε κύκλο, δηλ. Φράζει πολύ καλά το δίκτυο. Γενικά, αν έπρεπε να κάνεις master-master, πρέπει να σκεφτείς 100 φορές. Πιθανότατα, μπορείτε να τα βγάλετε πέρα ​​με έναν κύριο σκλάβο.

Μπορείτε πάντα να κάνετε αναπαραγωγή χειροκίνητα, π.χ. οργανώστε μερικές συνδέσεις και γράψτε σε 2, 3 ταυτόχρονα ή κάντε κάτι στο παρασκήνιο.

Τι είναι το Sharding;

Στην πραγματικότητα, αυτό διαχέει δεδομένα σε πολλούς διακομιστές. Μπορείτε να θρυμματίσετε ξεχωριστά τραπέζια. Ας πάρουμε, για παράδειγμα, έναν πίνακα φωτογραφιών, έναν πίνακα χρηστών κ.λπ., και ας τους τραβήξουμε σε ξεχωριστούς διακομιστές. Εάν οι πίνακες ήταν μεγάλοι, τότε όλα γίνονται μικρότερα, καταναλώνεται λιγότερη μνήμη, όλα είναι εντάξει, αλλά δεν μπορείτε να κάνετε JOIN και πρέπει να κάνετε ερωτήσεις όπως WHERE IN, δηλαδή πρώτα επιλέγουμε μια δέσμη αναγνωριστικών και μετά αντικαθιστούμε όλα αυτά τα αναγνωριστικά στο ερώτημα, αλλά σε άλλη σύνδεση, σε άλλο διακομιστή.

Μπορείτε να μοιραστείτε μέρος των ίδιων δεδομένων, δηλαδή, για παράδειγμα, λαμβάνουμε και δημιουργούμε πολλές βάσεις δεδομένων με χρήστες.

Μπορείτε απλά να επιλέξετε έναν διακομιστή - το υπόλοιπο της διαίρεσης με τον αριθμό των διακομιστών. Μια εναλλακτική είναι να πάρεις κάρτα, π.χ. Για κάθε εγγραφή, κρατήστε το κλειδί τιμής σε κάποια Redis ή παρόμοια, δηλαδή πού βρίσκεται κάθε εγγραφή.

Υπάρχει μια πιο εύκολη επιλογή:

Είναι πιο δύσκολο όταν δεν μπορείτε να ομαδοποιήσετε τα δεδομένα. Πρέπει να γνωρίζετε το αναγνωριστικό δεδομένων για να το αποκτήσετε. Χωρίς ΣΥΜΜΕΤΟΧΗ, ΠΑΡΑΓΓΕΛΙΑ κ.λπ. Στην πραγματικότητα, μειώνουμε τη MySQL ή την PostgreSQL μας σε κατάστημα αξίας κλειδιού, επειδή δεν μπορούμε να κάνουμε τίποτα με αυτά.

Οι συνηθισμένες εργασίες γίνονται έκτακτες:

  • Επιλέξτε TOP 10.
  • Ανάλυση σελίδας.
  • Επιλέξτε αυτό με το χαμηλότερο κόστος.
  • Επιλέξτε αναρτήσεις από τον χρήστη X.

Αν το μοιράσαμε τόσο πολύ που τα πάντα διασκορπίστηκαν σε όλους τους διακομιστές, αυτό αρχίζει να λύνεται με έναν πολύ μη τετριμμένο τρόπο. Σε αυτήν την περίπτωση, τίθεται το ερώτημα - γιατί χρειαζόμαστε καθόλου SQL; Δεν πρέπει να γράψουμε αμέσως στον Redis; Επιλέξαμε τη σωστή εγκατάσταση αποθήκευσης;

Εκτός συσκευασίας, η κοινή χρήση υποστηρίζεται από πράγματα όπως:

  • memcache?
  • Redis;
  • Κασσάνδρα (αλλά λένε ότι κάποια στιγμή δεν αντέχει και αρχίζει να πέφτει).

Τι γίνεται με τα στατιστικά;

Συχνά τους αρέσει να υπολογίζουν στατιστικά στοιχεία από τον κύριο διακομιστή - από έναν μόνο διακομιστή βάσης δεδομένων. Αυτό είναι υπέροχο, αλλά τα ερωτήματα στα στατιστικά είναι συνήθως ανατριχιαστικά, πολυσέλιδα κ.λπ., επομένως ο υπολογισμός στατιστικών στοιχείων για τα κύρια δεδομένα είναι μεγάλο λάθος. Στις περισσότερες περιπτώσεις, ο πραγματικός χρόνος δεν είναι απαραίτητος για στατιστικά στοιχεία, επομένως μπορούμε να ρυθμίσουμε την αναπαραγωγή στο κύριο slave και να υπολογίσουμε αυτά τα στατιστικά στοιχεία στον slave. Ή μπορούμε να πάρουμε κάτι έτοιμο - Mixpanel, Google Analytics ή παρόμοια.

Αυτή είναι η κύρια ιδέα που βοηθά στη διανομή των πάντων σε διαφορετικούς διακομιστές και κλίμακα. Πρώτον, το κέρδος από αυτό είναι άμεσα ορατό - ακόμα κι αν έχετε έναν διακομιστή και αρχίσετε να κάνετε κάτι στο παρασκήνιο, ο χρήστης λαμβάνει μια απάντηση πολύ πιο γρήγορα, αλλά και στη συνέχεια κατανέμει το φορτίο, δηλ. Μπορούμε να σύρουμε όλη αυτή την επεξεργασία σε άλλο διακομιστή, μπορούμε ακόμη και να την επεξεργαστούμε όχι σε PHP. Για παράδειγμα, στο Stay.com, οι εικόνες αλλάζουν μέγεθος στο Go.

Μπορείτε να πάρετε αμέσως το Gearman. Αυτό είναι ένα έτοιμο πράγμα για επεξεργασία στο παρασκήνιο. Είναι κάτω από Βιβλιοθήκες PHP, προγράμματα οδήγησης... Ή μπορείτε να χρησιμοποιήσετε ουρές, π.χ. ActiveMQ, RabbitMQ, αλλά προωθεί μόνο μηνύματα που δεν καλούν ούτε εκτελούν οι ίδιοι τους χειριστές και, στη συνέχεια, θα πρέπει να καταλήξετε σε κάτι.

Γενική σημασίαυπάρχει πάντα ένα - υπάρχει το κύριο λογισμικό που τοποθετεί ορισμένα δεδομένα στην ουρά (συνήθως αυτό είναι "τι να κάνω;" και δεδομένα για αυτό), και κάποια υπηρεσία - είτε το λαμβάνει είτε του αποστέλλεται (αν η ουρά μπορεί να συμπεριφέρεται ενεργά) Αυτά τα δεδομένα υποβάλλονται σε επεξεργασία στο παρασκήνιο.

Ας περάσουμε στην αρχιτεκτονική.

Το πιο σημαντικό πράγμα κατά την κλιμάκωση είναι να κάνετε το έργο όσο το δυνατόν λιγότερο συνδεδεμένο. Όσο λιγότερη συνδεσιμότητα, τόσο πιο εύκολο είναι να αλλάξετε μια λύση σε άλλη, τόσο πιο εύκολο είναι να μετακινήσετε ένα μέρος σε άλλο διακομιστή.

Η συνοχή συμβαίνει στον κώδικα. Το SOLID, το GRASP είναι αρχές που σας επιτρέπουν να αποφύγετε τη σύζευξη στον κώδικα. Αλλά η συνδεσιμότητα στον κώδικα, φυσικά, επηρεάζει τη διανομή μεταξύ των διακομιστών, αλλά όχι τόσο όσο τη συνδεσιμότητα του επιπέδου τομέα με το περιβάλλον μας. Εάν γράψουμε πολύ κώδικα στον ελεγκτή, αποδεικνύεται ότι πιθανότατα δεν θα μπορούμε να τον χρησιμοποιήσουμε αλλού. Δεν θα είναι εύκολο για εμάς να μεταφέρουμε όλα αυτά από τον ελεγκτή web στην κονσόλα και, κατά συνέπεια, θα είναι πιο δύσκολο να τα μεταφέρουμε σε άλλους διακομιστές και να τα επεξεργαστούμε διαφορετικά εκεί.

Αρχιτεκτονική Προσανατολισμού Υπηρεσιών.

Υπάρχουν 2 προσεγγίσεις για τη διάσπαση των συστημάτων σε μέρη:

    όταν εστιάζουν σε τεχνικά μέρη, δηλαδή, για παράδειγμα, υπάρχει μια ουρά, αφαίρεσαν την υπηρεσία ουράς, υπάρχει επεξεργασία εικόνας, αφαίρεσαν αυτήν την υπηρεσία κ.λπ.

    Αυτό είναι καλό, αλλά όταν αυτές οι ουρές, οι εικόνες κ.λπ. αλληλεπιδρούν σε δύο τομείς τομέα... Για παράδειγμα, σε ένα έργο υπάρχει μια περιοχή πωλήσεων και μια περιοχή πελατών - αυτοί είναι διαφορετικοί τομείς, συνεργάζονται με διαφορετικούς χρήστες, αλλά και οι δύο έχουν διαφορετικές ουρές. Όταν όλα αρχίζουν να πέφτουν μαζί, το έργο γίνεται χάος.

    σωστή λύση- σπάστε σε ξεχωριστά λογικά μέρη, π.χ. εάν οι περιοχές Πωλήσεις και Πελάτες χρησιμοποιούν το μοντέλο χρήστη, τότε δημιουργούμε 2 μοντέλα χρηστών. Μπορούν να διαβάσουν τα ίδια δεδομένα, αλλά τα παρουσιάζουν ελαφρώς διαφορετικά. Εάν καταρρίψετε το σύστημα με αυτόν τον τρόπο, τότε όλα γίνονται αντιληπτά πολύ καλύτερα και είναι πολύ πιο εύκολο να τα διασκορπίσετε όλα.

    Ένα άλλο σημαντικό πράγμα είναι ότι τα εξαρτήματα πρέπει πάντα να επικοινωνούν μέσω διεπαφών. Έτσι, στο παράδειγμά μας, αν το Sales αλληλεπιδράσει με κάτι, τότε δεν γράφει στη βάση δεδομένων, δεν χρησιμοποιεί γενικό μοντέλο, και «συνομιλεί» σε άλλους τομείς μέσω συγκεκριμένης σύμβασης.

Τι γίνεται με το επίπεδο τομέα;

Το επίπεδο τομέα χωρίζεται σε ορισμένες υπηρεσίες κ.λπ. - αυτό είναι σημαντικό για την ανάπτυξη μιας εφαρμογής, αλλά για την κλιμάκωση του σχεδιασμού της δεν είναι πολύ σημαντικό. Στο επίπεδο τομέα, είναι εξαιρετικά σημαντικό να το διαχωρίσουμε από το περιβάλλον, το πλαίσιο στο οποίο εκτελείται, δηλ. από τον ελεγκτή, το περιβάλλον της κονσόλας κ.λπ., ώστε όλα τα μοντέλα να μπορούν να χρησιμοποιηθούν σε οποιοδήποτε πλαίσιο.

Υπάρχουν 2 βιβλία σχετικά με το επίπεδο τομέα που προτείνω σε όλους:

  • "Domain-Driven Design: Tackling Complexity in the Heart of Software" του Eric Evans,
  • "Εφαρμογή σχεδίασης βάσει τομέα, υλοποίηση σχεδίασης βάσει τομέα."
  • σχετικά με το BoundedContext - http://martinfowler.com/bliki/BoundedContext.html (αυτό που αναφέρθηκε παραπάνω - εάν οι δύο περιοχές σας φαίνεται να τέμνονται, αλλά είναι διαφορετικές, τότε αξίζει να αντιγράψετε ορισμένες οντότητες, όπως το μοντέλο χρήστη).
  • για το DDD γενικά - σύνδεσμος σε άλλο βιβλίο.

Στην αρχιτεκτονική, πάλι, αξίζει να τηρήσουμε την αρχή του μοιράσματος τίποτα, δηλ. αν θέλετε να κάνετε κάτι κοινό, να το κάνετε πάντα συνειδητά. Είναι προτιμότερο να βάλετε τη λογική στην πλευρά της εφαρμογής, αλλά αξίζει να ξέρετε πότε να σταματήσετε. Δεν πρέπει ποτέ, για παράδειγμα, να δημιουργήσετε αποθηκευμένες διαδικασίες σε ένα DBMS, γιατί η κλιμάκωση είναι πολύ δύσκολη. Εάν το μεταφέρουμε στην πλευρά της εφαρμογής, τότε γίνεται ευκολότερο - θα δημιουργήσουμε αρκετούς διακομιστές και όλα θα εκτελεστούν εκεί.

Μην υποτιμάτε τη βελτιστοποίηση του προγράμματος περιήγησης. Όπως είπα ήδη, από τα 300-600 ms που εκτελούνται αιτήματα στον διακομιστή, προστίθενται 300-600 ms, τα οποία δαπανώνται στον πελάτη. Ο πελάτης δεν ενδιαφέρεται αν ο διακομιστής μας είναι γρήγορος ή αν ο ιστότοπος λειτουργεί τόσο γρήγορα, γι' αυτό σας συμβουλεύω να χρησιμοποιήσετε το Google PageSpeed ​​κ.λπ.

Ως συνήθως, η αφαίρεση και ο κατακερματισμός δεν είναι καθόλου δωρεάν. Εάν χωρίσουμε την υπηρεσία σε πολλές μικροϋπηρεσίες, τότε δεν θα μπορούμε πλέον να συνεργαζόμαστε με νεοφερμένους και θα πρέπει να πληρώσουμε πολλά, πολλά στην ομάδα μας, η οποία θα ψάξει όλα αυτά, θα ταξινομήσει όλα τα επίπεδα, επιπλέον , η υπηρεσία μπορεί να αρχίσει να λειτουργεί πιο αργά. Αν αυτό δεν είναι τρομακτικό σε μεταγλωττισμένες γλώσσες, τότε στην PHP, τουλάχιστον μέχρι την έκδοση 7, αυτό δεν είναι πολύ...

Μην ενεργείτε ποτέ στα τυφλά, πάντα παρακολουθείτε και αναλύετε. Τυφλά, σχεδόν όλες οι προεπιλεγμένες αποφάσεις είναι λανθασμένες. Νομίζω! Μην πιστεύετε ότι υπάρχει ασημένια σφαίρα, ελέγχετε πάντα.

Μερικοί ακόμη χρήσιμοι σύνδεσμοι:



Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: