하나의 웹 서버를 두 대로 나누어 보기
이번 8기 BaseCamp 7주차는 서버에 관련된 내용이었다. 하나의 웹 서버를 두 대로 늘려서 서비스한다면 어떻게 될까? 에 대한 내용임과 동시에, NHN Cloud를 통해 Object Storage 기능과 Deploy 기능을 사용하도록 하는 것이 이번 주차의 목표였다.
서버가 늘어나면 좋은 점만 있는 게 아닐까?
웹 서버가 두 대로 나누어지기 때문에, 얼핏 보면 트래픽도 잘 분산되고 서버가 1개일때보다는 많을수록 좋지! 라고 생각하는 사람들이 굉장히 많을 것이다. 나도 당연히 서버가 많아지면 그만큼 서비스도 잘 되고 있다는 뜻이고,
여러가지 문제들이 생길 수가 있는데 그 중 하나는 로그인 정보 등을 공유해야 하는 것이었다. 즉 두 개의 웹서버가 각각의 세션 하나씩을 가지고 있는 게 아니라, 하나의 공유 세션을 가지게 된다.
또한 공유 스토리지가 하나 있어서, 각각의 서버에 영화 포스터왁 같은 이미지 데이터를 저장하는 게 아니라, 공유 스토리지에 저장하여 여기에서 불러오는 방식으로 구현하는 것이 좋다. A서버에만 영화 포스터가 잘 나오고 B서버에는 영화 포스터가 잘 나오지 않는다고 하면 이상하지 않은가?
따라서 서버가 늘어날 수록 물론 성능은 좋아지겠지만, 서버가 1대에서 2대로 늘어났다고 해서 정확히 효율이 2배 증가하지는 않는다. 다만, 서버 1대로는 서비스에 한계가 오는 시점이 분명 존재할 수 있기 때문에, 현업에서도 이러한 부분을 고려하는 것으로 보인다. 서버의 용량이 충분치 않으니 서비스를 이용하겠다는 사용자를 막을 수는 없지 않은가…!
결국 유지보수, 서버 동기화 등이 큰 난관으로 다가오리라 생각했고 이는 그대로였다.
Redis 사용해 보기
두 서버에 각각 존재하는 세션을 하나로 합치려면 어떻게 해야 할까? 에 대한 의문은 Redis를 사용하면서 해소할 수 있었다. Redis는 key와 value로 이루어진 오픈소스 기반 데이터베이스 시스템인데, 굉장히 빠르기 때문에 상황에 따라 세션, 캐시 등을 대체해서 사용할 수 있다고 한다. 다만 멘토님께서 Redis의 동시성 문제에 대해 지적해 주셨는데, Redis에서는 Single-Thread 환경에서 Context-Switching을 통해 각각의 작업들을 실행한다고 한다. 따라서 쿼리문들이 transaction의 순서에 상관없이 동시에 실행되게 보일 수 있다고 이해했다.
그래서 여러 클라이언트에게 시간의 차이는 있겠지만 같은 서비스를 제공하는데, 이 시간의 차이로 인한 문제가 존재할 수 있는 것이다. 이는 선점 기능이 올바르게 작동할 것인가에 대한 우려를 낳는다. 처음에는 spring의 @Transactional annotation으로 간단히 해결할 수 있지 않을까 생각했는데, 잘 알고 사용하지 않으면 동작이 이상하게 될 수 있다는 피드백을 받아, SETNX 명령어를 사용하여 데이터베이스에 동일한 key가 없을 경우에만 저장하는 방법을 알게 되었다.
여기까지 이해하고 다른 팀원 두 명이 Redis 관련된 부분을 구현하였고, 우선 로그인 부분에 선 적용해 보았는데 로컬에서 간신히 돌아가던 게 서버에 올렸을 때 돌아가지 않는 이슈가 있어서 이를 해결하여야 한다… 해결하면서 redis값 저장될 때 expire(만료)설정을 하는 등 전반적인 리팩토링이 절실히 필요하지 않을까 생각이 들었다.
분명 ‘개발하기’ 단계는 끝났지만 다시 ‘개발하기’ 단계를 하는 느낌이었다.
NHN Cloud
이번 주부터 NHN Cloud를 접하게 되었다. 기존에 서버 설정과 관련된 부분을 내가 담당하지 않았기 때문에 이번 NHN Cloud - Object Storage와 Deploy 설정을 내가 맡아서 진행하게 되었다. 처음 Deploy 설정을 시도할 때는 가이드에 있는 내용이 무슨 말인지 잘 모르겠고, 또 ‘app id’라고 하면 이게 어느 app id인지 몰라서 젠킨스, 우리 web project, api project, sonarqube, nhn cloud 전부 다 뒤져서 알아내야 했던 시간이었다. 주말 내내 가이드와 NHN Cloud를 붙잡고 나니 나름 익숙해져서 뿌듯했다. 버튼 하나만으로 서버에 배포할 수 있다는 사실이 굉장히 놀라웠는데 이는 쉘 스크립트를 나름 잘 다룰 수 있어서였다고 생각한다. 멋진 가이드를 해 주신 멘토분들과 팀원들에게 감사하고, 나도 이어받아서 루키오리(팀명이 루키오리이다..) 위키방에 2개의 가이드를 작성했다. 이는 계속 보완해야지 :)
부서 소개 & 빠르게 흘러가는 시간
NHN에 입사하고 난 지 벌써 두 달이나 지났다. 처음 신입 입문교육을 받았을 때가 엊그제 같은데, 벌써 기술교육의 막바지에 다다르고 있다는 사실이 너무 신기했다. 이번 주 목요일에는 하루 종일 부서 소개를 받았다. 상당히 많은 부서에 지원할 수 있었고 이를 통해 내가 어떤 것에 더 집중할지를 결정할 수가 있었다. 과연 입문교육이 끝났을 때 나는 어느 부서에서 일을 하고 있을까? 어느 부서에 지원해야 하지? 라는 고민과 함께 말이다.
4월에 부서배치를 받고 나서는 또 교육을 받고 배치를 받아 실전 업무를 수행한다고 생각하니 기대가 되고 떨리기도 한다. 항상 새로운 도전을 하는 느낌인데 회사에 있으니, 어느 위치에서든 결과를 내는 개발자가 되고자 다짐했던 시간이었다.