공유할 서비스 선택

TECH


TECH

Middleware (JBoss & Wildfly) standalone-ha.xml 를 사용한 Cluster 구성 방법

페이지 정보

작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 13,579회 좋아요 2회 작성일 20-04-21 18:18

본문

안녕하세요. 

 

요즘 많이들 사용하고 계시는 미들웨어 오픈소스 RedHat 계열인 JBOSS와 커뮤니티 버전인 wildfly 가 있습니다.

예전에는 JBoss-EAP 와 JBoss 커뮤니티 버전으로 나뉘었었는데, 

REDHAT 에서 JBoss-EAP 상용버전과 명칭이 헷갈려서 Wildfly 이름으로 변경됐습니다.

그때가 아마.. 2016년도쯤..이였던걸로 기억이 나네요

 

오픈소스를 소개해드린 만큼 WildFly Cluster 방식에 대해 구성하는 방식을 설명드리겠습니다.

우선 기본적으로 WildFly 가 설치되있다는 기준하에 설명을 진행하겠습니다.

 

 

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>

 

 

keycloak 에서 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 목록
번호 제목 작성자 작성일 조회수
113 Middleware 미들웨어 아이디로 검색 전체게시물 08-19 350
(IMDG)를 활용한 session 구성 -2 오픈소스 (Hazelcast, Apache Ignite) 설치방법

카테고리 : Middleware

350 0
작성자 : 미들웨어 24/08/19
112 Middleware 미들웨어 아이디로 검색 전체게시물 08-09 335
(IMDG) Data Grid란? (IMDG)를 활용한 session 구성 -1

카테고리 : Middleware

335 0
작성자 : 미들웨어 24/08/09
111 Middleware 미들웨어 아이디로 검색 전체게시물 07-22 371
(오픈소스 활용-33) "ISTIO 이스티오" 쿠버네티스 서비스 시각화 구현에 필요한 데모설치

카테고리 : Middleware

371 0
작성자 : 미들웨어 24/07/22
110 Middleware 미들웨어 아이디로 검색 전체게시물 07-10 746
(Apache) mod_wl.so 에서 sticky session 사용방법 정리

카테고리 : Middleware

746 0
작성자 : 미들웨어 24/07/10
109 Middleware 미들웨어 아이디로 검색 전체게시물 06-24 492
(오픈소스 활용-32) Apache Kafka 란? 다운로드 및 샘플 소개

카테고리 : Middleware

492 0
작성자 : 미들웨어 24/06/24
108 Middleware 미들웨어 아이디로 검색 전체게시물 06-07 634
(Apache) Apache & Webtier에서 Nginx와 동일한 비동기 방식 처리 하기 (MPM-event)

카테고리 : Middleware

634 0
작성자 : 미들웨어 24/06/07
107 Middleware 미들웨어 아이디로 검색 전체게시물 05-21 784
(오픈소스 활용-31) (부하테스트 Tool) Jmeter 를 활용한 JDBC 부하테스트 방법 -2

카테고리 : Middleware

784 0
작성자 : 미들웨어 24/05/21
106 Middleware 미들웨어 아이디로 검색 전체게시물 05-07 1707
(오픈소스 활용-30) (부하테스트 Tool) Jmeter 를 활용한 JDBC 부하테스트 방법 -1

카테고리 : Middleware

1,707 0
작성자 : 미들웨어 24/05/07
105 Middleware 미들웨어 아이디로 검색 전체게시물 04-22 766
(오픈소스 활용-29) was에서 T4CConnection (Locked) 발생시 해결방법

카테고리 : Middleware

766 0
작성자 : 미들웨어 24/04/22
104 Middleware 미들웨어 아이디로 검색 전체게시물 04-08 714
(오픈소스 활용-28) Java Flight Recorder 이란? Java 모니터링을 구현가능

카테고리 : Middleware

714 0
작성자 : 미들웨어 24/04/08
Total 113건
게시물 검색

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