공유할 서비스 선택

TECH


TECH

Middleware (JBoss & Wildfly) standalone-ha.xml 를 사용한 session cluster 구성 및 keycloa…

페이지 정보

작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 7,808회 좋아요 0회 작성일 20-11-20 16:08

본문

안녕하세요 "미들웨어" 입니다.

 

이번에는 (JBoss & Wildflystandalone-ha.xml 를 사용한 keycloak session cluster 구성  대해서 진행해보겠습니다. 

  

(JBoss & Wildfly) wildfly 란? 설치방법 및 기본 구성

(JBoss & Wildfly) JBoss-eap 에서 wildfly 마이그레이션시 발생 에러

(JBoss & Wildflywildfly에서 remote ejb 설정 및 구성 방법 

(JBoss & WildflyWildfly 에서 Oracle JDBC 연동설정 하는 방법 

(JBoss & Wildfly) standalone-ha.xml 를 사용한 session cluster 구성 및 keycloak session-cluster 방식 

 

wildfly 를 서로 다른장비에서 cluster 하려고 하면 크게 두가지 방식이 있습니다.

standalone-ha 방식과 domain 방식이 존재합니다.

 

위 방식의 차이는 메뉴얼에 자세히 나와있으니 방식에 대한 설명은 건너띄고.. standalone-ha 를 사용해서 domain 모드보다 심플하게 관리하고 싶을때

UDP방식의 멀티캐스트 방식이 아닌 TCPPING 방식으로 cluster을 하는 방법에 대해 정리하겠습니다.

 

http://docs.wildfly.org/14/High_Availability_Guide.html#JGroups_Subsystem

 

standalone-ha 방식에 대해 정리 (TCPPING) 

wildfly 14버전의 jgroup 메뉴얼에는 TCPPING 방식에 대해 정의되있지 않습니다.. 

하지만, 기존 버전에는 설정 지원이 됐었고 번거롭게 UDP방식의 멀티캐스트 방식이 아닌 심플하게 서버대 서버로 TCP통신을 해서 간단하게 cluster을 하고 싶을때 사용하면 좋은 방식입니다.

 

 

1. standalone-ha 로 구성합니다.

  • 파일 : standalone-ha.xml
  • 내용 : 붉은색 표시된 부분을 추가해주시고 기존  불필요한 UDP부분은 삭제하시면 됩니다. 
             추가로 port-offset은 0으로 구성했으며, 0값일때 사용되는 TCP 7600 port을 그대로 사용했습니다. 
             충돌날경우 사용환경에 맞게 변경해서 사용하세요.

1,2번 서버 공통 TCP로 변경한다.

 

         <subsystem xmlns="urn:jboss:domain:jgroups:6.0">

            <channels default="ee">

                <channel name="ee" stack="tcp" cluster="ejb"/>

            </channels>

            <stacks>

                <stack name="tcp">

                    <transport type="TCP" socket-binding="jgroups-tcp"/>

                    <socket-discovery-protocol type="TCPPING" socket-bindings="jgroups-test1 jgroups-test2" />

                    <protocol type="MERGE3"/>

                    <protocol type="FD_SOCK"/>

                    <protocol type="FD_ALL"/>

                    <protocol type="VERIFY_SUSPECT"/>

                    <protocol type="pbcast.NAKACK2"/>

                    <protocol type="UNICAST3"/>

                    <protocol type="pbcast.STABLE"/>

                    <protocol type="pbcast.GMS"/>

                    <protocol type="MFC"/>

                    <protocol type="FRAG2"/>

                </stack>

            </stacks>

        </subsystem>

 

 

1,2 번 서버 공통 any 추가해주고 ip만 변경한다.

 

     <interfaces>

        <interface name="management">

            <inet-address value="${jboss.bind.address.management:127.0.0.1}"/>

        </interface>

        <interface name="public">

            <inet-address value="${jboss.bind.address:127.0.0.1}"/>

        </interface>

        <interface name="private">

            <inet-address value="${jboss.bind.address.private:127.0.0.1}"/>

        </interface>

          <interface name="any">    // 임의로 any2 이름 생성

              <inet-address value="10.10.10.1"/> .   //  1번 서버의 경우 10.10.10.1 IP사용,

               //   2번 서버일 경우 10.10.10.2 고정 IP를 사용한다.

          </interface>

 

    </interfaces>

1,2번 서버 공통으로 아래 변경사항을 추가해준다.

 

<socket-binding-group name="standard-sockets" default-interface="any" >

        <socket-binding name="management-http" interface="management" port="${jboss.management.http.port:9990}"/>

        <socket-binding name="management-https" interface="management" port="${jboss.management.https.port:9993}"/>

        <socket-binding name="ajp" port="${jboss.ajp.port:8009}"/>

        <socket-binding name="http" port="${jboss.http.port:8080}"/>

        <socket-binding name="https" port="${jboss.https.port:8443}"/>

        <socket-binding name="jgroups-tcp" interface="any" port="7600"/>       

        <socket-binding name="txn-recovery-environment" port="4712"/>

        <socket-binding name="txn-status-manager" port="4713"/>

        <outbound-socket-binding name="mail-smtp">

            <remote-destination host="localhost" port="25"/>

        </outbound-socket-binding>

 

        <!-- other configuration here -->

        <outbound-socket-binding name="jgroups-test1">

            <remote-destination host="10.10.10.1" port="7600"/>

        </outbound-socket-binding>

        <outbound-socket-binding name="jgroups-test2">

            <remote-destination host="10.10.10.2" port="7600"/>

        </outbound-socket-binding>

    </socket-binding-group>

 

 

 

### keyclock 에서 session cluster 을 사용하고자 할 경우 wildfly 설정 방법

 

<cache-container name="keycloak"> 명시되있기에 해당 부분에서 owners 를 연결하는 서버 수 만큼 적어줘야 한다.

서로 다른 서버의 session 경우를 하고 자 할 경우 서버 수 만큼 서로의 세션을 복제해야 하므로 owners 를 정해준다.

   <subsystem xmlns="urn:jboss:domain:infinispan:7.0">

            <cache-container name="keycloak">

                <transport lock-timeout="60000"/>

                <local-cache name="realms">

                    <object-memory size="10000"/>

                </local-cache>

                <local-cache name="users">

                    <object-memory size="10000"/>

                </local-cache>

                <distributed-cache name="sessions" owners="2"/>

                <distributed-cache name="authenticationSessions" owners="2"/>

                <distributed-cache name="offlineSessions" owners="2"/>

                <distributed-cache name="clientSessions" owners="2"/>

                <distributed-cache name="offlineClientSessions" owners="2"/>

                <distributed-cache name="loginFailures" owners="2"/>

                <local-cache name="authorization">

                    <object-memory size="10000"/>

                </local-cache>

                <replicated-cache name="work"/>

                <local-cache name="keys">

                    <object-memory size="1000"/>

                    <expiration max-idle="3600000"/>

                </local-cache>

                <distributed-cache name="actionTokens" owners="2">

                    <object-memory size="-1"/>

                    <expiration max-idle="-1" interval="300000"/>

                </distributed-cache>

            </cache-container>

 

 

2. 기동스크립트 옵션 추가 

  • 옵션 추가 :  export JAVA_OPTS=" $JAVA_OPTS -Djboss.default.jgroups.stack=tcp"
    udp -> tcpping 로 변경했으나, 좀 더 명확한 작업을 위해 tcp  명시한다.
  • 옵션 추가 :  export JAVA_OPTS=" $JAVA_OPTS -Djboss.as.management.blocking.timeout=3600"
  •  ERROR 내용 : Lost data because of graceful leaver pSso2_prd_sso_keycloak_1 에러 발생시 아래 옵션을 추가한다. 왜 추가하는지는 메뉴얼 참고해주세요. 전 해결책만 제사합니다.

10:53:25,396 INFO  [org.infinispan.CLUSTER] (remote-thread--p9-t3) [Context=keycloak-server.war] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 11

10:53:25,407 INFO  [org.infinispan.CLUSTER] (remote-thread--p7-t2) [Context=client-mappings] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 11

10:53:25,407 INFO  [org.infinispan.CLUSTER] (remote-thread--p9-t3) [Context=default-server] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 11

10:53:25,424 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=sessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1

10:53:25,424 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=sessions] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12

10:53:25,445 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=clientSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1

10:53:25,445 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=loginFailures] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1

10:53:25,446 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=loginFailures] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12

