Middleware (JBoss & Wildfly) standalone-ha.xml 를 사용한 Cluster 구성 방법
페이지 정보
작성자 미들웨어 아이디로 검색 전체게시물 댓글 0건 조회 13,504회 좋아요 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. 기동스크립트 옵션 추가
|
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등
메뉴얼에는 없지만, 구성을 해야 하는 부분이 있어 난이도가 좀 있었습니다만, 참고하셔서 성공하시길 바랍니다.
댓글목록
등록된 댓글이 없습니다.