nginx testing in naver

53
제 13 제 제제제제제제제 제제제제 네네네 네네네 NGiNX 네네네네 네네네 , 네네네 NHN 1

Upload: hyungkeun-song

Post on 18-Dec-2014

3.653 views

Category:

Documents


4 download

DESCRIPTION

2013-02-23, 13th JCO Conference

TRANSCRIPT

Page 1: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

네이버 메인의 NGiNX 테스팅기

송형근 , 윤준호NHN

1

Page 2: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

2

1. 네이버 메인의 NGiNX 테스트 사례 !

송형근 - [email protected]

자칭 훈남 개발자 NHN, 메인 서비스 개발 손노리 , 게임 클라이언트 개발

윤준호 - [email protected]

자칭 슈퍼 개발자 NHN, SW 테스트 / 검증 자동화 nGrinder 프로젝트 Lead

2. nGrinder 로 성능테스트 끝장내보자 !

Page 3: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

3

네이버 사용하시나요 ?

개발자라면구글이지 !

구글 티셔츠 정도 걸쳐줘야 간지지

Page 4: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

4

일 PV 2 억 이상

Page 5: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

5

겉모습은 참 화려하죠 ?

내부의 모습은 어떨까요 ?

Page 6: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

6

노후 된 엔진 ... 그리고 ?

APACHE

Page 7: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

7

DDoS Attack

때는 바야흐로 , 2009 년 7 월…

좀비들의 빈집 털이 습격…

Page 8: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

8

보안장비 투입 + 모니터링 강화

그러나 ...

Page 9: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

9

웹 서버를 바꿔보자…높으신 분

웹 서버의 근본적인 취약점은 어쩔 ?

Page 10: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

10

짜잔 ~ 최신 엔진으로 튜닝 !!

Page 11: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

11

에이 , 그냥 엔진만 바꿔 뀌면

되는 거 아냐 ?

누굴 그냥 동네 구멍가게

서비스로 보나 ..

Page 12: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

12

24 시간 365 일 무정지 서비스

아주 디테일하게 검증이 필요한 시스템

서버 점검 시간 따윈 없음 .

장애 발생하면 절대 절대 안 된다 !

Page 13: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

13

도입결정NGINX 용모듈 개발

검증작업( 기능 , 성능

테스트 )

일부 서버 적용

전체 서비스

적용

진행 과정

프로젝트 팀에 합류

모듈간 호환 X

Page 14: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

14

네이버 메인 페이지는 이렇게 만들어진다

정적 컨텐츠 + 동적 컨텐츠

Page 15: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

15

컨텐츠데이터

사용자데이터

Web Server

웹서버 모듈을 이용한 동적 컨텐츠 생성

웹 서버 모듈

index.html

Page 16: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

웹서버 모듈의 다른 기능은 ?

- 로그인 인증 처리- 컨텐츠 캐싱 - 백엔드 시스템 연동 - 쿠키 , 헤더 처리- 랜덤 노출 처리- ...

웹 서버 모듈은 네이버 메인의 핵심 !!

캐쉬

웹서버

랜덤

연동

Page 17: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

17

웹 서버 모듈

httpd.conf

LoadModule proxy_module mod_proxy.so

고성능 ? WAS(X), 웹 서버 모듈 (O)

Q : 보통은 WAS 를 많이 사용하지 않나 ?

A : WAS 로도 , 동일 기능 구현 가능 ( 단지 , 구성 방식의 차이일 뿐 ..)

• 웹 서버에서 제공하지 않는 , 특정 기능 추가

Page 18: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

18

• 기본적으로 NGINX 웹서버 자체의 기능 신뢰 .

• 네이버 메인에서는 , 웹 서버 모듈 (15 개 ) 을 개발하여 사용

• 검증 대상은 우리가 직접 만든 모듈의 안정성

웹 서버 검증 대상 ?

NGiNX 모듈 , 주요 검증 대상

Page 19: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

19

기존에는 어떻게 테스트를 했을까 ?

결과 코드 200?WGET

Curl