10:53:25,446 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=clientSessions] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12

10:53:25,449 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t9) [Context=actionTokens] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12

10:53:25,461 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t9) [Context=work] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12

10:53:25,462 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=offlineSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1

10:53:25,462 INFO  [org.infinispan.CLUSTER] (remote-thread--p6-t1) [Context=offlineSessions] ISPN100008: Updating cache members list [pSso1_prd_sso_keycloak_1], topology id 12

10:53:25,464 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t9) [Context=offlineClientSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1

10:53:25,464 WARN  [org.infinispan.CLUSTER] (remote-thread--p6-t11) [Context=authenticationSessions] ISPN000312: Lost data because of graceful leaver pSso2_prd_sso_keycloak_1

 

 

 

 

 

3. <distributable/> 설정 추가

session 공유를 위해서 배포할 war에 WEB-INF/web.xml 설정에 <distributable/>을 추가합니다.
keycloak 경우는 별도 안해도 위에 설정한 jboss:domain:infinispan 부분에 추가되있어서 괜찮다.

<web-app>

....

<distributable/>

</web-app> 

 

 

 

4. Session Cluster Log 확인

cluster 성공 및 session cluster 잘 됐는지 로그를 확인한다.

session cluster 을 구성한뒤, 1번 서버를 내리고 2번서버에 세션연결이 잘되는지 테스트 해보고..

또 반대로 2번 서버 내리고 1번서버 기동시 세션이 잘 유지되는지 확인해야 한다.

2개의 서버중 한대를 다운했을때 wildfly 서버 로그에는 아래와 같이 After merge 된 로그가 나와야지 정상 작동 된 겁니다. 

아래 로그 내용은 2대의 keycloak 를 wildfly 14버전으로 구성한뒤 각 서버를 shutdown 했을때 정상적으로 세션클러스터링이 된 것을 설명한 로그입니다.

 

 

11:07:26,949 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t54) [Context=sessions] ISPN100007: 

