팀 피클에서는 인공지능을 사용한 서비스를 계획하고 있어요. 많은 관심 부탁드립니다~!

그동안 팀 피클에서는 자체 서버와 무료 클라우드들을 사용해서 디스코드 봇을 가동하고 있어요.

이렇게 하게되니 여러가지 문제가 있었어요.

첫째로 업데이트가 있을 때마다 봇을 중단시켜야 하는것이죠.

마피아 게임 for Pickle 업데이트 공지
마피아 게임 for Pickle 업데이트 완료 공지

게임 봇이라는 특성상 업데이트 공지를 써야하는 것은 맞지만, 업데이트 시간이 연장 되는 등 사소한 이슈가 발생하고 있어요.

또한 유저가 적은 심야시간대에 업데이트를 해야 해서 작업자는 그때까지 깨어 있어야 하는 고통이… (저희 팀원 중에 낮밤이 바뀌신 분이 있어서 부탁드리고 있긴 하지만, 언제까지 그렇게 우리의 밤을 불태울 순 없죠)

그리고 서비스를 북미 지역등, 시간대가 반대인 곳까지 확장을 하게 된다면 유저 수가 적은 시간대를 찾기 어렵다는 단점이 있기도 해요.

그래서 “무중단 배포"를 언젠가는 고려해야 했어요.

무중단 배포

보통 웹서비스에서 자주 만달 수 있는 키워드에요.

웹서비스의 버전이 두개 (v1, v2) 있다고 가정을 해볼게요.

일반적인 배포 방식을 사용하면 서비스에 접근할 수 없는 downtime이 생기게 돼요

-cccllliiieeennntttvd-1owvnv1t2im2e

이러한 장애를 방지하기 위해서 DevOps 엔지니어들은 크게 세가지 방법을 고안했답니다.

  1. rolling
  2. blue-green
  3. canary

기본적으로 여러대의 서버에 로드 밸런서1를 사용해서 트래픽을 분산하는 형태여야해요.

rolling 배포

여러 서버의 버전을 하나씩 순차적으로 업데이트 하는 방식이에요. 다만 이런 식으로 구성하게 되면 한쪽에 트래픽이 쏠리게 되는 문제가 발생해요.

-rclololialedinntbgalance(r1)vv11v1

이렇게 세개의 서버와 로드밸런서가 있다고 가정해볼게요.

이때 v2버전으로 업그레이드가 필요하게 됐어요. 먼저 하나의 서버를 업그레이드 해볼게요.

그전에 업데이트 할 서버의 연결을 끊어줄게요. 로드밸런서의 설정을 바꿔주면 트래픽이 특정 서버로 가지 않게 할 수 있겠죠? 그렇게 하지 않더라도 먼저 업데이트를 수행하게 되면 그 서버는 트래픽을 처리할 수 없는 상태(unhealthy)가 돼요. 그렇게 하면 로드밸런서가 알아서 다른 서버로 요청을 보내게 될거에요.

-rclololialedinntbgalance(r2)vv11v1

그리고 연결을 끊은 서버를 업데이트 해줍니다.

-rclololialedinntbgalance(r3)v1v12v1

그리고 업데이트가 됐으면 업데이트 된 서버에 다시 연결하고 나머지 서버들에서 연결을 다 끊어볼게요.

이렇게 되면 사용자 입장에서는 업데이트 된 서비스를 만날 수 있어요.

-rclololialedinntbgalance(r4)vv21v1

그리고 남은 서버들도 v2로 업그레이드를 진행할게요

-rclololialedinntbgalance(r5)v1v22v12

업데이트가 다 되었으면 다시 연결해주면 돼요.

-rclololialedinntbgalance(r6)vv22v2

그럼 이제 모든 트래픽이 버전이 v2인 서비스와 연결이 되는거에요.

하지만 이 방식을 사용하면 하나의 서버가 트래픽을 세배 부담해야 되는 경우가 생겨요. 두번째 업데이트 때 다른 서버는 다 업데이트 중이고 혼자서 트래픽을 부담하는 상태가 돼요.

대신에 서버 개수를 두배로 늘리면 해결이 가능한데 그것이 바로 blue-green 배포에요.

blue-green 배포

서버 수를 두배로 늘려서 원래 서버에는 v1 트래픽이 향하게 하고, 남은 서버에 v2로 업데이트를 진행해요. 그리고 나서 로드 밸런서가 v2서버를 향하게 하는 방식이에요. 클라우드에서 쉽게 볼 수 있는 방식일 것 같아요.

-bclllouiaeed-ngtbraeleanncer(1)vv11v1

이런식으로 서버가 구성이 되어있을 때, v2버전의 서버를 준비해요.

-bclllouiaeed-ngtbraeleanncer(2)vvvv1122vv12

이렇게 준비가 되면 v1으로 가는 트래픽을 v2로 바꿔줘요.

-bclllouiaeed-ngtbraeleanncer(3)vvvv1122vv12

이렇게 하게 되면 만약에 v2버전에 장애가 발생했을 때 비교적 빠른 복구가 가능해요. (온프레미스 환경인 경우 v1버전은 업데이트 하지 않고 그대로 두고, 나중에 v3버전으로 바로 업그레이드 가능하답니다)

그렇지만 처음부터 장애가 있는지 없는지 확인할 수 있으면 제일 좋겠죠?

canary 배포

A/B 테스트 등에 활용을 할 수 있는 canary 배포가 있어요. 방식은 롤링 배포 방식에서 업데이트를 하고 나서 업데이트 된 서버의 트래픽을 일부 유저 또는 랜덤한 유저에게 보낼 수 있어요. 테스트 목적으로 유저의 트래픽을 업데이트 된 서버에 보내고, 어느정도 검증이 되었을 때 전체적으로 확장하는 방식이에요.

with discord bot

디스코드 봇은 단순히 웹서버를 만드는 것이 아닌데 어떻게 로드 밸런싱을 적용하고, MSA를 적용할까요? 팀 피클에서 하게 된 고민을 앞으로 풀어나갈게요.


참고

  1. 전인석 (Ahnlab CERT팀), 보안을 고려한 무중단 환경에서 개발운영조직 통합관리(DevOps), 情報保護學會誌 = KIISC review, 2015, pp.47-52

  1. 서버의 부하를 줄이기 위해서 서버를 여러대 사용하고, 각각 서버에 고르게 부하를 주기 위한 장치, 또는 기술을 뜻해요. ↩︎


CraftyDragon678's profile
CraftyDragon678
보안과 인공지능에 관심이 많은 개발자입니다.