የ Keycloak ን በ HA ሁነታ በ Kubernetes ላይ ያሂዱ

የ Keycloak ን በ HA ሁነታ በ Kubernetes ላይ ያሂዱ

TL; DR: የ Keycloak መግለጫ, ክፍት ምንጭ መዳረሻ ቁጥጥር ሥርዓት, የውስጥ መሣሪያ ትንተና, የውቅረት ዝርዝሮች ይኖራል.

መግቢያ እና ዋና ሀሳቦች

በዚህ ጽሑፍ ውስጥ የኪሎክ ክላስተር በኩበርኔትስ አናት ላይ ሲዘረጉ ማስታወስ ያለብን ዋና ሃሳቦችን እንመለከታለን።

ስለ Keycloak የበለጠ ማወቅ ከፈለጉ፣ እባክዎ በአንቀጹ መጨረሻ ያሉትን ማገናኛዎች ይመልከቱ። እራስዎን በጥልቀት በተግባር ለማጥለቅ, ማጥናት ይችላሉ የእኛ ማከማቻ የዚህ ጽሑፍ ዋና ሀሳቦችን በሚተገበር ሞጁል (የማስጀመሪያ መመሪያው እዚያ አለ ፣ በዚህ ጽሑፍ ውስጥ የመሳሪያው እና የቅንብሮች አጠቃላይ እይታ ይኖራል ፣ በግምት ተርጓሚ).

Keycloak በጃቫ የተፃፈ እና በመተግበሪያ አገልጋይ ላይ የተገነባ ውስብስብ ስርዓት ነው። የዱር ዝንብ. በአጭሩ፣ ለመተግበሪያ ተጠቃሚዎች ፌዴሬሽን እና ኤስኤስኦ (ነጠላ መግቢያ) አቅም የሚሰጥ የፈቃድ ማዕቀፍ ነው።

ኦፊሴላዊውን እንዲያነቡ እንጋብዝዎታለን ድር ጣቢያ ወይም ዊኪፔዲያ ለዝርዝር ግንዛቤ.

የቁልፍ መደረቢያን ጀምር

የቁልፍ ክሎክ ለማሄድ ሁለት ቋሚ የመረጃ ምንጮች ያስፈልገዋል፡-

  • እንደ የተጠቃሚዎች መረጃ ያለ የማያቋርጥ ውሂብ ለማከማቸት የሚያገለግል የውሂብ ጎታ
  • ዳታግሪድ መሸጎጫ፣ ከመረጃ ቋቱ ውስጥ መረጃን ለመሸጎጥ፣ እንዲሁም አንዳንድ አጭር ጊዜ የሚቆዩ እና በተደጋጋሚ የተቀየሩ ሜታዳታ ለምሳሌ የተጠቃሚ ክፍለ ጊዜዎችን ለማከማቸት የሚያገለግል ነው። ተለቋል ኢንፊኒስፓንብዙውን ጊዜ ከመረጃ ቋቱ በጣም ፈጣን ነው። ነገር ግን በማንኛውም ሁኔታ በ Infinispan ውስጥ የተቀመጠው መረጃ ጊዜ ያለፈበት ነው - እና ክላስተር እንደገና ሲጀመር የሆነ ቦታ ማስቀመጥ አያስፈልግም.

የቁልፍ ክሎክ በአራት የተለያዩ ሁነታዎች ይሰራል።

  • የተለመደ - አንድ እና አንድ ሂደት, በፋይል የተዋቀረ ለብቻው.xml
  • መደበኛ ዘለላ (በጣም የሚገኝ አማራጭ) - ሁሉም ሂደቶች አንድ አይነት ውቅር መጠቀም አለባቸው, እሱም በእጅ መመሳሰል አለበት. ቅንጅቶች በፋይል ውስጥ ተከማችተዋል። ለብቻው-ha.xml, በተጨማሪ, ወደ የውሂብ ጎታ እና የጭነት ሚዛን የጋራ መዳረሻ ማድረግ አለብዎት.
  • የጎራ ስብስብ - ክላስተርን በተለመደው ሁነታ መጀመር ክላስተር እያደገ ሲሄድ በፍጥነት መደበኛ እና አሰልቺ ሾል ይሆናል, ምክንያቱም አወቃቀሩን በቀየሩ ቁጥር በእያንዳንዱ የክላስተር መስቀለኛ መንገድ ላይ ሁሉንም ለውጦች ማድረግ ያስፈልግዎታል. የክዋኔው የጎራ ሁኔታ አንዳንድ የጋራ ማከማቻን በማዘጋጀት እና አወቃቀሩን በማተም ይህንን ችግር ይፈታል። እነዚህ ቅንብሮች በፋይል ውስጥ ይቀመጣሉ። domain.xml
  • በመረጃ ማእከሎች መካከል ማባዛት - Keycloakን በበርካታ የመረጃ ማእከሎች ክላስተር ውስጥ ማስኬድ ከፈለጉ ብዙ ጊዜ በተለያዩ ጂኦግራፊያዊ አካባቢዎች። በዚህ አማራጭ እያንዳንዱ የመረጃ ማዕከል የራሱ የሆነ የKeycloak አገልጋዮች ስብስብ ይኖረዋል።

