เปเบฅเปˆเบ™ Keycloak เปƒเบ™เป‚เปเบ” HA เปƒเบ™ Kubernetes

เปเบฅเปˆเบ™ Keycloak เปƒเบ™เป‚เปเบ” HA เปƒเบ™ Kubernetes

TL; DR: เบˆเบฐเบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเปˆเบฝเบงเบเบฑเบš Keycloak, เบฅเบฐเบšเบปเบšเบเบฒเบ™เบ„เบงเบšเบ„เบธเบกเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”, เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบฒเบเปƒเบ™, เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ.

เบเบฒเบ™เปเบ™เบฐเบ™เปเบฒเปเบฅเบฐเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบซเบฑเบ™เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบ•เป‰เบญเบ‡เบˆเบทเปˆเป„เบงเป‰เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบ™เปเบฒเปƒเบŠเป‰เบเบธเปˆเบก Keycloak เบขเบนเปˆเป€เบ—เบดเบ‡ Kubernetes.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบš Keycloak, เบญเป‰เบฒเบ‡เบญเบตเบ‡เปƒเบชเปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เบ•เบญเบ™เบ—เป‰เบฒเบเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบก. เป€เบžเบทเปˆเบญเบเบฒเบเป€เบ›เบฑเบ™ immersed เบซเบผเบฒเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบถเบเบชเบฒ repository เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ เบเบฑเบšเป‚เบกเบ”เบนเบ™เบ—เบตเปˆเบ›เบฐเบ•เบดเบšเบฑเบ”เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ•เบปเป‰เบ™เบ•เปเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰ (เบ„เบนเปˆเบกเบทเบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเปเบกเปˆเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™, เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบˆเบฐเปƒเบซเป‰เบžเบฒเบšเบฅเบงเบกเบ‚เบญเบ‡เบญเบธเบ›เบฐเบเบญเบ™เปเบฅเบฐเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบ›เบฐเบกเบฒเบ™ เบ™เบฑเบเปเบ›).

Keycloak เปเบกเปˆเบ™เบฅเบฐเบšเบปเบšเบ—เบตเปˆเบชเบปเบกเบšเบนเบ™เปเบšเบšเบ—เบตเปˆเบ‚เบฝเบ™เปƒเบ™ Java เปเบฅเบฐเบชเป‰เบฒเบ‡เบขเบนเปˆเป€เบ—เบดเบ‡เบชเบธเบ”เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ เบ”เบญเบเป€เบœเบดเป‰เบ‡. เปƒเบ™เบชเบฑเป‰เบ™, เบกเบฑเบ™เป€เบ›เบฑเบ™เบเบญเบšเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบญเบฐเบ™เบธเบเบฒเบ”เบ—เบตเปˆเปƒเบซเป‰เบชเบฐเบซเบฐเบžเบฑเบ™เบœเบนเป‰เปƒเบŠเป‰เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™เปเบฅเบฐ SSO (เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเบ”เบฝเบง).

เบžเบงเบเป€เบฎเบปเบฒเป€เบŠเบตเบ™เบ—เปˆเบฒเบ™เบญเปˆเบฒเบ™เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™ เป€เบงเบฑเบšเป„เบŠเบ—เปŒ เบซเบผเบท เบงเบดเบเบดเบžเบตเป€เบ”เบ เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเปƒเบˆเบฅเบฐเบญเบฝเบ”.

เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบง Keycloak

Keycloak เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบญเบ‡เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ„เบปเบ‡เบ„เป‰เบฒเบ‡เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™:

  • เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบ•เบฑเป‰เบ‡เป„เบงเป‰ เป€เบŠเบฑเปˆเบ™: เบ‚เปเป‰เบกเบนเบ™เบœเบนเป‰เปƒเบŠเป‰
  • Datagrid cache, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญ cache เบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบšเบฒเบ‡ metadata เบชเบฑเป‰เบ™เปเบฅเบฐเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เป€เบฅเบทเป‰เบญเบเป†, เป€เบŠเบฑเปˆเบ™: เบเบญเบ‡เบ›เบฐเบŠเบธเบกเบœเบนเป‰เปƒเบŠเป‰. เบ›เบฐเบ•เบดเบšเบฑเบ” Infinispan, เป€เบŠเบดเปˆเบ‡เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปเบกเปˆเบ™เป„เบงเบเบงเปˆเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เปเบ•เปˆเปƒเบ™เบเปเบฅเบฐเบ™เบตเปƒเบ”เบเปเปˆเบ•เบฒเบก, เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เปƒเบ™ Infinispan เปเบกเปˆเบ™ ephemeral - เปเบฅเบฐเบกเบฑเบ™เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบเบšเบฑเบ™เบ—เบถเบเป„เบงเป‰เบ—เบธเบเบšเปˆเบญเบ™เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบเบธเปˆเบกเบ–เบทเบเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เปƒเบซเบกเปˆ.

