클러스터링 환경에서는 프로세스가 두 개가 뜨기 때문에 종료 스크립트가 있는 것이 편리합니다. 그렇지 않고 JBoss 에서 제공되는 종료 스크립트를 이용할 경우 바로 프로세스가 떨어지지 않아 사용자의 요청이 종료 중이 프로세스로 갈 수도 있습니다. 바로 프로세스를 죽이는 것이 운영 중에는 좋습니다.
# Status worker for managing load balancer
worker.status.type=status
각 서버의 Apache HTTP Server 설정을 위와 같이 바꾸어주면 자신의 서버에 올려져 있는 인스턴스 뿐만 아니라 다른 서버의 인스턴스까지 요청이 가능하게 됩니다.
단, 이러한 구성의 경우 세션 복제로 인한 오버헤드가 발생할 수 있습니다. buddy-replication 설정을 통해 근접한 인스턴스에게만 세션 복제를 할 수 있게 설정할 수 있습니다.
node1 -> node2, node2 -> node3, node3 -> node4, node4 -> node1 이런 방식으로 buddy-replication 을 설정하면 하나의 노드가 죽더라도 buddy 노드가 해당 세션을 복제 받을 수 있을 것 입니다. 하지만 이러한 경우 sticky-session 설정이 되어야 할 것으로 생각되네요...
쉬울지 알고 접근했던 JBoss 클러스터링인데, 역시 뭐든지 실제로 해보고 느껴봐야 할 것 같습니다.
안해봤으면 말을 하지 마요~ 어후...
configuration 을 설정하는 것 입니다. all 을 통해 복사한 node1, node2 를 각 인스턴스별로 설정합니다.
-g
클러스터 이름을 설정합니다. (그냥 자기가 좋아하는 이름을 지정하면 될 것 같습니다.)
-u
내부 클러스터 통신을 위한 멀티캐스트 주소를 설정합니다.
-b
소켓에 바운딩될 아이피 주소를 설정합니다.
System properties
jboss.messaging.ServerPeerID
각 노드마다 지정되는 유니크한 정수 값 입니다. 1부터 순차적으로 증가하면 될 것 같습니다.
jboss.service.binding.set
ServiceBindingManager 를 통해 포트 설정을 위한 프로퍼티입니다. 시스템별 첫번째 인스턴스에는 ports-default 로 설정하고 그 다음 인스턴스부터는 ports-01, ports-02 ... 과 같이 설정을 합니다. 기본적으로 JBoss 의 포트가 8080 이고 AJP 1.3 포트가 8009 라면 ports-default 는 8080, 8009 로 바인딩 되고, ports-01 은 8180, 8109 로 바인딩 됩니다.
나중에 나오겠지만 mod_jk 설정을 위해 미리 jvmRoute 를 설정합니다. <JBOSS_HOME>/server/"node1|node2"/deploy/jbossweb.sar/server.xml
각 인스턴스 별로 <Engine> element 의 attribute 로 jvmRoute 를 설정합니다.
웹 어플리케이션을 어떤 방식으로 배포하냐에 따라서 설정이 달라지게 됩니다.
두 인스턴스의 deploy 경로에 각각 배포를 하는 방식이 있고, 한 곳에 배포하여 공유하여 사용하는 방식이 있습니다.
한 곳의 배포하는 방식 중에 한가지는 farm 을 이용하는 것 입니다.
<JBOSS_HOME>/server/node1/farm 에 배포를 하게 되면 각 인스턴스들이 공유하여 사용할 수 있습니다.
(해보지는 않았습니다... 어디선가 본 자료입니다.)
다른 방법으로는 같은 배포 경로를 각 인스턴스에 설정을 하는 것 입니다. <JBOSS_HOME>/server/"node1|node2"/conf/bootstrap/profile.xml
<deployment>
...
<!--
The profile configuration
This contains required properties:
The uri to jboss-service.xml.
The uri to the deployers folder.
A list of uris to deploy folders. -->
<bean class="org.jboss.system.server.profileservice.repository.StaticProfileFactory" name="BootstrapProfileFactory">
<property name="bindingsURI">${jboss.server.home.url}conf/bindingservice.beans</property>
<property name="bootstrapURI">${jboss.server.home.url}conf/jboss-service.xml</property>
<property name="deployersURI">${jboss.server.home.url}deployers</property>
<property name="applicationURIs">
<list elementclass="java.net.URI">
<value>${jboss.server.home.url}deploy</value> <value>file:/home/webapps</value>
</list>
</property>
<property name="attachmentStoreRoot">${jboss.server.data.dir}/attachments</property>
<property name="profileFactory"><inject bean="ProfileFactory"></inject></property>
</bean>
...
</deployment>
저의 경우에는 /home/webapps 에 war 를 배포할 예정이므로 위와 같이 설정을 하였습니다.
# Mount your applications JkMount /test-jboss/* loadbalancer
# You can use external file for mount points.
# It will be checked for updates each 60 seconds.
# The format of the file is: /url=worker
# /examples/*=loadbalancer
JkMountFile conf/uriworkermap.properties
# Add shared memory.
# This directive is present with 1.2.10 and
# later versions of mod_jk, and is needed for
# for load balancing to work properly
JkShmFile logs/jk.shm
# Add jkstatus for managing runtime data
<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>
웹 어플리케이션의 context-root 가 /text-jboss 이기 때문에 JkMount 에 설정하였습니다.
<APACHE_HOME>/conf/uriworkermap.properties
# Simple worker configuration file
# Mount the Servlet context to the ajp13 worker
/jmx-console=loadbalancer
/jmx-console/*=loadbalancer
/web-console=loadbalancer
/web-console/*=loadbalancer
/test-jboss=loadbalancer
/test-jboss/*=loadbalancer
웹 어플리케이션의 context-root 로 마운트 포인트를 설정합니다.
<APACHE_HOME>/conf/workers.properties
# Define list of workers that will be used
# for mapping requests
worker.list=loadbalancer,status
하나의 조직에는 여러 구성원들이 있습니다. 조직이 팀이라고 한다면 크게는 팀장과 팀원들으로 나눌 수 있습니다. 만약헤 팀원의 수가 많다면 팀장 혼자서 관리하기 힘들게 될 것 입니다. 이러한 경우에는 팀을 여러 파트로 나누어서 파트장-파트원들로 구성될 것 입니다.
팀이 파트로 나누어 질 때는 파트장만 혼자 있는 파트가 너무 많아서 파트원의 수보다 파트장들이 많으면 불필요한 관리포인트가 늘어나게 될 것 입니다. [그림 1] 과 같이 파트원이 가장 많은 규모를 차지하는 것이 안정적인 구성이라고 할 수 있을 것 입니다.
[그림 1] 조직(팀)의 안정적인 구성
일단 파트장이 된 팀원은 파트원을 관리해야 하는 관리적인 롤을 부여받게 됩니다. 중간관리자인 파트장은 기존에 자기가 맡고 있던 업무외에 추가적으로 관리적인 측면도 신경을 써야하는 것 입니다. 모든 회사가 그렇지는 않겠지만 파트장이 되면 여러 혜택들을 지원해 줄 것 입니다. 이것은 단순히 파트장이여서 주는 것이 아니라 자신의 파트원을 관리해야하는 책임을 부여했기 때문입니다.
가장 우선시 되는 파트장의 관리 포인트는 파트원의 리소스 관리입니다. 리소스 관리를 위해서는 파트원의 역량에 대해 미리 파악하고 있어야 하며, 일정을 수시로 확인해야 할 것 입니다. 이런 것들이 준비가 되어있지 않다면 위에서 내려오는 지시에 대해 파트 내에서 업무분담이 어렵게 됩니다. 아래로 일을 내리지 못하면 파트장 자신이 힘들게 되며, 파트원들의 리소스를 고려하지 않고 아래로 일을 내리게 되면 파트원들이 힘들게 될 것 입니다. 파트장이 파트원들을 위해 해야할 일은 파트원들이 힘들까봐 혼자서 일을 다 해주는 것도 이나고, 파트원들에게 맛있는 것을 사주는 것도 아닙니다. 자신의 파트에서 처리할 수 있는 업무를 할당받아 파트원들이 그 업무를 나누어 처리하는 것 입니다. 파트원들의 역량이 똑같을 수는 없습니다. 어느 한 부분에 강점이 있으면 다른 부분에 약점이 있을 것 입니다. 파트원들의 역량 및 장단점을 파악하여 업무를 분배하는 것도 파트장의 몫입니다. 위에서 내려오는 지시에 대해 파트의 역량내에 커버가 가능한 정도로 협의와 조율을 해야하는 것도 파트장의 중요한 업무입니다. 그외에도 파트원에게 직접 내려오는 지시사항을 자신을 통해서 들어오도록 프로세스를 만들어가야 합니다. 이런 파트장이 파트원들과 신뢰를 바탕으로 업무를 할 수 있는 것 입니다. 그렇다고 무작정 파트장이 파트원을 감싸는 것이 능사는 아닙니다. 파트원이 능력이 부족할 경우 여러 번의 기회를 주어 함께 업무를 진행할 수 있는지를 파악하고 조치를 취하는 것이 파트를 위해서도 필요할 것 입니다. 신뢰를 바탕으로 유기적으로 돌아가는 파트는 팀에 활력소를 불어넣을 수 있을 것 입니다. 파트가 성장하면 조직도 성장하게 될 것 입니다. 결론적으로 파트장은 자신의 파트를 캡슐화하여 위에서 보았을 때 하나의 개체로 인식시키는 것 입니다.
이런 파트장을 만드는 것은 파트장 혼자가 움직인다고 되는 것이 아닙니다. 팀장은 파트장에게 힘을 실어주어야 파트장의 위신을 세워줄 수 있으며 파트장 자신에게 책임감을 부여할 수 있을 것 입니다. 파트원들도 파트장이 결정한 사항에 대해 마음에 들지 않을 수 있습니다. 또, 파트장이 항상 옳은 결정을 한다고 볼 수도 없습니다. 이렇다고 해서 불만을 제기하게 되면 파트 내에 신뢰를 구축하기가 어렵게 됩니다. 파트에 대해 함께 고민할 수 있는 조언자가 되어야 합니다. 그리고 보고 체계를 무시하고 바로 팀장에게 보고하는 것은 파트장이 파트를 운영하는데 도움이 되지 않습니다. 파트를 캡슐화 해야하는 것이 파트장의 목적 중에 하나인데 직접적으로 팀장과 업무 협의를 하는 것은 파트장에게 곤란한 상황을 만들 수 있는 계기가 될 수도 있습니다.
[그림 2] 에서 보이는 것 처럼 팀장이 모든 팀원을 관리하게 되면 정작 본인이 관리해야 할 업무보다 더 많은 양을 감수해야할 것입니다. 안정적인 조직이 되기 위해서는 팀장은 [그림 3] 과 같이 파트장들만 보며 관리할 수 있는 조직이 되어야 할 것 같습니다.
결국 팀장도 회사 전체로 보았을 때는 중간관리자입니다. 본부장이 자신의 본부에 속해있는 본부원 개개인에게 관심을 쏟을 수 없듯이 팀장도 모든 팀원들에게 관심을 쏟을 수 없습니다.
[그림 2] 캡슐화되지 않은 팀 구성
[그림 3] 캡슐화된 팀 구성
한 가족 처럼 묶일 수 있는 가장 큰 단위인 팀이 안정적인 조직으로 발돋움 하기 위해서는 팀의 중간관리자인 파트장의 역할이 가장 중요하다고 생각됩니다.
이전부터 생각하던 내용을 글로 쓰다보니 처음에 의도했던 것과는 다른 글들이 쓰여지는 것을 보고 "아... 나는 글쓰기에 소질이 없구나" 를 깨달았습니다. 그래도 여러번 쓰다보면 다듬어 질 것이라 생각을 하며 평소 생각을 정리하려고 합니다.