Kubernetes पर HA मोड में Keycloak चलाएँ

Kubernetes पर HA मोड में Keycloak चलाएँ

TL, डॉ: इसमें कीक्लोक, एक ओपन सोर्स एक्सेस कंट्रोल सिस्टम, आंतरिक संरचना का विश्लेषण, कॉन्फ़िगरेशन विवरण का विवरण होगा।

परिचय और मुख्य विचार

इस लेख में, हम कुबेरनेट्स के शीर्ष पर कीक्लोक क्लस्टर तैनात करते समय ध्यान में रखने योग्य बुनियादी विचार देखेंगे।

यदि आप कीक्लोक के बारे में अधिक जानना चाहते हैं, तो लेख के अंत में दिए गए लिंक देखें। अभ्यास में अधिक तल्लीन होने के लिए आप अध्ययन कर सकते हैं हमारा भंडार एक मॉड्यूल के साथ जो इस आलेख के मुख्य विचारों को लागू करता है (लॉन्च गाइड वहां है, यह आलेख डिवाइस और सेटिंग्स का अवलोकन प्रदान करेगा, लगभग। अनुवादक).

कीक्लोक जावा में लिखी गई एक व्यापक प्रणाली है और एक एप्लिकेशन सर्वर के शीर्ष पर बनाई गई है जंगली मक्खी. संक्षेप में, यह प्राधिकरण के लिए एक ढांचा है जो एप्लिकेशन उपयोगकर्ताओं को फेडरेशन और एसएसओ (सिंगल साइन-ऑन) क्षमताएं देता है।

हम आपको आधिकारिक पढ़ने के लिए आमंत्रित करते हैं वेबसाइट या विकिपीडिया विस्तृत समझ के लिए.

कीक्लोक लॉन्च करना

Keycloak को चलाने के लिए दो सतत डेटा स्रोतों की आवश्यकता होती है:

  • एक डेटाबेस जिसका उपयोग लगातार डेटा संग्रहीत करने के लिए किया जाता है, जैसे कि उपयोगकर्ताओं के बारे में जानकारी
  • डेटाग्रिड कैश, जिसका उपयोग डेटाबेस से डेटा को कैश करने के साथ-साथ कुछ अल्पकालिक और बार-बार बदलते मेटाडेटा, जैसे उपयोगकर्ता सत्र, को संग्रहीत करने के लिए किया जाता है। कार्यान्वित इन्फिनिसपैन, जो आमतौर पर डेटाबेस से काफी तेज़ है। लेकिन किसी भी स्थिति में, Infinispan में सहेजा गया डेटा अल्पकालिक है - और क्लस्टर के पुनरारंभ होने पर इसे कहीं भी सहेजने की आवश्यकता नहीं है।

कीक्लोक चार अलग-अलग मोड में काम करता है:

  • साधारण - एक और केवल एक प्रक्रिया, एक फ़ाइल के माध्यम से कॉन्फ़िगर की गई स्टैंडअलोन.xml
  • नियमित क्लस्टर (उच्च उपलब्धता विकल्प) - सभी प्रक्रियाओं को समान कॉन्फ़िगरेशन का उपयोग करना चाहिए, जिसे मैन्युअल रूप से सिंक्रनाइज़ किया जाना चाहिए। सेटिंग्स एक फ़ाइल में संग्रहीत हैं स्टैंडअलोन-ha.xmlइसके अलावा, आपको डेटाबेस और एक लोड बैलेंसर तक साझा पहुंच बनाने की आवश्यकता है।
  • डोमेन क्लस्टर - जैसे-जैसे क्लस्टर बढ़ता है, क्लस्टर को सामान्य मोड में शुरू करना एक नियमित और उबाऊ कार्य बन जाता है, क्योंकि हर बार कॉन्फ़िगरेशन बदलने पर, प्रत्येक क्लस्टर नोड पर सभी परिवर्तन किए जाने चाहिए। ऑपरेशन का डोमेन मोड कुछ साझा भंडारण स्थान सेट करके और कॉन्फ़िगरेशन प्रकाशित करके इस समस्या को हल करता है। ये सेटिंग्स फ़ाइल में संग्रहीत हैं डोमेन.xml
  • डेटा केंद्रों के बीच प्रतिकृति — यदि आप Keycloak को कई डेटा केंद्रों के समूह में चलाना चाहते हैं, अक्सर विभिन्न भौगोलिक स्थानों में। इस विकल्प में, प्रत्येक डेटा सेंटर के पास Keycloak सर्वर का अपना क्लस्टर होगा।

