최근 롤링배포에서의 순단현상을 해결하며 배포시간이 많이 증가하게 되었다.

배포시간이 길어진다면 빠른 배포에 불리하기 때문에 빌드 및 배포시간을 최적화하는 과정을 추가하려 한다.
젠킨스의 로그파일을 확인해 보았다.

위의 방식을 분석해본 결과 아래와 같은 개선할 수 있는 문제를 확인하였다.
1,2번은 Dockerfile의 최적화를 통해 해결을 할수 있으며 3번은 매니저노드를 arm서버인 인터널 서버로 변경하여 해결을 할 수 있으며, 4번은 ssh배포를 한 서버씩 처리하는 것이 아닌 일괄 배포를 통해 처리를 하는 방식을 고려해 보았다.

#!/bin/bash
# 서버 목록
servers=(
"젠킨스 유저명@서버주소"
"젠킨스 유저명@서버주소"
"젠킨스 유저명@서버주소"
...
)
# SSH 키 파일 경로
identity_file="ssh키 경로"
# 원격 스크립트 경로
remote_script="/usr/local/koin_api_stage/deploy.sh"
# SSH 연결에 사용할 포트
ssh_port="22222"
# 병렬 실행을 위해 백그라운드로 실행
for server in "${servers[@]}"; do
echo "Deploying to $server..."
ssh -i "$identity_file" -p "$ssh_port" "$server" "sudo sh $remote_script" &
sleep 5
done
# 모든 백그라운드 작업이 끝날 때까지 대기
wait
echo "Deployment to all servers completed."
이전까지는 코인의 배포가 젠킨스의 ssh push over방식으로 한개의 서버씩 진행이 되고 있었다.
당장은 3개의 서버에 한개씩 이미지를 pull당겨와서 속도가 크게 차이가 안나지만, 만약 서버의 개수가 늘어난다면 Ansible같은 툴을 활용해서 일괄 배포를 진행하면 되겠지만 현재는 그럴수 없는 상황이기에 빌드서버에 스크립트를 작성하여 이미지를 병렬로 받아와 속도를 감축하였다.

새로운 버전을 배포하는데, 적용이 된 노드가 있고 안된 노드가 발생하는 것이었다.

맙소사... 확인해보니 위의 마지막에 정렬시켰던 노드에 이미지가 적용이 안되는 경우가 계속 생겼던 것이다.

위의 노드가 정상적으로 배포가 된 모습이다.
따라서 위의 스크립트에서 sleep시간을 주어 리스트 마지막에 있는 서버에도 이미지 업데이트 요청이 갈수 있도록 수정을 하였다.

위와 같이 빌드 및 배포시간을 5분대로 감축할 수 있게 되었다. 구조적으로 monolithic구조이기 때문에 JAR파일이 무거워 배포속도를 더 감축하기는 문제가 있지만 MSA로 가기에는 ROI가 많이 들것 같아 당장은 monolithic으로 가는게 좋을 것 같다.