Keycloak เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบชเบตเปˆเป‚เบซเบกเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™:

  • เบ—เปเบฒเบกเบฐเบ”เบฒ - เบซเบ™เบถเปˆเบ‡โ€‹เปเบฅเบฐโ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เบซเบ™เบถเปˆเบ‡โ€‹เบ‚เบฐโ€‹เบšเบงเบ™โ€‹เบเบฒเบ™โ€‹, configured เบœเปˆเบฒเบ™โ€‹เป„เบŸเบฅโ€‹เปŒโ€‹ standalone.xml
  • เบเบธเปˆเบกเบ›เบปเบเบเบฐเบ•เบด (เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบกเบตเบชเบนเบ‡) - เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เบˆเบฐเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ”เบฝเบงเบเบฑเบ™, เป€เบŠเบดเปˆเบ‡เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ synchronized เบ”เป‰เบงเบเบ•เบปเบ™เป€เบญเบ‡. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เป„เบŸเบฅเปŒ standalone-ha.xml, เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เปเบšเปˆเบ‡เบ›เบฑเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐ load balancer.
  • เบเบธเปˆเบกเป‚เบ”เป€เบกเบ™ โ€” เบเบฒเบ™เป€เบฅเบตเปˆเบกเบเบธเปˆเบกเบขเบนเปˆเปƒเบ™เป‚เปเบ”เบ›เบปเบเบเบฐเบ•เบดเบขเปˆเบฒเบ‡เบงเปˆเบญเบ‡เป„เบงเบˆเบฐเบเบฒเบเป€เบ›เบฑเบ™เบงเบฝเบเบ›เบฐเบˆเบณ เปเบฅเบฐเปœเป‰เบฒเป€เบšเบทเปˆเบญเป€เบกเบทเปˆเบญเบเบธเปˆเบกเป€เบ•เบตเบšเปƒเบซเบเปˆเบ‚เบถเป‰เบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบ—เบธเบเป†เบ„เบฑเป‰เบ‡เบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ, เบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบ—เบฑเบ‡เปเบปเบ”เบˆเบฐเบ•เป‰เบญเบ‡เบ–เบทเบเป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™เปเบ•เปˆเบฅเบฐ node เบ‚เบญเบ‡เบเบธเปˆเบก. เบฎเบนเบšเปเบšเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ‚เบญเบ‡เป‚เบ”เป€เบกเบ™เปเบเป‰เป„เบ‚เบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบšเบฒเบ‡เบšเปˆเบญเบ™เป€เบเบฑเบšเบกเป‰เบฝเบ™เบ—เบตเปˆเปเบšเปˆเบ‡เบ›เบฑเบ™ เปเบฅเบฐเป€เบœเบตเบเปเบœเปˆเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เป„เบŸเบฅเปŒ domain.xml
  • เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™ โ€” เบ–เป‰เบฒโ€‹เบซเบฒเบโ€‹เบงเปˆเบฒโ€‹เบ—เปˆเบฒเบ™โ€‹เบ•เป‰เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ—เบตเปˆโ€‹เบˆเบฐโ€‹เบ”เปเบฒโ€‹เป€เบ™เบตเบ™โ€‹เบเบฒเบ™ Keycloak เปƒเบ™โ€‹เบเบธเปˆเบกโ€‹เบ‚เบญเบ‡โ€‹เบชเบนเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบซเบ™เบถเปˆเบ‡โ€‹, เบชเปˆเบงเบ™โ€‹เบซเบผเบฒเบโ€‹เบกเบฑเบโ€‹เบˆเบฐโ€‹เบขเบนเปˆโ€‹เปƒเบ™โ€‹เบ—เบตเปˆโ€‹เบ•เบฑเป‰เบ‡โ€‹เบžเบนเบกโ€‹เบชเบฒเบ”โ€‹เบ—เบตเปˆโ€‹เปเบ•เบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบเบฑเบ™โ€‹. เปƒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰, เปเบ•เปˆเบฅเบฐเบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เบˆเบฐเบกเบตเบเบธเปˆเบกเบ‚เบญเบ‡เบ•เบปเบ™เป€เบญเบ‡เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Keycloak.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบขเปˆเบฒเบ‡เบฅเบฐเบญเบฝเบ”เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเบชเบญเบ‡, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™ เบเบธเปˆเบกเบ›เบปเบเบเบฐเบ•เบด, เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบˆเบฐเปเบ•เบฐเป€เบฅเบฑเบเบ™เป‰เบญเบเบเปˆเบฝเบงเบเบฑเบšเบซเบปเบงเบ‚เปเป‰เบ‚เบญเบ‡เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบชเบปเบกเป€เบซเบ”เบชเบปเบกเบœเบปเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ—เบฑเบ‡เบชเบญเบ‡เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ™เบตเป‰เปƒเบ™ Kubernetes. เป‚เบŠเบเบ”เบต, เปƒเบ™ Kubernetes เบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเบเบฑเบš synchronizing เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบซเบผเบฒเบ pods (Keycloak nodes), เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™. เบเบธเปˆเบกเป‚เบ”เป€เบกเบ™ เบกเบฑเบ™เบˆเบฐเบšเปเปˆเบเบฒเบเบซเบผเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฐเบฅเบธเบ™เบฒเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ„เปเบฒเบชเบฑเบš เบเบธเปˆเบกเบšเป‰เบฒเบ™ เบชเปเบฒเบฅเบฑเบšเบชเปˆเบงเบ™เบ—เบตเปˆเป€เบซเบผเบทเบญเบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบเบธเปˆเบกเบ‚เบญเบ‡ Keycloak nodes เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบฎเปˆเบงเบกเบเบฑเบ™, เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบญเป‰เบฒเบ‡เบญเบตเบ‡เป€เบ–เบดเบ‡เบเบธเปˆเบก Kubernetes.

เบเบธเปˆเบก Keycloak เบ›เบปเบเบเบฐเบ•เบด

เป€เบžเบทเปˆเบญเป€เบ›เบตเบ”เปƒเบŠเป‰ Keycloak เปƒเบ™เป‚เบซเบกเบ”เบ™เบตเป‰เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™:

  • เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบšเปˆเบ‡เบ›เบฑเบ™เบžเบฒเบเบ™เบญเบ
  • เบ•เบดเบ”เบ•เบฑเป‰เบ‡ load balancer
  • เบกเบตเป€เบ„เบทเบญเบ‚เปˆเบฒเบเบžเบฒเบเปƒเบ™เบ—เบตเปˆเบฎเบญเบ‡เบฎเบฑเบš IP multicast

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบšเปเปˆเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบžเบฒเบเบ™เบญเบ, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบกเบฑเบ™เบšเปเปˆเปเบกเปˆเบ™เบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰. เปƒเบซเป‰เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบกเบตเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบซเบ™เบถเปˆเบ‡ - เปเบฅเบฐเบžเบงเบเป€เบฎเบปเบฒเบกเบตเบˆเบธเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบกเบฑเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰เปƒเบชเปˆเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก.