इस लेख में, हम दूसरे विकल्प पर करीब से नज़र डालेंगे, यानी। नियमित क्लस्टर, और हम डेटा केंद्रों के बीच प्रतिकृति के विषय पर भी थोड़ा स्पर्श करेंगे, क्योंकि कुबेरनेट्स में इन दो विकल्पों को चलाना समझ में आता है। सौभाग्य से, कुबेरनेट्स में कई पॉड्स (कीक्लोक नोड्स) की सेटिंग्स को सिंक्रनाइज़ करने में कोई समस्या नहीं है, इसलिए डोमेन क्लस्टर ऐसा करना बहुत मुश्किल नहीं होगा.

कृपया यह भी ध्यान दें कि शब्द समूह जब तक लेख का अंत केवल एक साथ काम करने वाले कीक्लोक नोड्स के समूह पर लागू नहीं होगा, कुबेरनेट्स क्लस्टर को संदर्भित करने की कोई आवश्यकता नहीं है।

नियमित कीक्लोक क्लस्टर

इस मोड में कीक्लोक चलाने के लिए, आपको चाहिए:

  • बाहरी साझा डेटाबेस कॉन्फ़िगर करें
  • लोड बैलेंसर स्थापित करें
  • आईपी ​​​​मल्टीकास्ट समर्थन के साथ एक आंतरिक नेटवर्क है

हम बाहरी डेटाबेस के कॉन्फ़िगरेशन का विश्लेषण नहीं करेंगे, क्योंकि यह इस लेख का उद्देश्य नहीं है। आइए मान लें कि कहीं एक कार्यशील डेटाबेस है - और हमारे पास उससे एक कनेक्शन बिंदु है। हम बस इस डेटा को पर्यावरण चर में जोड़ देंगे।

यह बेहतर ढंग से समझने के लिए कि कीक्लोक फेलओवर (एचए) क्लस्टर में कैसे काम करता है, यह जानना महत्वपूर्ण है कि यह सब वाइल्डफ्लाई की क्लस्टरिंग क्षमताओं पर कितना निर्भर करता है।

वाइल्डफ्लाई कई उपप्रणालियों का उपयोग करती है, उनमें से कुछ का उपयोग लोड बैलेंसर के रूप में किया जाता है, कुछ का उपयोग दोष सहनशीलता के लिए किया जाता है। लोड बैलेंसर क्लस्टर नोड के अतिभारित होने पर एप्लिकेशन की उपलब्धता सुनिश्चित करता है, और दोष सहनशीलता कुछ क्लस्टर नोड्स के विफल होने पर भी एप्लिकेशन की उपलब्धता सुनिश्चित करती है। इनमें से कुछ उपप्रणालियाँ:

  • mod_cluster: HTTP लोड बैलेंसर के रूप में अपाचे के साथ मिलकर काम करता है, डिफ़ॉल्ट रूप से होस्ट खोजने के लिए टीसीपी मल्टीकास्ट पर निर्भर करता है। बाहरी बैलेंसर द्वारा प्रतिस्थापित किया जा सकता है।

  • infinispan: ट्रांसपोर्ट लेयर के रूप में JGroups चैनलों का उपयोग करके वितरित कैश। इसके अतिरिक्त, यह कैश सामग्री को सिंक्रनाइज़ करने के लिए बाहरी इनफिनिस्पैन क्लस्टर के साथ संचार करने के लिए HotRod प्रोटोकॉल का उपयोग कर सकता है।

  • jgroups: JGroups चैनलों पर आधारित अत्यधिक उपलब्ध सेवाओं के लिए समूह संचार सहायता प्रदान करता है। नामित पाइप क्लस्टर में एप्लिकेशन इंस्टेंस को समूहों में जोड़ने की अनुमति देते हैं ताकि संचार में विश्वसनीयता, सुव्यवस्थितता और विफलताओं के प्रति संवेदनशीलता जैसे गुण हों।

भार संतुलन

कुबेरनेट्स क्लस्टर में इनग्रेस कंट्रोलर के रूप में बैलेंसर स्थापित करते समय, निम्नलिखित बातों को ध्यान में रखना महत्वपूर्ण है:

कीक्लोक मानता है कि HTTP के माध्यम से प्रमाणीकरण सर्वर से जुड़ने वाले क्लाइंट का दूरस्थ पता क्लाइंट कंप्यूटर का वास्तविक आईपी पता है। बैलेंसर और इनग्रेस सेटिंग्स को HTTP हेडर सही ढंग से सेट करना चाहिए X-Forwarded-For и X-Forwarded-Proto, और मूल शीर्षक रखें HOST. नवीनतम संस्करण ingress-nginx (>0.22.0) इसे डिफ़ॉल्ट रूप से अक्षम कर देता है

