Kubernetes تي HA موڊ ۾ Keycloak هلائڻ

Kubernetes تي HA موڊ ۾ Keycloak هلائڻ

TL، ڊاڪٽر: اتي Keycloak جي وضاحت ڪئي ويندي، هڪ اوپن سورس رسائي ڪنٽرول سسٽم، اندروني جوڙجڪ جو تجزيو، ترتيب جي تفصيل.

تعارف ۽ اهم خيالات

هن آرٽيڪل ۾، اسان ڏسنداسين بنيادي خيالن کي ذهن ۾ رکڻ لاء جڏهن هڪ ڪيڪلوڪ ڪلستر کي ڪبرنيٽس جي چوٽي تي ترتيب ڏيو.

جيڪڏهن توهان Keycloak بابت وڌيڪ ڄاڻڻ چاهيو ٿا، مضمون جي آخر ۾ ڏنل لنڪس جو حوالو ڏيو. عمل ۾ وڌيڪ وسعت پيدا ڪرڻ لاء، توهان پڙهي سگهو ٿا اسان جو ذخيرو هڪ ماڊل سان جيڪو هن آرٽيڪل جي بنيادي خيالن کي لاڳو ڪري ٿو (لانچ گائيڊ موجود آهي، هي آرٽيڪل ڊوائيس ۽ سيٽنگن جو هڪ جائزو فراهم ڪندو، لڳ ڀڳ مترجم).

Keycloak هڪ جامع نظام آهي جيڪو جاوا ۾ لکيل آهي ۽ هڪ ايپليڪيشن سرور جي چوٽي تي ٺهيل آهي وائلڊ فلائي. مختصر ۾، اهو اختيار ڏيڻ لاء هڪ فريم ورڪ آهي جيڪو ايپليڪيشن صارفين فيڊريشن ۽ SSO (سنگل سائن آن) صلاحيتون ڏئي ٿو.

اسان توهان کي سرڪاري پڙهڻ جي دعوت ڏيون ٿا ويب سائيٽ يا وڪيپيڊيا تفصيلي سمجھڻ لاء.

ڪيڪلوڪ لانچ ڪرڻ

Keycloak کي هلائڻ لاءِ ٻن مسلسل ڊيٽا ذريعن جي ضرورت آھي:

  • هڪ ڊيٽابيس قائم ڪيل ڊيٽا کي ذخيرو ڪرڻ لاء استعمال ڪيو ويو آهي، جهڙوڪ صارف جي معلومات
  • Datagrid ڪيش، جيڪو ڊيٽابيس مان ڊيٽا کي ڪيش ڪرڻ لاء استعمال ڪيو ويندو آهي، انهي سان گڏ ڪجهه مختصر-رهندڙ ۽ بار بار تبديل ٿيندڙ ميٽا ڊيٽا کي ذخيرو ڪرڻ لاء، جهڙوڪ صارف سيشن. لاڳو ٿيل Infinispan، جيڪو عام طور تي ڊيٽابيس کان گهڻو تيز هوندو آهي. پر ڪنهن به صورت ۾، Infinispan ۾ محفوظ ڪيل ڊيٽا عارضي آهي - ۽ ان کي ڪٿي به محفوظ ڪرڻ جي ضرورت ناهي جڏهن ڪلستر ٻيهر شروع ڪيو وڃي.

Keycloak چار مختلف طريقن ۾ ڪم ڪري ٿو:

  • عام - ھڪڙو ۽ صرف ھڪڙو عمل، ھڪڙي فائل ذريعي ترتيب ڏنل standalone.xml
  • باقاعده ڪلستر (اعلي دستيابي اختيار) - سڀني عملن کي ساڳيو ترتيب استعمال ڪرڻ گهرجي، جيڪو دستي طور تي هم وقت سازي ٿيڻ گهرجي. سيٽنگون فائل ۾ محفوظ ٿيل آهن standalone-ha.xml، اضافي طور تي توهان کي ڊيٽابيس تائين حصيداري رسائي ۽ لوڊ بيلنس ڪرڻ جي ضرورت آهي.
  • ڊومين ڪلستر - عام موڊ ۾ ڪلستر شروع ڪرڻ جلدي هڪ معمولي ۽ بورنگ ڪم بڻجي ويندو آهي جيئن ڪلسٽر وڌندو آهي، جڏهن ته هر دفعي ترتيب تبديل ٿيندي آهي، سڀ تبديليون هر ڪلستر نوڊ تي ٿيڻ گهرجن. آپريشن جو ڊومين موڊ ھن مسئلي کي حل ڪري ٿو ڪجھ شيئر ڪيل اسٽوريج جڳھ کي ترتيب ڏيڻ ۽ ترتيب کي شايع ڪندي. اهي سيٽنگون فائل ۾ محفوظ ٿيل آهن domain.xml
  • ڊيٽا سينٽرن جي وچ ۾ نقل - جيڪڏھن توھان چاھيو ٿا Keycloak ڪيترن ئي ڊيٽا سينٽرن جي ڪلستر ۾، اڪثر ڪري مختلف جاگرافيائي جڳهن ۾. هن آپشن ۾، هر ڊيٽا سينٽر کي ڪيڪلوڪ سرورز جو پنهنجو ڪلستر هوندو.

