Εκτελέστε το Keycloak σε λειτουργία HA στο Kubernetes

Εκτελέστε το Keycloak σε λειτουργία HA στο Kubernetes

TL? DR: θα υπάρχει περιγραφή του Keycloak, ενός συστήματος ελέγχου πρόσβασης ανοιχτού κώδικα, ανάλυση της εσωτερικής συσκευής, λεπτομέρειες διαμόρφωσης.

Εισαγωγή και βασικές ιδέες

Σε αυτό το άρθρο, θα δούμε τις κύριες ιδέες που πρέπει να έχετε κατά νου κατά την ανάπτυξη ενός συμπλέγματος Keycloak πάνω από το Kubernetes.

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

Το Keycloak είναι ένα πολύπλοκο σύστημα γραμμένο σε Java και χτισμένο πάνω σε διακομιστή εφαρμογών. άγρια ​​μύγα. Εν ολίγοις, είναι ένα πλαίσιο εξουσιοδότησης που δίνει στους χρήστες της εφαρμογής δυνατότητα ομοσπονδίας και SSO (single sign-on).

Σας προσκαλούμε να διαβάσετε την επίσημη δικτυακός τόπος ή Βικιπαίδεια για λεπτομερή κατανόηση.

Ξεκινήστε το Keycloak

Το Keycloak χρειάζεται δύο μόνιμες πηγές δεδομένων για να εκτελεστεί:

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

Το Keycloak λειτουργεί σε τέσσερις διαφορετικούς τρόπους:

  • Κανονικός - μία και μοναδική διεργασία, ρυθμισμένη μέσω αρχείου αυτόνομο.xml
  • κανονικό σύμπλεγμα (επιλογή υψηλής διαθεσιμότητας) - Όλες οι διεργασίες πρέπει να χρησιμοποιούν την ίδια διαμόρφωση, η οποία πρέπει να συγχρονιστεί χειροκίνητα. Οι ρυθμίσεις αποθηκεύονται σε ένα αρχείο standalone-ha.xml, επιπλέον, πρέπει να κάνετε μια κοινή πρόσβαση στη βάση δεδομένων και έναν εξισορροπητή φορτίου.
  • σύμπλεγμα τομέα - Η εκκίνηση του συμπλέγματος σε κανονική λειτουργία γίνεται γρήγορα μια εργασία ρουτίνας και βαρετή καθώς το σύμπλεγμα μεγαλώνει, καθώς κάθε φορά που αλλάζετε τη διαμόρφωση, πρέπει να κάνετε όλες τις αλλαγές σε κάθε κόμβο του συμπλέγματος. Ο τρόπος λειτουργίας τομέα επιλύει αυτό το ζήτημα ρυθμίζοντας κάποιο κοινόχρηστο χώρο αποθήκευσης και δημοσιεύοντας τη διαμόρφωση. Αυτές οι ρυθμίσεις αποθηκεύονται σε ένα αρχείο domain.xml
  • Αντιγραφή μεταξύ κέντρων δεδομένων - σε περίπτωση που θέλετε να εκτελέσετε το Keycloak σε ένα σύμπλεγμα πολλών κέντρων δεδομένων, πιο συχνά σε διαφορετικές γεωγραφικές τοποθεσίες. Σε αυτήν την επιλογή, κάθε κέντρο δεδομένων θα έχει το δικό του σύμπλεγμα διακομιστών Keycloak.

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

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

Κανονικό σύμπλεγμα κλειδιών

Για να εκτελέσετε το Keycloak σε αυτήν τη λειτουργία, χρειάζεστε:

  • δημιουργήστε μια εξωτερική κοινόχρηστη βάση δεδομένων
  • εγκαταστήστε εξισορροπητή φορτίου
  • έχουν εσωτερικό δίκτυο με υποστήριξη ip multicast

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

