부하테스트 결과 EC2 병목 지점을 개선하기 위한 EC2 서버 이중화 방법

AWS EC2 서버 이중화 방법 (수동 확장)

느린 DB 쿼리에서 사용하는 날짜 컬럼 인덱스를 생성하여 RDS 병목 지점을 개선했었습니다.
쓰루풋이 3RPS에서 4RPS로 증가했지만, 목표 쓰루풋을 달성하기 위해 EC2 병목 지점도 개선하려고 합니다.
내부에 비효율적인 로직이 없다는 가정 하에 EC2 서버 이중화를 통해 성능 개선을 해보겠습니다.

AWS 오토 스케일링 기능을 사용하지 않고 수동으로 수평적 확장하는 방법입니다.

EC2 AMI 이미지 생성

AWS > EC2 검색 > 인스턴스 메뉴 > 복제본 이미지를 만들 backend-server EC2 서버 체크 > 작업 > 이미지 및 템플릿 > 이미지 생성 > 이미지 이름 : backend-server-ami 입력 > 인스턴스 재부팅 체크 해제 > 이미지 생성
기존 서버 환경을 그대로 복제하기 위해 EBS 볼륨의 스냅샷 등을 기반으로 AMI 이미지를 생성합니다.

EC2 인스턴스 복제

AWS > EC2 검색 > 이미지 > AMI 메뉴 > 생성한 AMI 이미지 체크 > 세부 정보 탭에서 상태 : 사용 가능 상태 확인 > AMI로 인스턴스 시작 > 이름 : backend-server2 입력 > 인스턴스 유형 : t3a.small (기존 인스턴스 유형과 동일하게 선택) > 키 페어(로그인) : 기존 backend-server에서 사용하는 키 페어 선택 > 네트워크 설정에서 네트워크 : 기존 backend-server와 동일한 VPC 선택, 방화벽(보안 그룹) : 기존 backend-server에서 사용하는 보안 그룹 선택 > 고급 세부 정보에서 IAM 인스턴스 프로파일 : 기존 EC2에서 사용하는 CloudWatchAgentServerRole 선택, 세부 CloudWatch 모니터링 : 활성화 (1분 단위 EC2 메트릭 수집, 추가 비용 발생 가능) > 인스턴스 시작 > 인스턴스 상태가 대기 중에서 실행 중으로 변경되면 서버 연결 가능
VPC, 보안 그룹, IAM 역할 등 필요한 설정은 기존 서버와 동일하게 선택하는 것이 좋습니다.

복제된 서버에서도 스프링부트 애플리케이션 실행

cd /home/ubuntu/load-testing-server/build/libs
sudo nohup java -jar jscode-0.0.1-SNAPSHOT.jar > app.log 2>&1 &

스프링부트 실행 후 http://복제된EC2서버IP/health에 접속하여 정상 실행 확인합니다.

복제된 서버에서도 CloudWatch Agent 실행

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json

복제된 EC2 서버에서도 CloudWatch Agent 실행 명령어를 입력하여 실행합니다.

인스턴스 확장 및 로드밸런서 연결

AWS > EC2 검색 > 로드 밸런싱 > 로드밸런서 메뉴 > 기존 로드밸런서 클릭 > 리스너 및 규칙 탭 > HTTP:80 리스너 대상 그룹 클릭 > 대상 탭 > 대상 등록 > 사용 가능한 인스턴스 > 생성한 backend-server2 인스턴스 체크 > 선택한 인스턴스를 위한 포트 : 80 확인 > 아래에 보류 중인 것으로 포함 클릭 > 보류 중인 대상 등록
AMI 이미지로 만든 신규 EC2 인스턴스를 기존 로드밸런서에 연결하여 트래픽을 분산합니다.