በዚህ ጽሑፍ ውስጥ, ሁለተኛውን አማራጭ ጠለቅ ብለን እንመለከታለን, ማለትም. መደበኛ ዘለላ, እንዲሁም በመረጃ ማእከሎች መካከል ያለውን የማባዛት ርዕስ ላይ ትንሽ ይንኩ, እነዚህን ሁለት አማራጮች በኩበርኔትስ ውስጥ ማስኬድ ምክንያታዊ ስለሆነ. እንደ እድል ሆኖ ኩበርኔትስ የበርካታ ፖድ (Keycloak nodes) ቅንጅቶችን በማመሳሰል ላይ ችግር የለበትም። የጎራ ስብስብ ለማድረግ በጣም ከባድ አይሆንም.

እንዲሁም እባክዎን ቃሉን ያስተውሉ እጅብታ የአንቀጹ መጨረሻ በአንድ ላይ በሚሰሩ የኪሎክ ኖዶች ቡድን ላይ ብቻ ተፈጻሚ እስከሚሆን ድረስ የኩበርኔትስ ክላስተርን መጥቀስ አያስፈልግም።

መደበኛ የቁልፍ ክላስተር

Keycloakን በዚህ ሁነታ ለማስኬድ የሚከተሉትን ያስፈልግዎታል

  • የውጭ የጋራ ዳታቤዝ አዘጋጅ
  • የጭነት ሚዛን ጫን
  • የውስጥ አውታረ መረብ ከአይፒ መልቲካስት ድጋፍ ጋር

የዚህ ጽሑፍ ዓላማ ስላልሆነ የውጪውን የውሂብ ጎታ አወቃቀሩን አንተነተንም። አንድ ቦታ የሚሰራ የውሂብ ጎታ እንዳለ እናስብ - እና ከእሱ ጋር የግንኙነት ነጥብ አለን. በቀላሉ ይህንን ውሂብ ወደ የአካባቢ ተለዋዋጮች እንጨምራለን.

Keycloak እንዴት በከሸፈ (HA) ክላስተር ውስጥ እንደሚሰራ በተሻለ ለመረዳት፣ ሁሉም በWildfly ክላስተር ችሎታዎች ላይ ምን ያህል እንደሚወሰን ማወቅ አስፈላጊ ነው።

Wildfly ብዙ ንዑስ ስርዓቶችን ይጠቀማል ፣ አንዳንዶቹ እንደ ጭነት ሚዛን ያገለግላሉ ፣ አንዳንዶቹ ለመውደቅ ያገለግላሉ። የሎድ ሚዛኑ የክላስተር መስቀለኛ መንገድ ከመጠን በላይ ሲጫን የመተግበሪያውን መገኘት ያረጋግጣል፣ እና አለመሳካቱ አንዳንድ የክላስተር ኖዶች ባይሳኩም የመተግበሪያውን መገኘት ያረጋግጣል። ከእነዚህ ንዑስ ስርዓቶች ውስጥ አንዳንዶቹ የሚከተሉት ናቸው፡-

  • mod_cluster: ከ Apache ጋር በመተባበር እንደ ኤችቲቲፒ ጭነት ሚዛን ይሰራል፣ ለነባሪ አስተናጋጅ ግኝት በTCP መልቲካስት ላይ የተመሠረተ ነው። በውጫዊ ሚዛን መተካት ይቻላል.

  • infinispanJGroups ቻናሎችን እንደ ማጓጓዣ ንብርብር በመጠቀም የተከፋፈለ መሸጎጫ። እንደ አማራጭ፣ የመሸጎጫውን ይዘት ለማመሳሰል ከውጪ ከኢንፊኒስፓን ክላስተር ጋር ለመገናኘት የ HotRod ፕሮቶኮልን መጠቀም ይችላል።

  • jgroupsበJGroups ቻናሎች ላይ ተመስርተው በከፍተኛ ደረጃ ለሚገኙ አገልግሎቶች የቡድን ማህበር ድጋፍን ይሰጣል። የተሰየሙ ቧንቧዎች በክላስተር ውስጥ ያሉ የመተግበሪያ ምሳሌዎችን በቡድን እንዲገናኙ ያስችላቸዋል ይህም ግንኙነቱ እንደ አስተማማኝነት ፣ ሥርዓታማነት እና ውድቀት ትብነት ያሉ ባህሪዎች አሉት።

