Monolith & MSA
edX에서 쿠버네티스 강의를 공부하면서 알게 된 내용을 정리하고 공유합니다.
MSA는 기존 Monolith Architecture에서 발생한 문제를 해결하기 위해 나온 것이기 때문에 기존 Monolith Architecture의 문제는 무엇인지, 단점은 무엇인지 아는 것이 중요하다.
Monolith
- 클라우드 환경에 적합하지 않다.
- 기능들이 퇴적물처럼 쌓여 있다.
- 중복되는 기능들이 수천줄의 코드로 표현되어 있다.
- 현대적이지 않은 하나의 언어로 구성이 되어 있다.
- 구시대의 아키텍쳐 패턴을 가지고 있다.
edX 강의에서는 위와 같은 특징을 가지는 Monolith 어플리케이션을 큰 바위와 같다고 묘사한다. 바위는 옮기기도 어렵고 내부 구성요소를 다시 배치하기도 어렵다. 이와 같이 Monolith 어플리케이션도 퇴적물처럼 기능이 계속해서 추가되어 있고 덩치가 커져 있어 관리하기도 내부 구조를 변경하기도 어렵다. 게다가 새로운 기능을 추가 했을 때 기존 코드와 얽히면서 복잡성은 급격히 올라간다.
또 하나의 어플리케이션으로서 하나의 서버에서 돌아야 하기 때문에 높은 메모리, 비싼 CPU가 필요하다. 이런 컴퓨터는 비싸기 때문에 경제적인 측면에서도 문제가 있다.
그리고 확장(Scaling)도 어려운데 병목이 생기는 내부 단일 기능에 대해 확장이 불가능하다. 확장을 하기 위해서는 어플리케이션을 여러 서버에 두고 로드밸런서를 붙여 확장해야 하는데 이 역시 비싼 서버를 여러대로 늘려야 한다는 점과 불필요한 부분까지도 확장이 되어야 한다는 점에서 최선의 방법은 아니다.
그리고 프로그램의 덩치가 커 구동 시키는데 시간이 필요하며, 단일 기능만 별도로 업데이트할 수 없기 때문에 비교적 긴 다운타임을 가져갈 수 밖에 없다.
MSA
edX 강의에서 Micro Service Architecture는 큰 바위와 같은 Monolith와 대조되며 조약돌과 같다고 한다. 큰 어플리케이션의 기능들을 각 모듈로 나누고 서로 소통이 가능하도록 하는 구조이다. 각 모듈들은 나뉘어 있지만 합쳐지면 기존 Monolith와 같은 기능을 제공한다.
MSA는 아래와 같은 장점을 가진다.
- 개별 모듈(마이크로 서비스)을 손쉽게 확장할 수 있다.
- 각 마이크로 서비스는 적은 리소스를 가진 값싼 여러 서버에 배포 될 수 있어 경제적으로 장점이 있다.
- 각 마이크로 서비스는 각자 목적에 적합한 현대화된 프로그래밍 언어로 개발될 수 있다.
- 각 기능을 개발하는 전문적인 여러팀으로 나누어 운영할 수 있다.
- 업데이트가 필요한 각 개별 마이크로 서비스만 업데이트 하면 되기 때문에 사용자 입장에서 다운타임이 거의 없다.
물론 MSA의 분산화된 특성이 아키텍쳐에 복잡성을 더하기는 하지만, 이를 뛰어넘는 장점 특히 확장성이라는 장점을 얻을 수 있다.
Monolith to MSA
어떤 기업들은 자신의 Monolith 어플리케이션을 MSA 형태로 운영해보려고 하지만 잘 동작하지 않는다고 한다.
결국에는 기존 Monolith 구조의 어플리케이션을 MSA 형태로 변화시켜 나가는 것이 필요한데 1) 빅뱅 접근 방식, 2)점진적 개선 방식이 존재한다.
빅뱅 접근 방식은 현재 사업에 영향이 있더라도 추가직인 기능 개발을 멈추고 전체 어플리케이션을 단번에 MSA로 변경하는 것이다.
점진적 개선 방식은 기존의 서비스는 그대로 두고 새롭게 추가되는 기능들에 대해 MSA 구조를 가져가도록 하는 방법이다. 새로 추가되는 기능들(마이크로 서비스)은 기존 Monolith 어플리케이션과 API로 상호작용 하게 된다. 그리고 추가적으로 기존에 있던 Monolith 어플리케이션도 점진적으로 하나의 기능씩 MSA 형태로 변경해 나간다.
MSA로 전환하기 위한 접근 방식을 고른 후에는
- 어떤 비지니스 컴포넌트를 떼어내어 마이크로 서비스로 바꿀 것인가
- 어떻게 데이터 복잡성을 어플리케이션 로직으로부터 분리하기 위해 DB를 어플리케이션으로부터 분리할 것인가
- 어떻게 새로운 마이크로 서비스를 테스트할 것인가
- 어떻게 새로운 마이크로 서비스들을 모니터링 할 것인가
- 어떤 방식으로(어떤 서버에) 배포할 할 것인가
- 단일 서버에서 모든 컨테이너를 돌리거나 하나의 서버에 하나의 컨테이너만 돌리는 것은 좋지 못하다
와 같은 도전과제가 있으며 이외에도 수많은 의사결정 사항을 직면하게 된다.
이 과정을 통해 기존 Monolith 어플리케이션은 새로운 프로그래밍 언어를 사용하고 현대 아키텍쳐 패턴을 사용하면서 클라우드 네이티브 어플리케이션으로 변화된다.
그러나 모든 Monolith 어플리케이션이 MSA로 변화될 수 있는 것은 아니라는 점을 알아야 한다. 예로 코볼이나 어셈블리로 쓰여진 어플리케이션이 있거나 DB와 비지니스 로직이 강하게 결합되어 있는 어플리케이션들은 MSA로 변환하기에 적합하지 않을 확률이 크다.