เป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ”เบตเบ‚เบถเป‰เบ™เบงเปˆเบฒ Keycloak เป€เบฎเบฑเบ”เบงเบฝเบเปเบ™เบงเปƒเบ”เปƒเบ™เบเบธเปˆเบกเบ—เบตเปˆเบฅเบปเป‰เบกเป€เบซเบฅเบง (HA), เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”เปเบกเปˆเบ™เบ‚เบถเป‰เบ™เบเบฑเบšเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เบ‚เบญเบ‡เบเบธเปˆเบก Wildfly.

Wildfly เปƒเบŠเป‰เบฅเบฐเบšเบปเบšเบเปˆเบญเบเบซเบผเบฒเบ, เบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบžเบงเบเบกเบฑเบ™เบ–เบทเบเปƒเบŠเป‰เป€เบ›เบฑเบ™เบ•เบปเบงเบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เบเบฒเบ™เป‚เบซเบผเบ”, เบšเบฒเบ‡เบญเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ•เปเปˆเบ„เบงเบฒเบกเบœเบดเบ”. เบ•เบปเบงเบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เบเบฒเบ™เป‚เบซเบผเบ”เบˆเบฐเบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ เป€เบกเบทเปˆเบญ node cluster เป‚เบซเบผเบ”เป€เบเบตเบ™, เปเบฅเบฐเบ„เบงเบฒเบกเบ—เบปเบ™เบ—เบฒเบ™เบ„เบงเบฒเบกเบœเบดเบ” เบฎเบฑเบšเบ›เบฐเบเบฑเบ™เบ„เบงเบฒเบกเบžเป‰เบญเบกเบ‚เบญเบ‡เปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™ เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡ node cluster เบฅเบปเป‰เบกเป€เบซเบฅเบง. เบšเบฒเบ‡เบฅเบฐเบšเบปเบšเบเปˆเบญเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰:

  • mod_cluster: เป€เบฎเบฑเบ”เบงเบฝเบเบฎเปˆเบงเบกเบเบฑเบ™เบเบฑเบš Apache เป€เบ›เบฑเบ™ HTTP load balancer, เบ‚เบถเป‰เบ™เบเบฑเบš TCP multicast เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒเป€เบˆเบปเป‰เบฒเบžเบฒเบšเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™. เบชเบฒเบกเบฒเบ”เบ–เบทเบเปเบ—เบ™เบ—เบตเปˆเบ”เป‰เบงเบเบ•เบปเบงเบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เบžเบฒเบเบ™เบญเบ.

  • infinispan: เปเบ„เบชเบ—เบตเปˆเปเบˆเบเบขเบฒเบเป‚เบ”เบเปƒเบŠเป‰เบŠเปˆเบญเบ‡ JGroups เป€เบ›เบฑเบ™เบŠเบฑเป‰เบ™เบเบฒเบ™เบ‚เบปเบ™เบชเบปเปˆเบ‡. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบกเบฑเบ™เบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป‚เบ›เป‚เบ•เบ„เบญเบ™ HotRod เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เปเปˆเบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบเบธเปˆเบก Infinispan เบžเบฒเบเบ™เบญเบเป€เบžเบทเปˆเบญ synchronize เป€เบ™เบทเป‰เบญเปƒเบ™ cache.

  • jgroups: เบชเบฐเบซเบ™เบญเบ‡เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบธเปˆเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบกเบตเบชเบนเบ‡เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆเบŠเปˆเบญเบ‡เบ—เบฒเบ‡ JGroups. เบ—เปเปˆเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเปƒเบ™เบเบธเปˆเบกเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบธเปˆเบกเป€เบžเบทเปˆเบญเปƒเบซเป‰เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบกเบตเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เป€เบŠเบฑเปˆเบ™: เบ„เบงเบฒเบกเบซเบ™เป‰เบฒเป€เบŠเบทเปˆเบญเบ–เบท, เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบฅเบฐเบšเบฝเบšเบฎเบฝเบšเบฎเป‰เบญเบ, เปเบฅเบฐเบ„เบงเบฒเบกเบญเปˆเบญเบ™เป„เบซเบงเบ•เปเปˆเบเบฑเบšเบ„เบงเบฒเบกเบฅเบปเป‰เบกเป€เบซเบฅเบง.

Load Balancer

เป€เบกเบทเปˆเบญเบ•เบดเบ”เบ•เบฑเป‰เบ‡เป€เบ„เบทเปˆเบญเบ‡เบ”เบธเปˆเบ™เบ”เปˆเบฝเบ‡เป€เบ›เบฑเบ™เบ•เบปเบงเบ„เบงเบšเบ„เบธเบก ingress เปƒเบ™เบเบธเปˆเบก Kubernetes, เบกเบฑเบ™เป€เบ›เบฑเบ™เบชเบดเปˆเบ‡เบชเปเบฒเบ„เบฑเบ™เบ—เบตเปˆเบˆเบฐเบฎเบฑเบเบชเบฒเบชเบดเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰เบขเบนเปˆเปƒเบ™เปƒเบˆ:

