JEUS MQ 클러스터링

본 장에서는 JEUS MQ 서버의 부하를 줄이고 원활한 서비스를 제공하기 위해서 여러 대의 서버를 하나로 묶어서 사용하는 클러스터링에 대해서 설명한다.

1. 개요

한 대의 JEUS MQ 서버를 사용해서 서비스를 제공할 경우 이를 이용하는 클라이언트의 수가 너무 많거나 또는 서버에 보관되고 있는 메시지의 양이 너무 많으면 네트워크에 부하가 걸리거나 서버의 메모리 사용량이 증가한다. 이는 전체적인 성능 저하나 서버 다운의 원인이 될 수 있다. 이런 경우 네트워크 또는 메모리 부하를 분산하고 전체적인 성능을 유지시키기 위해서 JEUS MQ 서버를 증설하고 전체 MQ 서버들을 한 대의 서버처럼 동작하게 하는 것을 JEUS MQ 클러스터링이라고 한다. 이때 JEUS MQ 클라이언트는 자신이 접속하려는 JEUS MQ 서버가 클러스터링 되어 있는지 여부와 상관없이 단일 서버를 이용할 때와 동일한 방법으로 접근할 수 있다.

또한, JEUS MQ 클러스터링은 JEUS MQ 장애 극복의 개념을 포함한 기능으로 제공하고 있다. 자세한 내용은 JEUS MQ 장애 극복을 참고한다.

2. 클러스터링 종류

클러스터링은 Connection Factory 클러스터링과 Destination 클러스터링의 두 종류로 나누어진다.

2.1. Connection Factory 클러스터링

두 대 이상의 JEUS MQ 서버를 구성했다면 클라이언트로부터 이들 서버에 접근하는 연결들을 분산시킬 필요가 있다. 클라이언트로부터 서버로의 연결은 Connection Factory를 통해서 이루어지므로 Connection Factory에서 이런 분산 기능을 지원해야 한다. 이를 Connection Factory 클러스터링이라고 한다.

Connection Factory로부터 Connection을 생성할 때 매 연결마다 서로 다른 서버로 연결하게 되며 매번 다른 서버를 선택하기 위한 정책(Policy)을 설정할 수 있다.

하나의 JEUS MQ 클라이언트는 클러스터 내의 한 서버로 연결되며 클라이언트는 어느 서버로 연결되는지 고려할 필요가 없다.

다음은 Connection Factory 클러스터링을 간략하게 나타낸 그림이다.

figure connection load balancing
Connection Factory 클러스터링

2.2. Destination 클러스터링

Connection Factory 클러스터링에 의해서 클라이언트 연결이 적절하게 분산되더라도 클라이언트의 처리 속도 차이나 네트워크 환경에 따라서 클라이언트가 연결된 JEUS MQ 서버의 메시지가 모두 소모되어서 더 이상 받을 수 없는 경우가 있다. 또한 서버에 메시지가 쌓이는 속도에 비해서 소모되는 양이 적다면 메시지가 계속해서 쌓이는 현상이 발생할 수 있다. 이러한 상황에서는 남는 메시지를 메시지가 부족한 JEUS MQ 서버로 이동시켜서 서비스가 지속적으로 이루어지도록 해야한다. 이런 기능을 Destination 클러스터링이라고 한다.

다음은 Destination 클러스터링을 나타낸 그림이다.

figure destination clustering
Destination 클러스터링

3. 클러스터링 사용

본 절에서는 JEUS MQ 클러스터링을 사용하기 위해서 필요한 설정들에 대해서 설명한다.

3.1. 서버 설정

JEUS MQ 클러스터링의 전체적인 구성은 JEUS 서버의 클러스터링에 따른다. JEUS 서버 클러스터링에 관한 설명은 JEUS Domain 안내서의 JEUS 클러스터링을 참고한다.

JEUS MQ 클러스터링 설정 주의 사항

JEUS MQ 클러스터링에 참여하는 JEUS MQ 서버들의 Destination, Durable Subscription 설정들은 WebAdmin의 JEUS Master 화면 상단의 [클러스터] 메뉴에서 설정하여 그에 포함된 각 서버들에 동일하게 적용되며, 서버마다 주소가 다르기 때문에 별도로 설정해야 하는 Connection Factory는 WebAdmin의 JEUS Master 화면 상단 [서버] 메뉴에서 설정한다. 단, 이 경우도 이름은 동일하게 설정해야 한다.

클러스터의 Destination이나 Durable Subscription은 WebAdmin의 JEUS Master 화면 상단 [클러스터] 메뉴를 선택한 후 목록에서 클러스터를 선택 후 [Jms Resource] 탭 화면에서 설정할 수 있다. 각각의 Destination이나 Durable Subscription을 설정하는 방법은 서버에 설정하는 것과 동일하므로 JMS 리소스 설정의 설명을 참고한다.

  1. 클러스터에 서버를 추가하는 방법에 대해서는 JEUS Domain 안내서의 클러스터에 서버 추가를 참고한다.

  2. 클러스터 내의 Destination을 설정하는 경우 서버에 설정되었던 Destination이나 Durable Subscription의 설정들은 무시되나 명확한 동작을 위해 중복된 이름을 사용하지 않도록 한다.

