"한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다."
(책에 대한 이야기는 맨 마지막 문단에 쓰여져있다. 앞쪽 내용은 개인적인 배경이므로 넘겨도 무방하다.)
나는 작은 연구실 규모의 간단한 계산 서버, 스토리지 및 네트워크를 구성하고 관리하고 있다. 내 생각에 작은 규모의 계산 서버는 것은 일반적인 의미에 서버라고 부르기에는 관리가 거의 별로 필요 없으며, 불특정 다수에게 실시간으로 서비스를 하는 것이 아니기 때문에 24시간 모니터링 할 필요도 없다. 서버를 사용하는 사람들은 같은 팀 사람들이며, 그 작업의 종류도 대부분의 경우 중간에 중단이 되어도 큰 지장이 없는 것들이라서 관리 및 버전 업데이트 등도 크게 어렵지 않다. 사용할 수 있는 예산의 금액 및 사용처도 매우 한정되어 있기 때문에 사실상 서버 관리를 제대로 하기에는 거의 불가능한 상황이다. 무엇보다 나를 포함한 다른 친구들은 서버를 전담하는 인력이 아니라서 대부분의 구성 및 장애 처리는 주먹구구식으로 이뤄져 왔다. 물론 그래도 되는 용도이기 때문에 (연구용 과학 계산) 지금까지 큰 문제는 없었다.
아주 작은 규모지만 하드웨어-네트워크-소프트웨어 및 사용자 활용 방식까지 모두 설계를 해오면서 자연스럽게 자동화를 통한 효율적인 운영 방식을 고민하기 시작했다. 현재는 외부로 제공하는 웹이나 앱 기반 서비스가 없기 때문에 계산 서버 및 스토리지만을 예시로 들자면 다음과 같다.
- 어떻게 해야 새로운 cpu 혹은 gpu 계산 서버를 추가했을 때 별다른 설정 없이 현재 체계를 유지하면서 사용이 가능할지?
- 여러 서버를 하나의 cluster로 묶은 뒤에 master 및 slave node로 구성하여 message passing을 통한 병렬화를 하는 것이 좋을지, 아니면 개별 node를 동일한 계층에 두고 각각을 독립적으로 하는 것이 좋을지?
- GPU 연산의 경우 단일 작업의 병렬화를 하는 것이 좋을지 개별 task의 병렬화를 하는 것이 좋을지?
- 스토리지의 경우 작게 보면 개별 프로젝트 규모로 최대한 분할해야 할지, 아니면 큰 규모의 단일 볼륨을 구성하는 것이 좋을지? 큰 단일 규모를 설정한다면 lustre 방식이 필요할텐데, 내가 떠나면 이를 관리할 수 있는 사람이 있을지? 작은 스토리지를 여럿 만들면 리스크 분산은 되겠지만 관리해야 하는 하드웨어 수 자체가 너무 증가하는 것은 아닌지?
- 현재 수준만 고려하지 말고 추후에 n배 이상 scale-up을 하기 위해서 처음부터 어떤 구성을 하는 것이 좋을지?
위의 질문들에 대한 정답은 역시 진리의 case-by-case이다. 개인적으로 내린 결론은 손이 많이 가더라도 하나의 거대 서버 및 스토리지에 의존하는 것보다 여러 개의 작은 서버 및 스토리지를 활용하는 것이 리스크 관리 차원에서 훨씬 안정적이라고 판단해서 목적에 따라 용도를 나누는 방식으로 운영해왔다.
최근 몇년동안 인프라 관리 차원에서 크게 주목을 받은 키워드 중 하나는 바로 Docker가 아닐까 생각한다. 기존 가상화에 비해 훨씬 적은 리소스를 사용하며 효율적으로 환경을 배포할 수 있기 때문에, 시스템 관리와 연관이 있는 사람이라면 Docker는 기본적으로 익혀야 할 스킬이 되었다. 대학원 연구실 규모에서는 굳이 Docker를 사용할 일이 거의 없었지만, 나의 경우 개인적으로 2017년부터 Docker에 관심을 가져오긴 했었다. Docker를 통해서 효율적으로 서버 종류에 관계 없이 원하는 환경을 쉽게 구축할 수 있다는 사실이 매력적으로 느껴졌다. 대학원을 졸업하고 본격적으로 나만의 시스템을 구축해야 할 때는 단일 연구실 규모보다 훨씬 큰 스토리지, 계산 서버, 웹서버, API 구축 등을 고려해야 한다. 처음에는 매우 작은 단일 서버로 시작하더라도 추후의 scale-up이나 클라우드 사용을 고려해야 하며, 이를 위해서는 최대한 효율적인 서버 관리 방법을 필요로 한다. 그런 고민을 하던 중 접하게 된 책이 바로 Infrastructure as Code이다. 자동화 할 수 있다는 것의 다른 의미는 바로 코드를 활용할 수 있냐는 의미기 때문이다.
이 책은 따라하며 익힐 수 있는 실습 예제를 제공하지 않는다. 그렇다고 완전히 예제가 없는 것은 아니다. 개념을 나타내는 간단한 pseudo code정도는 제공하지만, 특정 플랫폼이나 서비스를 기반으로 실제 예제를 제공하지는 않는다. 그 이유는 인프라 구축 및 관리라는 것이 워낙 포괄적인 개념이고 각자 환경에 따라 사용하는 도구가 너무나 다양하기 때문이다. 하지만 인프라 및 관리를 하는 독자들에게는 실습보다는 거시적인 방향성을 제시하는 편이 더욱 도움이 될 것이라고 생각한다. 이 책의 큰 구성은 아래와 같다.
- PART 1 기초
- CHAPTER 1 코드형 인프라란?
- CHAPTER 2 클라우드 시대 인프라의 원칙
- CHAPTER 3 인프라 플랫폼
- CHAPTER 4 핵심 실행 방법 1: 모든 것을 코드로 정의한다
- PART 2 인프라 스택으로 작업하기
- CHAPTER 5 코드로 인프라 스택 구축하기
- CHAPTER 6 스택으로 환경 구축하기
- CHAPTER 7 스택 인스턴스 구성하기
- CHAPTER 8 핵심 실행 방법 2: 코드를 지속적으로 테스트하고 딜리버리한다
- CHAPTER 9 인프라 스택 테스트하기
- PART 3 서버와 여러 애플리케이션 런타임 플랫폼으로 작업하기
- CHAPTER 10 애플리케이션 런타임
- CHAPTER 11 코드형 서버 구축
- CHAPTER 12 서버 변경 관리
- CHAPTER 13 코드형 서버 이미지
- CHAPTER 14 코드형 클러스터 구축
- PART 4 인프라 설계
- CHAPTER 15 핵심 실행 방법 2: 시스템을 작고 간단하게 빌드한다
- CHAPTER 16 컴포넌트에서 스택 빌드하기
- CHAPTER 17 스택을 컴포넌트로 사용하기
- PART 5 인프라 딜리버리
- CHAPTER 18 인프라 코드 구조화하기
- CHAPTER 19 인프라 코드 딜리버리하기
- CHAPTER 20 팀 워크플로
- CHAPTER 21 안전한 인프라 변경
나는 데이터 엔지니어링이나 웹서비스에 대해서 접할 기회가 없었기 때문에 이 책의 내용들이 매우 피상적으로 다가왔다. 하지만 그동안 관심은 많이 있었기 때문에 전문적인 지식이 없더라고 책을 읽는데 큰 어려움은 없었다. 비전문가의 입장에서 특히 인상깊었던 장을 3개 꼽아보자면 아래와 같다.
- Chapter 2, 클라우드 시대 인프라의 원칙: 이 장에서는 5가지 원칙을 제시했는데, 내가 미래에 구축해야 하는 인프라에 대한 고려 사항을 잘 정리해 주었다. (1) 시스템을 신뢰할 수 없다고 가정한다. (2) 모든 것은 재생산 가능하다. (3) 사라질 수 있는 것으로 만든다. (4) 다양성을 최소화한다. (5) 어떤 프로세스라도 반복 가능한지 확인한다.
- Chapter 15, 시스템을 작고 간단하게 만든다: 이 장에서는 인프라 차원에서도 모듈화를 하는 것이 중요하다는 개념을 익혔다. 모듈화의 경우 프로젝트 레벨에서의 코드에만 해당하는 것이 아니라 서버, 나아가 인프라에 대해서도 적용할 수 있는 개념이라는 것이 신선했다. 이러한 발상은 backend 개발자라면 아마 기본 중에 기본으로 생각했을지 모르지만, 개발자가 아닌 나의 경우에는 매우 신선하면서도 곧바로 수긍이 되는 것이었다. 아마 대부분은 가상화 서버를 통해서 모듈화가 잘 되어있을 것으로 생각한다. 아직은 사용할 일이 없는 가상화에 대해서도 졸업 후에는 본격적으로 익혀야겠다는 생각이 들었다.
- Chapter 20, 팀 워크플로: 인프라를 만드는 것도 사람이고, 사용하는 것도 사람이다. 누가 만들고 누가 쓸지에 대해서 고민하는 것은 근본적인 요소이며, 조금 과장을 하자면 팀의 정체성 및 철학과도 괸련이 있다고 생각한다. 사용자, 설계자, 개발자, 테스터, 서포터 등등 여러 역할을 맡은 사람들이 유기적으로 활동하게끔 잘 조율하는 것도 중요하다. 중앙 서버 및 개인 인스턴스 등 구조적인 설계도 함께 해야할 것이며, 소스 코드의 branch 관리도 매우 중요하다. 이 장에서는 이에 대한 내용을 간단하게 정리하였다.
정리하자면 이 책을 통해서 실질적으로 특정 인프라를 구축할 수는 없다. 아무런 예제가 없기 때문에 실질적인 구축 방법은 각자 환경에 맞게 찾아야 할 것이다. 사실 인프라라고 하는 개념은 매우 광범위하기 때문에, 이를 예제로 보여주는 것도 여간 쉬운 일은 아닐 것이다. 대신 이 책에서는 인프라 구축 및 관리를 위해서 기본적으로 익혀야 하는 개념 및 고민에 대해서 제시한다. 책을 읽으며 ‘우리 서비스에는 어떤 방식이 적합할까?’ 하는 자문을 하다보면 스스로 얻는 것이 있을 것이다. 분량은 400페이지가 약간 넘으나, 쓱쓱 넘기며 읽다보면 약 2시간정도면 충분히 읽을 수 있다. 구체적인 내용을 담지 않기 때문에 한편으로는 너무 포괄적이고 당연한 이야기를 한다고 생각이 들 때도 있었다. 이것은 내가 비전문가이기 때문이라고 생각하고, 전문가가 읽는다면 내가 놓친 부분들까지 잘 파악할 수 있을 것이다. 인프라 구축 및 관리에 있는 사람들이라면 누구든지 읽어보길 추천한다.