Keycloak เบชเบปเบกเบกเบธเบ”เบงเปˆเบฒเบ—เบตเปˆเบขเบนเปˆเบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบœเปˆเบฒเบ™ HTTP เบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบเบฒเบ™เบเบงเบ”เบชเบญเบšเปเบกเปˆเบ™เบ—เบตเปˆเบขเบนเปˆ IP เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบ‚เบญเบ‡เบ„เบญเบกเบžเบดเบงเป€เบ•เบตเบฅเบนเบเบ„เป‰เบฒ. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ Balancer เปเบฅเบฐ ingress เบ„เบงเบ™เบ•เบฑเป‰เบ‡เบชเปˆเบงเบ™เบซเบปเบง HTTP เบขเปˆเบฒเบ‡เบ–เบทเบเบ•เป‰เบญเบ‡ X-Forwarded-For ะธ X-Forwarded-Proto, เปเบฅเบฐเบเบฑเบ‡เบšเบฑเบ™เบ—เบถเบเบŠเบทเปˆเบ•เบปเป‰เบ™เบชเบฐเบšเบฑเบš HOST. เบชเบฐโ€‹เบšเบฑเบšโ€‹เบซเบฅเป‰เบฒโ€‹เบชเบธเบ” ingress-nginx (>0.22.0) เบ›เบดเบ”เบเบฒเบ™เปƒเบŠเป‰เบ‡เบฒเบ™เบ™เบตเป‰เบ•เบฒเบกเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™

เบเบฒเบ™เป€เบ›เบตเบ”เปƒเบŠเป‰เบ—เบธเบ‡ proxy-address-forwarding เป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก PROXY_ADDRESS_FORWARDING ะฒ true เปƒเบซเป‰ Keycloak เป€เบ‚เบปเป‰เบฒเปƒเบˆเบงเปˆเบฒเบกเบฑเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเป€เบšเบทเป‰เบญเบ‡เบซเบผเบฑเบ‡เบ•เบปเบงเปเบ—เบ™.

เบ™เบญเบเบ™เบฑเป‰เบ™เบ—เปˆเบฒเบ™เบเบฑเบ‡เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เป€เบ›เบตเบ”เปƒเบŠเป‰ เป€เบŠเบ”เบŠเบฑเบ™เบซเบ™เบฝเบง เปƒเบ™ ingress. Keycloak เปƒเบŠเป‰เปเบ„เบ” Infinispan เบ—เบตเปˆเปเบˆเบเบขเบฒเบเป€เบžเบทเปˆเบญเป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเป€เบŠเบ”เบŠเบฑเบ™เบเบฒเบ™เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เปเบฅเบฐเป€เบŠเบ”เบŠเบฑเบ™เบœเบนเป‰เปƒเบŠเป‰. Caches เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบเบฑเบšเป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡เบ”เบฝเบงเป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™, เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เป€เบŠเบ”เบŠเบฑเบ™เบชเบฐเป€เบžเบฒเบฐเบ™เบฑเป‰เบ™เบ–เบทเบเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™เบšเบฒเบ‡ node เปƒเบ™ cluster, เปเบฅเบฐ nodes เบญเบทเปˆเบ™เป†เบ•เป‰เบญเบ‡เบชเบญเบšเบ–เบฒเบกเบกเบฑเบ™เบซเปˆเบฒเบ‡เป„เบเบชเบญเบเบซเบผเบตเบเบ–เป‰เบฒเบžเบงเบเป€เบ‚เบปเบฒเบ•เป‰เบญเบ‡เบเบฒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เบเบญเบ‡เบ›เบฐเบŠเบธเบกเบ™เบฑเป‰เบ™.

เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบกเบเบฑเบšเป€เบญเบเบฐเบชเบฒเบ™, เบเบฒเบ™เบ„เบฑเบ”เบ•เบดเบ”เบเบญเบ‡เบ›เบฐเบŠเบธเบกเบ—เบตเปˆเบกเบตเบŠเบทเปˆเบ„เบธเบเบเบตเบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เบงเบฝเบเบชเปเบฒเบฅเบฑเบšเบžเบงเบเป€เบฎเบปเบฒ AUTH_SESSION_ID. Keycloak เบกเบตเบงเบปเบ‡เบเบฒเบ™เบ›เปˆเบฝเบ™เป€เบชเบฑเป‰เบ™เบ—เบฒเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เป€เบฅเบทเบญเบเบŠเบทเปˆเบ„เบธเบเบเบตเบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบชเปเบฒเบฅเบฑเบšเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบซเบ™เบฝเบง.

Keycloak เบเบฑเบ‡เป€เบญเบปเบฒเบŠเบทเปˆเบ‚เบญเบ‡ node เบ—เบตเปˆเบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡เบเปˆเบญเบ™ AUTH_SESSION_ID, เปเบฅเบฐเบ™เบฑเบšเบ•เบฑเป‰เบ‡เปเบ•เปˆเปเบ•เปˆเบฅเบฐ node เปƒเบ™เบชเบฐเบšเบฑเบšเบ—เบตเปˆเบกเบตเบชเบนเบ‡เปƒเบŠเป‰เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เบ”เบฝเบงเบเบฑเบ™, เปเบ•เปˆเบฅเบฐเบ„เบปเบ™ เบ„เบงเบ™โ€‹เบกเบต เบ•เบปเบงเบฅเบฐเบšเบธ node เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปเบฅเบฐเป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบˆเบฑเบ”เบเบฒเบ™เบ—เบธเบฅเบฐเบเปเบฒ. เบกเบฑเบ™เปเบกเปˆเบ™เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบชเปˆเปƒเบ™ JAVA_OPTS เบ—เบฒเบ‡เป€เบฅเบทเบญเบ jboss.node.name ะธ jboss.tx.node.id เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ node - เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”, เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบเบปเบเบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบชเปˆเบŠเบทเปˆเบ‚เบญเบ‡เบเบฑเบเป„เบ”เป‰. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบชเปˆเบŠเบทเปˆ pod, เบขเปˆเบฒเบฅเบทเบกเบเปˆเบฝเบงเบเบฑเบšเบ‚เบญเบšเป€เบ‚เบ”เบˆเปเบฒเบเบฑเบ” 23 เบ•เบปเบงเบญเบฑเบเบชเบญเบ™เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเปเบ› jboss, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเปƒเบŠเป‰ StatefulSet เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ Deployment.