የጭነት ሚዛን

በ Kubernetes ክላስተር ውስጥ ሚዛንን እንደ ውስጠ-ተቆጣጣሪ ሲጭኑ የሚከተሉትን ነገሮች ግምት ውስጥ ማስገባት አስፈላጊ ነው.

የ Keycloak ስራ የሚያመለክተው ደንበኛው በኤችቲቲፒ በኩል ከማረጋገጫ አገልጋይ ጋር የሚያገናኘው የርቀት አድራሻ የደንበኛው ኮምፒዩተር ትክክለኛ የአይፒ አድራሻ ነው። ሚዛናዊ እና የመግቢያ ቅንጅቶች HTTP ራስጌዎችን በትክክል ማቀናበር አለባቸው X-Forwarded-For и X-Forwarded-Proto, እና ዋናውን ርዕስ አቆይ HOST. የቅርብ ጊዜ ስሪት ingress-nginx (> 0.22.0) በነባሪነት ያሰናክለዋል።

ባንዲራ ማግበር proxy-address-forwarding የአካባቢን ተለዋዋጭ በማዘጋጀት PROXY_ADDRESS_FORWARDING в true Keycloak ከፕሮክሲ ጀርባ እየሮጠ መሆኑን እንዲገነዘብ ያደርገዋል።

እንዲሁም ማንቃት ያስፈልግዎታል የተጣበቁ ክፍለ ጊዜዎች በመግቢያው ላይ ። Keycloak ከአሁኑ የማረጋገጫ ክፍለ-ጊዜ እና የተጠቃሚ ክፍለ-ጊዜ ጋር የተገናኘ ውሂብ ለማከማቸት የ Infinispan's የተከፋፈለ መሸጎጫ ይጠቀማል። መሸጎጫዎች በነባሪ ነጠላ ባለቤት ናቸው፣ በሌላ አነጋገር ያ የተወሰነ ክፍለ ጊዜ በአንዳንድ የክላስተር መስቀለኛ መንገድ ላይ ይከማቻል እና ሌሎች አንጓዎች የዚያ ክፍለ ጊዜ መዳረሻ ከፈለጉ በርቀት መጠየቅ አለባቸው።

በተለይም ከሰነዶቹ በተቃራኒ ክፍለ ጊዜን ከኩኪው ስም ጋር ማያያዝ ለእኛ አልሰራም። AUTH_SESSION_ID. የቁልፍ ክሎክ ማዘዋወሩን አዙሮታል፣ ስለዚህ ለተለጣፊው ክፍለ ጊዜ የተለየ የኩኪ ስም እንዲመርጡ እንመክራለን።

ኪልሎክ መጀመሪያ መልስ የሰጠውን የአስተናጋጅ ስምም አያይዟል። AUTH_SESSION_ID, እና በጣም ባለው ስሪት ውስጥ ያለው እያንዳንዱ መስቀለኛ መንገድ አንድ አይነት የውሂብ ጎታ ስለሚጠቀም እያንዳንዳቸው ሊኖረው ይገባል ግብይቶችን ለማስተዳደር የተለየ እና ልዩ የመስቀለኛ መንገድ መታወቂያ። ውስጥ ማስገባት ይመከራል JAVA_OPTS መለኪያዎች jboss.node.name и jboss.tx.node.id ለእያንዳንዱ መስቀለኛ መንገድ ልዩ - ለምሳሌ, የፖዳውን ስም ማዘጋጀት ይችላሉ. የፖድ ስም ካስቀመጥክ - ስለ jboss ተለዋዋጮች ስለ 23 ቁምፊ ገደብ አትርሳ, ስለዚህ StatefulSet መጠቀም የተሻለ ነው, አይደለም Deployment.