هن آرٽيڪل ۾ اسان تفصيل سان غور ڪنداسين ته ٻيو اختيار، اهو آهي باقاعده ڪلستر، ۽ اسان ڊيٽا سينٽرن جي وچ ۾ نقل جي موضوع تي پڻ ٿورڙو رابطو ڪنداسين، ڇاڪاڻ ته اهو سمجھ ۾ اچي ٿو ته انهن ٻن اختيارن کي ڪبرنيٽس ۾ هلائڻ. خوشقسمتيء سان، ڪبرنيٽس ۾ ڪيترن ئي پوڊس (Keycloak nodes) جي سيٽنگن کي هم وقت سازي ڪرڻ ۾ ڪو مسئلو ناهي، تنهنڪري ڊومين ڪلستر اهو ڪرڻ تمام ڏکيو نه ٿيندو.

پڻ مهرباني ڪري نوٽ ڪريو ته لفظ ڪلسٽر باقي مضمون لاءِ لاڳو ٿيندو صرف Keycloak نوڊس جي هڪ گروپ تي جيڪو گڏجي ڪم ڪري رهيو آهي، ڪوبرنيٽس ڪلستر ڏانهن رجوع ڪرڻ جي ڪا ضرورت ناهي.

باقاعده Keycloak ڪلستر

هن موڊ ۾ Keycloak هلائڻ لاء توهان کي ضرورت آهي:

  • خارجي حصيداري ڊيٽابيس کي ترتيب ڏيو
  • لوڊ بيلنس انسٽال ڪريو
  • IP ملٽي ڪاسٽ سپورٽ سان هڪ اندروني نيٽ ورڪ آهي

اسان هڪ خارجي ڊيٽابيس قائم ڪرڻ تي بحث نه ڪنداسين، ڇاڪاڻ ته اهو هن مضمون جو مقصد ناهي. اچو ته فرض ڪريو ته اتي هڪ ڪم ڪندڙ ڊيٽابيس آهي ڪٿي - ۽ اسان وٽ ان لاء هڪ ڪنيڪشن پوائنٽ آهي. اسان صرف هن ڊيٽا کي ماحولياتي متغيرن ۾ شامل ڪنداسين.

بهتر سمجهڻ لاءِ ته Keycloak ڪيئن ڪم ڪري ٿو هڪ ناڪامي (HA) ڪلسٽر ۾، اهو ڄاڻڻ ضروري آهي ته اهو سڀ ڪجهه Wildfly جي ڪلسترنگ صلاحيتن تي منحصر آهي.

Wildfly ڪيترن ئي سبسسٽمن کي استعمال ڪري ٿو، انهن مان ڪجهه لوڊ بيلنس طور استعمال ڪيا ويا آهن، ڪجهه غلطي رواداري لاء. لوڊ بيلنس ايپليڪيشن جي دستيابي کي يقيني بڻائي ٿو جڏهن ڪلستر نوڊ اوور لوڊ ٿيل آهي، ۽ غلطي رواداري ايپليڪيشن جي دستيابي کي يقيني بڻائي ٿي جيتوڻيڪ ڪي ڪلستر نوڊس ناڪام ٿي وڃن. انهن مان ڪجهه سب سسٽم:

  • mod_cluster: Apache سان گڏ ڪم ڪري ٿو HTTP لوڊ بيلنسر جي طور تي، ڊفالٽ طور تي ميزبان ڳولڻ لاءِ TCP ملٽي ڪاسٽ تي منحصر آهي. هڪ خارجي بيلنس سان تبديل ٿي سگهي ٿو.

  • infinispan: هڪ ورهايل ڪيش JGroups چينلز کي ٽرانسپورٽ پرت طور استعمال ڪندي. اضافي طور تي، اهو استعمال ڪري سگھي ٿو HotRod پروٽوڪول هڪ خارجي Infinispan ڪلستر سان رابطو ڪرڻ لاءِ ڪيش مواد کي هم وقت سازي ڪرڻ لاءِ.

  • jgroups: JGroups چينلز جي بنياد تي انتهائي دستياب خدمتن لاءِ گروپ ڪميونيڪيشن سپورٽ مهيا ڪري ٿي. نامزد ٿيل پائپس ايپليڪيشن جي مثالن کي ڪلستر ۾ گروپن ۾ ڳنڍڻ جي اجازت ڏين ٿا ته جيئن رابطي ۾ خاصيتون آهن جهڙوڪ اعتبار، ترتيب، ۽ ناڪامي جي حساسيت.