3.2. 클라이언트 설정

본 절에서는 JEUS MQ 클러스터링을 사용하는 방법에 대해서 설명한다. 클라이언트에서 JEUS MQ 클러스터링을 이용하기 위해서 제일 먼저 설정하는 것이 Connection Factory이기 때문에 주로 이에 관해서 설명한다.

JEUS MQ의 Connection Factory 클러스터링은 클라이언트가 Connection Factory를 얻어오는 방법에 따라서 다음과 같이 2가지로 구분할 수 있다.

  • 클러스터링된 Connection Factory를 사용하는 방법

    JEUS MQ 서버의 클러스터링 여부와 상관없이 Connection Factory에서 설명한 것과 같은 방법으로 사용할 수 있다. 단, 사용하려는 Connection Factory가 서버 설정절의 설명처럼 클러스터링된 서버간에 같은 이름을 사용해야한다. 한번 얻어온 Connection Factory를 재활용해서 커넥션만 다시 생성하여 사용하며, 여러 JEUS MQ서버들 중에서 접속할 곳을 선택하는 정책은 서버의 Connection Factory 설정에서 설정할 수 있는데, 현재는 Round-robin방식과 Random방식을 지원하고 있다.

  • JEUS MQ 전용 API를 사용하여 클러스터링된 Connection Factory를 생성하는 방법

    JEUS MQ 전용 API를 사용하여 Connection Factory를 직접 생성하는 경우에는 JEUS MQ 서버가 클러스터링되어 있다면 Connection Factory에서 설명한 방법에 외에 추가적인 작업이 필요하다.

    다음과 같이 JeusConnectionFactoryCreator.addServerAddress() 메소드를 이용하여 클러스터링에 참여하고 있는 모든 서버들의 정보를 추가해야 한다.

    jeus.jms.client.util.JeusConnectionFactoryCreator connectionFactoryCreator =
    new jeus.jms.client.util.JeusConnectionFactoryCreator();
    
    connectionFactoryCreator.setFactoryName("ConnectionFactory");
    connectionFactoryCreator.addServerAddress("192.168.1.2", 9741, <service-name>);
    connectionFactoryCreator.addServerAddress("192.168.1.3", 9741, <service-name>);
    connectionFactoryCreator.addServerAddress("192.168.1.4", 9741, <service-name>);
    
    ConnectionFactory connectionFactory = connectionFactoryCreator.createConnectionFactory();

4. 예제

본 절에서는 JEUS MQ 클러스터링의 사용 예에 대해 일반적인 경우와 잘못 사용된 경우를 예제를 사용해서 설명한다.

4.1. 일반적인 사용 예제

물품의 주문을 JEUS MQ를 통해서 처리하는 쇼핑몰을 가정해보자.

웹 페이지에서 생성된 주문은 메시지로 작성되어 클러스터링으로 구성된 JEUS MQ의 큐에 보관되고, 실제로 주문을 처리하는 비즈니스 서버에서 이 메시지를 가져간다. 그리고 이 JEUS MQ들은 물론 클러스터링으로 구성한다.

비즈니스 서버는 각각 하나씩 대응하는 JEUS MQ 서버에서 메시지를 가져가고 주문 메시지는 각 JEUS MQ 서버들에 골고루 쌓인다면 이 구조는 JEUS MQ 서버를 이상적으로 구성한 예가 된다. 만약 특정 비즈니스 서버의 처리 속도가 빨라서 그에 대응하는 JEUS MQ 서버의 큐가 다른 곳보다 먼저 비워지면, 해당 JEUS MQ 서버는 Destination 클러스터링을 통해서 다른 JEUS MQ 서버로부터 메시지들을 받아와서 해당 비즈니스 서버에 메시지를 제공할 것이다.

figure good example
JEUS MQ 클러스터링 구성의 좋은 예

4.2. 잘못된 사용 예제

JEUS MQ 클러스터링의 구성 방법은 매우 다양하지만, 다음과 같은 구조로 사용하는 것은 오히려 효율을 떨어뜨릴 수 있다.

figure bad example
JEUS MQ 클러스터링 구성의 나쁜 예

JEUS MQ 클러스터링을 구성하긴 했으나 사용하는 JMS 클라이언트가 한 번 연결한 커넥션을 계속 재활용하면 커넥션의 부하 분산이 제대로 동작하지 않고 JEUS MQ 서버 간에 불필요한 메시지 이동이 일어나게 되어 효율을 크게 저하시킬 수 있다.