አንድ ተጨማሪ መሰቅሰቂያ - ፖድ ከተሰረዘ ወይም እንደገና ከተጀመረ መሸጎጫው ጠፍቷል። ይህንን ከግምት ውስጥ በማስገባት ለሁሉም መሸጎጫዎች የመሸጎጫ ባለቤቶችን ቁጥር ቢያንስ ለሁለት ማቀናበሩ ጠቃሚ ነው, ስለዚህ የመሸጎጫ ቅጂ ይኖራል. መፍትሄው መሮጥ ነው። ለ Wildfly ስክሪፕት ፖድውን ሲጀምሩ, በማውጫው ውስጥ ያስቀምጡት /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 ወደሚፈለገው.

የግል አውታረ መረብ ከአይፒ መልቲካስት ድጋፍ ጋር

Weavenetን እንደ የእርስዎ CNI እየተጠቀሙ ከሆነ፣ መልቲካስት ወዲያውኑ ይሰራል - እና የኪሎክ ኖዶችዎ ልክ እንደተነሱ እና ሲሰሩ ይገናኛሉ።

በእርስዎ Kubernetes ክላስተር ውስጥ የአይ ፒ መልቲካስት ድጋፍ ከሌልዎት፣ ኖዶችን ለማግኘት 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.

በመረጃ ማእከሎች መካከል ማባዛት

የ Keycloak ን በ HA ሁነታ በ Kubernetes ላይ ያሂዱ

ግንኙነት

Keycloak በቁልፍ ክላክ ኖዶች ለተመረቱ ለእያንዳንዱ የውሂብ ማዕከል አስተናጋጅ በርካታ የተለያዩ Infinispan መሸጎጫ ስብስቦችን ይጠቀማል። ግን በተመሳሳይ ጊዜ በተለያዩ የመረጃ ማእከሎች ውስጥ በ Keycloak nodes መካከል ምንም ልዩነት የለም.

በመረጃ ማዕከሎች መካከል ለመነጋገር የኪሎክ ኖዶች ውጫዊ የጃቫ ዳታ ግሪድ (ኢንፊኒስፓን አገልጋዮች) ይጠቀማሉ። ግንኙነት በፕሮቶኮሉ መሰረት ይሰራል ኢንፊኒስፓን HotRod.

የኢንፊኒስፓን መሸጎጫዎች ከባህሪው ጋር መዋቀር አለባቸው remoteStoreመረጃው በርቀት ውስጥ እንዲከማች (በሌላ የመረጃ ማእከል ውስጥ ፣ በግምት ተርጓሚ) መሸጎጫዎች. በJDG አገልጋዮች መካከል የተለየ የኢንፊኒስፓን ዘለላዎች ስላሉ በጣቢያው ላይ በJDG1 ላይ የተከማቸ መረጃ site1 በጣቢያው ላይ ወደ JDG2 ይደገማል site2.

በመጨረሻ፣ ተቀባይው የJDG አገልጋይ የክላስተር ኪክሎክ አገልጋዮችን በደንበኛ ግንኙነት ያሳውቃል፣ ይህም የሆትሮድ ፕሮቶኮል ባህሪ ነው። የቁልፍ ካባ አንጓዎች በርተዋል። site2 የኢንፊኒስፓን መሸጎጫዎችን ያዘምኑ እና የተለየ የተጠቃሚ ክፍለ ጊዜ በቁልፍ ኖዶች ላይ ይገኛል። site2.

እንዲሁም ለአንዳንድ መሸጎጫዎች ምትኬ እንዳይቀመጥ እና በ Infinispan አገልጋይ በኩል መረጃን ለመፃፍ ሙሉ በሙሉ እምቢ ማለት ይቻላል ። ይህንን ለማድረግ ቅንብሩን ማስወገድ ያስፈልግዎታል remote-store የተወሰነ የኢንፊኒስፓን መሸጎጫ (በፋይል ውስጥ ለብቻው-ha.xml), ከዚያ በኋላ የተወሰነ replicated-cache ከኢንፊኒስፓን አገልጋይ ጎንም አያስፈልግም።

