★ 프로젝트 + 트러블 슈팅 ★

★ 대규모 트래픽 부하테스트 ★ ALB (Application-Load-Balancing) + Auto-Scaling 진행순서 및 트러블 슈팅

리승우 2022. 12. 13. 23:31

아래와 같은 문제상황을 가정하여 생각해본 결과,

서버에 대한 전체 API응답 속도개선처리를 위해 ALB를 구상하게 되었다.

 

https://desirelsw.tistory.com/170

 

단일 서버 성능개선 트러블 슈팅

[프로젝트 현 상황] > E커머스 웹 구현중 (ex. 쿠팡, G마켓) > 특정 시간대에 특정 상품의 재고한정 특가이벤트 기능 추가예정 https://github.com/OnNaNOn/OMG GitHub - OnNaNOn/OMG Contribute to OnNaNOn/OMG development by

desirelsw.tistory.com

 

깃허브 이슈는 아래와 같다

https://github.com/OnNaNOn/OMG/issues/160

 

서버 전체 API요청 속도개선 처리 · Issue #160 · OnNaNOn/OMG

💡 이슈 내용 단일 서버로 운영할 시에 벌어지는 문제 (CPU 부하)에 대한 해결방안을 아래에 자세히 기재하였다 (https://desirelsw.tistory.com/170) 🔎 문제 분석 현재 프로젝트는 일 평균 사용자가 10만

github.com

 

그리고 문제 해결을 위한 트러블 슈팅 과정은 아래와 같다.

https://github.com/OnNaNOn/OMG/issues/213

 

ALB(Application-Load Balancer) + Auto Scaling 실패로 인한 대체방안 트러블슈팅 · Issue #213 · OnNaNOn/OMG

💡 이슈 내용 AWS기준, ubuntu 20.04버전 t2.micro EC2를 이용하여 ALB(Application-Load Balancer) + Auto Scaling을 진행하였다. 헌데 최소 EC2를 2개로 운영하여도 제이미터 부하테스트로 3초동안 약 7,000개의 요청

github.com

 

 

아래에서는, 어떻게 ALB를 적용할 수 있게 되었는지 그 적용방법과 문제해결과정을 적으려고 한다.

[ALB + Auto-Scaling 적용과정]

 

 

 

[문제 해결과정]

1. Auto-Scaling의 시작 템플릿 자동변경 

 

[현 상황]

1. github actions + codeDeploy + S3를 이용하여, EC2 1개를 CI/CD하고 있는 상태임
2. 추후 서비스 운영 도중 대규모 트래픽이 발생할 상황을 대비하여 aws Auto-Scaling을 도입할 계획
3. Auto-Scaling이용하여 기존 EC2에 대한 Auto-scaling그룹을 만들었음

4. 동작됨을 확인 완료함


[문제점]

1. 기존 EC2에 대한 변경점이 생길 경우, 기존 EC2를 CI/CD시켜 재배포를 할 예정이나, 다시 생겨나게 될 Auto-Scaling 인스턴스들은 반영된 내용이 자동으로 적용되지 않을 것인데...

 

 

Auto-Scaling을 통해서 생성되는 것들은, AMI(Amazon Machine Images)를 이용한 시작템플릿을 이용하여 생성된다.

 

이 AMI라는 것은 기존EC2의 특정시점을 image화 시켜서 만든 것이다.

그 특정시점을 기준으로 만든 image를 시작템플릿으로 지정함으로써, Auto-Scaling그룹 내에서 서버 부하에 따라 인스턴스가 추가/감소되는 것이다.

 

그럼으로써 위와 같은 문제가 생겨난다.

EC2의 원본 소스코드를 바꾸게되면, CI/CD는 평소대로 진행이 가능하게끔 할 수 있는데 이미 AMI로 image화 시킨 게 적용된 Auto-Scaling의 시작템플릿은 자동으로 반영이 안 되지 않나??

 

고민이 된다....

 

근데 당연히 안되는 게 맞다고 생각한다.

 

그래서 아래와 같은 해결방안으로 진행하는 게, 별로 남지않은 프로젝트 기한에 합당한 결과물같다.

 

[해결방안]

1. 애플리케이션을 모두 완성한 뒤, 그 시점을 기준으로 AMI를 생성하여 Auto-Scaling 진행

2. 우선 Auto-Scaling을 진행한 뒤, EC2 원본 소스코드가 바뀌게 되면 AMI를 새로 생성하여 Auto-Scaling의 시작템플릿을 변경

 

1번과 2번 사항 중 선택하여 해결하는 것이 시간관계상 가장 합리적인 방안으로 생각된다.

(서버 부하를 해소시키는 게 가장 큰 목적임. 부하테스트를 서둘러 해야할 경우 2번이 가장 유력한 선택지)

 

Beanstalk는 이러한 과정을 한번에 해결할 수 있다는데... 

나중에 다른 프로젝트를 맡으면 꼭 Beanstalk를 적용해봐야겠다.

 

 

2. EC2 스케일업 도입고려

부하테스트를 빠르게 진행해보기 위하여, 위에 기재한 1번 문제상황 중

해결방안 2번 (우선 Auto-Scaling을 진행한 뒤, EC2 원본 소스코드가 바뀌게 되면 AMI를 새로 생성하여 Auto-Scaling의 시작템플릿을 변경)

을 택하여 진행하였다.

 

하지만...

또 아래와 같은 이슈로 인하여 의사결정을 해야하는 상황이 도래하였다.

해당 이슈에 대한 해결방안은 아래에 도출하였다.

💡 이슈 내용

- AWS기준, ubuntu 20.04버전 t2.micro EC2를 이용하여 ALB(Application-Load Balancer) + Auto Scaling을 진행하였다.
헌데 최소 EC2를 2개로 운영하여도 제이미터 부하테스트로 3초동안 약 7,000개의 요청을 날릴 시에 실패가 되는 사례가 발생하고 있다.

 

 

🔎 문제 가능성 분석

- EC2의 버전 자체가 너무 낮은 처리능력을 가지고 있는 것이여서

- Auto Scaling으로 인해 새로 생겨나는 EC2의 생성속도가 지연됨에 따라 처리량을 보강하지 못해서

 작업 계획내용

- 높은 처리량을 가진 EC2로 스케일업

- Auto Scaling 세팅옵션 재조정을 통한 생성속도 지연상황 방지

 

 

3.  EC2 스케일업 도입방향

💡 이슈 내용

서버부하테스트 및 개발일정 준수로 인해,
높은 처리량을 가진 EC2로 스케일업하는 것을 목적으로 둠.
이에 따른 추가 작업들은 아래 작업 계획내용에 기재해둠.

 작업 계획내용

ubuntu r5.8xlarge 모델로 스케일업
(금액 부담으로 인해 on/off 형식으로 운영할 예정)

  • Timezone 설정
  • reids 설치
  • java 11버전 설치
  • 8080포트포워딩 진행
  • 인스턴스 실행 시, jar파일 자동 실행세팅

상품 페이지네이션 지연 현상 해결

일반 상품 주문기능 미구현 현상 해결

 

4.  EC2 스케일업 도입 후, 성능개선 미비

💡 이슈 내용

위 내용대로 변경하였음. 내용은 아래와 같음

 반영 결과 내용

제이미터 활용, 3,000명이 1초간 주문하기 기능을 요청하였을 경우 에러율 58.7% 육박

🔎 문제 가정

서버 문제가 맞을려나? 확인이 추가로 필요할듯
why? 이전에 t2.micro EC2로 운영하였을 때와 유사한 실패율을 보이고 있음..

 

5.  EC2 문제가 아닌, DB 병목 현상으로 인한 문제인 것으로 유추

💡 이슈 내용

서버 문제가 아닌 것으로 확인됨. DB문제인 것으로 유추되고 있음
(DB커넥션 문제 or DB 자체 스펙미달 문제)

🔎 확인 내용 (제이미터를 활용한 부하테스트)

[ubuntu r5.8xlarge 모델 사용]

500명 1초동안 주문하기 기능 요청 시, 에러율 0% 달성

  1. 1,000명이 1초동안 주문하기 기능 요청 시, 에러율 35% 달성

[ubuntu t2.micro 모델 사용]

3,000명이 1초동안 주문하기 기능 요청 시, 에러율 56% 달성
CPU 사용률(%)은 약 30%에 불과하여, CPU부하로 인해 그동안 에러가 발생한 게 아니였다는 것이 확인됨

 추후 작업계획

DB 튜닝을 통해 부하테스트 에러율 0% 달성

 

6. DB 병목 현상 해결을 위한 트러블 슈팅

💡 이슈 내용

DB튜닝을 통해 DB 병목으로 인한 에러현상 해결해야함
(DB max-connections 가 요청트래픽에 비해 부족한 상태여서 지연현상 에러가 발생하는 걸로 유추됨)

🔎 실행 및 확인 내용

세팅 내용, hikari maximum-pool-size를 50으로 변경하여, 에러 개선시도하였으나 실패함.

 

[RDS별 max_connections 개수] 

현재 프로젝트 RDS는 2.micro임

Tomcat 서버 튜닝하여 에러 개선시도하였으나 실패함.

 추후 작업계획

DB튜닝을 통해 최적화를 시도하였으나, 근본적인 성능차이로 인해 불가능할 것으로 여겨지는 상태임.
위를 해결하기 위해선 DB Scale-up을 통한 근본적인 해결책이 필요할 것으로 예상되어 팀원들과 논의결과 아래와 같이 결정하였음.

★ DB Scale-up을 통하여 max-connections 상승

위 과정 거친 후, 대규모 트래픽 부하테스트 진행예정

 

아래에 있는 것으로 Scale-up 할 예정

 

7. DB 스케일업 문제가 아닌, 본인 PC jmeter 결과값의 상이함??

 

💡 이슈 내용

스케일업된 DB로 변경 후, 아래에 테스트들을 진행하였음.
그럼에도 에러가 발생하여, 혹시 모르니 EC2 서버도 스케일업하여 추가 테스트를 진행하였음

 

🔎 테스트 결과 리스트

프리티어 EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 및 서버설정 없음

8000회 요청 / 5초 / 5회 / 조회기능
=> 1분 31초 소요 + 에러 34%
8000회 요청 / 5초 / 10회 / 조회기능
=> 중간에 테스트 중단함 + 에러발생

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 및 서버설정 없음

8000회 요청 / 5초 / 5회 / 조회기능
=> 1분 16초 소요 + 에러 27,7~30.5%

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 130 + tomcat threads-max 150

8000회 요청 / 5초 / 5회 / 조회기능
=> 1분 15초 소요 + 에러 28,7%

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 150 + tomcat threads-max 190 + tomcat max-connections 3000

8000회 요청 / 5초 / 5회 / 조회기능
=> 1분 15초 소요 + 에러 28,7%

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 10 + tomcat threads-max 60

8000회 요청 / 5초 / 10회 / 조회기능
=> 1분 28초 소요 + 에러 27,7%

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 10 + tomcat threads-max 60 + tomcat connection time-out 1800000

8000회 요청 / 5초 / 10회 / 조회기능
=> 2분 45초 소요 + 에러 30.7%

 작업 결과

모두 에러가 발생하였음.
다른 조원의 PC에서 제이미터를 한 결과, 에러 0% 결과가 나왔음
(조건은 다르게 먹였으나, 본인이 시도해도 에러가 떴음. 왜지??)

 

😂 [다른 조원 테스트 성공결과]

테스트는 모두 4000회 요청 / 5초 / 10회 반복으로 시도하였음 (총 40,000요청)

프리티어 EC2 1개 + 프리티어 RDS (레플리케이션 2개)

 

 

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 10 + tomcat threads-max 60

 

 

t2.large EC2 1개 + db.m5.4xlarge (레플리케이션 없이)
hikari maximum-pool-size 160 + tomcat threads-max 200

 

 

프리티어 EC2 1개 + 프리티어 RDS (레플리케이션 2개)
hikari maximum-pool-size 10 + tomcat threads-max 60 + tomcat connection-timeout 1800000

 

 

🚨 필수 확인해야할 사항

1. 같은 조건으로 하였는데, 왜 본인 PC의 jmeter의 결과값은 다르게 산출된 것인지?

2. tomcat threads-max는 기본값이 200인데, 60으로 낮춰서 진행하는 것이 서버 튜닝에 있어 어떤 의미인 것인지?

3. tomcat connection-timeout을 통한 서버튜닝이 어떻게 가능한 것인지?

 

원리파악이 중요한 것 같습니다... 내일 아침에 한번 알아보겠습니다

 

8. ALB세팅 시, 헬스체크 path '/' 실패사항

아래와 같이, 헬스체크를 기존에는 '/'로 path를 지정해서 진행해본 결과.

계속해서 헬스체크에서 실패한다는 문구가 노출되었다. 

 

분석한 결과 아래 링크도 참고했다

https://may9noy.tistory.com/661

 

왜 그랬을까...

계속 생각해본 결과, 당연한 것이었다.

 

답은?

 

현재 시큐리티를 사용하고 있는데, '/' 경로에 대해서는 다 허용하지 않는다고 했기때문이다!

이것 때문에 계속 헬스체크를 통과하지 못한 것이였다.

 

왜냐하면 헬스체크는 실제 웹 서비스가 정상적을 호출하는 페이지의 URL주소를 넣어줘야 하기 때문이다.

그러한 이유로 현재 테스트 하고 있는 웹 사이트의 메인 경로가 /omg이므로 해당 경로를 헬스체크에 넣어준 결과.

동작이 매우 잘되게 되었다.

 

 

💊 추후에 위와 유사한 문제를 다루게 된다면 꼭 이렇게 해결해보자!

BeanStalk도입

특징

초기 세팅

기본적으로 필요한 환경을 몇번의 클릭으로 서버 셋팅을 할 수 있다.
예를 들면 원하는 루비 버전과 패신저를 설정하면,
인스턴스에 직접 들어가서 설치하지 않아도 빈스톡이 알아서 환경을 구성해준다.
그런데 최신 버전의 언어를 지원하지 않는 경우도 있다. 이런 경우, 알아서 docker 환경을 만들어서 빈스톡에 등록해두어야한다.

환경 구성

AWS Console에서 서버에 필요한 환경 변수들을 쉽게 변경/관리할 수 있다.
그래서 서버에 직접 들어가서 환경 변수를 확인하거나, 배포스크립트를 확인하지 않아도 된다.

운영

오토 스케일링이 편하다.
빈스톡 설정 값에서 CPU 혹은 메모리가 일정이상을 사용하는 경우, 인스턴스를 늘리도록 설정할 수 있다.
그래서 갑자기 트래픽이 몰려도, 빈스톡이 알아서 스케일업을 해줘서 든든할 때가 있다.
그리고 트래픽이 빠지면, 알아서 스케일인을 해준다.

로그

패신저, 기본 어플리케이션 로그 등의 로그 로테이트를 알아서 해준다.
게다가 알아서 S3에 저장해준다. 그래서 지난 로그를 확인하고 싶은 경우, S3에 들어가서 로그를 확인하면 된다.

모니터링

서버에 문제가 발생한 경우, 알림을 주는 기능도 있다. ( Elastic Beanstalk Environment Notifications with Amazon Simple Notification Service )

 

https://americanopeople.tistory.com/97

 

[AWS]Beanstalk이란

나는 1년정도 BeanStalk을 사용하고 있다. 처음에는 BeanStalk가 어떤 역할을 하는 서비스인지 궁금해서 찾아봤었는데, 이해가 잘 되지 않았었다. 그래서 내가 경험한 빈스톡에 대해서 정리해보고자

americanopeople.tistory.com

 

https://thalals.tistory.com/151

 

[AWS] Elastic Beanstalk란 (ELB + Auto Scaling + EC2 한번에 관리)

🍯EB(ElasticBeanstalk) 란 ELB + Auto Scaling + EC2 한번에 관리할 수 있는 서비스입니다 AWS 에서는 통합해서 관리할수 있는 서비스인 ElasticBeanstalk 를 제공하고 있습니다. 구글의 앱엔진이라는 서비스와

thalals.tistory.com