Προγραμματισμός

Ομαδοποίηση J2EE, Μέρος 1

Οι επιχειρήσεις επιλέγουν Java 2, Enterprise Edition (J2EE) για να παραδώσουν τις κρίσιμες αποστολές εφαρμογές τους μέσω του Διαδικτύου. Στο πλαίσιο του J2EE, οι συστάδες παρέχουν κρίσιμες αποστολές υπηρεσίες για να εξασφαλίσουν ελάχιστο χρόνο διακοπής λειτουργίας και μέγιστη επεκτασιμότητα. Ένα σύμπλεγμα είναι μια ομάδα διακομιστών εφαρμογών που εκτελούν με διαφάνεια την εφαρμογή J2EE σαν να ήταν μία οντότητα. Για κλιμάκωση, θα πρέπει να συμπεριλάβετε επιπλέον μηχανήματα στο σύμπλεγμα. Για να ελαχιστοποιήσετε το χρόνο διακοπής λειτουργίας, βεβαιωθείτε ότι κάθε στοιχείο του συμπλέγματος είναι περιττό.

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

Για να εφαρμόσουμε τις γνώσεις μας που συγκεντρώθηκαν πρόσφατα στον πραγματικό κόσμο, θα δούμε πώς το HP Bluestone Total-e-Server 7.2.1, το Sybase Enterprise Application Server 3.6, το SilverStream Application Server 3.7 και το BEA WebLogic Server 6.0 εφαρμόζουν κάθε ομάδα.

Στο Μέρος 2 αυτής της σειράς, θα καλύψουμε στρατηγικές προγραμματισμού και ανακατεύθυνσης για συμπλέγματα, καθώς και δοκιμή των τεσσάρων προϊόντων διακομιστή εφαρμογών για να δούμε πώς κλιμακώνονται και ανακατεύονται.

Ορίστηκαν συστάδες

Οι προμηθευτές διακομιστών εφαρμογών J2EE ορίζουν ένα σύμπλεγμα ως ομάδα μηχανημάτων που συνεργάζονται για την παροχή διαφανών εταιρικών υπηρεσιών (υποστήριξη για JNDI, EJB, JSP, HttpSession και ανακατεύθυνση στοιχείων και ούτω καθεξής). Αφήνουν τον ορισμό εσκεμμένα αόριστο, επειδή κάθε πωλητής εφαρμόζει διαφορετικούς συνδυασμούς. Στο ένα άκρο των πωλητών ανάπαυσης φάσματος που έβαλαν έναν αποστολέα μπροστά σε μια ομάδα ανεξάρτητων μηχανών, κανένας από τους οποίους δεν έχει γνώση των άλλων μηχανών στο σύμπλεγμα. Σε αυτό το σχήμα, ο διεκπεραιωτής λαμβάνει ένα αρχικό αίτημα από έναν χρήστη και απαντά με μια κεφαλίδα ανακατεύθυνσης HTTP για να καρφιτσώσει τον πελάτη σε έναν συγκεκριμένο διακομιστή μέλους του συμπλέγματος. Στο άλλο άκρο του φάσματος βρίσκονται προμηθευτές που εφαρμόζουν μια ομοσπονδία σφιχτά ενσωματωμένων μηχανημάτων, με κάθε μηχάνημα να γνωρίζει πλήρως τα άλλα μηχανήματα γύρω από αυτό μαζί με τα αντικείμενα αυτών των μηχανών.

Εκτός από τις μηχανές, οι συστάδες μπορούν να περιλαμβάνουν πλεονάζοντα και ικανά failover:

  • Ισορροπία φορτίων: Μεμονωμένα σημεία εισόδου στο σύμπλεγμα και στους διευθυντές κίνησης σε μεμονωμένους διακομιστές Web ή εφαρμογών
  • Διακομιστές Web
  • Δρομολογητές πύλης: Σημεία εξόδου από ένα εσωτερικό δίκτυο
  • Διακόπτες πολλαπλών επιπέδων: Φίλτρα πακέτων και πλαισίων για να διασφαλιστεί ότι κάθε μηχάνημα στο σύμπλεγμα λαμβάνει μόνο πληροφορίες σχετικές με αυτό το μηχάνημα
  • Τείχη προστασίας: Σύμπλεγμα προστασίας από χάκερ φιλτράροντας την πρόσβαση σε επίπεδο θύρας στο σύμπλεγμα και στο εσωτερικό δίκτυο
  • Διακόπτες SAN (Storage Area Networking): Συνδέστε τους διακομιστές εφαρμογών, τους διακομιστές Web και τις βάσεις δεδομένων σε ένα μέσο αποθήκευσης backend. Διαχειριστείτε σε ποιον φυσικό δίσκο θα γράψετε δεδομένα. και ανακατεύθυνση
  • Βάσεις δεδομένων

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

Επεκτασιμότητα

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

Μεγάλη διαθεσιμότητα

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

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

Τύποι συμπλέγματος

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

