월별 글 목록: 2016년 9월월

[GoLang] GoLang 에서 네이밍룰 과 접근 제한자

내가 요즘 관심있어 하는 언어중 하나는 GoLang이다. 간단한 프로젝트도 해봤는데… (http://www.ptcompare.com)

네이밍룰과 접근 제한자가 특이하다.

Java에서는 보통 private, public, protected, default 등이 있지만

GoLang에서는 function에 따로 접근 제한자를 붙이는게 없고

function의 명이 앞글자가 대문자 이면 public ( [ex] func ImPublic () { … } ) 이고

앞글자가 소문자 이면 private 이다.

이 원칙은 변수나, struct등 모든것에 적용된다.

 

[Spring Cloud] 클라이언트 사이드 로드 밸런싱 (Client side Loadbalancing) 이란 ??

최근들어 나는 Spring Cloud에 관심을 가지고 해당 플랫폼을 이용하여 스터디겸 파일럿 프로젝트를 진행중이다.
Spring Cloud를 접하면서 여러가지의 용어들을 접했지만 그중에 가장 흥미로운 용어는 바로 “Client Side LoadBalancing”이었다.
이 낯설지도 않고 익숙하지도 않은 용어는 나를 흥미롭게 했고 해당 용어를 좀더 살펴보았다.

일단 검색엔진을 통해서 검색을 해보았지만… 나 혼자만 몰라서 그런것인지 한글로 검색을 하면 나오지를 않았다.

반면 영어로 하면 괜찮은 자료들이 많이 나왔는데 검색을 해보다 보니 이 개념은 이미 2007년 말부터 나왔던 개념이라는 것을 알게 되었다.

용어란것이 다 그렇지만 이미 우리가 특정 어플리케이션 개발을 할때 이미 쓰이고 있던 방법을 용어화 한것 이었다.
(특히 요즘 유행하는 Micro service archtecture도 예전부터 있던 개념이었다.)
하지만 “에이~ 그런것 이었어? 이미 쓰고 있었구만 뭐” 라며 그냥 넘길 일이 아니다…

왜냐하면 본인도 개발자로서 이직을 몇번 해보았고 개발자가 면접을 볼때는 꼭 용어로 물어 보더라는 것이다…..
본인은 용어에 약하기 때문에 면접관에게 “아 제가 용어에 약한데 한글로 어떤것을 물어보는 것인지 조금 설명이 가능할까요? 라고 한적이 있다.”

그리고 보통은 개발자들은 같이 일할때 용어들을 많이 쓰기 때문에 알아두어야 할 필요가 있다….

사견이 길었는데… 다시 돌아와서.

클라이언트 사이드 로드 밸런싱 (Client Side LoadBalancing) 이란 웹어플리케이션의 부하를 분산하는 방식중에 하나이다.

보통 웹어플리케이션 환경에서 엄청나게 많은 트래픽을 처리하는 방법이 무었일까요? 라고 질문을 할때 대부분의 개발자들은 서버를 여러대를 두어 트래픽을 분산하여 처리를 합니다 라고 대답을 할것이다.

이때 사용하는 것이 Switch로 매우 비싼장비이다. (웹 어플리케이션에서 사용하는 Switch는 보통 L4, L7 스위치를 사용한다.)

Screen Shot 2016-09-17 at 1.36.57 AM
(이게 L4 Switch이다 좀 있어 보인다.)

요즘은 Switch가 설치 및 셋팅이 어렵고 비싸기 때문에 Open Source Software Loadbalancer인 HA proxy를 많이 사용중이다. (듀얼 코어 서버 정도만 되도 초당 2만 세션 정도 처리가 가능하다는 측정 자료도 있다.)

이런 Switch나 HA proxy를 사용하여 부하를 분산하는 방식이 “Server Side LoadBalancing”이다. 보통 이 방식을 우리가 말하는 부하 분산이라고 한다.

Screen Shot 2016-09-17 at 1.37.03 AM
(개념도를 한번 그려보았다. 이런방식으로 서버에 요청하기 전에 Switch가 받아서 각 서버로 분산처리 하도록 한다.)

이 방식에는 문제점이 있다.

1. Switch자체가 처리할수 있는 요청수에 한계가 있다.
2. Switch를 증설하거나 셋팅 설정 하는 어려움이 있으며 그리고 비싸다. (HA proxy도 어쨋든 서버가 필요하다.)
3. Switch가 접속이 문제가 생길것을 대비해서 Switch를 이중화 하기도 한다. 하지만  1,2번 문제와 함께 보통은 Active – Standby로 동작을 하도록 셋팅을 하는데 이떄 문제가 생길동안 이 비싼 장치는 전혀 사용이 되지 않는 문제가 있다.

이런 문제점을 해결하고자 나온 개념이 “Client Side LoadBalancing”이다.

먼저 개념도를 보자

Screen Shot 2016-09-17 at 1.37.14 AM
(simple is best)

“Server Side LoadBalancing”과 차이점은 중간에 Switch를 거치지 않고 바로 서버로 요청이 가는것이다.
Switch에서 하던 분산 역할을 이제는 Client software에서 처리를 하자는 것이다.

이 방식은 클라이언트의 코드에 추가를 하는것이기 때문에 하드웨어 Switch를 추가하는것보다 쉬우며 빠른 문제해결이 가능하다.

“Client Side Loadbalancer”를 구현하기 위해서는 다음을 구현해야 한다.
1. 클라이언트는 랜덤 혹은 특정한 알고리즘으로 (RR같은) 클러스터로 묶여있는 서버중에 랜덤으로 접속을 하여 부하를 분산시킬수 있어야 한다.
2. 서버 접속에 있어 오류사항이 발생했을때 적절하게 대응이 가능해야 한다. 즉 클라이언트는 서버가 특정 시간동안 응답 하지 않는다면 다른 서버를 선택하여 접속해야 한다.
3. 클러스터에 있는 서버들은 최종 사용자에게 (해당 접속 라이브러리를 사용하는 개발자) 한개의 서버로 보여야 한다. (예를들어 http://test-server/ 라는 Alias 를 이용햇 접속을 하며 test-server 는 클러스터의 이름이고 이 test-server 클러스터에는 192.168.0.3, 192.168.0.4, 192.168.0.5 라는 서버가 연결되어있도록 한다.)

위의 1,2,3을 모두 직접 구현할 필요는 없고 이런 기능을 해주는 Library들이 많이 나와있다. 이중에서 Java에서 사용하는 Ribbon 을 이용한 “Client Side Loadbalancer”를 살펴 보도록 하자.

예제코드 는 Java, Spring boot (Cloud) 에 Ribbon을 사용했다고 가정한다.
코드의 목적은 단순하게 서버 컨테이너 3개 (127.0.0.1:8081, 127.0.0.1:8082, 127.0.0.1:8083)를 실행시킨뒤에 클라이언트 컨테이너 (127.0.0.1:8080)에서 해당 서버로 요청하는 코드이다 하지만 다른점은 서버로 Http 요청하는 코드가 다르다는 것이다.

예를들어
Http://127.0.0.1:8081~8083/req-server 로 요청하는것이 아닌 Http://cslb-server/req-server 로 요청하는것이다.
(cslb-server 는 127.0.0.1:8081, 127.0.0.1:8082, 127.0.0.1:8083 서버의 host 정보를 묶은 클러스터 이름이다.)

서버쪽은 코드를 볼것도 없고. (그냥 요청 들어오면 해당 서버의 포트와 요청 시간을 찍어주는 코드)
127.0.0.1:8081, 127.0.0.1:8082, 127.0.0.1:8083 이렇게 3개의 컨테이너를 실행시켜 준다.

Screen Shot 2016-09-17 at 1.37.23 AM

클라이언트쪽 코드를 보면

클러스터로 묶는 서버 설정쪽 (Ribbon)

– application.yml
Screen Shot 2016-09-17 at 1.37.33 AM

– CslbClientApplication.java
Screen Shot 2016-09-17 at 1.37.42 AM

해당 프로젝트를 실행 시킨뒤에 Loadbalancing이 잘 이루어졌나 확인해 보면

Screen Shot 2016-09-17 at 1.37.52 AM

요청 시간을 보면 Loadbalancing이 잘 이루어진것을 볼수가 있다.

Jmeter를 이용해서 failover를 확인해 보도록 하자

Screen Shot 2016-09-17 at 1.38.04 AM

요청을 시작하면

Screen Shot 2016-09-17 at 1.38.27 AM

그중에 8083 컨테이너를 중지하면

Screen Shot 2016-09-17 at 1.38.37 AM

Jmeter상에서 요청 통계를 살펴보면

Screen Shot 2016-09-17 at 1.38.49 AM

error 확률이 0.01% (물론 요청수가 많아서 그렇지만) 빼고는 정상적으로 처리된것을 볼수있다.
(error는 중지 시키는 순간 해당 세션에 물려있는 요청이 있기때문에 어쩔수가 없다.)

failover시점은 설정으로 health check 시간 간격을 더 줄여서 최소한으로 줄일수는 있긴하다.

Screen Shot 2016-09-17 at 1.38.57 AM

소스와 예제를 보니 “Client Side Loadbalancing”에 관해서 이해를 했으리라 믿는다.

참고로 Spring Cloud의 Eureka를 사용하면 Ribbon을 따로 설정해 주지 않아도 “Client Side Loadbalancing”을 사용할수 있으니 참고 바란다. (그건 시간나면 다음 포스팅에)

해당 demo의 소스는 : https://github.com/LeeKyoungIl/Cslb 여기에서 확인해 볼수 있으니 참고 바란다.