Για να κατανοήσετε καλύτερα πώς λειτουργεί το Keycloak σε ένα σύμπλεγμα ανακατεύθυνσης (HA), είναι σημαντικό να γνωρίζετε πόσο εξαρτώνται όλα από τις ικανότητες ομαδοποίησης του Wildfly.

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

  • mod_cluster: λειτουργεί σε συνδυασμό με το Apache ως εξισορροπητής φορτίου HTTP, εξαρτάται από το TCP multicast για την προεπιλεγμένη ανακάλυψη κεντρικού υπολογιστή. Μπορεί να αντικατασταθεί από εξωτερικό εξισορροπητή.

  • infinispan: κατανεμημένη κρυφή μνήμη χρησιμοποιώντας κανάλια JGroups ως επίπεδο μεταφοράς. Προαιρετικά, μπορεί να χρησιμοποιήσει το πρωτόκολλο HotRod για να επικοινωνήσει με ένα εξωτερικό σύμπλεγμα Infinispan για να συγχρονίσει τα περιεχόμενα της κρυφής μνήμης.

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

εξισορροπητής φορτίου

Κατά την εγκατάσταση ενός εξισορροπητή ως ελεγκτή εισόδου σε ένα σύμπλεγμα Kubernetes, είναι σημαντικό να έχετε υπόψη σας τα ακόλουθα πράγματα:

Η εργασία του Keycloak υποδηλώνει ότι η απομακρυσμένη διεύθυνση του πελάτη που συνδέεται μέσω HTTP στον διακομιστή ελέγχου ταυτότητας είναι η πραγματική διεύθυνση IP του υπολογιστή-πελάτη. Οι ρυθμίσεις εξισορρόπησης και εισόδου θα πρέπει να ορίζουν σωστά τις κεφαλίδες HTTP X-Forwarded-For и X-Forwarded-Protoκαι διατηρήστε τον αρχικό τίτλο HOST. τελευταία έκδοση ingress-nginx (> 0.22.0) το απενεργοποιεί από προεπιλογή

Ενεργοποίηση σημαίας proxy-address-forwarding ορίζοντας μια μεταβλητή περιβάλλοντος PROXY_ADDRESS_FORWARDING в true δίνει στον Keycloak την κατανόηση ότι τρέχει πίσω από έναν διακομιστή μεσολάβησης.

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

Συγκεκριμένα, σε αντίθεση με την τεκμηρίωση, η επισύναψη μιας περιόδου λειτουργίας με το όνομα του cookie δεν λειτούργησε για εμάς AUTH_SESSION_ID. Το Keycloak κυκλοφόρησε την ανακατεύθυνση, επομένως συνιστούμε να επιλέξετε διαφορετικό όνομα cookie για τη σταθερή περίοδο λειτουργίας.

Το Keycloak επισυνάπτει επίσης το όνομα του κεντρικού υπολογιστή που απάντησε πρώτος AUTH_SESSION_ID, και δεδομένου ότι κάθε κόμβος στην εξαιρετικά διαθέσιμη έκδοση χρησιμοποιεί την ίδια βάση δεδομένων, καθένας από αυτούς πρέπει να έχουν ένα ξεχωριστό και μοναδικό αναγνωριστικό κόμβου για τη διαχείριση συναλλαγών. Συνιστάται η τοποθέτηση JAVA_OPTS παραμέτρων jboss.node.name и jboss.tx.node.id μοναδικό για κάθε κόμβο - για παράδειγμα, μπορείτε να ορίσετε το όνομα του pod. Εάν βάλετε το όνομα του pod - μην ξεχάσετε το όριο των 23 χαρακτήρων για τις μεταβλητές jboss, επομένως είναι καλύτερο να χρησιμοποιήσετε StatefulSet και όχι Deployment.