መሸጎጫዎችን በማዘጋጀት ላይ

በ Keycloak ውስጥ ሁለት አይነት መሸጎጫዎች አሉ፡

  • አካባቢያዊ። ከመሠረቱ አጠገብ ይገኛል, በመረጃ ቋቱ ላይ ያለውን ጭነት ለመቀነስ, እንዲሁም የምላሽ መዘግየትን ለመቀነስ ያገለግላል. ይህ ዓይነቱ መሸጎጫ ግዛትን፣ ደንበኞችን፣ ሚናዎችን እና የተጠቃሚን ዲበ ውሂብ ያከማቻል። ይህ መሸጎጫ የኪሎክ ክላስተር አካል ቢሆንም እንኳ ይህ ዓይነቱ መሸጎጫ አይደገምም። በመሸጎጫው ውስጥ የተወሰነ ግቤት ከተቀየረ የለውጥ መልእክት በክላስተር ውስጥ ላሉ ሌሎች አገልጋዮች ይላካል ፣ ከዚያ በኋላ ግቤቱ ከመሸጎጫው ውስጥ አይካተትም። መግለጫ ተመልከት work ሾለ ሂደቱ የበለጠ ዝርዝር መግለጫ ከዚህ በታች.

  • ሊባዛ የሚችል። የይለፍ ቃል የማስገር ሙከራዎችን እና ሌሎች ጥቃቶችን ለማግኘት የተጠቃሚ ክፍለ-ጊዜዎችን፣ ከመስመር ውጭ ማስመሰያዎችን እና የመግባት አለመሳካቶችን ይቆጣጠራል። በእነዚህ መሸጎጫዎች ውስጥ የተከማቸው ውሂብ ጊዜያዊ ነው፣ በ RAM ውስጥ ብቻ ይከማቻል፣ ነገር ግን በክላስተር ውስጥ ሊባዛ ይችላል።

የኢንፊኒስፓን መሸጎጫዎች

ክፍለ-ጊዜዎች - በ Keycloak ውስጥ ያለ ጽንሰ-ሐሳብ ፣ የተለዩ መሸጎጫዎች ፣ የሚጠሩት። authenticationSessions, የተወሰኑ ተጠቃሚዎችን ውሂብ ለማከማቸት ያገለግላሉ. ከእነዚህ መሸጎጫዎች የሚቀርቡ ጥያቄዎች አብዛኛውን ጊዜ የሚፈለጉት በአፕሊኬሽኖች ሳይሆን በአሳሹ እና በቁልፍ ክሎክ አገልጋዮች ነው። ይህ በተጣበቁ ክፍለ-ጊዜዎች ላይ ያለው ጥገኝነት እራሱን የሚገለጥበት ነው, እና እንደዚህ ያሉ መሸጎጫዎች እራሳቸው በንቁ-ንቁ ሁነታ ላይ እንኳን እንደገና መድገም አያስፈልጋቸውም.

የድርጊት ምልክቶች. ሌላ ጽንሰ-ሀሳብ፣ ብዙውን ጊዜ ለተለያዩ ሁኔታዎች ጥቅም ላይ የሚውለው፣ ለምሳሌ ተጠቃሚው አንድን ነገር በደብዳቤ የማይመሳሰል ማድረግ ሲፈልግ ነው። ለምሳሌ, በሂደቱ ወቅት forget password መሸጎጫ actionTokens ተዛማጅ ምልክቶችን ሜታዳታ ለመከታተል ጥቅም ላይ ይውላል - ለምሳሌ ፣ ማስመሰያው ቀድሞውኑ ጥቅም ላይ ውሏል እና እንደገና ሊነቃ አይችልም። ይህ ዓይነቱ መሸጎጫ በተለምዶ በዳታ ማእከሎች መካከል መደገም አለበት።

የተከማቸ ውሂብ መሸጎጫ እና ጊዜው የሚያበቃበት ጭነቱን ከመረጃ ቋቱ ላይ ለማንሳት ይሰራል። ይህ መሸጎጫ አፈጻጸምን ያሻሽላል ነገር ግን ግልጽ የሆነ ችግርን ይጨምራል። አንድ የKeycloak አገልጋይ መረጃውን ካዘመነ፣ የተቀሩት አገልጋዮች መሸጎጫቸውን ማዘመን እንዲችሉ ማሳወቅ አለባቸው። Keycloak የአካባቢ መሸጎጫዎችን ይጠቀማል realms, users и authorization የውሂብ ጎታውን ለመሸጎጥ.