ध्वज को सक्रिय करना proxy-address-forwarding एक पर्यावरण चर सेट करके PROXY_ADDRESS_FORWARDING в true Keycloak को यह समझ मिलती है कि वह एक प्रॉक्सी के पीछे काम कर रहा है।

आपको भी सक्षम करने की आवश्यकता है चिपचिपा सत्र प्रवेश में. Keycloak वर्तमान प्रमाणीकरण सत्र और उपयोगकर्ता सत्र से जुड़े डेटा को संग्रहीत करने के लिए एक वितरित इनफिनिस्पैन कैश का उपयोग करता है। कैश डिफ़ॉल्ट रूप से एक ही मालिक के साथ काम करता है, दूसरे शब्दों में, वह विशेष सत्र क्लस्टर में कुछ नोड पर संग्रहीत होता है, और यदि अन्य नोड्स को उस सत्र तक पहुंच की आवश्यकता होती है, तो उन्हें इसे दूरस्थ रूप से क्वेरी करना होगा।

विशेष रूप से, दस्तावेज़ीकरण के विपरीत, कुकी नाम के साथ एक सत्र संलग्न करना हमारे लिए काम नहीं आया AUTH_SESSION_ID. कीक्लोक ने रीडायरेक्ट को लूप किया है, इसलिए हम स्टिकी सत्र के लिए एक अलग कुकी नाम चुनने की सलाह देते हैं।

कीक्लोक उस नोड का नाम भी संलग्न करता है जिसने सबसे पहले प्रतिक्रिया दी थी AUTH_SESSION_ID, और चूंकि अत्यधिक उपलब्ध संस्करण में प्रत्येक नोड एक ही डेटाबेस का उपयोग करता है, उनमें से प्रत्येक होना ही चाहिए लेनदेन के प्रबंधन के लिए एक अलग और अद्वितीय नोड पहचानकर्ता। लगाने की अनुशंसा की जाती है JAVA_OPTS मानकों को jboss.node.name и jboss.tx.node.id प्रत्येक नोड के लिए अद्वितीय - उदाहरण के लिए, आप पॉड का नाम सेट कर सकते हैं। यदि आप पॉड का नाम डालते हैं - जेबॉस वेरिएबल्स के लिए 23 वर्ण सीमा के बारे में न भूलें, तो परिनियोजन नहीं, बल्कि स्टेटफुलसेट का उपयोग करना बेहतर है।

एक और रेक - यदि पॉड हटा दिया जाता है या पुनः प्रारंभ किया जाता है, तो इसका कैश खो जाता है। इसे ध्यान में रखते हुए, सभी कैश के लिए कैश मालिकों की संख्या कम से कम दो निर्धारित करना उचित है, ताकि कैश की एक प्रति बनी रहे। समाधान चलाना है वाइल्डफ्लाई के लिए स्क्रिप्ट पॉड प्रारंभ करते समय, उसे निर्देशिका में रखें /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 आवश्यक के लिए.

आईपी ​​​​मल्टीकास्ट समर्थन के साथ निजी नेटवर्क

यदि आप वीवनेट को सीएनआई के रूप में उपयोग करते हैं, तो मल्टीकास्ट तुरंत काम करेगा - और आपके कीक्लोक नोड्स लॉन्च होते ही एक-दूसरे को देखेंगे।

यदि आपके कुबेरनेट्स क्लस्टर में आईपी मल्टीकास्ट समर्थन नहीं है, तो आप नोड्स खोजने के लिए अन्य प्रोटोकॉल के साथ काम करने के लिए JGroups को कॉन्फ़िगर कर सकते हैं।

पहला विकल्प उपयोग करना है KUBE_DNSजो उपयोग करता है headless service कीक्लोक नोड्स ढूंढने के लिए, आप बस JGroups को उस सेवा का नाम पास करें जिसका उपयोग नोड्स ढूंढने के लिए किया जाएगा।

दूसरा विकल्प विधि का उपयोग करना है KUBE_PING, जो नोड्स खोजने के लिए एपीआई के साथ काम करता है (आपको कॉन्फ़िगर करने की आवश्यकता है)। serviceAccount अधिकार के साथ list и get, और फिर इसके साथ काम करने के लिए पॉड्स को कॉन्फ़िगर करें serviceAccount).