لوڊ بيلنس

جڏهن ڪوبرنيٽس ڪلستر ۾ انگريس ڪنٽرولر جي طور تي بيلنس کي نصب ڪيو وڃي، اهو ضروري آهي ته هيٺين شين کي ذهن ۾ رکڻ گهرجي:

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 ڪيش استعمال ڪري ٿو. ڪيچ ڊفالٽ طور ھڪڙي مالڪ سان هلائيندا آھن، ٻين لفظن ۾، اھو خاص سيشن ڪلستر ۾ ڪجھ نوڊ تي ذخيرو ٿيل آھي، ۽ ٻين نوڊس کي ان کان پڇڻ گھرجي جيڪڏھن انھن کي ان سيشن تائين رسائي جي ضرورت آھي.

خاص طور تي، دستاويز جي برعڪس، ڪوڪي نالي سان هڪ سيشن کي ڳنڍڻ اسان لاء ڪم نه ڪيو AUTH_SESSION_ID. Keycloak وٽ ھڪڙو ريڊائريڪٽ لوپ آھي، تنھنڪري اسان سفارش ڪريون ٿا ته مختلف ڪوڪيز جو نالو چونڊيو وڃي اسٽڪي سيشن لاءِ.

Keycloak پڻ نوڊ جو نالو ڳنڍي ٿو جيڪو پهريون جواب ڏنو AUTH_SESSION_ID، ۽ جيئن ته هر نوڊ انتهائي دستياب ورزن ۾ ساڳيو ڊيٽابيس استعمال ڪري ٿو، انهن مان هر هڪ ضرور هجڻ گھرجي ٽرانزيڪشن کي منظم ڪرڻ لاء هڪ الڳ ۽ منفرد نوڊ سڃاڻپ ڪندڙ. ان ۾ داخل ڪرڻ جي صلاح ڏني آهي JAVA_OPTS حراست ۾ jboss.node.name и jboss.tx.node.id هر نوڊ لاءِ منفرد - توهان ڪري سگهو ٿا، مثال طور، پوڊ جو نالو. جيڪڏهن توهان هڪ پوڊ جو نالو رکون ٿا، نه وساريو 23 ڪردار جي حد جي باري ۾ jboss متغيرن لاء، تنهنڪري اهو بهتر آهي ته هڪ رياستي سيٽ استعمال ڪرڻ بجاء هڪ مقرري جي ڀيٽ ۾.

ٻيو ريڪ - جيڪڏهن پوڊ کي ختم ڪيو وڃي يا ٻيهر شروع ڪيو وڃي، ان جي ڪيش وڃائي وئي آهي. انهي کي مدنظر رکندي، اهو ضروري آهي ته ڪيش جي مالڪن جو تعداد سڀني ڪيش لاءِ گهٽ ۾ گهٽ ٻن تائين مقرر ڪيو وڃي، ته جيئن ڪيش جي ڪاپي باقي رهي. ھلڻ جو حل آھي 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 گهربل تائين.

IP ملٽي ڪاسٽ سپورٽ سان پرائيويٽ نيٽ ورڪ

جيڪڏهن توهان Weavenet کي CNI طور استعمال ڪيو ٿا، ملٽي ڪاسٽ فوري طور تي ڪم ڪندو - ۽ توهان جي Keycloak نوڊس هڪ ٻئي کي ڏسندا جيئن ئي اهي لانچ ٿيندا.

