Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
<야생의 땅: 듀랑고> 지형 관리 완전 자동화
생생한 AWS와 Docker 체험기
넥슨코리아
변수민
발표자 소개
<야생의 땅: 듀랑고> 서버 프로그래머 @넥슨코리아
Computer Science, MS @University of Arizona
Computer Science, BS @University of Arizon...
듀랑고 서버 개발자는 무슨 일을 할까요?
지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런
스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터
검색,...
듀랑고 서버 개발자는 무슨 일을 할까요?
지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런
스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터
검색,...
듀랑고 지형 통계
• 2차 LBT 참여자 수 = 6,937명
• 테스트 기간동안 발견된 섬의 수 = 836개
• 인구가 가장 많은 섬 = 플레밍 우랄맥 (504명)
지형 자동 생성
• 이번에 준비한 지형 개수 = 약 300개
• 지형을 수작업으로 만드는 것이 아니라 자동으로 생성하기 때문에 가능한 일
섬? 지형?
지형
+ =
지질, 온도, 습도,
호수, 강, 바다,
식물 배치
섬
세부 사항

(섬 생성시 자동 결정)
섬? 지형?
지형
+ =
지질, 온도, 습도,
호수, 강, 바다,
식물 배치
섬
세부 사항

(섬 생성시 자동 결정)
문제점: 지형 관리 병목
• (지형 스냅샷 작업중…)
• “수민님, 지형 배포 해주세요”
문제점: 지형 관리 병목
• (장터 검색 기능 작업중…)
• “수민님, 무슨무슨 섬에 생태계 시뮬레이션 돌려주세요”
그러다보니 다른 작업에 집중하기 어려움
해결책: 자동화를 하자
• 도전 과제는 크게 두 가지
• 지형 배포 - 지형 배포 자동화
• 자연물 관리 - 자연 상태 파악, 생태계 시뮬레이션 자동화
오늘 이야기 할 내용들
• <야생의 땅: 듀랑고>의 지형 제작과 배포, 생태계 시뮬레이션
• 지형 관리 자동화 과정에서 겪었던 문제들을 아마존 웹 서비스(AWS)와
Docker를 이용해서 해결한 이야기
지형 제작과 배포 과정
<야생의 땅: 듀랑고>의 지형은 어떻게 만들어질까?
지형 제작 & 배포 개요
• 전용 도구로 지형 파일들을 제작
• 여러가지 후처리를 거친 후
• 지형 파일을 Git 저장소에 올리고
• 서버 코드에서 해당 커밋을 참조하도록 변경
지형 제작 & 배포 도구
• WorldGen: 지형 파일 제작, C#으로 작성됨
• 지형 관리 도구: 지형 배포 및 관리에 필요한 기능을 제공, Python으로 작성됨
지형 관리 도구를 따로 만든 이유는
• 서버 코드가 파이썬으로 작성 되어있고
• 지형을 배포할 때 서버 코드를 그대로 이용하는 부분이 있기 때문
• 월드젠은 서버 코드와는 별개로 지형 파일만 제작
지형 배포 절차
지형 제작 도구 ‘월드젠’을 이용하여 지형을 제작
지형 배포 절차
청크별 빠른 색인을 위해 여러가지 지형 정보들을 청크별로 나눔
좌표 시스템
• cm 단위의 좌표: 동물의 위치 등 섬세한 위치 조정에 사용
• 타일(tile): 가로 세로 2m의 정사각형 ➔ 자연물, 건축물 등의 최소 단위
• 청크(chunk): 16x16 타일 ➔ pub-sub ...
청크별로 나누는 이유?
(x, y)
(x-1, y)
(x+1, y)
(x+1, y+1)
(x-1, y-1)
(x+1, y-1)
(x, y-1)
(x, y+1)
(x-1, y+1)
{
군계 정보
강, 바다, 호수 정보
자...
자연물?
자연물 = 식물, 광물, 기타 채집 가능한 것
지형 배포 절차
자동화된 검수 과정을 거침
assert x == y
assert z == w
assert essential_files_exist()
assert terrain_contains_this_and_that()...
지형 배포 절차
• 지형 색인 파일 업데이트
• 지형 파일들을 지형 파일 저장소(Git)에 커밋 & 푸시
지형 배포 절차
Git 서브모듈 업데이트
• (서버 코드 저장소)
• README
• setup.py
• lib
• k1terrains.git
• tests
• (지형 파일 저장소)
• README
• terrains
...
지형 파일 관리에 Git을 쓰는 이유?
버전 1
지형 1
서버 저장소
지형 저장소 지형 2 지형 3
버전 1
지형 1
서버 저장소
지형 저장소 지형 2 지형 3
버전 2
지형 4
서버 코드와 함께 버전 관리를 하기 위함...
지형 파일 관리에 Git을 쓰는 이유?
• 입사 전에 이미 만들어진 시스템이라 지형 파일을 Git으로 관리하는 것에 대한
별다른 의문을 가지지 않았지만
• 의문을 가져야 했었다
지형 배포 절차
• 복잡해보이지만 대부분 스크립트로 만들어 놓음
• 하지만 프로그래머가 아닌 사람이 보기엔 여전히 장벽이 높음

이 부분에 대한 고민도 했어야…
생태계 시뮬레이션
나무를 심자
그림 © 강임성, 2015
플레이어들은 항상 무언가를 채집
벌목당한 숲울창한 나무 숲
훼손 상태를 파악
섬의 최초 상태와 비교하여 부족한 자연물의 종류와 수량을 파악
자연물 보충
훼손 상태가 임계점을 넘을 경우 필요한 자연물 종류와 개수를 생태계 시뮬레이터에 전달
지형 관리 도구 Ecosystem Simulator
산딸기 5
깃털나무 13
멀구슬나무 4
백단향 3
Manifest
자연물 보충
지형 관리 도구 Ecosystem Simulator
산딸기 5
깃털나무 13
멀구슬나무 4
백단향 3
산딸기 (132, 39), (133, 38), …
깃털나무 (88, 255), …
멀구슬나무 (187, ...
생태계 시뮬레이션
Frontend node 1
Frontend node 2
Frontend node n
서버 클러스터
…
Ecosystem Simulator
지형 관리 도구
로컬 머신
데이터베이스
지형 관리 자동화 요구조건
• 고성능 계산 능력이 필요
• 플레이어의 행동에 따라 실행 주기, 작업 규모가 달라질 수 있음
• 여러대의 머신에서 동시에 실행될 수 있고
• 자유로운 스케일 아웃(scale-out)
지형 관리 시스템에 필요한 것들
Ubuntu Linux
.NET runtime (mono)
Python runtime
Python package 1
Python package 2
Python package n
…
Lib...
지형 관리 도구 배포
지형 관리 도구 + 필요한 것들
머신 1 머신 2 머신 3 머신 n…
지형 관리 도구 배포
배포 스크립트 복잡도
배
포
할
머
신
의
수
실패할확률
배포가 쉬워야 함
• 일회용 컴퓨팅 인스턴스, 탄력적 스케일링
• 여러대의 머신에 배포
• 쉽고 신뢰성 있는 배포 방식이 필요
그렇다면 Docker를 써보자
Got Docker?
Docker의 세계에 빠져보자
Docker?
• 소프트웨어가 구동되는데 필요한 모든 것 - 코드, 런타임 환경, 시스템 도구,
라이브러리 등 - 을 담고 있는 컨테이너를 제공
• 소프트웨어 배포에 관련된 여러가지 문제를 해결
전통적인 소프트웨어 배포 방식의 문제점
• 배포 환경마다 커널 버전, 설치된 라이브러리 등 런타임 환경이 상이함
• 개발자들의 전통적인 변명 “It works on my machine!”
문제는 표준 규격의 부재
• 소프트웨어 배포 방식의 표준이라고 할만한 것이 없음

배포 스크립트, 가상 머신 이미지, Chef/Puppet, 인스톨러
• 우리가 작성하는 프로그램이 수많은 외부 환경에 의존적인 것도 문제...
컨테이너
물류 업계는 ‘컨테이너’라는 통일된 규격을 만들
어서 물건의 종류에 상관 없이 전세계 어디로든
배송 가능하도록 문제를 해결했는데 우리는 왜 그
렇게 하지 못할까
그래서 고안된 것이 바로 Docker
• 컨테이너 안에만 들어가면 옥수수든 아이폰이든 물건의 종류의 상관 없이 원하
는 목적지까지 보낼 수 있다
• Docker 컨테이너로 패키징 된 소프트웨어는 Docker 실행 환경이...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구...
Docker가 해결해줄 수 있는 문제
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기...
가상머신으로도 그런 문제를 해결할 수 있지 않나요?
• 격리: 하나의 호스트 OS에서 여러개의 게스트 OS를 실행하더라도 개별 게스
트 OS 안에서 보기엔 독립된 머신처럼 보임
• 자급자족성: 코드가 실행되는데 필요한 ...
Docker의 장점
• 격리: 하나의 호스트에서 여러개의 Docker 컨테이너를 실행하더라도 개별 컨
테이너 안에서 보기엔 독립된 머신처럼 보임
• 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수...
Docker의 장점
Virtual Machines Docker Containers
Images excerpted from https://www.docker.com/what-docker
이렇게 각 게스트 OS를 실행하기 ...
Docker의 장점
• 같은 성능의 호스트 머신이라도 더 많은 컨테이너를 띄울 수 있음
• 실제로 테스트 기간동안 하나의 머신에 수십개의 컨테이너를 띄우기도 했음
Docker의 비밀
• 가상머신 없이 컨테이너마다 다른 환경을 갖출 수 있다니, 어떻게?
• 그 비밀은 바로 chroot
chroot
• chroot = change root directory
• Chroot is an operation that changes the apparent root directory for
the current ...
chroot
/
/bin
/boot
/dev
/etc
/home
/lib
…
일반적인 리눅스 디렉토리 구조
chroot
임의의 디렉토리 안쪽에

리눅스 시스템을 구성하는 파일들을 넣고
/
/bin
/boot
/dev
/etc
/home
/home/anotherworld
/bin
/boot
/dev
/etc
…
chroot
/
/bin
/boot
/dev
/etc
/home
/home/anotherworld
/bin
/boot
/dev
/etc
…
chroot /home/anotherworld 명령어를 실행하면 - 레드썬!

...
chroot
chroot /home/anotherworld /home/anotherworld/bin/bash
chroot
chroot /home/anotherworld /home/anotherworld/bin/bash
새로운 루트 디렉토리
chroot
chroot /home/anotherworld /home/anotherworld/bin/bash
새로운 루트 디렉토리
루트 디렉토리가 변경될 때

실행될 명령어

(생략 하면 현재 쉘)
Docker 프로세스 안의 또 다른 세상
786 ? Ssl 1:12 /usr/bin/docker -d
1534 ? Ss 0:00 _ /bin/bash /entrypoint
1601 ? Sl 1:19 | _ /opt/co...
Docker 프로세스 안의 또 다른 세상
786 ? Ssl 1:12 /usr/bin/docker -d
1534 ? Ss 0:00 _ /bin/bash /entrypoint
1601 ? Sl 1:19 | _ /opt/co...
진짜 천재같은 발상이다
그럼 Docker 컨테이너는 어떻게 만드나요?
Dockerfile
• Docker 이미지를 빌드하는 절차를 명시한 파일
• 명령어 하나당 레이어 하나
• 레이어를 쌓아 올리는 방식 - 재사용성
• 재현성 보장 (guaranteed repeatability)
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Dockerfile 예제
FROM ubuntu:14.04
MAINTAINER Sumin Byeon <suminb@nexon.co.kr>
ENV SOME_FLAG=1
RUN apt-get update && apt-get ...
Building a Docker Image
Building a Docker Image
• docker build /opt/docker-image
Dockerfile이 있는 디렉토리
Building a Docker Image
• docker build /opt/docker-image
• docker build -t ${저장소 주소}/k1eco-complete .
Dockerfile이 있는 디렉토리
...
Docker Image
28b3321d1682 124.3 MB
7e0641b95986 294.7 KB
e16121a2089f 7.831 KB
876fc4769c5a 1,894 KB
k1eco-complete:latest...
Docker Image
28b3321d1682 124.3 MB
7e0641b95986 294.7 KB
e16121a2089f 7.831 KB
876fc4769c5a 1,894 KB
k1eco-complete:latest...
Running a Docker Image
• docker run postgres
• docker run postgres:9.4
• docker run -d postgres
• docker run -d -p 5432:54...
Running a Docker Image
• docker run postgres
• docker run postgres:9.4
• docker run -d postgres
• docker run -d -p 5432:54...
Running a Docker Image
• docker run postgres
• docker run postgres:9.4
• docker run -d postgres
• docker run -d -p 5432:54...
Running a Docker Image
• docker run postgres
• docker run postgres:9.4
• docker run -d postgres
• docker run -d -p 5432:54...
Running a Docker Image
• docker run postgres
• docker run postgres:9.4
• docker run -d postgres
• docker run -d -p 5432:54...
Running a Docker Image
• docker run postgres
• docker run postgres:9.4
• docker run -d postgres
• docker run -d -p 5432:54...
Docker Container
f028ae8823c8 2.432 KB
e16121a2089f 7.831 KB
876fc4769c5a 1,894 KB
k1eco-complete:latest
…
577f02323aaf 1....
Docker Container
f028ae8823c8 2.432 KB
e16121a2089f 7.831 KB
876fc4769c5a 1,894 KB
k1eco-complete:latest
…
577f02323aaf 1....
Docker Container
f028ae8823c8 2.432 KB
e16121a2089f 7.831 KB
876fc4769c5a 1,894 KB
k1eco-complete:latest
…
577f02323aaf 1....
Docker Container
> Containers that write a lot of data will consume more space than
containers that do not. This is becaus...
Storage Drivers
Docker는 다양항 종류의 스토리지 드라이버를 제공
잘 모르겠으면 그냥 기본값으로 되어있는걸 쓰자
Content Addressability
876fc4769c5a 1,894 KB
File contents
Cryptographic hash function
Content Addressability
8b9022a8dfe4 696.9 KB
876fc4769c5a 1,894 KB
27f381189a32 87.49 KB
1a86c4c9077a 353.1 KB
39387babad7...
Dockerizing
• 애플리케이션이 Docker 환경에서 실행될 수 있도록 하는 일
• 입력은 환경 변수로 받고, 출력은 표준 출력으로

(필수는 아니지만 이렇게 하면 일이 여러가지로 쉬워짐)
• 포트 매핑
우리가 빌드한 Docker 이미지들
런타임 환경
k1eco-base
런타임 환경
지형 관리 도구
k1eco-complete
우리가 빌드한 Docker 이미지들
런타임 환경
k1eco-base
런타임 환경
지형 관리 도구
k1eco-complete
CI
우리가 빌드한 Docker 이미지들
지형 관리 도구
런타임 환경
k1eco-base
런타임 환경
지형 관리 도구
k1eco-complete
CI
우리가 빌드한 Docker 이미지들
지형 관리 도구
런타임 환경
k1eco-base
런타임 환경
지형 관리 도구
k1eco-complete
CI
로컬 개발 환경
• 로컬 개발 환경은 갖추어졌다
• 프로덕션 런타임 환경은?
• Docker 이미지는 어디에 저장하지?
EC2 Container Service
Life was much simpler when Amazon was just a forest
CC Shawn O’Neil, 2013 <https://www.flickr.com/ph...
EC2 Container Service (ECS)
• Docker 컨테이너들을 실행하고 관리할 수 있는 환경과 도구를 제공
• 컨테이너를 실행하기 위해서는 EC2 인스턴스가 필요
• Docker 이미지를 저장할 수 있는...
Container Instance
• Docker 이미지가 실행되는 가상머신
• Docker 실행 환경 + ECS 데몬
• 개별 컨테이너 인스턴스에 신경쓰지 않고 Docker 컨테이너만 실행할 수 있는
서비스였으면 좋았...
Cluster
• EC2 컨테이너 인스턴스를 묶는 논리적 그룹
• 한 개 이상의 EC2 인스턴스로 구성
• 각 지역마다 고유함(region-specific)
Task Definition
• Docker 컨테이너의 속성을 정의하는 JSON 문서
• CPU, 메모리 요구 사항, 포트 매핑, 저장소 마운트, 환경 변수 정의, 컨테이너
이름 지정, 다른 컨테이너와 연결 등
• 많은...
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainic...
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainic...
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainic...
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainic...
Docker 이미지를 어디에 저장하지? ➔ ECR
• EC2 Container Registry
• 아마존에 의해서 관리되는(fully-managed) Docker 이미지 저장소 서비스
• 인증 절차를 제외하고는 도커 허...
ECS 클러스터와 ECR이 같은 지역에 있어야 하는 줄 알았어…
그래서 도쿄-버지니아 VPC간을 연결하는 VPN 망 구성

하지만 ECS 클러스터가 버지니아 이외의 지역에 있어도 된다는 것을 나중에 깨달음
VPN
Tok...
다소 먼 길을 돌아왔지만
• 미래에는 다른 지역에도 <야생의 땅: 듀랑고>를 런칭할 계획도 있으니, 지역간
VPN 구축 작업이 시간 낭비는 아니었음
어부지리로 비용 절감
• c4.xlarge, 온-디맨드 인스턴스 기준
• 도쿄: $0.265/hr
• 버지니아: $0.209/hr
• 27% 차이
어부지리로 비용 절감
• 일주일간의 베타 테스트 기간동안 다양한 타입의 인스턴스를 켜놓았는데
• c4.xlarge 기준으로 인스턴스당 $9.408 절약 (1년이면 $491)
AWS 비용 구조
> >Networking Computations Storage
Resource Utilizations
Networking Computations Storage
생태계 시뮬레이션을 담당하는 ECS 클러스터의 경우
지형 배포 자동화
환경이 갖추어졌으니 이제 진짜 일을 시작해볼까
지형 배포 Recap
• 지형 데이터 생성
• 지형 파일 후처리
• 지형 파일을 Git 저장소에 커밋 & 푸시
• 서버 코드 저장소에도 반영
지형 배포 Recap
• 지형 데이터 생성
• 지형 파일 후처리
• 지형 파일을 Git 저장소에 커밋 & 푸시
• 서버 코드 저장소에도 반영
이 부분을 좀 개선할 수는 없을까
We’ve been abusing Git
• Git은 바이너리 파일을 다루기에 적합하지 않음
• 지형을 추가, 수정할수록 히스토리가 걷잡을 수 없이 커지는 문제
• 지형 파일 저장소를 서버 코드 저장소의 서브모듈 형태로...
Dropping Git
• 지형 관리 프로세스에서 Git을 완전히 빼기로 결정함
지형 배포 시스템 개편
• 지형 파일을 Git 저장소에 저장
• 서버 코드 저장소에서 서브모듈로 지형 저장
소를 참조
• 서버 노드마다 모든 지형 파일을 다 가지고
있음
2세대1세대
• 지형 파일을 AWS S3에 저장
...
지형 배포 2세대
• 지형 데이터 생성
• 지형 파일 후처리
• 지형 파일을 지형 저장소(S3)에 올리기
• 서버 코드 저장소에도 반영
지형 배포 2세대
• 지형 데이터 생성
• 지형 파일 후처리
• 지형 파일을 지형 저장소(S3)에 올리기
• 서버 코드 저장소에도 반영
이 과정을 자동화
지형 배포 자동화 시스템
지형 파일
지형 배포 자동화 시스템
S3
지형 파일
지형 배포 자동화 시스템
S3
Lambda
SQS
지형 파일
지형 배포 자동화 시스템
ECS
S3
Lambda
SQS
지형 파일
지형 배포
지형 배포 자동화 시스템
ECS
S3
Lambda
SQS
지형 파일
지형 배포
지형 배포 자동화 시스템
CloudWatch
ECS
S3
Lambda
SQS
지형 파일
지형 배포
잠깐!
• S3?
• Lambda?
• SQS?
• CloudWatch?
지형 배포 자동화 시스템
CloudWatch
ECS
S3
Lambda
SQS
지형 파일
지형 배포
Simple Storage Service (S3)
• 오브젝트 스토리지
• 주로 파일을 저장하는데 사용
• 상당수의 POSIX 파일시스템 시맨틱을 제공하지는 않지만,

높은 확장성(scalability)을 제공
• Ob...
Simple Storage Service (S3)
.whl
S3
지형 파일
에셋 파일
.zip
로그 파일
지형 배포 자동화 시스템
CloudWatch
ECS
S3
Lambda
SQS
지형 파일
지형 배포
Lambda
• (사용자가 따로 서버를 마련하지 않고) AWS의 기반 시설에서 코드를 수행할
수 있는 서비스
• Java 8, Node.js 0.10, Node.js 4.3, Python 2.7
Lambda
• 명시적으로 호출할 수도 있고
• AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거
• S3에 파일이 올라오거나
• DynamoDB의 레코드가 업데이트 되거나
• Kinesis 스트림에 데이터가 ...
Lambda
• 명시적으로 호출할 수도 있고
• AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거
• S3에 파일이 올라오거나
• DynamoDB의 레코드가 업데이트 되거나
• Kinesis 스트림에 데이터가 ...
Lambda
• 여러가지 제한들
• 최대 수행 시간: 300초 (5분)
• 코드 패키지 최대 크기: 250MB
• 사용할 수 있는 디스크 공간: 512MB
• (다른 제한들도 많지만, 공간이 협소하니 자세한 내용은 AW...
Lambda
• 오래 걸리거나 자원 사용량이 많은 코드 (X)
• Lambda에서 직접 처리하는 대신 ECS 태스크를 띄우기 (O)
지형 배포 자동화 시스템
CloudWatch
ECS
S3
Lambda
SQS
지형 파일
지형 배포
Simple Queue Service (SQS)
• 분산 메세지 큐 서비스
• 신뢰성 있는 메세지 전달 보장
• 높은 확장성(scalability), 높은 가용성(availability)
Simple Queue Service (SQS)
Producer ConsumerB U F F E R 0
Producer
Producer
Consumer
Consumer
지형 배포 자동화 시스템
CloudWatch
ECS
S3
Lambda
SQS
지형 파일
지형 배포
CloudWatch
• AWS의 여러가지 자원을 모니터링 할 수 있는 서비스
• 각 서비스에 대한 여러가지 지표(metrics)들을 제공,

사용자 정의 지표도 가능
• 로그 수집, 알람 기능
자동화 된 지형 파일 배포
• 로컬 가상머신에 지형 파일을 준비
• 지형 배포 명령어를 수동으로 수행
• 서버 코드 저장소에 변경사항 반영
• 프로그래머의 개입이 필요
자동화 시스템기존 시스템
• 지형 파일을 S3에 업...
자동화 된 지형 파일 배포
지형 파일 올리기 지형 파일 후처리 지형 저장소에 커밋 서버 저장소 업데이트
지형 파일 올리기
지형 제작자 프로그래머 프로그래머 프로그래머
지형 제작자
지형 파일 후처리 지형 저장소에 업로드
...
그러던 어느날
• CI 머신에서 디스크 용량 부족 오류 메세지가 뜨기 시작
• 디스크 사용량은 50% 미만이라 당황(!)
• 알고보니 파일 개수가 많아서 사용 가능한 inode를 모두 소진
• 몇년마다 한 번씩 겪는 문...
너무 많은 파일 개수
• 지형 개수 = 약 1,000개 (미사용 지형 포함; 베타테스트 시작 전 갑자기 많아짐)
• 지형별 파일 개수 = 지형의 크기에 따라서 1,000-400,000개
• 총 파일 개수 = 약 1,30...
해결책: .zip으로 압축하자
• 하나의 지형당 파일 하나
• 지형 배포 코드, 서버 코드에서 지형 파일 읽어오는 부분만 재빠르게 수정
• 더이상 안 쓰는 지형 파일도 지우자
또다른 문제점: .zip 파일 성능 병목
• 파일 개수가 많다보니 .zip 파일을 열기 위해서 많은 메모리를 사용
• 파일 색인을 위한 트리 구조를 메모리에 가지고 있기 때문
해결책: 전용 포맷을 만들자
• 지형 속성별(군계, 강, 호수, 바다, 온도, 습도, 랜드마크 등) 파일 한 개
• 청크 좌표만 가지고 바로 읽어올 수 있는 고정 크기 파일
• Sparse data일때 용량 낭비가 있지...
지형 파일 성능 문제는 일단 해결이 되었도다
생태계 시뮬레이션 자동화
플레이어들이 나무를 마구 베어도 걱정 없어요
Image excerpted from https://en.wikipedia.org/wiki/Computer_simulation#/media/File:...
생태계 시뮬레이션 Recap
• 자연 상태 파악
• 부족한 자연물 보충
자연 상태 파악
(0, 0): ♣
(5, 0): ♦
(3, 1): ♣
(4, 1): ♤
(2, 2): ♣
(3, 2): ♤
(4, 2): ♣
♣ ♦
♣ ♤
♣ ♤ ♣
♡ ♦
♠ ♦ ♤
♡ ♠ ♦
자연 상태 파악
디버깅 도구에서 본 가든 스냅샷
주기적으로 자연 상태 파악
• 모든 섬을 돌아다니며 자연 상태를 전수 조사
• 간단하게 구현할 수 있지만 비효율적인 방법
시스템 구조 - 주기적으로 자연 상태 파악
CloudWatch Events
시스템 구조 - 주기적으로 자연 상태 파악
LambdaCloudWatch Events
시스템 구조 - 주기적으로 자연 상태 파악
ECSLambdaCloudWatch Events
Parkranger
시스템 구조 - 주기적으로 자연 상태 파악
ECSLambda
SQS
CloudWatch Events
Parkranger
시스템 구조 - 주기적으로 자연 상태 파악
ECSLambda
SQS
CloudWatch Events
CloudWatch Events Lambda ECS
Parkranger
Gardener
Gardener
Gardener...
시스템 구조 - 주기적으로 자연 상태 파악
ECSLambda
SQS
CloudWatch Events
CloudWatch Events Lambda ECS
Parkranger
Gardener
Gardener
Gardener...
Parkranger, Gardener
지형 관리 도구
Parkranger

(task definition)
지형 관리 도구
Gardener

(task definition)
• Parkranger
• 섬의 자연 상태를 ...
선택적으로 자연 상태 파악
• 사람의 손이 닿지 않은 곳이라면 굳이 조사할 필요 없음
• 채집 활동이 활발한 섬 위주로 자연 상태 파악
시스템 구조 - 선택적으로 자연 상태 파악
시스템 구조 - 선택적으로 자연 상태 파악
자연물 채집
시스템 구조 - 선택적으로 자연 상태 파악
SQS자연물 채집
시스템 구조 - 선택적으로 자연 상태 파악
SQS자연물 채집 ECS
Aggregator
시스템 구조 - 선택적으로 자연 상태 파악
SQS자연물 채집 ECS
Aggregator
시스템 구조 - 선택적으로 자연 상태 파악
SQS자연물 채집
CloudWatch Events Lambda ECS
Gardener
Gardener
Gardener
Gardener
…
ECS
Aggregator
시스템 구조 - 선택적으로 자연 상태 파악
SQS자연물 채집
CloudWatch Events Lambda ECS
Gardener
Gardener
Gardener
Gardener
…
ECS
Aggregator
이제야 마음 놓고 다른 일을 할 수 있겠군!
Summary
• 코드 배포 단순화 ➔ Docker
• Docker 실행 환경 ➔ ECS
• 지형 배포 자동화
• 생태계 시뮬레이션 자동화
Future Works
이번에 해결하진 못했지만 앞으로 해결할 문제들
Image excerpted from https://commons.wikimedia.org/wiki/File:XOR_from_NOR.svg
Supply & Demand Mismatches
시간
채집 활동 처리 용량
Supply & Demand Mismatches
시간
채집 활동 처리 용량
잉여 처리 용량

➔ 비용 낭비
Supply & Demand Mismatches
시간
채집 활동 처리 용량
잉여 처리 용량

➔ 비용 낭비
부족한 처리 용량

➔ 부정적 사용자 경험
Supply & Demand Mismatches
시간
채집 활동 처리 용량
잉여 처리 용량

➔ 비용 낭비
부족한 처리 용량

➔ 부정적 사용자 경험
넥슨은 어서 갈대를 뿌려라!
ECS 클러스터 오토 스케일링
• CPU, 메모리 사용량 등 다양한 지표
• 지표에 따라 EC2 인스턴스의 수를 조절
하여 수요 변화에 탄력적으로 대응
• 동시 접속자, 채집된 자연물의 수와 같
은 게임 내 지표를 참조...
Amazon Simple Workflow Service (SWF)
• Amazon SWF helps developers build, run, and scale background
jobs that have paralle...
스팟 인스턴스를 이용한 비용 절감
• 아마존에서 미사용(unused) 컴퓨팅 자원을 싸게 파는 일종의 경매 시스템
• 수요와 공급에 따라서 가격이 실시간으로 변화
스팟 인스턴스를 이용한 비용 절감
수요와 공급에 따라서 가격이 실시간으로 변화
스팟 인스턴스를 이용한 비용 절감
• 일주일간의 테스트 기간동안 고성능 인스턴스들을 원래 가격의 15-20% 수준
에 사용
• 특정 인스턴스 타입에 지불하고자 하는 최대 가격을 제출하고 그 가격이 시장가
보다 높거나 같...
지형 런타임 공급
• 지형을 미리 제작하고 배포하는 것은 과도기적 해결책
• 우리의 꿈은 빌드 타임에 지형을 공급하는 것이 아니라 런타임에 공급하는 것
지형 런타임 공급
지형 1
지형 2
지형 n
서버 1
서버 2
서버 3
서버 n
…
오늘 새로운 지형을
만들어볼까?
지형 제작 도구
지형 배포 도구
지형 풀(pool) 서버 코드 업데이트 없이

필요할때마다 지형 꺼내 ...
오늘 못다한 이야기는
@suminb
https://linkedin.com/in/suminb
suminb@nexon.co.kr
감사합니다
다음에 또 만나요
[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Next
Upcoming SlideShare
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Next
Download to read offline and view in fullscreen.

Share

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

Download to read offline

이 발표는 [야생의 땅: 듀랑고]의 지형 배포 시스템과 생태계 시뮬레이션 자동화 시스템에 대한 이야기를 다룹니다. 듀랑고의 각 섬은 크기와 지형, 기후 조건이 다양하고 섬의 개수가 많아서 수동으로 관리하는 것은 사실상 불가능합니다. 몇번의 사내 테스트와 베타 테스트를 거치면서 이러한 문제를 해결해주는 자동화된 도구의 필요성이 절실해졌고, 작년에 NDC에서 발표했던 생태계 시뮬레이터와 Docker, 그리고 아마존 웹서비스(AWS)를 이용하여 수많은 섬들을 자동으로 생성하고 관리하는 자동화 시스템을 구축하게 되었습니다. 그 과정에서 했던 고민들, 기존의 애플리케이션을 "Dockerizing" 했던 경험, AWS의 각 서비스들을 적절히 활용했던 이야기, AWS의 각 지역별 요금이 상이하다는 점을 이용해서 비용을 절감한 사례, 그리고 자동화 시스템의 문제점과 앞으로의 방향에 대해서 이야기 할 계획입니다.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

[야생의 땅: 듀랑고] 지형 관리 완전 자동화 - 생생한 AWS와 Docker 체험기

  1. 1. <야생의 땅: 듀랑고> 지형 관리 완전 자동화 생생한 AWS와 Docker 체험기 넥슨코리아 변수민
  2. 2. 발표자 소개 <야생의 땅: 듀랑고> 서버 프로그래머 @넥슨코리아 Computer Science, MS @University of Arizona Computer Science, BS @University of Arizona Research Programmer @University of Arizona 2010 2011 2012 2013 2014 2015 2016 소프트웨어 엔지니어 @스포카
  3. 3. 듀랑고 서버 개발자는 무슨 일을 할까요? 지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런 스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터 검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집 및 관리, 채팅방, 데이터베이스, 동기화, …
  4. 4. 듀랑고 서버 개발자는 무슨 일을 할까요? 지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런 스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터 검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집 및 관리, 채팅방, 데이터베이스, 동기화, … 그 중에 제가 맡고 있는건 이정도…?
  5. 5. 듀랑고 지형 통계 • 2차 LBT 참여자 수 = 6,937명 • 테스트 기간동안 발견된 섬의 수 = 836개 • 인구가 가장 많은 섬 = 플레밍 우랄맥 (504명)
  6. 6. 지형 자동 생성 • 이번에 준비한 지형 개수 = 약 300개 • 지형을 수작업으로 만드는 것이 아니라 자동으로 생성하기 때문에 가능한 일
  7. 7. 섬? 지형? 지형 + = 지질, 온도, 습도, 호수, 강, 바다, 식물 배치 섬 세부 사항
 (섬 생성시 자동 결정)
  8. 8. 섬? 지형? 지형 + = 지질, 온도, 습도, 호수, 강, 바다, 식물 배치 섬 세부 사항
 (섬 생성시 자동 결정)
  9. 9. 문제점: 지형 관리 병목 • (지형 스냅샷 작업중…) • “수민님, 지형 배포 해주세요”
  10. 10. 문제점: 지형 관리 병목 • (장터 검색 기능 작업중…) • “수민님, 무슨무슨 섬에 생태계 시뮬레이션 돌려주세요”
  11. 11. 그러다보니 다른 작업에 집중하기 어려움
  12. 12. 해결책: 자동화를 하자 • 도전 과제는 크게 두 가지 • 지형 배포 - 지형 배포 자동화 • 자연물 관리 - 자연 상태 파악, 생태계 시뮬레이션 자동화
  13. 13. 오늘 이야기 할 내용들 • <야생의 땅: 듀랑고>의 지형 제작과 배포, 생태계 시뮬레이션 • 지형 관리 자동화 과정에서 겪었던 문제들을 아마존 웹 서비스(AWS)와 Docker를 이용해서 해결한 이야기
  14. 14. 지형 제작과 배포 과정 <야생의 땅: 듀랑고>의 지형은 어떻게 만들어질까?
  15. 15. 지형 제작 & 배포 개요 • 전용 도구로 지형 파일들을 제작 • 여러가지 후처리를 거친 후 • 지형 파일을 Git 저장소에 올리고 • 서버 코드에서 해당 커밋을 참조하도록 변경
  16. 16. 지형 제작 & 배포 도구 • WorldGen: 지형 파일 제작, C#으로 작성됨 • 지형 관리 도구: 지형 배포 및 관리에 필요한 기능을 제공, Python으로 작성됨
  17. 17. 지형 관리 도구를 따로 만든 이유는 • 서버 코드가 파이썬으로 작성 되어있고 • 지형을 배포할 때 서버 코드를 그대로 이용하는 부분이 있기 때문 • 월드젠은 서버 코드와는 별개로 지형 파일만 제작
  18. 18. 지형 배포 절차 지형 제작 도구 ‘월드젠’을 이용하여 지형을 제작
  19. 19. 지형 배포 절차 청크별 빠른 색인을 위해 여러가지 지형 정보들을 청크별로 나눔
  20. 20. 좌표 시스템 • cm 단위의 좌표: 동물의 위치 등 섬세한 위치 조정에 사용 • 타일(tile): 가로 세로 2m의 정사각형 ➔ 자연물, 건축물 등의 최소 단위 • 청크(chunk): 16x16 타일 ➔ pub-sub 토픽, 분산의 최소 단위
  21. 21. 청크별로 나누는 이유? (x, y) (x-1, y) (x+1, y) (x+1, y+1) (x-1, y-1) (x+1, y-1) (x, y-1) (x, y+1) (x-1, y+1) { 군계 정보 강, 바다, 호수 정보 자연물 배치 정보 청크 좌표 플레이어의 시야
  22. 22. 자연물? 자연물 = 식물, 광물, 기타 채집 가능한 것
  23. 23. 지형 배포 절차 자동화된 검수 과정을 거침 assert x == y assert z == w assert essential_files_exist() assert terrain_contains_this_and_that() assert validate_chunked_tiles()
  24. 24. 지형 배포 절차 • 지형 색인 파일 업데이트 • 지형 파일들을 지형 파일 저장소(Git)에 커밋 & 푸시
  25. 25. 지형 배포 절차 Git 서브모듈 업데이트 • (서버 코드 저장소) • README • setup.py • lib • k1terrains.git • tests • (지형 파일 저장소) • README • terrains • (아까 만든 지형) • (기존 지형 1) • (기존 지형 2) • tests HEAD
  26. 26. 지형 파일 관리에 Git을 쓰는 이유? 버전 1 지형 1 서버 저장소 지형 저장소 지형 2 지형 3 버전 1 지형 1 서버 저장소 지형 저장소 지형 2 지형 3 버전 2 지형 4 서버 코드와 함께 버전 관리를 하기 위함 없어진 지형을 참조하는 것을 방지
  27. 27. 지형 파일 관리에 Git을 쓰는 이유? • 입사 전에 이미 만들어진 시스템이라 지형 파일을 Git으로 관리하는 것에 대한 별다른 의문을 가지지 않았지만 • 의문을 가져야 했었다
  28. 28. 지형 배포 절차 • 복잡해보이지만 대부분 스크립트로 만들어 놓음 • 하지만 프로그래머가 아닌 사람이 보기엔 여전히 장벽이 높음
 이 부분에 대한 고민도 했어야…
  29. 29. 생태계 시뮬레이션 나무를 심자 그림 © 강임성, 2015
  30. 30. 플레이어들은 항상 무언가를 채집 벌목당한 숲울창한 나무 숲
  31. 31. 훼손 상태를 파악 섬의 최초 상태와 비교하여 부족한 자연물의 종류와 수량을 파악
  32. 32. 자연물 보충 훼손 상태가 임계점을 넘을 경우 필요한 자연물 종류와 개수를 생태계 시뮬레이터에 전달 지형 관리 도구 Ecosystem Simulator 산딸기 5 깃털나무 13 멀구슬나무 4 백단향 3 Manifest
  33. 33. 자연물 보충 지형 관리 도구 Ecosystem Simulator 산딸기 5 깃털나무 13 멀구슬나무 4 백단향 3 산딸기 (132, 39), (133, 38), … 깃털나무 (88, 255), … 멀구슬나무 (187, 321), … 백단향 (308, 209), …
  34. 34. 생태계 시뮬레이션 Frontend node 1 Frontend node 2 Frontend node n 서버 클러스터 … Ecosystem Simulator 지형 관리 도구 로컬 머신 데이터베이스
  35. 35. 지형 관리 자동화 요구조건 • 고성능 계산 능력이 필요 • 플레이어의 행동에 따라 실행 주기, 작업 규모가 달라질 수 있음 • 여러대의 머신에서 동시에 실행될 수 있고 • 자유로운 스케일 아웃(scale-out)
  36. 36. 지형 관리 시스템에 필요한 것들 Ubuntu Linux .NET runtime (mono) Python runtime Python package 1 Python package 2 Python package n … Libraries System tools 서버 코드 지형 관리 도구Other utilities 복잡한 지형 관리 시스템 구성
  37. 37. 지형 관리 도구 배포 지형 관리 도구 + 필요한 것들 머신 1 머신 2 머신 3 머신 n…
  38. 38. 지형 관리 도구 배포 배포 스크립트 복잡도 배 포 할 머 신 의 수 실패할확률
  39. 39. 배포가 쉬워야 함 • 일회용 컴퓨팅 인스턴스, 탄력적 스케일링 • 여러대의 머신에 배포 • 쉽고 신뢰성 있는 배포 방식이 필요
  40. 40. 그렇다면 Docker를 써보자
  41. 41. Got Docker? Docker의 세계에 빠져보자
  42. 42. Docker? • 소프트웨어가 구동되는데 필요한 모든 것 - 코드, 런타임 환경, 시스템 도구, 라이브러리 등 - 을 담고 있는 컨테이너를 제공 • 소프트웨어 배포에 관련된 여러가지 문제를 해결
  43. 43. 전통적인 소프트웨어 배포 방식의 문제점 • 배포 환경마다 커널 버전, 설치된 라이브러리 등 런타임 환경이 상이함 • 개발자들의 전통적인 변명 “It works on my machine!”
  44. 44. 문제는 표준 규격의 부재 • 소프트웨어 배포 방식의 표준이라고 할만한 것이 없음
 배포 스크립트, 가상 머신 이미지, Chef/Puppet, 인스톨러 • 우리가 작성하는 프로그램이 수많은 외부 환경에 의존적인 것도 문제
 커널 버전, 라이브러리, 프레임워크, 인터프리터
  45. 45. 컨테이너 물류 업계는 ‘컨테이너’라는 통일된 규격을 만들 어서 물건의 종류에 상관 없이 전세계 어디로든 배송 가능하도록 문제를 해결했는데 우리는 왜 그 렇게 하지 못할까
  46. 46. 그래서 고안된 것이 바로 Docker • 컨테이너 안에만 들어가면 옥수수든 아이폰이든 물건의 종류의 상관 없이 원하 는 목적지까지 보낼 수 있다 • Docker 컨테이너로 패키징 된 소프트웨어는 Docker 실행 환경이 갖추어진 곳에서는 별다른 배포, 설치 절차 없이 바로 실행할 수 있다
  47. 47. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  48. 48. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  49. 49. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  50. 50. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  51. 51. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  52. 52. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  53. 53. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  54. 54. Docker가 해결해줄 수 있는 문제 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  55. 55. 가상머신으로도 그런 문제를 해결할 수 있지 않나요? • 격리: 하나의 호스트 OS에서 여러개의 게스트 OS를 실행하더라도 개별 게스 트 OS 안에서 보기엔 독립된 머신처럼 보임 • 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수 있음
  56. 56. Docker의 장점 • 격리: 하나의 호스트에서 여러개의 Docker 컨테이너를 실행하더라도 개별 컨 테이너 안에서 보기엔 독립된 머신처럼 보임 • 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수 있음 • 자원 효율성: 각 컨테이너마다 커널을 따로 띄울 필요가 없음
  57. 57. Docker의 장점 Virtual Machines Docker Containers Images excerpted from https://www.docker.com/what-docker 이렇게 각 게스트 OS를 실행하기 위해서 낭비되는 자원이 없음
  58. 58. Docker의 장점 • 같은 성능의 호스트 머신이라도 더 많은 컨테이너를 띄울 수 있음 • 실제로 테스트 기간동안 하나의 머신에 수십개의 컨테이너를 띄우기도 했음
  59. 59. Docker의 비밀 • 가상머신 없이 컨테이너마다 다른 환경을 갖출 수 있다니, 어떻게? • 그 비밀은 바로 chroot
  60. 60. chroot • chroot = change root directory • Chroot is an operation that changes the apparent root directory for the current running process and their children. A program that is run in such a modified environment cannot access files and commands outside that environmental directory tree. This modified environment is called a chroot jail. (C) Warner Bros., 1999
  61. 61. chroot / /bin /boot /dev /etc /home /lib … 일반적인 리눅스 디렉토리 구조
  62. 62. chroot 임의의 디렉토리 안쪽에
 리눅스 시스템을 구성하는 파일들을 넣고 / /bin /boot /dev /etc /home /home/anotherworld /bin /boot /dev /etc …
  63. 63. chroot / /bin /boot /dev /etc /home /home/anotherworld /bin /boot /dev /etc … chroot /home/anotherworld 명령어를 실행하면 - 레드썬!
 마치 다른 OS로 부팅한 것 같은 느낌 (커널은 바뀌지 않음)
  64. 64. chroot chroot /home/anotherworld /home/anotherworld/bin/bash
  65. 65. chroot chroot /home/anotherworld /home/anotherworld/bin/bash 새로운 루트 디렉토리
  66. 66. chroot chroot /home/anotherworld /home/anotherworld/bin/bash 새로운 루트 디렉토리 루트 디렉토리가 변경될 때
 실행될 명령어
 (생략 하면 현재 쉘)
  67. 67. Docker 프로세스 안의 또 다른 세상 786 ? Ssl 1:12 /usr/bin/docker -d 1534 ? Ss 0:00 _ /bin/bash /entrypoint 1601 ? Sl 1:19 | _ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -- -root /opt/couchbase/lib/er 1705 ? Ssl 633:23 | | _ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -sbt u -P 327680 -K true - 1733 ? Ss 0:01 | | | _ sh -s disksup 1734 ? Ss 0:08 | | | _ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/memsup 1735 ? Ss 0:00 | | | _ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/cpu_sup 1738 ? Ss 0:09 | | | _ inet_gethost 4 1739 ? S 0:05 | | | | _ inet_gethost 4 1757 ? Ssl 84:42 | | | _ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -P 327680 -K true -- -root /
  68. 68. Docker 프로세스 안의 또 다른 세상 786 ? Ssl 1:12 /usr/bin/docker -d 1534 ? Ss 0:00 _ /bin/bash /entrypoint 1601 ? Sl 1:19 | _ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -- -root /opt/couchbase/lib/er 1705 ? Ssl 633:23 | | _ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -A 16 -sbt u -P 327680 -K true - 1733 ? Ss 0:01 | | | _ sh -s disksup 1734 ? Ss 0:08 | | | _ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/memsup 1735 ? Ss 0:00 | | | _ /opt/couchbase/lib/erlang/lib/os_mon-2.2.14/priv/bin/cpu_sup 1738 ? Ss 0:09 | | | _ inet_gethost 4 1739 ? S 0:05 | | | | _ inet_gethost 4 1757 ? Ssl 84:42 | | | _ /opt/couchbase/lib/erlang/erts-5.10.4.0.0.1/bin/beam.smp -P 327680 -K true -- -root / Docker process
  69. 69. 진짜 천재같은 발상이다
  70. 70. 그럼 Docker 컨테이너는 어떻게 만드나요?
  71. 71. Dockerfile • Docker 이미지를 빌드하는 절차를 명시한 파일 • 명령어 하나당 레이어 하나 • 레이어를 쌓아 올리는 방식 - 재사용성 • 재현성 보장 (guaranteed repeatability)
  72. 72. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh
  73. 73. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 베이스 이미지 지정
  74. 74. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 관리자 지정
  75. 75. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 환경변수 설정
  76. 76. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 소프트웨어 패키지 업데이트 & 설치
  77. 77. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 작업 디렉토리 변경
  78. 78. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 명령어 수행
  79. 79. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 로컬 파일 복사
  80. 80. Dockerfile 예제 FROM ubuntu:14.04 MAINTAINER Sumin Byeon <suminb@nexon.co.kr> ENV SOME_FLAG=1 RUN apt-get update && apt-get install -y (some packages) WORKDIR /opt/k1eco RUN pip install -e . COPY startup.sh ./ CMD ./startup.sh 진입점 명령어 지정 (오버라이드 가능)
  81. 81. Building a Docker Image
  82. 82. Building a Docker Image • docker build /opt/docker-image Dockerfile이 있는 디렉토리
  83. 83. Building a Docker Image • docker build /opt/docker-image • docker build -t ${저장소 주소}/k1eco-complete . Dockerfile이 있는 디렉토리 이미지 태그
  84. 84. Docker Image 28b3321d1682 124.3 MB 7e0641b95986 294.7 KB e16121a2089f 7.831 KB 876fc4769c5a 1,894 KB k1eco-complete:latest … … 577f02323aaf 1.052 KB
  85. 85. Docker Image 28b3321d1682 124.3 MB 7e0641b95986 294.7 KB e16121a2089f 7.831 KB 876fc4769c5a 1,894 KB k1eco-complete:latest … RUN apt-get install RUN pip install -e . COPY startup.sh ./ CMD startup.sh … 577f02323aaf 1.052 KB MAINTAINER Sumin Byeon
  86. 86. Running a Docker Image • docker run postgres • docker run postgres:9.4 • docker run -d postgres • docker run -d -p 5432:5432 -e ENV=value postgres • docker run -i -t postgres /bin/bash
  87. 87. Running a Docker Image • docker run postgres • docker run postgres:9.4 • docker run -d postgres • docker run -d -p 5432:5432 -e ENV=value postgres • docker run -i -t postgres /bin/bash 이미지 이름만으로 실행, 암시적으로 최신 버전
  88. 88. Running a Docker Image • docker run postgres • docker run postgres:9.4 • docker run -d postgres • docker run -d -p 5432:5432 -e ENV=value postgres • docker run -i -t postgres /bin/bash 이미지 이름과 버전을 명시해서 실행
  89. 89. Running a Docker Image • docker run postgres • docker run postgres:9.4 • docker run -d postgres • docker run -d -p 5432:5432 -e ENV=value postgres • docker run -i -t postgres /bin/bash 데몬으로 (백그라운드에서) 실행
  90. 90. Running a Docker Image • docker run postgres • docker run postgres:9.4 • docker run -d postgres • docker run -d -p 5432:5432 -e ENV=value postgres • docker run -i -t postgres /bin/bash 포트 매핑 & 환경 변수
  91. 91. Running a Docker Image • docker run postgres • docker run postgres:9.4 • docker run -d postgres • docker run -d -p 5432:5432 -e ENV=value postgres • docker run -i -t postgres /bin/bash 인터랙티브 모드로 실행
  92. 92. Docker Container f028ae8823c8 2.432 KB e16121a2089f 7.831 KB 876fc4769c5a 1,894 KB k1eco-complete:latest … 577f02323aaf 1.052 KB Thin R/W layer Container layer Image layers
 (read only)
  93. 93. Docker Container f028ae8823c8 2.432 KB e16121a2089f 7.831 KB 876fc4769c5a 1,894 KB k1eco-complete:latest … 577f02323aaf 1.052 KB Thin R/W layer Container layer Image layers
 (read only)이미지 빌드가
 끝나면 이 상태
  94. 94. Docker Container f028ae8823c8 2.432 KB e16121a2089f 7.831 KB 876fc4769c5a 1,894 KB k1eco-complete:latest … 577f02323aaf 1.052 KB Thin R/W layer Container layer Image layers
 (read only) 이미지를 실행하면
 레이어가 추가됨
  95. 95. Docker Container > Containers that write a lot of data will consume more space than containers that do not. This is because most write operations consume new space in the container’s thin writable top layer. If your container needs to write a lot of data, you should consider using a data volume. [^1] [^1]: https://docs.docker.com/engine/userguide/storagedriver/imagesandcontainers/
  96. 96. Storage Drivers Docker는 다양항 종류의 스토리지 드라이버를 제공 잘 모르겠으면 그냥 기본값으로 되어있는걸 쓰자
  97. 97. Content Addressability 876fc4769c5a 1,894 KB File contents Cryptographic hash function
  98. 98. Content Addressability 8b9022a8dfe4 696.9 KB 876fc4769c5a 1,894 KB 27f381189a32 87.49 KB 1a86c4c9077a 353.1 KB 39387babad77 1.327 MB 876fc4769c5a 1,894 KB 32132a7c82e9 1,994 KB 6467734fa93c 2.403 MB 이미지 1 이미지 2 서로 다르게 빌드된 이미지라도 같은 내용을 가진 레이어가 있다면 상호간 공유 가능
  99. 99. Dockerizing • 애플리케이션이 Docker 환경에서 실행될 수 있도록 하는 일 • 입력은 환경 변수로 받고, 출력은 표준 출력으로
 (필수는 아니지만 이렇게 하면 일이 여러가지로 쉬워짐) • 포트 매핑
  100. 100. 우리가 빌드한 Docker 이미지들 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete
  101. 101. 우리가 빌드한 Docker 이미지들 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete CI
  102. 102. 우리가 빌드한 Docker 이미지들 지형 관리 도구 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete CI
  103. 103. 우리가 빌드한 Docker 이미지들 지형 관리 도구 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete CI
  104. 104. 로컬 개발 환경 • 로컬 개발 환경은 갖추어졌다 • 프로덕션 런타임 환경은? • Docker 이미지는 어디에 저장하지?
  105. 105. EC2 Container Service Life was much simpler when Amazon was just a forest CC Shawn O’Neil, 2013 <https://www.flickr.com/photos/oneilsh/14601920735>
  106. 106. EC2 Container Service (ECS) • Docker 컨테이너들을 실행하고 관리할 수 있는 환경과 도구를 제공 • 컨테이너를 실행하기 위해서는 EC2 인스턴스가 필요 • Docker 이미지를 저장할 수 있는 레지스트리 서비스인 ECR을 제공
  107. 107. Container Instance • Docker 이미지가 실행되는 가상머신 • Docker 실행 환경 + ECS 데몬 • 개별 컨테이너 인스턴스에 신경쓰지 않고 Docker 컨테이너만 실행할 수 있는 서비스였으면 좋았겠지만…
 Docker 엔진의 일부 동작이 루트 권한을 요구하기 때문에 보안상의 이유로 그 렇게 하기 어렵지 않았을까 하는 추측
  108. 108. Cluster • EC2 컨테이너 인스턴스를 묶는 논리적 그룹 • 한 개 이상의 EC2 인스턴스로 구성 • 각 지역마다 고유함(region-specific)
  109. 109. Task Definition • Docker 컨테이너의 속성을 정의하는 JSON 문서 • CPU, 메모리 요구 사항, 포트 매핑, 저장소 마운트, 환경 변수 정의, 컨테이너 이름 지정, 다른 컨테이너와 연결 등 • 많은 경우에 Docker 이미지 ≠ 수행하고자 하는 일
  110. 110. Task Definition ECS Override • Env. variables • Port mappings • Command Task Definition Image excerpted from http://plainicon.com/download-icon/50348/docker Container
  111. 111. Task Definition ECS Override • Env. variables • Port mappings • Command Task Definition Image excerpted from http://plainicon.com/download-icon/50348/docker Container X
  112. 112. Task Definition ECS Override • Env. variables • Port mappings • Command Task Definition Image excerpted from http://plainicon.com/download-icon/50348/docker Container X
  113. 113. Task Definition ECS Override • Env. variables • Port mappings • Command Task Definition Image excerpted from http://plainicon.com/download-icon/50348/docker Container X
  114. 114. Docker 이미지를 어디에 저장하지? ➔ ECR • EC2 Container Registry • 아마존에 의해서 관리되는(fully-managed) Docker 이미지 저장소 서비스 • 인증 절차를 제외하고는 도커 허브(Docker Hub)와 동일한 방법으로 이용 • (2016년 4월) 현재는 버지니아 지역(us-east-1)에서만 이용 가능
  115. 115. ECS 클러스터와 ECR이 같은 지역에 있어야 하는 줄 알았어… 그래서 도쿄-버지니아 VPC간을 연결하는 VPN 망 구성
 하지만 ECS 클러스터가 버지니아 이외의 지역에 있어도 된다는 것을 나중에 깨달음 VPN Tokyo VA
  116. 116. 다소 먼 길을 돌아왔지만 • 미래에는 다른 지역에도 <야생의 땅: 듀랑고>를 런칭할 계획도 있으니, 지역간 VPN 구축 작업이 시간 낭비는 아니었음
  117. 117. 어부지리로 비용 절감 • c4.xlarge, 온-디맨드 인스턴스 기준 • 도쿄: $0.265/hr • 버지니아: $0.209/hr • 27% 차이
  118. 118. 어부지리로 비용 절감 • 일주일간의 베타 테스트 기간동안 다양한 타입의 인스턴스를 켜놓았는데 • c4.xlarge 기준으로 인스턴스당 $9.408 절약 (1년이면 $491)
  119. 119. AWS 비용 구조 > >Networking Computations Storage
  120. 120. Resource Utilizations Networking Computations Storage 생태계 시뮬레이션을 담당하는 ECS 클러스터의 경우
  121. 121. 지형 배포 자동화 환경이 갖추어졌으니 이제 진짜 일을 시작해볼까
  122. 122. 지형 배포 Recap • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 Git 저장소에 커밋 & 푸시 • 서버 코드 저장소에도 반영
  123. 123. 지형 배포 Recap • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 Git 저장소에 커밋 & 푸시 • 서버 코드 저장소에도 반영 이 부분을 좀 개선할 수는 없을까
  124. 124. We’ve been abusing Git • Git은 바이너리 파일을 다루기에 적합하지 않음 • 지형을 추가, 수정할수록 히스토리가 걷잡을 수 없이 커지는 문제 • 지형 파일 저장소를 서버 코드 저장소의 서브모듈 형태로 관리, 사용하지 않는 지형까지 모두 체크아웃 • Docker 이미지를 빌드할 때에도 모든 지형이 다 들어가기 때문에 자원 낭비
 지형 관리 도구가 서버 코드를 포함하고, 서버 코드 저장소가 지형 저장소를 포함하고 있기 때문에…
  125. 125. Dropping Git • 지형 관리 프로세스에서 Git을 완전히 빼기로 결정함
  126. 126. 지형 배포 시스템 개편 • 지형 파일을 Git 저장소에 저장 • 서버 코드 저장소에서 서브모듈로 지형 저장 소를 참조 • 서버 노드마다 모든 지형 파일을 다 가지고 있음 2세대1세대 • 지형 파일을 AWS S3에 저장 • 서버 설정 파일에 저장된 지형 ID를 참조 • 실제로 사용하는 지형만 그때그때 받아옴
  127. 127. 지형 배포 2세대 • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 지형 저장소(S3)에 올리기 • 서버 코드 저장소에도 반영
  128. 128. 지형 배포 2세대 • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 지형 저장소(S3)에 올리기 • 서버 코드 저장소에도 반영 이 과정을 자동화
  129. 129. 지형 배포 자동화 시스템 지형 파일
  130. 130. 지형 배포 자동화 시스템 S3 지형 파일
  131. 131. 지형 배포 자동화 시스템 S3 Lambda SQS 지형 파일
  132. 132. 지형 배포 자동화 시스템 ECS S3 Lambda SQS 지형 파일 지형 배포
  133. 133. 지형 배포 자동화 시스템 ECS S3 Lambda SQS 지형 파일 지형 배포
  134. 134. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  135. 135. 잠깐! • S3? • Lambda? • SQS? • CloudWatch?
  136. 136. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  137. 137. Simple Storage Service (S3) • 오브젝트 스토리지 • 주로 파일을 저장하는데 사용 • 상당수의 POSIX 파일시스템 시맨틱을 제공하지는 않지만,
 높은 확장성(scalability)을 제공 • Object versioning • Multi-regional replications ➔ high-availability
  138. 138. Simple Storage Service (S3) .whl S3 지형 파일 에셋 파일 .zip 로그 파일
  139. 139. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  140. 140. Lambda • (사용자가 따로 서버를 마련하지 않고) AWS의 기반 시설에서 코드를 수행할 수 있는 서비스 • Java 8, Node.js 0.10, Node.js 4.3, Python 2.7
  141. 141. Lambda • 명시적으로 호출할 수도 있고 • AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거 • S3에 파일이 올라오거나 • DynamoDB의 레코드가 업데이트 되거나 • Kinesis 스트림에 데이터가 들어오거나 • CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나
  142. 142. Lambda • 명시적으로 호출할 수도 있고 • AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거 • S3에 파일이 올라오거나 • DynamoDB의 레코드가 업데이트 되거나 • Kinesis 스트림에 데이터가 들어오거나 • CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나 우리는 이것을 이용
  143. 143. Lambda • 여러가지 제한들 • 최대 수행 시간: 300초 (5분) • 코드 패키지 최대 크기: 250MB • 사용할 수 있는 디스크 공간: 512MB • (다른 제한들도 많지만, 공간이 협소하니 자세한 내용은 AWS 문서를 참고) • 메모리 사용량, ms 단위로 측정된 수행 시간을 기준으로 과금
  144. 144. Lambda • 오래 걸리거나 자원 사용량이 많은 코드 (X) • Lambda에서 직접 처리하는 대신 ECS 태스크를 띄우기 (O)
  145. 145. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  146. 146. Simple Queue Service (SQS) • 분산 메세지 큐 서비스 • 신뢰성 있는 메세지 전달 보장 • 높은 확장성(scalability), 높은 가용성(availability)
  147. 147. Simple Queue Service (SQS) Producer ConsumerB U F F E R 0 Producer Producer Consumer Consumer
  148. 148. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  149. 149. CloudWatch • AWS의 여러가지 자원을 모니터링 할 수 있는 서비스 • 각 서비스에 대한 여러가지 지표(metrics)들을 제공,
 사용자 정의 지표도 가능 • 로그 수집, 알람 기능
  150. 150. 자동화 된 지형 파일 배포 • 로컬 가상머신에 지형 파일을 준비 • 지형 배포 명령어를 수동으로 수행 • 서버 코드 저장소에 변경사항 반영 • 프로그래머의 개입이 필요 자동화 시스템기존 시스템 • 지형 파일을 S3에 업로드 • S3이벤트 트리거에 의해서 자동으로 지형 배포 태스크 실행 • 처리된 지형 파일들을 S3에 저장 • 프로그래머가 필요 없음
 우리의 일자리가 위험…읍읍
  151. 151. 자동화 된 지형 파일 배포 지형 파일 올리기 지형 파일 후처리 지형 저장소에 커밋 서버 저장소 업데이트 지형 파일 올리기 지형 제작자 프로그래머 프로그래머 프로그래머 지형 제작자 지형 파일 후처리 지형 저장소에 업로드 자동화 전 자동화 후
  152. 152. 그러던 어느날 • CI 머신에서 디스크 용량 부족 오류 메세지가 뜨기 시작 • 디스크 사용량은 50% 미만이라 당황(!) • 알고보니 파일 개수가 많아서 사용 가능한 inode를 모두 소진 • 몇년마다 한 번씩 겪는 문제라 매번 낚임. 오류 메세지를 수정해서 리눅스 커널 패치를 보내볼까…
  153. 153. 너무 많은 파일 개수 • 지형 개수 = 약 1,000개 (미사용 지형 포함; 베타테스트 시작 전 갑자기 많아짐) • 지형별 파일 개수 = 지형의 크기에 따라서 1,000-400,000개 • 총 파일 개수 = 약 1,300,000 • CI가 다섯번만 돌면 inode 모두 소진
  154. 154. 해결책: .zip으로 압축하자 • 하나의 지형당 파일 하나 • 지형 배포 코드, 서버 코드에서 지형 파일 읽어오는 부분만 재빠르게 수정 • 더이상 안 쓰는 지형 파일도 지우자
  155. 155. 또다른 문제점: .zip 파일 성능 병목 • 파일 개수가 많다보니 .zip 파일을 열기 위해서 많은 메모리를 사용 • 파일 색인을 위한 트리 구조를 메모리에 가지고 있기 때문
  156. 156. 해결책: 전용 포맷을 만들자 • 지형 속성별(군계, 강, 호수, 바다, 온도, 습도, 랜드마크 등) 파일 한 개 • 청크 좌표만 가지고 바로 읽어올 수 있는 고정 크기 파일 • Sparse data일때 용량 낭비가 있지만, 스토리지는 싸니까 괜찮아!
  157. 157. 지형 파일 성능 문제는 일단 해결이 되었도다
  158. 158. 생태계 시뮬레이션 자동화 플레이어들이 나무를 마구 베어도 걱정 없어요 Image excerpted from https://en.wikipedia.org/wiki/Computer_simulation#/media/File:Typhoon_Mawar_2005_computer_simulation_thumbnail.gif
  159. 159. 생태계 시뮬레이션 Recap • 자연 상태 파악 • 부족한 자연물 보충
  160. 160. 자연 상태 파악 (0, 0): ♣ (5, 0): ♦ (3, 1): ♣ (4, 1): ♤ (2, 2): ♣ (3, 2): ♤ (4, 2): ♣ ♣ ♦ ♣ ♤ ♣ ♤ ♣ ♡ ♦ ♠ ♦ ♤ ♡ ♠ ♦
  161. 161. 자연 상태 파악 디버깅 도구에서 본 가든 스냅샷
  162. 162. 주기적으로 자연 상태 파악 • 모든 섬을 돌아다니며 자연 상태를 전수 조사 • 간단하게 구현할 수 있지만 비효율적인 방법
  163. 163. 시스템 구조 - 주기적으로 자연 상태 파악 CloudWatch Events
  164. 164. 시스템 구조 - 주기적으로 자연 상태 파악 LambdaCloudWatch Events
  165. 165. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambdaCloudWatch Events Parkranger
  166. 166. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambda SQS CloudWatch Events Parkranger
  167. 167. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambda SQS CloudWatch Events CloudWatch Events Lambda ECS Parkranger Gardener Gardener Gardener Gardener …
  168. 168. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambda SQS CloudWatch Events CloudWatch Events Lambda ECS Parkranger Gardener Gardener Gardener Gardener …
  169. 169. Parkranger, Gardener 지형 관리 도구 Parkranger
 (task definition) 지형 관리 도구 Gardener
 (task definition) • Parkranger • 섬의 자연 상태를 조사 • 일정 수준 이상 훼손되었을 경우 생태계 시뮬레이션 작업 요청 • 정원사 • 큐에서 시뮬레이션 작업 요청 받아옴 • 작업 요청대로 시뮬레이션 실행 + +
  170. 170. 선택적으로 자연 상태 파악 • 사람의 손이 닿지 않은 곳이라면 굳이 조사할 필요 없음 • 채집 활동이 활발한 섬 위주로 자연 상태 파악
  171. 171. 시스템 구조 - 선택적으로 자연 상태 파악
  172. 172. 시스템 구조 - 선택적으로 자연 상태 파악 자연물 채집
  173. 173. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집
  174. 174. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 ECS Aggregator
  175. 175. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 ECS Aggregator
  176. 176. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 CloudWatch Events Lambda ECS Gardener Gardener Gardener Gardener … ECS Aggregator
  177. 177. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 CloudWatch Events Lambda ECS Gardener Gardener Gardener Gardener … ECS Aggregator
  178. 178. 이제야 마음 놓고 다른 일을 할 수 있겠군!
  179. 179. Summary • 코드 배포 단순화 ➔ Docker • Docker 실행 환경 ➔ ECS • 지형 배포 자동화 • 생태계 시뮬레이션 자동화
  180. 180. Future Works 이번에 해결하진 못했지만 앞으로 해결할 문제들 Image excerpted from https://commons.wikimedia.org/wiki/File:XOR_from_NOR.svg
  181. 181. Supply & Demand Mismatches 시간 채집 활동 처리 용량
  182. 182. Supply & Demand Mismatches 시간 채집 활동 처리 용량 잉여 처리 용량
 ➔ 비용 낭비
  183. 183. Supply & Demand Mismatches 시간 채집 활동 처리 용량 잉여 처리 용량
 ➔ 비용 낭비 부족한 처리 용량
 ➔ 부정적 사용자 경험
  184. 184. Supply & Demand Mismatches 시간 채집 활동 처리 용량 잉여 처리 용량
 ➔ 비용 낭비 부족한 처리 용량
 ➔ 부정적 사용자 경험 넥슨은 어서 갈대를 뿌려라!
  185. 185. ECS 클러스터 오토 스케일링 • CPU, 메모리 사용량 등 다양한 지표 • 지표에 따라 EC2 인스턴스의 수를 조절 하여 수요 변화에 탄력적으로 대응 • 동시 접속자, 채집된 자연물의 수와 같 은 게임 내 지표를 참조할수도…
  186. 186. Amazon Simple Workflow Service (SWF) • Amazon SWF helps developers build, run, and scale background jobs that have parallel or sequential steps. You can think of Amazon SWF as a fully-managed state tracker and task coordinator in the cloud.[^1] • If your app's steps take more than 500 milliseconds to complete, you need to track the state of processing, and you need to recover or retry if a task fails, Amazon SWF can help you. [^1]: https://aws.amazon.com/swf/
  187. 187. 스팟 인스턴스를 이용한 비용 절감 • 아마존에서 미사용(unused) 컴퓨팅 자원을 싸게 파는 일종의 경매 시스템 • 수요와 공급에 따라서 가격이 실시간으로 변화
  188. 188. 스팟 인스턴스를 이용한 비용 절감 수요와 공급에 따라서 가격이 실시간으로 변화
  189. 189. 스팟 인스턴스를 이용한 비용 절감 • 일주일간의 테스트 기간동안 고성능 인스턴스들을 원래 가격의 15-20% 수준 에 사용 • 특정 인스턴스 타입에 지불하고자 하는 최대 가격을 제출하고 그 가격이 시장가 보다 높거나 같으면 인스턴스 사용, 시장 가격보다 낮아지면 인스턴스가 꺼짐 • 인스턴스가 꺼졌을 때 적절히 대응할 수 있는 소프트웨어 아키텍처가 필요
  190. 190. 지형 런타임 공급 • 지형을 미리 제작하고 배포하는 것은 과도기적 해결책 • 우리의 꿈은 빌드 타임에 지형을 공급하는 것이 아니라 런타임에 공급하는 것
  191. 191. 지형 런타임 공급 지형 1 지형 2 지형 n 서버 1 서버 2 서버 3 서버 n … 오늘 새로운 지형을 만들어볼까? 지형 제작 도구 지형 배포 도구 지형 풀(pool) 서버 코드 업데이트 없이
 필요할때마다 지형 꺼내 쓰기
  192. 192. 오늘 못다한 이야기는 @suminb https://linkedin.com/in/suminb suminb@nexon.co.kr
  193. 193. 감사합니다 다음에 또 만나요
  • ByungWheeKim

    Dec. 1, 2020
  • leeJongSung2

    Jan. 3, 2019
  • AriSeo

    Feb. 20, 2018
  • dbongman

    Jan. 28, 2018
  • SoohyungLee11

    Jan. 25, 2018
  • SmilemanJ

    Jan. 17, 2018
  • JIHUNBAEK2

    Jan. 6, 2018
  • sijineroh

    Aug. 14, 2017
  • foxkjy

    Jul. 7, 2017
  • ssuser6c6963

    Dec. 22, 2016
  • serivires

    Oct. 16, 2016
  • ryonjeong1

    Sep. 10, 2016
  • ssuserc961e4

    Jul. 6, 2016
  • ssuser96558b

    Jun. 20, 2016
  • a1221110

    Jun. 1, 2016
  • MinwooPark13

    May. 16, 2016
  • EugenePark1

    May. 11, 2016
  • realcollab

    May. 2, 2016
  • ssuser555100

    May. 2, 2016
  • kernel0

    May. 1, 2016

이 발표는 [야생의 땅: 듀랑고]의 지형 배포 시스템과 생태계 시뮬레이션 자동화 시스템에 대한 이야기를 다룹니다. 듀랑고의 각 섬은 크기와 지형, 기후 조건이 다양하고 섬의 개수가 많아서 수동으로 관리하는 것은 사실상 불가능합니다. 몇번의 사내 테스트와 베타 테스트를 거치면서 이러한 문제를 해결해주는 자동화된 도구의 필요성이 절실해졌고, 작년에 NDC에서 발표했던 생태계 시뮬레이터와 Docker, 그리고 아마존 웹서비스(AWS)를 이용하여 수많은 섬들을 자동으로 생성하고 관리하는 자동화 시스템을 구축하게 되었습니다. 그 과정에서 했던 고민들, 기존의 애플리케이션을 "Dockerizing" 했던 경험, AWS의 각 서비스들을 적절히 활용했던 이야기, AWS의 각 지역별 요금이 상이하다는 점을 이용해서 비용을 절감한 사례, 그리고 자동화 시스템의 문제점과 앞으로의 방향에 대해서 이야기 할 계획입니다.

Views

Total views

8,378

On Slideshare

0

From embeds

0

Number of embeds

522

Actions

Downloads

130

Shares

0

Comments

0

Likes

58

×