Page 20: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

클라이언트 웹 서버

확장모듈

20

기존 테스트 방법 ? 내부 리소스 활용 모듈

정상적인응답만을 제공

WGET

Page 21: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

클라이언트 웹 서버

확장모듈

21

기존 테스트 방법 ? 외부 리소스 활용 모듈

정상응답만을 제공

백엔드 서버

TCP, UDP, HTTP

WGET

Page 22: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

22

[ 이슈 1] 내부 시스템 예외 상황

• Segmentation Fault ?

• 잘못된 메모리 주소 접근으로 인한 오류 : 비정상 종료

NULL 로 설정된 영역을 접근

할당 받은 메모리 공간을 넘어서는 영역에 접근했을 경우

Page 23: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

23

발생 가능한 케이스는 ? 파라미터 , 리소스 오류

13월 ??

2012-13 월의 계좌 조회 ?

데이터 파일 요청

Page 24: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

24

1. 최신 NGiNX 모듈 소스 빌드

2. NGiNX 서버 실행

3. HTTP 호출 (WGET 등 )

4. 결과 검증

NGiNX 모듈 테스트 Flow

어짜피 HTTP ( 윈도우에서 테스트할래 , 리눅스에서 할래 ?)

근데 NGiNX 는 C 언어 아닌가요 ? 갑자기 JUnit 은 ?

수작업 NO !!!!

Page 25: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

25

테스트 코드 예제

public void 정상 _ 응답 _ 테스트 (){

// Client 측 요청 (HTTP)

Map<String,Object> headers = new HashMap();

headers.put( “cookie”, “…” );

page = new WebClient().getPage("http://localhost/deposit?mon=13", headers );

// 검증단계 : 기대했던 결과값이 들어왔는지 검증 assertThat( page.getStatusCode(), is(200) );

assertThat( page.getContent().containts(expectedContent ), is(true));

}

Page 26: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

26

[ 이슈 2] 백엔드 시스템 예외 상황

높으신분 왈

백엔드 시스템이 다운 되어도 , 우리는 정상적으로 서비스 가능해 ?

테스트 해볼 수 있어 ?

Page 27: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

27

백엔드 서비스가 정상적으로 동작하지 않는 상황 ?

시스템 오류천재 지변 해킹

Page 28: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

잘못된 데이터

응답 없음

전체 응답받지 못함

28

궁금하면 500 원

01/23, 500 원

발생 가능한 케이스는 ? 네트워크 관련 오류

요청 : 계좌 이체 내용 조회 , 기대 응답 : { 날짜 , 금액 , 계좌번호 , 잔액 }

1 월 계좌이체 조회

1 월 계좌이체 조회

1 월 계좌이체 조회 계좌조회 시스템

Page 29: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

29

그럼 어떻게 테스트 하지 ?

Page 30: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

30

이번 테스트는요 ,

0.1 초안에 강제로 TCP 연결을 끊어주세요

백엔드 시스템 담당자

-_- 뭥미 .. (멘붕 )

Page 31: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

31

랜선을 뽑아야 하나 ? 아님 두꺼비집이라도 내려 ?

Page 32: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

Mocking : mock objects are simulated objects that mimic the behavior of real objects in controlled ways, wikipedia 32

백엔드 서비스의 테스트 환경 구성

환경적으로 제어할 수 있는 방법 고민 ?

테스트를 위한 NGiNX 모듈 수정은 못합니다 .

우리 시스템은 절대로 다운 시킬 수 없습니다 . 시키기만 해봐 ?!!

결론은 MOCKING !!

Page 33: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

클라이언트NGiNX

백엔드 시스템

Mock 서비스

1 2X

33

백엔드 시스템 Mocking 테스트 환경 구성Localhost

Redirection

Redirection, Mock : 외부의 환경 변화 없이 , 원하는 테스트 가능

Request 검증Response 생성

Page 34: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

1. 도메인으로 접속 시 : hosts 설정

2. IP 로 접속 시 : iptables 설정 ( 리눅스 환경 )