Αντίθετα, ένα σύμπλεγμα κοινόχρηστου δίσκου χρησιμοποιεί μια συσκευή αποθήκευσης που χρησιμοποιούν όλοι οι διακομιστές εφαρμογών για να αποκτήσουν τις εφαρμογές που εκτελούνται στο σύμπλεγμα. Ενημερώσεις και βελτιώσεις συμβαίνουν σε ένα μόνο σύστημα αρχείων και όλα τα μηχανήματα του συμπλέγματος μπορούν να έχουν πρόσβαση στις αλλαγές. Μέχρι πρόσφατα, ένα μειονέκτημα αυτής της προσέγγισης ήταν το μοναδικό σημείο αποτυχίας. Ωστόσο, το SAN δίνει μια λογική διεπαφή σε ένα περιττό μέσο αποθήκευσης για να παρέχει failover, failback και επεκτασιμότητα. (Για περισσότερες πληροφορίες σχετικά με το SAN, ανατρέξτε στην πλαϊνή γραμμή αποθήκευσης υποδομής.)

Κατά τη σύγκριση των εφαρμογών συμπλέγματος διακομιστών εφαρμογών J2EE, είναι σημαντικό να λάβετε υπόψη:

  • Υλοποίηση συμπλέγματος
  • Υπηρεσίες ανακατεύθυνσης συμπλεγμάτων και στοιχείων
  • Μετάβαση στο HttpSession
  • Μεμονωμένα σημεία αποτυχίας σε μια τοπολογία συμπλέγματος
  • Ευέλικτη τοπολογία
  • Συντήρηση

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

Υλοποίηση συμπλέγματος

Οι διακομιστές εφαρμογών J2EE εφαρμόζουν ομαδοποίηση γύρω από την εφαρμογή του JNDI (Java Naming and Directory Interface). Αν και το JNDI είναι η βασική υπηρεσία στην οποία βασίζονται οι εφαρμογές J2EE, είναι δύσκολο να εφαρμοστεί σε ένα σύμπλεγμα επειδή δεν μπορεί να συνδέσει πολλά αντικείμενα σε ένα μόνο όνομα. Υπάρχουν τρεις γενικές μέθοδοι συμπλέγματος σε σχέση με την υλοποίηση JNDI κάθε διακομιστή εφαρμογών:

  • Ανεξάρτητος
  • Κεντρική
  • Κοινόχρηστο παγκόσμιο

Ανεξάρτητο δέντρο JNDI

Ο διακομιστής HP Bluestone Total-e-Server και SilverStream Application χρησιμοποιούν ένα ανεξάρτητο δέντρο JNDI για κάθε διακομιστή εφαρμογών. Οι διακομιστές μελών σε ένα ανεξάρτητο σύμπλεγμα δέντρων JNDI δεν γνωρίζουν ούτε ενδιαφέρονται για την ύπαρξη άλλων διακομιστών στο σύμπλεγμα. Επομένως, το failover δεν υποστηρίζεται ή παρέχεται μέσω ενδιάμεσων υπηρεσιών που ανακατευθύνουν αιτήματα HTTP ή EJB. Αυτές οι ενδιάμεσες υπηρεσίες έχουν ρυθμιστεί ώστε να γνωρίζουν πού βρίσκεται κάθε στοιχείο του συμπλέγματος και πώς να φτάσετε σε ένα εναλλακτικό στοιχείο σε περίπτωση αποτυχίας.

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

Ωστόσο, υπάρχουν πολλές αδυναμίες. Πρώτον, το failover είναι συνήθως ευθύνη του προγραμματιστή. Δηλαδή, επειδή το δέντρο JNDI κάθε διακομιστή εφαρμογών είναι ανεξάρτητο, οι απομακρυσμένοι διακομιστές μεσολάβησης που ανακτήθηκαν μέσω του JNDI καρφιτσώνονται στον διακομιστή στον οποίο πραγματοποιήθηκε η αναζήτηση. Σε αυτό το σενάριο, εάν μια κλήση μεθόδου σε ένα EJB αποτύχει, ο προγραμματιστής πρέπει να γράψει επιπλέον κώδικα για να συνδεθεί σε έναν διεκπεραιωτή, να λάβει τη διεύθυνση ενός άλλου ενεργού διακομιστή, να κάνει μια άλλη αναζήτηση JNDI και να καλέσει ξανά την αποτυχημένη μέθοδο. Το Bluestone εφαρμόζει μια πιο περίπλοκη μορφή του ανεξάρτητου δέντρου JNDI κάνοντας κάθε αίτημα να περάσει από μια υπηρεσία διακομιστή μεσολάβησης EJB ή Proxy LBB (Load Balance Broker). Η υπηρεσία διακομιστή μεσολάβησης EJB διασφαλίζει ότι κάθε αίτημα EJB πηγαίνει σε μια ενεργή παρουσία UBS. Αυτό το σχήμα προσθέτει επιπλέον καθυστέρηση σε κάθε αίτημα, αλλά επιτρέπει αυτόματη ανακατεύθυνση μεταξύ των κλήσεων μεθόδου.

Κεντρικό δέντρο JNDI

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