የተለየ መሸጎጫም አለ። work, በሁሉም የመረጃ ማእከሎች ላይ ይደገማል. እሱ ራሱ ከመረጃ ቋቱ ምንም አይነት መረጃ አያከማችም ፣ ግን የውሂብ ያረጁ መልዕክቶችን በመረጃ ማእከሎች መካከል ወደ ክላስተር ኖዶች ለመላክ ያገለግላል። በሌላ አነጋገር ልክ መረጃው እንደተዘመነ የ Keycloak node በዳታ ማእከሉ ውስጥ ላሉ አንጓዎች እንዲሁም በሌሎች የመረጃ ቋቶች ውስጥ ላሉ አንጓዎች መልእክት ይልካል። እንደዚህ አይነት መልእክት ከደረሰ በኋላ እያንዳንዱ መስቀለኛ መንገድ በአካባቢው መሸጎጫዎች ውስጥ ያለውን ተዛማጅ ውሂብ ያጸዳል።

የተጠቃሚ ክፍለ-ጊዜዎች. ስሞች ያላቸው መሸጎጫዎች sessions, clientSessions, offlineSessions и offlineClientSessionsብዙውን ጊዜ በመረጃ ማእከሎች መካከል ይባዛሉ እና ተጠቃሚው በአሳሹ ውስጥ ንቁ ሆኖ ሳለ ንቁ ስለሆኑ የተጠቃሚ ክፍለ-ጊዜዎች ውሂብ ለማከማቸት ያገለግላሉ። እነዚህ መሸጎጫዎች ከዋና ተጠቃሚዎች የሚመጡ የኤችቲቲፒ ጥያቄዎችን ከሚያስተናግድ መተግበሪያ ጋር አብረው ይሰራሉ ​​\uXNUMXb\uXNUMXb፣ ስለዚህ እነሱ ከተጣበቁ ክፍለ-ጊዜዎች ጋር የተቆራኙ ናቸው እና በዳታ ማእከሎች መካከል መደገም አለባቸው።

የጭካኔ ኃይል ጥበቃ. መሸጎጫ loginFailures የመግቢያ ስህተት ውሂብን ለመከታተል ጥቅም ላይ ይውላል፣ ለምሳሌ ተጠቃሚው የተሳሳተ የይለፍ ቃል ያስገቡበት ጊዜ ብዛት። የዚህ መሸጎጫ ማባዛት የአስተዳዳሪው ነው. ነገር ግን ለትክክለኛ ስሌት, በመረጃ ማእከሎች መካከል ማባዛትን ማግበር ጠቃሚ ነው. ግን በሌላ በኩል, ይህንን ውሂብ ካልደጋገሙ, አፈፃፀሙን ማሻሻል ይችላሉ, እና ይህ ጥያቄ ከተነሳ, ማባዛት ላይሰራ ይችላል.

የኢንፊኒስፓን ክላስተር በሚለቀቅበት ጊዜ የመሸጎጫ ፍቺዎችን በቅንብሮች ፋይሉ ላይ ማከል አለብዎት፡

<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" />

የቁልፍ ክላስተርን ከማሄድዎ በፊት የኢንፊኒስፓን ክላስተር ማዋቀር እና መጀመር አለብዎት

ከዚያ ማዋቀር ያስፈልግዎታል 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 HotRod እንዲሰራ ለቁልፍ ኖዶች፡- remote.cache.host, remote.cache.port እና የአገልግሎት ስም jboss.site.name.

አገናኞች እና ተጨማሪ ሰነዶች

ጽሑፉ በሠራተኞች ተተርጉሞ ለሐብር ተዘጋጅቷል የስሉም ማሰልጠኛ ማዕከል - የተጠናከረ ፣ የቪዲዮ ኮርሶች እና የኮርፖሬት ስልጠና ከተለማመዱ (Kubernetes ፣ DevOps ፣ Docker ፣ Ansible ፣ Ceph ፣ SRE)

ምንጭ: hab.com

አስተያየት ያክሉ