외부서비스 Host IP 도메인주소

서비스 #1 127.0.0.1 www.xxx.com

외부서비스 iptables 를 사용한 IP 포워딩 이용

서비스 #2 iptables -t nat -A OUTPUT -p tcp -d 서버주소 -j DNAT --to-destination 127.0.0.1:10000

34

Redirection

Page 35: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

35

백엔드 시스템 Mocking 테스트 Flow

클라이언트 (C) Mock 서비스 (M)

RedirectionHTTP 요청(N)

Page 36: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

36

정상 테스트 코드 예제 (HTTP)

public void before(){

createServer( HTTP_PROTOCOL, PORT );

startServer();

// Server 측 결과 생성 server.setHandler( new AbstractHandler(){

public void handle( HttpServletRequest req, HttpServletResponse

resp ){

... // NGiNX Request 메시지 검증 + Response 메시지 전송 });

}

public void 정상 _ 응답 _ 테스트 (){

page = new WebClient().getPage("http://localhost/” );

}C M

N

Page 37: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

37

비정상 예외 테스트 코드 예제 (HTTP)

public void before() throws Exception {

createServer( HTTP_PROTOCOL, PORT );

startServer();

// Server 측 결과 생성 server.setHandler( new AbstractHandler(){

public void handle( HttpServletRequest req, HttpServletResponse

resp ){

resp.write( “ 잘못된 데이터지롱” );

stopServer();

}

});

}

1

2

Page 38: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

테스트 코드 예제 (TCP, UDP)

// TCP, IoAcceptor 객체 이용server.setHandler(new IoHandlerAdapter() {

public void processStreamIo(IoSession session, InputStream in, Out-

putStream out) {

out.print ( responseMsg );

}

});

// UDP

server.setHandler(new StreamIoHandler() {

public void messageReceived(IoSession ssn, Object msg){

ssn.write( … );

}

});

Page 39: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

39

23 개 오류 발견

기존 방법으로는 절대 검출 못했을

개당 1 억 : 23 억 절감

Page 40: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

40

Redirection + Mocking

백엔드 시스템 예외상황 테스트

Page 41: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

41

NGiNX 적용 이후

NGiNX 고가용성 확보 : TPS 약 3배 증가

서버 대수 : 1/3 수준으로 감소

NGiNX 장애 : 0 건

Page 42: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

2. nGrinder 로 성능테스트 끝장내보자 !

42

Page 43: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

43

성능 테스트 ?

스트레스 테스트 로드 테스트

로드 상황에서 크래시 등의 문제점 확인

로드 상황에서 성능 특성 파악

Page 44: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

44

1 2 5 10 50 100 2000

500

1000

1500

2000

2500

ApacheNginxNginx-caching

동시사용자 #(Think Time 없을 때 )

초당처리량

로드 테스트

Page 45: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

45

스트레스 테스트

부적절한 커넥션 풀 ?

불충분한 쓰레드 풀 ?

메모리 릭 ?

리소스 릭 ?

비효율적인 코드 ?

Page 46: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

NHN 에서는 어떻게 로드를 주나요 ?

46

ApacheBench? LoadRunner?

NGiNX 같은 고성능 서버에는 부적절…

Page 47: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

무제한 로드 부여 가능 / NGiNX 테스트에 적합

컨트롤러 테스트 대상 서버

로드 생성기

부하제어

스크립트

47

분산 테스트 ?

Page 48: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

그냥 하나 만들고 만다 .48

Page 49: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

49

nGrinder since 2010

Page 50: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

스크립트 작성

테스트 진행결과 리포트

테스트 설정 (vuser 개수등 )상세 결과 보기

50

데모 > 테스트 흐름

Page 51: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

언제든 원하는 시점에 테스트 수행

51

테스트 준비시간 0 분

네트워크 과점유 자동 검출

월간 2000 건 성능 테스트 실행

Page 52: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

http://www.nhnopensource.org/ngrinder/

Page 53: Nginx Testing in NAVER

제 13 회 한국자바개발자 컨퍼런스

53

Thank You.