Ένα ακόμη rake - εάν ένα pod διαγραφεί ή επανεκκινηθεί, η προσωρινή μνήμη του χάνεται. Έχοντας αυτό υπόψη, αξίζει να ορίσετε τον αριθμό των κατόχων της κρυφής μνήμης για όλες τις κρυφές μνήμες σε τουλάχιστον δύο, επομένως θα υπάρχει ένα αντίγραφο της κρυφής μνήμης. Η λύση είναι να τρέξεις σενάριο για το Wildfly κατά την εκκίνηση του pod, τοποθετώντας το στον κατάλογο /opt/jboss/startup-scripts σε δοχείο:

Περιεχόμενο σεναρίου

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

echo * Setting CACHE_OWNERS to "${env.CACHE_OWNERS}" in all cache-containers

/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})

run-batch
stop-embedded-server

στη συνέχεια ορίστε την τιμή της μεταβλητής περιβάλλοντος CACHE_OWNERS στο απαιτούμενο.

Ιδιωτικό δίκτυο με υποστήριξη ip multicast

Εάν χρησιμοποιείτε το Weavenet ως CNI σας, το multicast θα λειτουργήσει αμέσως - και οι κόμβοι Keycloak θα βλέπονται ο ένας τον άλλον μόλις τεθούν σε λειτουργία.

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

Η πρώτη επιλογή είναι να χρησιμοποιήσετε KUBE_DNSπου χρησιμοποιεί headless service για να βρείτε τους κόμβους Keycloak, απλώς μεταβιβάζετε στο JGroups το όνομα της υπηρεσίας που θα χρησιμοποιηθεί για την εύρεση των κόμβων.

Μια άλλη επιλογή είναι να χρησιμοποιήσετε τη μέθοδο KUBE_PING, το οποίο λειτουργεί με το API για την εύρεση κόμβων (πρέπει να κάνετε διαμόρφωση serviceAccount με δικαιώματα list и getκαι, στη συνέχεια, διαμορφώστε τα pods ώστε να λειτουργούν με αυτό serviceAccount).

Ο τρόπος αναζήτησης των κόμβων για JGroups διαμορφώνεται ορίζοντας μεταβλητές περιβάλλοντος JGROUPS_DISCOVERY_PROTOCOL и JGROUPS_DISCOVERY_PROPERTIES. Για KUBE_PING πρέπει να επιλέξετε λοβούς ρωτώντας namespace и labels.

️ Εάν χρησιμοποιείτε multicast και εκτελείτε δύο ή περισσότερα συμπλέγματα Keycloak στο ίδιο σύμπλεγμα Kubernetes (ας πούμε ένα στον χώρο ονομάτων production, δεύτερο - staging) - οι κόμβοι από ένα σύμπλεγμα Keycloak μπορούν να ενωθούν με ένα άλλο σύμπλεγμα. Βεβαιωθείτε ότι χρησιμοποιείτε μια μοναδική διεύθυνση πολλαπλής διανομής για κάθε σύμπλεγμα ορίζοντας μεταβλητέςjboss.default.multicast.address и jboss.modcluster.multicast.address в JAVA_OPTS.

Αντιγραφή μεταξύ κέντρων δεδομένων

Εκτελέστε το Keycloak σε λειτουργία HA στο Kubernetes

Σύνδεσμος

Το Keycloak χρησιμοποιεί πολλαπλά ξεχωριστά συμπλέγματα Cache Infinispan για κάθε κέντρο δεδομένων που φιλοξενεί συμπλέγματα Keycloack που αποτελούνται από κόμβους Keycloak. Αλλά ταυτόχρονα, δεν υπάρχει διαφορά μεταξύ των κόμβων Keycloak σε διαφορετικά κέντρα δεδομένων.

Οι κόμβοι Keycloak χρησιμοποιούν ένα εξωτερικό πλέγμα δεδομένων Java (διακομιστές Infinispan) για την επικοινωνία μεταξύ κέντρων δεδομένων. Η επικοινωνία λειτουργεί σύμφωνα με το πρωτόκολλο Infinispan HotRod.