जिस तरह से JGroups नोड्स ढूंढता है वह पर्यावरण चर सेट करके कॉन्फ़िगर किया गया है JGROUPS_DISCOVERY_PROTOCOL и JGROUPS_DISCOVERY_PROPERTIES. के लिए KUBE_PING आपको पूछकर पॉड्स का चयन करना होगा namespace и labels.

️ यदि आप मल्टीकास्ट का उपयोग करते हैं और एक कुबेरनेट्स क्लस्टर में दो या दो से अधिक कीक्लोक क्लस्टर चलाते हैं (मान लें कि नेमस्पेस में एक है) production, दूसरा - staging) - एक कीक्लोक क्लस्टर से नोड्स दूसरे क्लस्टर में शामिल हो सकते हैं। चर सेट करके प्रत्येक क्लस्टर के लिए एक अद्वितीय मल्टीकास्ट पते का उपयोग करना सुनिश्चित करेंjboss.default.multicast.address и jboss.modcluster.multicast.address в JAVA_OPTS.

डेटा केंद्रों के बीच प्रतिकृति

Kubernetes पर HA मोड में Keycloak चलाएँ

Связь

Keycloak प्रत्येक डेटा सेंटर के लिए कई अलग-अलग Infinispan कैश क्लस्टर का उपयोग करता है जहां Keycloak नोड्स से बने Keycloack क्लस्टर स्थित होते हैं। लेकिन विभिन्न डेटा केंद्रों में कीक्लोक नोड्स के बीच कोई अंतर नहीं है।

कीक्लोक नोड्स डेटा केंद्रों के बीच संचार के लिए बाहरी जावा डेटा ग्रिड (इन्फिनिस्पैन सर्वर) का उपयोग करते हैं। संचार प्रोटोकॉल के अनुसार कार्य करता है इन्फिनिसपैन हॉटरॉड.

Infinispan कैश को विशेषता के साथ कॉन्फ़िगर किया जाना चाहिए remoteStore, ताकि डेटा को दूरस्थ रूप से संग्रहीत किया जा सके (दूसरे डेटा सेंटर में, लगभग। अनुवादक) कैश। JDG सर्वरों के बीच अलग-अलग infinispan क्लस्टर हैं, ताकि साइट पर JDG1 पर डेटा संग्रहीत हो सके site1 साइट पर JDG2 की प्रतिकृति बनाई जाएगी site2.

अंत में, प्राप्त करने वाला JDG सर्वर क्लाइंट कनेक्शन के माध्यम से अपने क्लस्टर के कीक्लोक सर्वर को सूचित करता है, जो HotRod प्रोटोकॉल की एक विशेषता है। कीक्लोक नोड्स चालू site2 उनके इनफिनिस्पैन कैश को अपडेट करें और विशिष्ट उपयोगकर्ता सत्र कीक्लोक नोड्स पर भी उपलब्ध हो जाता है site2.

कुछ कैश के लिए, बैकअप न बनाना और पूरी तरह से इनफिनिस्पैन सर्वर के माध्यम से डेटा लिखने से बचना भी संभव है। ऐसा करने के लिए आपको सेटिंग हटानी होगी remote-store विशिष्ट इन्फिनिस्पैन कैश (फ़ाइल में स्टैंडअलोन-ha.xml), जिसके बाद कुछ विशिष्ट replicated-cache Infinispan सर्वर साइड पर भी अब इसकी आवश्यकता नहीं होगी।

कैश सेट करना

Keycloak में दो प्रकार के कैश होते हैं:

  • स्थानीय। यह डेटाबेस के बगल में स्थित है और डेटाबेस पर लोड को कम करने के साथ-साथ प्रतिक्रिया विलंबता को कम करने का कार्य करता है। इस प्रकार का कैश क्षेत्र, क्लाइंट, भूमिकाएँ और उपयोगकर्ता मेटाडेटा संग्रहीत करता है। इस प्रकार के कैश को दोहराया नहीं जाता है, भले ही कैश कीक्लोक क्लस्टर का हिस्सा हो। यदि कैश में कोई प्रविष्टि बदलती है, तो परिवर्तन के बारे में एक संदेश क्लस्टर में शेष सर्वरों को भेजा जाता है, जिसके बाद प्रविष्टि को कैश से बाहर रखा जाता है। विवरण देखे work प्रक्रिया के अधिक विस्तृत विवरण के लिए नीचे देखें।

  • दोहराया गया। उपयोगकर्ता सत्रों, ऑफ़लाइन टोकन को संसाधित करता है, और पासवर्ड फ़िशिंग प्रयासों और अन्य हमलों का पता लगाने के लिए लॉगिन त्रुटियों पर भी नज़र रखता है। इन कैश में संग्रहीत डेटा अस्थायी है, केवल रैम में संग्रहीत है, लेकिन पूरे क्लस्टर में दोहराया जा सकता है।