Η λήψη αναφοράς σε ένα EJB σε ένα κεντρικό σύμπλεγμα δέντρων JNDI είναι μια διαδικασία δύο βημάτων. Πρώτον, ο πελάτης αναζητά ένα οικιακό αντικείμενο από έναν διακομιστή ονόματος, ο οποίος επιστρέφει μια διαλειτουργική αναφορά αντικειμένου (IOR). Ένα IOR δείχνει πολλά ενεργά μηχανήματα στο σύμπλεγμα που έχουν το αρχικό αντικείμενο. Δεύτερον, ο πελάτης επιλέγει την πρώτη θέση διακομιστή στο IOR και αποκτά το σπίτι και το τηλεχειριστήριο. Εάν υπάρχει αποτυχία μεταξύ της επίκλησης μεθόδου EJB, το στέλεχος CORBA εφαρμόζει λογική για την ανάκτηση άλλου σπιτιού ή απομακρυσμένου από έναν εναλλακτικό διακομιστή που αναφέρεται στο IOR που επιστρέφεται από το διακομιστή ονόματος.

Οι ίδιοι οι διακομιστές ονομάτων δείχνουν μια αδυναμία του κεντρικού συμπλέγματος δέντρων JNDI. Συγκεκριμένα, εάν έχετε ένα σύμπλεγμα 50 μηχανημάτων, εκ των οποίων τα πέντε είναι διακομιστές ονομάτων, το σύμπλεγμα καθίσταται άχρηστο εάν και οι πέντε διακομιστές ονομάτων πέσουν. Πράγματι, τα άλλα 45 μηχανήματα θα μπορούσαν να λειτουργήσουν, αλλά το σύμπλεγμα δεν θα εξυπηρετήσει έναν μόνο πελάτη EJB ενώ οι διακομιστές ονομάτων είναι εκτός λειτουργίας.

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

Τέλος, οι συγκεντρωτικές συστάδες δέντρων JNDI υποφέρουν από αυξημένο χρόνο έως τη σύγκλιση καθώς το σύμπλεγμα μεγαλώνει σε μέγεθος. Δηλαδή, καθώς κλιμακώνετε το σύμπλεγμα, πρέπει να προσθέσετε περισσότερους διακομιστές ονομάτων. Λάβετε υπόψη ότι η γενικά αποδεκτή αναλογία μηχανών διακομιστή ονομάτων προς συνολικά μηχανήματα συμπλέγματος είναι 1:10, με ελάχιστο αριθμό δύο διακομιστών ονομάτων. Επομένως, εάν έχετε ένα σύμπλεγμα 10 μηχανών με δύο διακομιστές ονομάτων, ο συνολικός αριθμός συνδέσμων μεταξύ διακομιστή και διακομιστή ονομάτων είναι 20. Σε ένα σύμπλεγμα 40 μηχανών με τέσσερις διακομιστές ονομάτων, θα υπάρχουν 160 δεσμεύσεις. Κάθε δέσμευση αντιπροσωπεύει μια διαδικασία όπου ένας διακομιστής μέλους συνδέει όλα τα αντικείμενά του στο δέντρο JNDI ενός διακομιστή ονόματος. Έχοντας αυτό υπόψη, το συγκεντρωτικό σύμπλεγμα δέντρων JNDI έχει το χειρότερο χρόνο σύγκλισης μεταξύ όλων των υλοποιήσεων συμπλέγματος JNDI.

Κοινόχρηστο παγκόσμιο δέντρο JNDI

Τέλος, το BEA WebLogic εφαρμόζει ένα κοινό παγκόσμιο δέντρο JNDI. Με αυτήν την προσέγγιση, όταν ξεκινά ένας διακομιστής στο σύμπλεγμα, ανακοινώνει την ύπαρξή του και το δέντρο JNDI στους άλλους διακομιστές του συμπλέγματος μέσω IP (Internet Protocol) multicast. Κάθε μηχανή συμπλέγματος συνδέει τα αντικείμενά της στο κοινό παγκόσμιο δέντρο JNDI, καθώς και στο δικό του τοπικό δέντρο JNDI.

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

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

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

Όλα αυτά πρέπει να ληφθούν με έναν κόκκο αλατιού, επειδή JSPs, servlets, EJBs και JavaBeans που εκτελούνται στον διακομιστή εφαρμογών μπορούν να επωφεληθούν από τη συνεκπροσώπησή τους στον διακομιστή EJB. Θα χρησιμοποιούν πάντα μια αναζήτηση JNDI κατά τη διαδικασία. Λάβετε υπόψη ότι εάν εκτελείτε μόνο εφαρμογές από διακομιστή, υπάρχει μικρή διαφορά μεταξύ των ανεξάρτητων, κεντρικών ή κοινόχρηστων καθολικών εφαρμογών συμπλέγματος. Πράγματι, κάθε αίτημα HTTP θα καταλήξει σε έναν διακομιστή εφαρμογών που θα κάνει μια αναζήτηση JNDI σε διαδικασία για να επιστρέψει οποιοδήποτε αντικείμενο χρησιμοποιείται στην εφαρμογή σας από τον διακομιστή.

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

Υπηρεσίες συμπλέγματος και ανακατεύθυνσης

$config[zx-auto] not found$config[zx-overlay] not found