3 minute read

라즈베리파이 WEB WAS 로드밸런싱

로드밸런싱 개요

: 라즈베리파이에 Apache & Tomcat서버를 로드밸런싱 한다.

  • 1대의 웹서버를 바라보는 WAS서버 2대를 구성한다.
  • 물리적으로 서버를 분리하여 부하를 줄인다.
  • mod_jk의 load balancing 방식은 기본적으로 round robin이지만 한번 왔던 요청은 같은 Engine에 보내준다.

로드밸런싱 구축

WEB서버 mod_jk 설정

: 웹서버(아파치) 측의 설정.

  1. (아파치루트/톰캣커넥터루트/workers.properties) 설정
    : 워커를 정의 및 로드 밸런싱을 위한 다중화 톰캣 설정을 한다.

     # ASIS
     # worker.list=lilo_lb                     # 리스트정의
     # worker.lilo_lb.type=lb                  # 타입정의
     # worker.lilo_lb.balance_workers=worker1  # load balancing할 worker 속성 지정, (worker1)를 lilo_lb 라는 리스트 하위에 추가한다.
                                               # ajp13프로토콜을 사용하는 톰캣서버를 구분하기 위한 이름이다.
     # worker.worker1.port=8009                # mod_jk 가 이용하는 APJ 연동 포트
     # worker.worker1.host=192.168.0.10        # 연동시킬 나의 다른 라즈베리파이 WAS서버 주소를 입력
     # worker.wokrer1.type=ajp13               # 연동모듈 프로토콜
    
    
    
    
     # TOBE
     worker.list=blang_balancer
     worker.blang_balancer.type=lb
     worker.blang_balancer.balance_workers=tomcat1,tomcat2
    
     # Server1
     worker.tomcat1.port=18009          # 로드밸런싱 전용포트 포트중첩불가 톰캣에서 설정한 포트와 일치해야함
     worker.tomcat1.host=192.168.0.10
     worker.tomcat1.type=ajp13
     worker.tomcat1.lbfactor=1          # 서버밸런스비율
    
     # Server2
     worker.tomcat2.port=28009
     worker.tomcat2.host=192.168.0.12
     worker.tomcat2.type=ajp13
     worker.tomcat2.lbfactor=1
    
    

    ajp13 을 apj13 으로 작성해서 한참을 찾았다…. ㅋㅋㅋㅋ…

  2. (아파치루트/conf/httpd.conf) 설정
    : 톰캣에 통과시킬 매핑을 정의하는 jk마운트를 최종 설정한다.

     # 최종으로 mod_jk JK마운트로 worker를 등록한다. url를 구분하여 톰캣이 처리할지 결정한다.
     # /* 으로들어오는 요청을 blang_balancer 라는 워커로 넘긴다.
     # 워커 설정에는 로드밸런싱이 설정되어있다.
     # tomcat1, tomcat2 골고루 요청을 분산해줄 것이다.
    
     # ASIS
     #jkMount /* lilo_lb
    
     # TOBE
     jkMount /* blang_balancer
    
    

WAS서버 mod_jk 설정

: 와스서버(톰캣) 측의 설정.

  1. (톰캣루트/conf/server.xml) 설정
    : WAS 2대의 톰캣의 mod_jk 커넥터 포트를 겹치지 않도록 설정한다.

     # (WAS 1번에서 작성)
    
     # 아래 mod_jk 로드밸런싱 전용 포트를 서버별로 각각 다르게 설정한다.
     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <Connector protocol="AJP/1.3"
              address="0.0.0.0"
              secretRequired="false"
              # port="8009"     # 이전에 설정한 mod_jk 연동 포트이다. 주석처리하고
              port="18009"      # (#WAS1) 이부분은 로드밸런싱 내용이다. 이렇게 추가한다. (달라야한다)
              redirectPort="8443" />
    
     (중략)
          
    
     # (WAS 2번에서 작성)
    
     # 아래 mod_jk 로드밸런싱 전용 포트를 서버별로 각각 다르게 설정한다.
     <!-- Define an AJP 1.3 Connector on port 8009 -->
     <Connector protocol="AJP/1.3"
              address="0.0.0.0"
              secretRequired="false"
              # port="8009"     # 이전에 설정한 mod_jk 연동 포트이다. 주석처리하고
              port="28009"      # (#WAS2) 이부분은 로드밸런싱 내용이다. 이렇게 추가한다. (달라야한다)
              redirectPort="8443" />
    
     (중략)
    
    

중간점검
여기까지 하면 아주 원초적이고 기본적인 웹서버 1대N개의 WAS서버 연동이 완료된다. 그리고 이를 이를 로드밸런싱이라고 한다. 번갈아가며 WAS1, WAS2 의 페이지가 호출되는건 좋다이말이다.. 하지만 문제가 있다.
WAS가 교체될때마다 작업중이던 세션을 잃어버릴테니 로그인처리 같은 로직은 자꾸 풀릴 것이다. 이를 위해 추가적인 작업이 필요하다. 다음 내용을 살펴본다.

sticky 세션 (선택)

: sticky 세션이이 없다면 위와 같이만 설정하면 mod_jk는 예전에 보냈던 위치를 찾지 못하고 다른 Engine에게 보내줄수도 있다.

  • 요청(Request)이 한번이라도 되었던 WAS 측에 지속적으로 로드밸런싱하여 요청하는 모드이다.
  • Sticky Session 방식은 세션을 최초에 생성한 서버로 요청을 고정하는 방식이라고 보면된다.
  • 브라우저가 죽지않는이상 쿠키에 세션정보를 담아 이력이 있던 한쪽 WAS서버만 고정(Sticky) 요청한다.
  • 아파치 서버는 이를 확인하여 스티키 (sticky) 모드로 밸런싱한다고 한다.
  1. 방법1 : JK커넥터의 workers.properties 에서 스티키옵션을 활성화 한다. (아파치루트/톰캣커넥터루트/workers.properties)

     # (WAS 1번에서 작성) 
    
     # TOBE
     worker.list=blang_balancer
     worker.blang_balancer.type=lb
     worker.blang_balancer.balance_workers=tomcat1,tomcat2
          
     # Server1
     worker.tomcat1.port=18009          
     worker.tomcat1.host=192.168.0.10
     worker.tomcat1.type=ajp13
     worker.tomcat1.lbfactor=1
     worker.tomcat1.method=Session         # 추가
     worker.tomcat1.sticky_session=True    # 추가
                
     # Server2
     worker.tomcat2.port=28009
     worker.tomcat2.host=192.168.0.12
     worker.tomcat2.type=ajp13
     worker.tomcat2.lbfactor=1
     worker.tomcat2.method=Session         # 추가
     worker.tomcat2.sticky_session=True    # 추가
          
    
  2. 방법2
    : 톰캣의 server.xml 에서 jvmRoute 로 워커명을 명시해준다. 이렇게하면 세션 ID 끝에 jvmRoute 값이 추가된다. (아파치루트/톰캣커넥터루트/workers.properties)

     # (WAS 1번에서 작성)
    
     <!-- ASIS -->
     <!-- <Engine name="Catalina" defaultHost="localhost"> -->
             
     <!-- TOBE (jvmRoute 옵션으로 워커명을 준다.)-->
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
    
    
     # (WAS 2번에서 작성)
    
     <!-- ASIS -->
     <!-- <Engine name="Catalina" defaultHost="localhost"> -->
             
     <!-- TOBE (jvmRoute 옵션으로 워커명을 준다.)-->
     <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat2">
    
    

    적용예시) 다음과 같이 출력된다.
    // ASIS
    529F15696D89F53762085869335B881E
    // TOBE
    529F15696D89F53762085869335B881E.tomcat1

중요)
sticky 관련하여 헷갈린점이 있었다.

  • 첫번째
    • 적용을 했는데도 JSP가 아닌 HTML 을 호출하면 sticky가 적용되지 않은것처럼 번갈아가면서 WAS서버 1,2 를 호출하는것이였다. 생각해보면 단순 String인 html페이지를 호출하면 톰캣컨테이너가 request를 위임받지 못하기때문에 세션아이디를 생성하지 못하여 그런것 같다고 추측한다.
  • 두번째
    • 위에서 설명한 방법1 만 있는줄알았다. 방법2 를 어찌저찌하다가 미리 적용해둔 상태에서 sticky 라는게 있네? 하고 적용하려고 개념을 보고있었는데 아무리 살펴봐도 나한테 sticky 모드가 적용되어있는것같았다.. 이게 첫번째 이유와 동시에 닥치니까 매우 헷갈렸다.. 방법2 처럼 jvmRoute 를 설정만해두어도 mod_jk 는 sticky 밸런싱을 해준다.

연동완료 정리

: 부하분산을 위한 mod_jk 의 로드밸런싱이 완료되었다. was1번,2번에 동일한 url서블릿 매핑을 가진 jsp주소를 호출해보면 (내용은 달라야한다) 서로 다른내용이 번갈아가며 출력되는것을 볼 수 있다.

사진2

참고) 세션 클러스터링이 필요하다.
아파치1, 톰캣2 구성의 로드밸런싱을 완성했다.

  • 접속하면 WAS서버가 번갈아가면서 처리되는걸 보면 목적대로 로드밸런싱 성공.
  • 한번 처리요청한 서버에서 지속적인 요청하도록 Sticky 밸런싱 성공

하지만 sticky 밸런싱으로 한쪽 WAS로 요청이 이루어지는 도중에 갑자기 서버에 문제가 생기면? 세션은 잃어버리겠지만 다른쪽의 WAS로 요청이 이루어질것이다. 이렇게 고정적(Sticky)으로 받고있던 세션을 잃지않고 공유되어야하는 경우 세션 클러스터링 작업이 별도로 필요하다. 세션 클러스터링은 한쪽이 끊어져도 두개의 톰캣이 하나의 세션을 유지할 수 있도록 서로 복사하며 공유한다.

Leave a comment