جيڪڏهن توهان وٽ پنهنجي ڪبرنيٽس ڪلستر ۾ ip ملٽي ڪاسٽ سپورٽ نه آهي، توهان نوڊس ڳولڻ لاءِ ٻين پروٽوڪولن سان ڪم ڪرڻ لاءِ JGroups ترتيب ڏئي سگهو ٿا.

پهريون اختيار استعمال ڪرڻ آهي KUBE_DNSجيڪو استعمال ڪري ٿو headless service Keycloak نوڊس ڳولڻ لاءِ، توھان صرف پاس ڪريو JGroups سروس جو نالو جيڪو نوڊس ڳولڻ لاءِ استعمال ڪيو ويندو.

ٻيو اختيار طريقو استعمال ڪرڻ آهي KUBE_PING، جيڪو نوڊس ڳولڻ لاءِ API سان ڪم ڪري ٿو (توهان کي ترتيب ڏيڻ جي ضرورت آهي serviceAccount حقن سان list и get، ۽ پوءِ ان سان ڪم ڪرڻ لاءِ پوڊ کي ترتيب ڏيو serviceAccount).

JGroups ڳولڻ جو طريقو ماحول جي متغيرن کي ترتيب ڏيڻ سان ترتيب ڏنل آهي JGROUPS_DISCOVERY_PROTOCOL и JGROUPS_DISCOVERY_PROPERTIES. لاء KUBE_PING توھان کي پڇڻ سان پوڊ چونڊڻ جي ضرورت آھي namespace и labels.

️ جيڪڏهن توهان ملٽي ڪاسٽ استعمال ڪندا آهيو ۽ هڪ ڪبرنيٽس ڪلسٽر ۾ ٻه يا وڌيڪ ڪيڪلوڪ ڪلسٽر هلائيندا آهيو (چون ٿا هڪ کي نالي جي جاءِ ۾ production، ٻيون - staging) - هڪ Keycloak ڪلستر جا نوڊ ٻئي ڪلستر ۾ شامل ٿي سگهن ٿا. متغير ترتيب ڏيڻ سان هر ڪلسٽر لاءِ هڪ منفرد ملٽي ڪاسٽ ايڊريس استعمال ڪرڻ جي پڪ ڪريوjboss.default.multicast.address и jboss.modcluster.multicast.address в JAVA_OPTS.

ڊيٽا سينٽرن جي وچ ۾ نقل

Kubernetes تي HA موڊ ۾ Keycloak هلائڻ

رابطي

Keycloak هر ڊيٽا سينٽر لاءِ ڪيترن ئي الڳ الڳ Infinispan ڪيش ڪلسٽر استعمال ڪري ٿو جتي ڪيڪلوڪ نوڊس مان ٺهيل Keycloack ڪلسٽر موجود آهن. پر مختلف ڊيٽا سينٽرن ۾ ڪيڪلوڪ نوڊس جي وچ ۾ ڪوبه فرق ناهي.

ڪيڪلوڪ نوڊس ڊيٽا سينٽرن جي وچ ۾ رابطي لاءِ ٻاهرين جاوا ڊيٽا گرڊ (Infinispan سرور) استعمال ڪن ٿا. ڪميونيڪيشن پروٽوڪول جي مطابق ڪم ڪري ٿي Infinispan HotRod.

Infinispan caches کي خاصيت سان ترتيب ڏيڻ لازمي آھي remoteStoreانهي ڪري ڊيٽا کي محفوظ ڪري سگهجي ٿو دور دراز (ٻي ڊيٽا سينٽر ۾، لڳ ڀڳ مترجم) ڪيچ. JDG سرورز جي وچ ۾ الڳ الڳ infinispan ڪلستر آهن، انهي ڪري ته سائيٽ تي JDG1 تي ذخيرو ٿيل ڊيٽا site1 سائيٽ تي JDG2 ڏانهن نقل ڪيو ويندو site2.

۽ آخرڪار، وصول ڪندڙ JDG سرور ڪلائنٽ ڪنيڪشن ذريعي پنهنجي ڪلستر جي Keycloak سرورز کي اطلاع ڏئي ٿو، جيڪو HotRod پروٽوڪول جي هڪ خاصيت آهي. Keycloak نوڊس تي site2 انهن جي Infinispan ڪيچ کي تازه ڪاري ڪريو ۽ مخصوص صارف سيشن پڻ Keycloak نوڊس تي دستياب ٿي ويندي site2.