Οι κρυφές μνήμες Infinispan πρέπει να ρυθμιστούν με το χαρακτηριστικό remoteStore, ώστε τα δεδομένα να μπορούν να αποθηκευτούν απομακρυσμένα (σε άλλο κέντρο δεδομένων, περίπου. μεταφράστης) κρυφές μνήμες. Υπάρχουν ξεχωριστά συμπλέγματα infinispan μεταξύ των διακομιστών JDG, επομένως τα δεδομένα αποθηκεύονται στο JDG1 στον ιστότοπο site1 θα αντιγραφεί στο JDG2 επί τόπου site2.

Τέλος, ο διακομιστής JDG λήψης ειδοποιεί τους διακομιστές Keycloak για το σύμπλεγμα του μέσω συνδέσεων πελάτη, κάτι που είναι χαρακτηριστικό του πρωτοκόλλου HotRod. Κόμβοι Keycloak ενεργοποιημένοι site2 ενημερώστε τις κρυφές μνήμες Infinispan και η συγκεκριμένη περίοδος λειτουργίας χρήστη γίνεται διαθέσιμη στους κόμβους Keycloak στο site2.

Είναι επίσης δυνατό για ορισμένες κρυφές μνήμες να μην δημιουργούνται αντίγραφα ασφαλείας και να αρνούνται εντελώς την εγγραφή δεδομένων μέσω του διακομιστή Infinispan. Για να το κάνετε αυτό, πρέπει να καταργήσετε τη ρύθμιση remote-store συγκεκριμένη κρυφή μνήμη Infinispan (στο αρχείο standalone-ha.xml), μετά την οποία ορισμένα συγκεκριμένα replicated-cache Επίσης, δεν θα χρειάζεται πλέον στο πλάι του διακομιστή Infinispan.

Ρύθμιση κρυφής μνήμης

Υπάρχουν δύο τύποι κρυφής μνήμης στο Keycloak:

  • Τοπικός. Βρίσκεται δίπλα στη βάση, χρησιμεύει για τη μείωση του φορτίου στη βάση δεδομένων, καθώς και για τη μείωση της καθυστέρησης απόκρισης. Αυτός ο τύπος κρυφής μνήμης αποθηκεύει το βασίλειο, τους πελάτες, τους ρόλους και τα μεταδεδομένα χρήστη. Αυτός ο τύπος κρυφής μνήμης δεν αναπαράγεται ακόμη και αν αυτή η κρυφή μνήμη αποτελεί μέρος ενός συμπλέγματος Keycloak. Εάν αλλάξει κάποια καταχώρηση στη μνήμη cache, αποστέλλεται ένα μήνυμα αλλαγής στους υπόλοιπους διακομιστές του συμπλέγματος, μετά το οποίο η καταχώρηση αποκλείεται από τη μνήμη cache. δείτε την περιγραφή work παρακάτω για μια πιο λεπτομερή περιγραφή της διαδικασίας.

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

Infinispan Caches

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

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

Προσωρινή αποθήκευση και λήξη των αποθηκευμένων δεδομένων λειτουργεί για να αφαιρέσει το φορτίο από τη βάση δεδομένων. Αυτή η προσωρινή αποθήκευση βελτιώνει την απόδοση, αλλά προσθέτει ένα προφανές πρόβλημα. Εάν ένας διακομιστής Keycloak ενημερώσει τα δεδομένα, οι υπόλοιποι διακομιστές πρέπει να ειδοποιηθούν ώστε να μπορούν να ενημερώσουν τις κρυφές μνήμες τους. Το Keycloak χρησιμοποιεί τοπικές κρυφές μνήμες realms, users и authorization για την προσωρινή αποθήκευση δεδομένων από τη βάση δεδομένων.

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