After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

 

11:07:26,949 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=authenticationSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:26,949 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t29) [Context=offlineClientSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:26,960 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t54) [Context=clientSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

 

11:07:26,965 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=work] ISPN100007: 

After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

 

11:07:26,967 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=offlineSessions] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:26,968 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=loginFailures] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:26,969 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p25-t19) [Context=actionTokens] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:27,051 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN000094: Received new cluster view for channel ejb: [pSso1_prd_sso_keycloak_1|4] (1) [pSso1_prd_sso_keycloak_1]

11:07:27,051 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN100001: Node pSso2_prd_sso_keycloak_1 left the cluster

11:07:27,053 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN000094: Received new cluster view for channel ejb: [pSso1_prd_sso_keycloak_1|4] (1) [pSso1_prd_sso_keycloak_1]

11:07:27,054 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN100001: Node pSso2_prd_sso_keycloak_1 left the cluster

11:07:27,054 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p23-t29) [Context=keycloak-server.war] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:27,054 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p23-t2) [Context=default-server] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:27,054 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN000094: Received new cluster view for channel ejb: [pSso1_prd_sso_keycloak_1|4] (1) [pSso1_prd_sso_keycloak_1]

11:07:27,054 INFO  [org.infinispan.CLUSTER] (thread-4,null,null) ISPN100001: Node pSso2_prd_sso_keycloak_1 left the cluster