rake เบญเบทเปˆเบ™ - เบ–เป‰เบฒเบเบฑเบเบ–เบทเบเบฅเบถเบšเบซเบผเบท restarted, cache เบ‚เบญเบ‡เบกเบฑเบ™เบˆเบฐเบชเบนเบ™เป€เบชเบ. เบเบฒเบ™เบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ™เบตเป‰, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเบเปเบฒเบ™เบปเบ”เบˆเปเบฒเบ™เบงเบ™เป€เบˆเบปเป‰เบฒเบ‚เบญเบ‡ cache เบชเปเบฒเบฅเบฑเบš cache เบ—เบฑเบ‡เบซเบกเบปเบ”เบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเบญเบ‡, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบชเปเบฒเป€เบ™เบปเบฒเบ‚เบญเบ‡ cache เบˆเบฐเบเบฑเบ‡เบ„เบปเบ‡เบขเบนเปˆ. เบเบฒเบ™เปเบเป‰เป„เบ‚เปเบกเปˆเบ™เป€เบžเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ script เบชเปเบฒเบฅเบฑเบš 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 multicast

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰ Weavenet เป€เบ›เบฑเบ™ CNI, multicast เบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบ—เบฑเบ™เบ—เบต - เปเบฅเบฐเบ‚เปเป‰เบ‚เบญเบ‡ Keycloak เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เบเบฑเบ™เปเบฅเบฐเบเบฑเบ™เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบžเบงเบเบกเบฑเบ™เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบง.

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบกเบตเบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบš ip multicast เปƒเบ™เบเบธเปˆเบก Kubernetes เบ‚เบญเบ‡เบ—เปˆเบฒเบ™, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ JGroups เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป‚เบ›เบฃเป‚เบ•เบ„เปเบญเบทเปˆเบ™เป†เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒ nodes.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เปเบฒเบญเบดเบ”เปเบกเปˆเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ KUBE_DNSเป€เบŠเบดเปˆเบ‡เปƒเบŠเป‰ headless service เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒ Keycloak nodes, เบ—เปˆเบฒเบ™เบžเบฝเบ‡เปเบ•เปˆเบœเปˆเบฒเบ™ JGroups เบŠเบทเปˆเบ‚เบญเบ‡เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒ nodes เป„เบ”เป‰.

เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบญเบทเปˆเบ™เปเบกเปˆเบ™เปƒเบŠเป‰เบงเบดเบ—เบตเบเบฒเบ™ KUBE_PING, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš API เป€เบžเบทเปˆเบญเบŠเบญเบเบซเบฒ nodes (เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡ configure serviceAccount เบ”เป‰เบงเบโ€‹เบชเบดเบ” list ะธ get, เปเบฅเบฐเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™ configure pods เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ™เบตเป‰ serviceAccount).

เบงเบดเบ—เบตเบ—เบตเปˆ JGroups เบŠเบญเบเบซเบฒ nodes เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ›เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบก JGROUPS_DISCOVERY_PROTOCOL ะธ JGROUPS_DISCOVERY_PROPERTIES. เบชเบณ เบฅเบฑเบš KUBE_PING เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบฅเบทเบญเบเบเบฑเบเป‚เบ”เบเบเบฒเบ™เบ–เบฒเบก namespace ะธ labels.

๏ธ เบ–เป‰เบฒเบ—เปˆเบฒเบ™เปƒเบŠเป‰ multicast เปเบฅเบฐเปเบฅเปˆเบ™เบชเบญเบ‡เบซเบผเบทเบซเบผเบฒเบเบเบงเปˆเบฒเบเบธเปˆเบก Keycloak เปƒเบ™เบเบธเปˆเบก Kubernetes เบ”เบฝเบง (เปƒเบซเป‰เป€เบงเบปเป‰เบฒเบงเปˆเบฒเบซเบ™เบถเปˆเบ‡เปƒเบ™ namespace. production, เบ—เบตเปˆโ€‹เบชเบญเบ‡ - staging) - nodes เบ‚เบญเบ‡เบซเบ™เบถเปˆเบ‡เบเบธเปˆเบก Keycloak เบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบฎเปˆเบงเบกเบเบธเปˆเบกเบญเบทเปˆเบ™. เปƒเบซเป‰เปเบ™เปˆเปƒเบˆเบงเปˆเบฒเปƒเบŠเป‰เบ—เบตเปˆเบขเบนเปˆ multicast เป€เบ›เบฑเบ™เป€เบญเบเบฐเบฅเบฑเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐ cluster เป‚เบ”เบเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ•เบปเบงเปเบ›jboss.default.multicast.address ะธ jboss.modcluster.multicast.address ะฒ JAVA_OPTS.

เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™

เปเบฅเปˆเบ™ Keycloak เปƒเบ™เป‚เปเบ” HA เปƒเบ™ Kubernetes

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ

Keycloak เปƒเบŠเป‰เบซเบผเบฒเบเบเบธเปˆเบกเปเบ„เบ” Infinispan เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเบชเปเบฒเบฅเบฑเบšเปเบ•เปˆเบฅเบฐเบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบเบธเปˆเบก Keycloack เบ—เบตเปˆเบ›เบฐเบเบญเบšเบ”เป‰เบงเบเบ‚เปเป‰ Keycloak เบ•เบฑเป‰เบ‡เบขเบนเปˆ. เปเบ•เปˆเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡ Keycloak nodes เปƒเบ™เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™.

