(내용이 길어짐에 따라 두 개의 파트로 나눠서 작성하겠습니다)
첫 회사에서 경험한 환경구축 작업 했던 내용에 대해서 적어보려고 합니다. 그 당시 프로젝트 기획단계에서 몇 가지 검토가 필요했던 시점이었고 이에 따라 지속적으로 오픈소스로 이루어진 개발 환경이 재 설치되어야 하는 과정이 필요했습니다.
해당 문제를 해결하기 위해 docker와 Jenkins를 도입하기로 했었으며 그 내용을 정리하고자 작성해봅니다.
제가 진행했던 프로젝트는 오픈소스를 사용하는 데이터 플랫폼이었습니다. 총 4개의 역할(App, Monitoring, Datawarehouse, Workflow manager)을 가진 오픈소스 환경이 구축되어졌으며 아래의 이미지와 같습니다.
이 중 Datawarehouse의 역할을 맡은 Elasticsearch와 workflow manager 역할의 Airflow의 최적의 사양을 찾기 위해 지속적으로 환경을 변경해야 하는 상황이었습니다.
제가 해당 업무를 진행하던 시기에 kubernetes의 도입을 요청드렸었으나 사내 사정(관리 인력 부족, 제가 진행을 하더라도 해당 업무를 이어받을 개발자 부족)으로 인해 기각되었습니다.
따라서 부서 내에서도 사용되고 있는 Docker를 통해 구축을 간소화할 수 있도록 진행하였습니다. 또한 명령어를 통해 간단하게 배포하고 실행 시킬 수 있었다는 점이 가장 큰 이유 중 하나였습니다.
Elasticsearch(Datawarehouse) [Github Link]
Elasticsearch는 데이터를 저장하는 공간이니만큼 cluster 형태의 구축을 진행을 했어야했습니다. 총 3가지의 방식으로 docker-compose 파일을 작성하여 repository에 저장하였습니다
single node
단일 노드로 이루어진 형태로서 가장 쉽게 서비스를 배포하여 실행 할 수 있습니다
master, slave 구조의 클러스터
노드 2개로 이루어진 구성으로 각 노드의 역할을 지정하지 않고 dedicate 형태의 노드로 배포되어 운영 되어지게됩니다. 하나의 노드가 비정상 종료될 경우 다른 노드를 통해 서비스가 지속될 수 있도록 모든 index의 복제본을 각각 가지게 됩니다
RAFT 알고리즘에 기반한 노드 역할을 분담한 클러스터
정족수 기반의 마스터 노드 선출 할 수 있도록 설정되어진 클러스터 입니다. 마스터 후보 2개의 노드와 투표권을 가진 노드(data node) 3개로 구성 되어져있습니다 (master node 2개, data node 3개)
또한 docker를 사용하지 않고 VM 또는 온프레미스 환경에 배포될 상황을 고려하여 config 내용을 yaml 파일에 저장하는 것이 아닌 따로 관리하도록 구성하였습니다.
Airflow(Workflow manager) [Github Link]
Airflow는 공식홈페이지에서 제공된 docker-compose.yml 파일을 사용하여 필요한 부분을 변경하여 사용하였습니다. 변경된 내용은 아래와 같습니다.
1번 항목은 worflow를 개발하는 개발자에 의해 설치되는 패키지들을 지원하기 위함이었습니다. 사내 내부적으로 패키지 매니징을 위한 솔루션이 없었음에 따라 이미지를 새롭게 빌드하여 배포하는 형태로 변경하였습니다.(이미지 빌드과정은 이후 ‘반복되는 환경 구축 작업 젠킨스를 통해 자동화하기’ 에서 다루겠습니다)
2번 항목은 사내에서 사용할 수 있는 인프라 환경의 제한이 있어 성능이 작은 노드를 사용할 수밖에 없는 문제가 존재하였습니다. 가장 많은 리소스를 사용하게 되는 worker를 분리시킴으로써 성능 부하 문제를 분산시킬 수 있었습니다.
Kubernetes의 도입이 어려워 Docker로의 전환을 결정했던 순간과, Elasticsearch와 Airflow의 구축에 있어서의 다양한 시행착오들은 지금도 남아 있네요…Elasticsearch 배포하기 위해서 필요한 설정 값 구분하면서 체크하고 Airflow 배포할 때마다 성능 이슈가 지속적으로 발생하는 등 참 죽을 많이 썼던 것 같아요 (진짜 container 별거 아니구나 했는데 너무 많은 내용이 있어 공부만 한 세월 했습니다) 다시금 글을 쓰면서 복기할 수 있어서 참 많은 것을 배운 경험이라 생각이 듭니다.
다음 게시글은 Jenkin를 통해 자동화한 내용으로 다시 뵙겠습니다~