11:07:27,057 INFO  [org.infinispan.CLUSTER] (stateTransferExecutor-thread--p24-t1) [Context=client-mappings] ISPN100007: After merge (or coordinator change), recovered members [pSso1_prd_sso_keycloak_1] with topology id 12

11:07:49,987 INFO  [stdout] (default task-1) 20190219 11:07:49 [NONE] LoadJarBytes scouter.http 13520 bytes

 

끝으로.. 이번 테스트는 keycloak 에 삽입된 wildfly 14을 사용하여 cluster 구성해봤습니다.

UDP 방식이 아닌 TCPPING 방식으로 구현하다 보니 wildfly 14버전 메뉴얼에 없는 내용을 추가해야 했고, 기존버전을 참고해서 any 사용 이나 owner=2등 

메뉴얼에는 없지만, 구성을 해야 하는 부분이 있어 난이도가 좀 있었습니다.

 

 




댓글목록

등록된 댓글이 없습니다.

TECH 목록
번호 제목 작성자 작성일 조회수
168 OS OSworker 아이디로 검색 전체게시물 09-25 494
Stratis 파일시스템에 대해 들어보셨나요?

카테고리 : OS

494 0
작성자 : OSworker 23/09/25
167 Middleware 미들웨어 아이디로 검색 전체게시물 09-22 369
(MSA 개발-2) Oracle DB & SpringBoot MSA 응용 프로그램 테스트

카테고리 : Middleware

369 0
작성자 : 미들웨어 23/09/22
166 OS OSworker 아이디로 검색 전체게시물 09-21 642
Kdump 에 대해 알아보는 시간~!!

카테고리 : OS

642 0
작성자 : OSworker 23/09/21
165 Middleware 미들웨어 아이디로 검색 전체게시물 09-11 660
(MSA 개발-1) Oracle DB를 사용한 SpringBoot 마이크로서비스

카테고리 : Middleware

660 0
작성자 : 미들웨어 23/09/11
164 OS OSworker 아이디로 검색 전체게시물 08-30 1332
Red Hat Linux lifecycle

카테고리 : OS

1,332 0
작성자 : OSworker 23/08/30
163 Middleware 미들웨어 아이디로 검색 전체게시물 08-21 501
(MSA 개발 환경 구성-2) Oracle DB (Docker)& SQLcl 구성

카테고리 : Middleware

501 0
작성자 : 미들웨어 23/08/21
162 OS OSworker 아이디로 검색 전체게시물 08-20 554
Live kernel patch - 온라인 커널 업데이트

카테고리 : OS

554 0
작성자 : OSworker 23/08/20
161 OS OSworker 아이디로 검색 전체게시물 08-12 688
Red Hat Enterprise Linux 9 의 새로운기능에 대해 알아보기 part -2 : Session Recording

카테고리 : OS

688 0
작성자 : OSworker 23/08/12
160 Middleware 미들웨어 아이디로 검색 전체게시물 08-09 2050
(MSA 개발 환경 구성-1) Maven & VScode & RancherDesktop설치

카테고리 : Middleware

2,050 0
작성자 : 미들웨어 23/08/09
159 OS OSworker 아이디로 검색 전체게시물 07-31 943
OpenSSH 'CVE-2023-38408' 보안 취약점 안내

카테고리 : OS

943 1
작성자 : OSworker 23/07/31
Total 198건
게시물 검색

주식회사 클럭스| 대표 : 이찬호| 사업자등록번호 : 107-87-27655
주소 : 서울특별시 영등포구 국회대로 800, 여의도파라곤
E-mail : sales@chlux.co.kr
Copyright © 클럭스 www.chlux.co.kr All rights reserved.
상단으로Top