Keycloak nodes เปƒเบŠเป‰ Java Data Grid เบžเบฒเบเบ™เบญเบ (เป€เบŠเบตเบšเป€เบงเบต Infinispan) เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™. เบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบ•เบฒเบกเบžเบดเบ—เบตเบเบฒเบ™ Infinispan HotRod.

เปเบ„เบช Infinispan เบ•เป‰เบญเบ‡เบ–เบทเบเบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ”เป‰เบงเบเบ„เบธเบ™เบชเบปเบกเบšเบฑเบ” remoteStore, เป€เบžเบทเปˆเบญโ€‹เปƒเบซเป‰โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เป€เบเบฑเบšโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เป„เบงเป‰โ€‹เบซเปˆเบฒเบ‡โ€‹เป„เบโ€‹เบชเบญเบโ€‹เบซเบผเบตเบ (เปƒเบ™โ€‹เบชเบนเบ™โ€‹เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบญเบทเปˆเบ™โ€‹, เบ›เบฐเบกเบฒเบ™ เบ™เบฑเบเปเบ›) เบ–เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹. เบกเบตเบเบธเปˆเบก infinispan เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเปƒเบ™เบšเบฑเบ™เบ”เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ JDG, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰เปƒเบ™ JDG1 เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒ site1 เบˆเบฐเบ–เบทเบเบˆเปเบฒเบฅเบญเบ‡เป€เบ›เบฑเบ™ JDG2 เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠ site2.

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เป€เบŠเบตเบšเป€เบงเบต JDG เบ—เบตเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบˆเป‰เบ‡เป€เบ•เบทเบญเบ™เปƒเบซเป‰เป€เบŠเบตเบšเป€เบงเบต Keycloak เบ‚เบญเบ‡เบเบธเปˆเบกเบ‚เบญเบ‡เบกเบฑเบ™เบœเปˆเบฒเบ™เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบฅเบนเบเบ„เป‰เบฒ, เป€เบŠเบดเปˆเบ‡เป€เบ›เบฑเบ™เบ„เบธเบ™เบชเบปเบกเบšเบฑเบ”เบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™ HotRod. เป€เบ›เบตเบ” nodes Keycloak site2 เบ›เบฑเบšเบ›เบธเบ‡เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ Infinispan เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเปเบฅเบฐเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบœเบนเป‰เปƒเบŠเป‰เบชเบฐเป€เบžเบฒเบฐเบเปเปˆเบกเบตเบขเบนเปˆเปƒเบ™เป‚เบซเบ™เบ” Keycloak on site2.

เบชเปเบฒเบฅเบฑเบšเบšเบฒเบ‡เปเบ„เบ”, เบกเบฑเบ™เบเปเปˆเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบเบฒเบ™เบชเปเบฒเบฎเบญเบ‡เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเบซเบผเบตเบเป€เบงเบฑเป‰เบ™เบเบฒเบ™เบ‚เบฝเบ™เบ‚เปเป‰เบกเบนเบ™เบœเปˆเบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ Infinispan เบ—เบฑเบ‡เบซเบกเบปเบ”. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบญเบปเบฒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบญเบญเบ remote-store Infinispan cache เบชเบฐเป€เบžเบฒเบฐ (เปƒเบ™เป„เบŸเบฅเปŒ standalone-ha.xml), เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบšเบฒเบ‡เบชเบฐเป€เบžเบฒเบฐ replicated-cache เบˆเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เปƒเบ™เบ”เป‰เบฒเบ™เป€เบŠเบตเบšเป€เบงเบต Infinispan เบญเบตเบเบ•เปเปˆเป„เบ›.

เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบ–เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹

เบกเบตเบชเบญเบ‡เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเปƒเบ™ Keycloak:

  • เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™. เบกเบฑเบ™เบ•เบฑเป‰เบ‡เบขเบนเปˆเปƒเบเป‰เบเบฑเบšเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเป€เบฎเบฑเบ”เบซเบ™เป‰เบฒเบ—เบตเปˆเป€เบžเบทเปˆเบญเบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบซเบผเบธเบ”เบœเปˆเบญเบ™เบเบฒเบ™เบ•เบญเบšเป‚เบ•เป‰ latency. เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ cache เบ™เบตเป‰เป€เบเบฑเบšเบฎเบฑเบเบชเบฒ realm, เบฅเบนเบเบ„เป‰เบฒ, เบžเบฒเบฅเบฐเบšเบปเบ”เบšเบฒเบ”, เปเบฅเบฐ metadata เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰. เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ cache เบ™เบตเป‰เบšเปเปˆเป„เบ”เป‰เบ–เบทเบ replicated, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒ cache เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡เบเบธเปˆเบก Keycloak. เบ–เป‰เบฒเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบขเบนเปˆเปƒเบ™ cache เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡, เบ‚เปเป‰เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบˆเบฐเบ–เบทเบเบชเบปเปˆเบ‡เป„เบ›เบซเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเบขเบนเปˆเปƒเบ™ cluster, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบˆเบฐเบ–เบทเบเบเบปเบเป€เบงเบฑเป‰เบ™เบˆเบฒเบ cache. เป€เบšเบดเปˆเบ‡เบฅเบฒเบเบฅเบฐเบญเบฝเบ” work เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบฅเบฒเบเบฅเบฐเบญเบฝเบ”เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบ‚เบญเบ‡เบ‚เบฑเป‰เบ™เบ•เบญเบ™.

  • เบชเบณเป€เบ™เบปเบฒ. เบ›เบฐเบกเบงเบ™เบœเบปเบ™เป€เบŠเบ”เบŠเบฑเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰, เป‚เบ—เป€เบ„เบฑเบ™เบญเบญเบšเป„เบฅเบ™เปŒ, เปเบฅเบฐเบเบฑเบ‡เบเบงเบ”เบชเบญเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบšเป€เบžเบทเปˆเบญเบเบงเบ”เบซเบฒเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบผเบญเบเบฅเบงเบ‡เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™ เปเบฅเบฐเบเบฒเบ™เป‚เบˆเบกเบ•เบตเบญเบทเปˆเบ™เป†. เบ‚เปเป‰โ€‹เบกเบนเบ™โ€‹เบ—เบตเปˆโ€‹เป€เบเบฑเบšโ€‹เป„เบงเป‰โ€‹เปƒเบ™โ€‹เบ–เบฒเบ™โ€‹เบ„เบงเบฒเบกโ€‹เบˆเปเบฒโ€‹เป€เบซเบผเบปเปˆเบฒโ€‹เบ™เบตเป‰โ€‹เปเบกเปˆเบ™โ€‹เบŠเบปเปˆเบงโ€‹เบ„เบฒเบงโ€‹, เป€เบเบฑเบšโ€‹เป„เบงเป‰โ€‹เบžเบฝเบ‡โ€‹เปเบ•เปˆโ€‹เปƒเบ™ RAMโ€‹, เปเบ•เปˆโ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™ replicated เปƒเบ™โ€‹เบเบธเปˆเบกโ€‹.