ڪجهه ڪيچز لاءِ، اهو به ممڪن آهي ته بيڪ اپ نه ڪجي ۽ مڪمل طور تي Infinispan سرور ذريعي ڊيٽا لکڻ کان پاسو ڪجي. هن کي ڪرڻ لاء، توهان کي سيٽنگ کي هٽائڻ جي ضرورت آهي remote-store مخصوص Infinispan ڪيش (فائل ۾ standalone-ha.xml)، جنهن کان پوء ڪجهه مخصوص replicated-cache Infinispan سرور سائڊ تي به هاڻي ضرورت نه پوندي.

ڪيش قائم ڪرڻ

Keycloak ۾ ڪيش جا ٻه قسم آهن:

  • مقامي. اهو ڊيٽابيس جي اڳيان واقع آهي ۽ ڊيٽابيس تي لوڊ کي گهٽائڻ، ۽ انهي سان گڏ جواب جي ويڪرائي کي گهٽائڻ لاء ڪم ڪري ٿو. هن قسم جي ڪيش اسٽورن، ڪلائنٽ، ڪردار، ۽ صارف ميٽاداٽا. هن قسم جي ڪيش کي نقل نه ڪيو ويو آهي، جيتوڻيڪ ڪيش ڪيچ ڪلستر جو حصو آهي. جيڪڏهن ڪيش ۾ ڪا داخلا تبديل ٿئي ٿي، تبديلي بابت هڪ پيغام ڪلستر ۾ باقي سرورز ڏانهن موڪليو ويو آهي، جنهن کان پوء داخلا کي ڪيش مان خارج ڪيو ويندو آهي. وصف ڏسو work عمل جي وڌيڪ تفصيلي وضاحت لاء هيٺ ڏسو.

  • نقل ٿيل. پروسيسنگ يوزر سيشن، آف لائن ٽوڪن، ۽ پڻ لاگ ان غلطين جي نگراني ڪري ٿو پاسورڊ فشنگ جي ڪوششن ۽ ٻين حملن کي ڳولڻ لاء. انهن ڪيشز ۾ ذخيرو ٿيل ڊيٽا عارضي آهي، صرف رام ۾ ذخيرو ٿيل آهي، پر ڪلستر ۾ نقل ڪري سگهجي ٿو.

Infinispan caches

سيشن - Keycloak ۾ هڪ تصور، الڳ ڪيچ سڏيو ويندو آهي authenticationSessions، مخصوص استعمال ڪندڙن جي ڊيٽا کي محفوظ ڪرڻ لاء استعمال ڪيو ويندو آهي. انهن ڪيش مان درخواستون عام طور تي برائوزر ۽ ڪيڪلوڪ سرورز جي ضرورت هونديون آهن، ايپليڪيشنن طرفان نه. هي اهو آهي جتي لچڪدار سيشن تي انحصار راند ۾ اچي ٿو، ۽ اهڙي ڪيچ پاڻ کي نقل ڪرڻ جي ضرورت ناهي، جيتوڻيڪ فعال-فعال موڊ جي صورت ۾.

ايڪشن ٽوڪن. ٻيو تصور، عام طور تي مختلف منظرنامي لاءِ استعمال ٿيندو آهي جڏهن، مثال طور، صارف کي لازمي طور تي ميل ذريعي ڪجهه ڪرڻ گهرجي. مثال طور، عمل دوران 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" />

Keycloak ڪلستر شروع ڪرڻ کان اڳ توھان کي Infinispan ڪلستر کي ترتيب ڏيڻ ۽ شروع ڪرڻ گھرجي

پوء توهان کي ترتيب ڏيڻ جي ضرورت آهي remoteStore Keycloak caches لاءِ. هن کي ڪرڻ لاء، هڪ اسڪرپٽ ڪافي آهي، جيڪو اڳئين هڪ وانگر ڪيو ويو آهي، جيڪو متغير کي سيٽ ڪرڻ لاء استعمال ڪيو ويندو آهي. 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.

لنڪ ۽ اضافي دستاويز

مضمون ترجمو ڪيو ويو ۽ ملازمن پاران حبر لاءِ تيار ڪيو ويو سلم ٽريننگ سينٽر - سخت ڪورس، وڊيو ڪورسز ۽ عملي جي ماهرن کان ڪارپوريٽ ٽريننگ (Kubernetes، DevOps، Docker، Ansible، Ceph، SRE)

جو ذريعو: www.habr.com

تبصرو شامل ڪريو