इन्फिनिसपैन कैश

अधिवेशन - कीक्लोक में एक अवधारणा, अलग-अलग कैश, जिन्हें कहा जाता है authenticationSessions, विशिष्ट उपयोगकर्ताओं के डेटा को संग्रहीत करने के लिए उपयोग किया जाता है। इन कैश से अनुरोधों की आवश्यकता आमतौर पर ब्राउज़र और कीक्लोक सर्वर को होती है, अनुप्रयोगों को नहीं। यह वह जगह है जहां चिपचिपा सत्रों पर निर्भरता स्वयं प्रकट होती है, और ऐसे कैश को सक्रिय-सक्रिय मोड के मामले में भी दोहराने की आवश्यकता नहीं होती है।

कार्रवाई टोकन. एक अन्य अवधारणा, आमतौर पर विभिन्न परिदृश्यों के लिए उपयोग की जाती है, जब, उदाहरण के लिए, उपयोगकर्ता को मेल द्वारा अतुल्यकालिक रूप से कुछ करने की आवश्यकता होती है। उदाहरण के लिए, प्रक्रिया के दौरान forget password कैश actionTokens संबंधित टोकन के मेटाडेटा को ट्रैक करने के लिए उपयोग किया जाता है - उदाहरण के लिए, एक टोकन का उपयोग पहले ही किया जा चुका है और उसे दोबारा सक्रिय नहीं किया जा सकता है। इस प्रकार के कैश को आमतौर पर डेटा केंद्रों के बीच दोहराने की आवश्यकता होती है।

संग्रहीत डेटा की कैशिंग और उम्र बढ़ना डेटाबेस पर लोड को राहत देने का काम करता है। इस प्रकार की कैशिंग से प्रदर्शन में सुधार होता है, लेकिन एक स्पष्ट समस्या जुड़ जाती है। यदि एक Keycloak सर्वर डेटा अपडेट करता है, तो अन्य सर्वर को सूचित किया जाना चाहिए ताकि वे अपने कैश में डेटा अपडेट कर सकें। कीक्लोक स्थानीय कैश का उपयोग करता है realms, users и authorization डेटाबेस से डेटा कैशिंग के लिए।

एक अलग कैश भी है work, जिसे सभी डेटा केंद्रों पर दोहराया जाता है। यह स्वयं डेटाबेस से कोई डेटा संग्रहीत नहीं करता है, बल्कि डेटा केंद्रों के बीच क्लस्टर नोड्स में डेटा एजिंग संदेश भेजने का कार्य करता है। दूसरे शब्दों में, जैसे ही डेटा अपडेट किया जाता है, कीक्लोक नोड अपने डेटा सेंटर में अन्य नोड्स के साथ-साथ अन्य डेटा सेंटरों में भी एक संदेश भेजता है। ऐसा संदेश प्राप्त होने पर, प्रत्येक नोड अपने स्थानीय कैश में संबंधित डेटा को शुद्ध कर देता है।

उपयोगकर्ता सत्र. नामों के साथ कैश 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" />

Keycloak क्लस्टर प्रारंभ करने से पहले आपको Infinispan क्लस्टर को कॉन्फ़िगर और प्रारंभ करना होगा

फिर आपको कॉन्फ़िगर करने की आवश्यकता है remoteStore कीक्लोक कैश के लिए। इसके लिए, एक स्क्रिप्ट पर्याप्त है, जो पिछले वाले के समान ही की जाती है, जिसका उपयोग वेरिएबल सेट करने के लिए किया जाता है 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 HotRod के काम करने के लिए Keycloak नोड्स के लिए: remote.cache.host, remote.cache.port और सेवा का नाम jboss.site.name.

लिंक और अतिरिक्त दस्तावेज़ीकरण

कर्मचारियों द्वारा हैबर के लिए लेख का अनुवाद और तैयारी की गई थी स्लम प्रशिक्षण केंद्र - गहन पाठ्यक्रम, वीडियो पाठ्यक्रम और अभ्यास विशेषज्ञों से कॉर्पोरेट प्रशिक्षण (कुबेरनेट्स, डेवऑप्स, डॉकर, एन्सिबल, सेफ, एसआरई)

स्रोत: www.habr.com

एक टिप्पणी जोड़ें