เปเบ„เบช Infinispan

เบเบญเบ‡เบ›เบฐเบŠเบธเบก - เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เปƒเบ™ Keycloak, เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบเป€เบญเบตเป‰เบ™เบงเปˆเบฒ authenticationSessions, เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰เบชเบฐเป€เบžเบฒเบฐ. เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เป‚เบ”เบเบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Keycloak, เบšเปเปˆเปเบกเปˆเบ™เป‚เบ”เบเปเบญเบฑเบšเบžเบฅเบดเป€เบ„เบŠเบฑเบ™. เบ™เบตเป‰เปเบกเปˆเบ™เบšเปˆเบญเบ™เบ—เบตเปˆเบเบฒเบ™เป€เบžเบดเปˆเบ‡เบžเบฒเบญเบฒเป„เบชเบ‚เบญเบ‡เป€เบŠเบ”เบŠเบฑเบ™เบซเบ™เบฝเบงเป€เบ‚เบปเป‰เบฒเบกเบฒ, เปเบฅเบฐ cache เบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเป€เบญเบ‡เบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบ–เบทเบ replicated, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เป‚เบซเบกเบ” Active-Active.

Action Token. เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบญเบทเปˆเบ™, เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปƒเบŠเป‰เบชเปเบฒเบฅเบฑเบšเบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ•เปˆเบฒเบ‡เป†, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบœเบนเป‰เปƒเบŠเป‰เบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡ asynchronously เป‚เบ”เบเบ—เบฒเบ‡เป„เบ›เบชเบฐเบ™เบต. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เปƒเบ™เป„เบฅเบเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™ forget password cache actionTokens เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบก metadata เบ‚เบญเบ‡ tokens เบ—เบตเปˆเบเปˆเบฝเบงเบ‚เป‰เบญเบ‡ - เบ•เบปเบงเบขเปˆเบฒเบ‡, token เป„เบ”เป‰เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เปเบฅเป‰เบงเปเบฅเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡. เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ cache เบ™เบตเป‰เบ›เบปเบเบเบฐเบ•เบดเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ replicated เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™.

Caching เปเบฅเบฐเบญเบฒเบเบธเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเป€เบเบฑเบšเป„เบงเป‰ เป€เบฎเบฑเบ”เบงเบฝเบเป€เบžเบทเปˆเบญเบšเบฑเบ™เป€เบ—เบปเบฒเบเบฒเบ™เป‚เบซเบผเบ”เปƒเบ™เบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™. เบ›เบฐเป€เบžเบ”เบ‚เบญเบ‡ caching เบ™เบตเป‰เบ›เบฑเบšเบ›เบธเบ‡เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบš, เปเบ•เปˆเป€เบžเบตเปˆเบกเบšเบฑเบ™เบซเบฒเบ—เบตเปˆเบˆเบฐเปเบˆเป‰เบ‡. เบ–เป‰เบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Keycloak เบ›เบฑเบšเบ›เบธเบ‡เบ‚เปเป‰เบกเบนเบ™, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบญเบทเปˆเบ™เป†เบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เปเบˆเป‰เบ‡เปƒเบซเป‰เบŠเบฒเบšเป€เบžเบทเปˆเบญเปƒเบซเป‰เบžเบงเบเป€เบ‚เบปเบฒเบชเบฒเบกเบฒเบ”เบ›เบฑเบšเบ›เบธเบ‡เบ‚เปเป‰เบกเบนเบ™เปƒเบ™เปเบ„เบ”เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ. Keycloak เปƒเบŠเป‰ cache เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™ realms, users ะธ authorization เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบเบฑเบšเบ‚เปเป‰เบกเบนเบ™เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™.

เบ™เบญเบเบ™เบฑเป‰เบ™เบเบฑเบ‡เบกเบต cache เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ work, เป€เบŠเบดเปˆเบ‡ replicated เบ—เบปเปˆเบงเบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”. เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เบšเปเปˆเป„เบ”เป‰เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เปƒเบ”เป†เบˆเบฒเบเบ–เบฒเบ™เบ‚เปเป‰เบกเบนเบ™, เปเบ•เปˆเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเบเปˆเบฝเบงเบเบฑเบšเบญเบฒเบเบธเบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™เป„เบ›เบซเบฒเบเบธเปˆเบกเบ‚เบญเบ‡เบเบธเปˆเบกเบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™. เปƒเบ™เบ„เปเบฒเบชเบฑเบšเบ•เปˆเบฒเบ‡เป†เบญเบทเปˆเบ™เป†, เบ—เบฑเบ™เบ—เบตเบ—เบตเปˆเบ‚เปเป‰เบกเบนเบ™เบ–เบทเบเบ›เบฑเบšเบ›เบธเบ‡, Keycloak node เบชเบปเปˆเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ›เบซเบฒ nodes เบญเบทเปˆเบ™เป†เปƒเบ™เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš nodes เปƒเบ™เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เบญเบทเปˆเบ™เป†. เบซเบผเบฑเบ‡เบˆเบฒเบเป„เบ”เป‰เบฎเบฑเบšเบ‚เปเป‰เบ„เบงเบฒเบกเบ”เบฑเปˆเบ‡เบเปˆเบฒเบง, เปเบ•เปˆเบฅเบฐ node เบˆเบฐเบฅเป‰เบฒเบ‡เบ‚เปเป‰เบกเบนเบ™เบ—เบตเปˆเบชเบญเบ”เบ„เป‰เบญเบ‡เบเบฑเบ™เปƒเบ™เบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒเบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เบ‚เบญเบ‡เบกเบฑเบ™.

เบŠเปˆเบงเบ‡เป€เบงเบฅเบฒเบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰. เปเบ„เบชเบ—เบตเปˆเบกเบตเบŠเบทเปˆ sessions, clientSessions, offlineSessions ะธ offlineClientSessions, เบ›เบปเบเบเบฐเบ•เบดเปเบฅเป‰เบงเปเบกเปˆเบ™ replicated เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™เปเบฅเบฐเปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบ‚เปเป‰เบกเบนเบ™เบเปˆเบฝเบงเบเบฑเบšเบเบญเบ‡เบ›เบฐเบŠเบธเบกเบœเบนเป‰เปƒเบŠเป‰เบ—เบตเปˆเบกเบตเบเบฒเบ™เป€เบ„เบทเปˆเบญเบ™เป„เบซเบงเปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบœเบนเป‰เปƒเบŠเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. cache เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ„เปเบฒเบฎเป‰เบญเบ‡เบชเบฐเบซเบกเบฑเบเบเบฒเบ™เบ›เบฐเบกเบงเบ™เบœเบปเบ™ HTTP เบฎเป‰เบญเบ‡เบ‚เปเบˆเบฒเบเบœเบนเป‰เปƒเบŠเป‰เบชเบธเบ”เบ—เป‰เบฒเบ, เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบ–เบทเบเป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบเบฑเบš sessions เบซเบ™เบฝเบงเปเบฅเบฐเบ•เป‰เบญเบ‡เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™ replicated เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™.

เบเบฒเบ™โ€‹เบ›เป‰เบญเบ‡โ€‹เบเบฑเบ™โ€‹เบœเบปเบ™โ€‹เบšเบฑเบ‡โ€‹เบ„เบฑเบšโ€‹เปƒเบŠเป‰ Bruteโ€‹. เปเบ„เบ” loginFailures เปƒเบŠเป‰เป€เบžเบทเปˆเบญเบ•เบดเบ”เบ•เบฒเบกเบ‚เปเป‰เบกเบนเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบชเบนเปˆเบฅเบฐเบšเบปเบš, เป€เบŠเบฑเปˆเบ™เบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบ›เป‰เบญเบ™เบฅเบฐเบซเบฑเบ”เบœเปˆเบฒเบ™เบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบซเบผเบฒเบเบ›เบฒเบ™เปƒเบ”. Replication เบ‚เบญเบ‡ cache เบ™เบตเป‰เปเบกเปˆเบ™เบ„เบงเบฒเบกเบฎเบฑเบšเบœเบดเบ”เบŠเบญเบšเบ‚เบญเบ‡เบœเบนเป‰เบšเปเบฅเบดเบซเบฒเบ™. เปเบ•เปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ„เบดเบ”เป„เบฅเปˆเบ—เบตเปˆเบ–เบทเบเบ•เป‰เบญเบ‡, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบˆเปเบฒเบฅเบญเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบชเบนเบ™เบ‚เปเป‰เบกเบนเบ™. เปเบ•เปˆเปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบ‚เปเป‰เบกเบนเบ™เบ™เบตเป‰, เบ—เปˆเบฒเบ™เบˆเบฐเบ›เบฑเบšเบ›เบธเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”, เปเบฅเบฐเบ–เป‰เบฒเบšเบฑเบ™เบซเบฒเบ™เบตเป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™, เบเบฒเบ™เบชเปเบฒเป€เบ™เบปเบฒเบญเบฒเบ”เบˆเบฐเบšเปเปˆเบ–เบทเบเป€เบ›เบตเบ”เปƒเบŠเป‰.

เป€เบกเบทเปˆเบญเป€เบ›เบตเบ”เบ•เบปเบงเบเบธเปˆเบก Infinispan, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบ„เปเบฒเบ™เบดเบเบฒเบก cache เปƒเบชเปˆเป„เบŸเบฅเปŒเบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒ:

<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

เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡ configure remoteStore เบชเปเบฒเบฅเบฑเบšเบ–เบฒเบ™เบ„เบงเบฒเบกเบˆเปเบฒ Keycloak. เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เบชเบดเปˆเบ‡เบ™เบตเป‰, script เปเบกเปˆเบ™เบžเบฝเบ‡เบžเป, เป€เบŠเบดเปˆเบ‡เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบญเบฑเบ™เบ—เบตเปˆเบœเปˆเบฒเบ™เบกเบฒ, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เป€เบžเบทเปˆเบญเบเปเบฒเบ™เบปเบ”เบ•เบปเบงเปเบ›. 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

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™