Oriental Unity 프로젝트 기획 당시
어차피 시간도 없는거 그냥 빠르게 MVP로 서비스를 구현하고
리팩토링 & 성능 개선을 목표로 했다.
비록 리팩토링과 성능 개선은 못하고있으나,,
어플리케이션의 성능을 모니터링하고 분석할 수 있는 서비스(APM) 중 하나인 Pinpoint를 도입하고자 했다.
자세한 시연 영상과 코드는 아래 레포지토리에 나와있다.
0) Pinpoint란?
네이버 클라우드 공식 Pinpoint 사이트에서는 Pinpoint를
분산 애플리케이션의 성능을 분석, 진단, 추적하는 서버형 플랫폼 서비스라고 설명하고 있다.
필자도 써본 후에 적는 것으로,
처음엔 뭘 분석, 진단, 추적해주는지를 몰랐다.
설치 후 모든 기능을 사용해보지는 않았으나
사용자가 API를 사용했을 때의 서비스의 응답의 성능을 분석해주고
그것으로 통계를 내어 진단할 수 있도록 그래프화, 시각화 해주고
응답 시의 서버 내 데이터의 활동도 추적해주더라..
위는 Pinpoint의 아키텍처이다.
host는 agent를 실행시키는, 간단히 말하면 서비스 이용자이다.
그러면 agent는 서비스의 활동을 collector에게 보내주고,
collector는 수집한 정보가 kafka, pinot 을 이용하는 과정을 거치도록 한 후
개발자가 web 화면으로 정보를 시각화하여 볼 수 있도록 해준다.
1) Pinpoint 설치
1-1) Naver Cloud에서 제공하는 Pinpoint 설치
Pinpoint를 그냥 서버에 설치해도 되지만,
네이버 클라우드에서도 Pinpoint 서비스를 제공해주는 것을 발견해서
어차피 크레딧도 많으니 이걸 한번 써보기로 했다.
1-1-1) Pinpoint Repository 생성
Pinpoint Repository에서 생성하면
오른쪽 화면을 볼 수 있는 바로가기 버튼을 볼 수 있다.
1-1-2) Pinpoint Agent 설치
후술할 문제 때문에
저 버전은 필자의 팀이 직접 다운받은 버전이고
위 사진의 Download Link 안의 2.5.2 버전은 차이가 있을 수 있다.
아무튼 저 링크를 클릭하면 Agent를 다운받을 수 있다.
1-2) Naver Cloud Pinpoint의 버전 이슈
1-1-2의 Agent를 다운받고
Spring Boot Application을 실행해보니
자꾸 Application과 Agent가 충돌이 나서 실행이 되지 않았다.
Pinpoint Github에서 찾아보니,
네이버 클라우드에서 제공하는 Pinpoint Agent는 2.2.3 버전으로
그 버전은 JDK 7~14까지만 지원하는데
우리 Spring Boot는 3.x.x 버전이었고
Spring Boot 3 부터는 JDK 17 이상이었기 때문에 버전 충돌이 났던 것이다.
그래서 결국...
1-3) 프로젝트 프록시 서버에 Docker-Compose로 Pinpoint 설치하기
Pinpoint를 우리 프록시 서버에
docker-compose를 이용하여 설치하기로 했다.
왜 프록시 서버인가? ⬇️
agent는 사용자의 활동을 collector에게 보내주고
collector는 그것들을 모으는 역할을 하기 때문에
agent는 실제 어플리케이션이 돌아가는 어플리케이션 서버에 설치해야 하고,
collector는 프록시 서버에 설치하여
어플리케이션 서버에 있는 agent가 프록시 서버에 있는 collector에게 사용자 활동 정보를 보내도록 설정해야 했다.
collector 서버나 agent는 물론이고 hbase같은 자잘한 것들을
모두 직접 설치하기에는 공수가 너무 크기 때문에
pinpoint-apm/pinpoint-docker 레포지토리에 나와있는 방법대로
docker-compose를 이용하는 것이 훨씬 낫다.
git clone https://github.com/pinpoint-apm/pinpoint-docker.git
cd pinpoint-docker
git checkout {tag} ## tag는 pinpoint-docker github 레포에 나와있는 다운받고자 하는 버전을 입력하면 된다.
docker-compose -f docker-compose.yml -f docker-compose-metric.yml build
필자의 경우에는
위 더보기에서 설명한대로 agent를 빼놓고 설치하려 했기 때문에
docker-compose.yml 파일에서
pinpoint-quickstart와 pinpoint-agent 부분을 주석처리하고
위 명령어를 실행시켰다. (물론 프록시 서버에서)
1-4) 프록시 서버 - 어플리케이션 서버 간 ACG 설정
Pinpoint가 사용하는 Port로, 필자의 경우
Private한 어플리케이션 서버의 agent에서 보내주는 사용 정보를
Public한 프록시 서버의 collector에서 받기 때문에
두 서버 간의 ACG 설정만 갱신해주면 되었다.
위 사진의 10090, 8090 Port들은
어차피 Public하게 뚫려있는 프록시 서버에서 쓰이는 Port이기 때문에 따로 설정해주지 않았고
Agent와 TCP/UDP로 통신하는 9994~9996 포트를 포함하도록 9000~10000 Inboud Port를 뚫어주었다.
1-5) 실행
이후 어플리케이션과 함께 실행해보면...
실행이 잘 되는 모습. http://{프록시 서버 IP주소}:8080
으로 접속 시 이 화면을 볼 수 있다.
그런데 여기서.. 또 이슈가...
1-6) 프록시 서버 Scale Up
초기 프록시 서버의 스펙이
2 Core CPU, 4GB RAM
이었는데
Pinpoint를 깔아 실행해보니 RAM 메모리때문에
서버가 꺼지진 않는데 말을 안듣더라,,
메모리가 딸리는 것이니 바로 스펙업을 진행했고,
4 Core CPU, 8GB RAM
으로 스펙업 후 다시 상태를 보니
Pinpoint + Jenkins만 돌려도 메모리의 80% 정도가 사용중이었다.
이후 어플리케이션의 분산 환경 크기가 커지고
더 많은 요청을 받게 되면 또 메모리 문제가 생길 것 같아
4 Core CPU, 16GB RAM
으로 다시 스펙업을 진행했다.
그러고 나니 이제야 부하가 생기지 않고 안정적으로...ㅠㅠ
2) Pinpoint Agent 적용
프록시 서버에 collector를 준비해놓았으니
이제 어플리케이션 서버에
사용자의 활동 정보를 모아주는 agent를 설치해보자.
2-1) Pinpoint Web 화면에서 다운받기
1번 과정에서 한 대로
웹 화면에서 Configuration - Installation에 들어가
다운로드 링크를 받아준다.
이때 저 링크는 서버에 깔린 핀포인트의 버전과 맞아야 한다.
2-2) Spring Boot 어플리케이션에 따로 설정하기
위 사진과 같이 다운받은 파일의 압축을 풀고
프로젝트 내로 끌고와준다.
이후 pinpoint-root.config
와
profiles/release 안의 pinpoint.config
에서 설정을 바꾸어 줄 것인데
profiler.transport.grpc.collector.ip
를
우리 어플리케이션 서버의 IP로 바꾸어 주어야 한다.
만약 로컬에서만 핀포인트를 사용한다면
pinpoint.profiler.profiles.active
를
local
로 바꾸어 주자.
2-3) Dockerfile에 Pinpoint 관련 명령어 추가
현재 프로젝트 세팅이
프록시 서버의 Jenkins를 제외하면
프록시, 어플리케이션 서버의 어플리케이션을
도커 컨테이너 이미지로 실행하고 있다 보니,
Naver Cloud의 Container Registry에 저장될 컨테이너 이미지에도
우리가 넣어준 pinpoint 설정 디렉토리가 말려 들어가야 했다.
따라서 Dockerfile에 다음과 같은 명령어를 추가했다.
RUN mkdir /pinpoint
COPY ${JAR_FILE} /
COPY pinpoint/ /pinpoint/
2-4) VMOption에 Pinpoint 관련 옵션 추가
위 과정에서 Docker 컨테이너 이미지로 pinpoint 디렉토리를 같이 말아올렸다면,
우리 프로젝트 jar 파일 말고도 pinpoint jar 파일도 실행시켜야 한다.
실제 폴더에서 보면 pinpoint-bootstrap-2.5.2.jar 파일이 존재하고,
이 jar 파일을 실행시킬 것이다.
물론 서버 내에서는 Dockerfile에 VMOption을 지정해주자.
applicationName과 agentId 같은 경우는 아래 사진에서처럼
Application Name과 Agent ID를 Check해보고
그에 따라 작성해주면 문제없다.
만약 분산처리를 해야 한다면 Agent ID를 각각 다르게 정해야 할 것이다.
3) 시연 영상과 마무리
팀장님의 도움을 받아 Pinpoint 작업을 하면서
들어보기만 했던 APM 툴을 직접 사용해보고
(성능 리포트를 보고 성능 개선은 못해보았지만)
항상 말로만 들었던 성능 체크 / 성능 개선에 대해 조금이나마 체험해 볼 수 있었다.
뿐만 아니라,
Pinpoint 설치를 해보며 인프라에 대해 더 깊게 생각해 볼 수 있었으며
Docker를 이용한 어플리케이션의 실행에 대한 이해도 깊어졌다.
여러모로 많은 성장을 할 수 있는 기회가 아니었나... 싶다!
'🎉 프로젝트 > 🍀 Naver Cloud' 카테고리의 다른 글
[NCP] 어플리케이션 로그 쉽게 수집하기 with Effective Log Search & Analytics (2) | 2024.01.31 |
---|---|
[NCP] public area - private area 간의 통신 가능하게 하기 with NAT Gateway (1) | 2024.01.30 |
[NCP] 무중단 배포 환경 구축하기 with Jenkins (0) | 2024.01.15 |
[NCP] Oriental Unity 프로젝트 (0) | 2024.01.15 |
[NCP] Multipart 파일 업로드 with Object Storage (2) | 2023.10.02 |