Συνεδρίες χρήστη. Μνήμες με ονόματα sessions, clientSessions, offlineSessions и offlineClientSessions, συνήθως αναπαράγονται μεταξύ κέντρων δεδομένων και χρησιμεύουν για την αποθήκευση δεδομένων σχετικά με τις περιόδους λειτουργίας χρήστη που είναι ενεργές ενώ ο χρήστης είναι ενεργός στο πρόγραμμα περιήγησης. Αυτές οι κρυφές μνήμες συνεργάζονται με την εφαρμογή που χειρίζεται αιτήματα HTTP από τελικούς χρήστες, επομένως συσχετίζονται με σταθερές περιόδους λειτουργίας και πρέπει να αναπαράγονται μεταξύ κέντρων δεδομένων.

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

Όταν ανοίγετε ένα σύμπλεγμα Infinispan, πρέπει να προσθέσετε ορισμούς προσωρινής μνήμης στο αρχείο ρυθμίσεων:

<replicated-cache-configuration name="keycloak-sessions" mode="ASYNC" start="EAGER" batching="false">
</replicated-cache-configuration>

<replicated-cache name="work" configuration="keycloak-sessions" />
<replicated-cache name="sessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineSessions" configuration="keycloak-sessions" />
<replicated-cache name="actionTokens" configuration="keycloak-sessions" />
<replicated-cache name="loginFailures" configuration="keycloak-sessions" />
<replicated-cache name="clientSessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineClientSessions" configuration="keycloak-sessions" />

Πρέπει να διαμορφώσετε και να ξεκινήσετε το σύμπλεγμα Infinispan πριν εκτελέσετε το σύμπλεγμα Keycloak

Τότε πρέπει να ρυθμίσετε remoteStore για κρυφές μνήμες Keycloak. Για αυτό, αρκεί ένα σενάριο, το οποίο γίνεται παρόμοια με το προηγούμενο, το οποίο χρησιμοποιείται για τη ρύθμιση της μεταβλητής CACHE_OWNERS, πρέπει να το αποθηκεύσετε σε ένα αρχείο και να το βάλετε σε έναν κατάλογο /opt/jboss/startup-scripts:

Περιεχόμενο σεναρίου

embed-server --server-config=standalone-ha.xml --std-out=echo
batch

echo *** Update infinispan subsystem ***
/subsystem=infinispan/cache-container=keycloak:write-attribute(name=module, value=org.keycloak.keycloak-model-infinispan)

echo ** Add remote socket binding to infinispan server **
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-cache:add(host=${remote.cache.host:localhost}, port=${remote.cache.port:11222})

echo ** Update replicated-cache work element **
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=work, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)

/subsystem=infinispan/cache-container=keycloak/replicated-cache=work:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache sessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=sessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache offlineSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=offlineSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache clientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=clientSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache offlineClientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=offlineClientSessions, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache loginFailures element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    remote-servers=["remote-cache"], 
    cache=loginFailures, 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache actionTokens element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens/store=remote:add( 
    passivation=false, 
    fetch-state=false, 
    purge=false, 
    preload=false, 
    shared=true, 
    cache=actionTokens, 
    remote-servers=["remote-cache"], 
    properties={ 
        rawValues=true, 
        marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory, 
        protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion} 
    } 
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=statistics-enabled,value=true)

echo ** Update distributed-cache authenticationSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=statistics-enabled,value=true)

echo *** Update undertow subsystem ***
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding,value=true)

run-batch
stop-embedded-server

Μην ξεχάσετε να εγκαταστήσετε JAVA_OPTS για τους κόμβους Keycloak που λειτουργούν με το HotRod: remote.cache.host, remote.cache.port και όνομα υπηρεσίας jboss.site.name.

Σύνδεσμοι και πρόσθετη τεκμηρίωση

Το άρθρο μεταφράστηκε και ετοιμάστηκε για το Habr από υπαλλήλους Κέντρο εκπαίδευσης Slurm — εντατικά, μαθήματα βίντεο και εταιρική εκπαίδευση από επαγγελματίες (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο