SlideShare a Scribd company logo
1 of 194
Download to read offline
<야생의 땅: 듀랑고> 지형 관리 완전 자동화
생생한 AWS와 Docker 체험기
넥슨코리아
변수민
발표자 소개
<야생의 땅: 듀랑고> 서버 프로그래머 @넥슨코리아
Computer Science, MS @University of Arizona
Computer Science, BS @University of Arizona
Research Programmer @University of Arizona
2010
2011
2012
2013
2014
2015
2016
소프트웨어 엔지니어 @스포카
듀랑고 서버 개발자는 무슨 일을 할까요?
지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런
스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터
검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집
및 관리, 채팅방, 데이터베이스, 동기화, …
듀랑고 서버 개발자는 무슨 일을 할까요?
지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런
스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터
검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집
및 관리, 채팅방, 데이터베이스, 동기화, …
그 중에 제가 맡고 있는건 이정도…?
듀랑고 지형 통계
• 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()
assert validate_chunked_tiles()
지형 배포 절차
• 지형 색인 파일 업데이트
• 지형 파일들을 지형 파일 저장소(Git)에 커밋 & 푸시
지형 배포 절차
Git 서브모듈 업데이트
• (서버 코드 저장소)
• README
• setup.py
• lib
• k1terrains.git
• tests
• (지형 파일 저장소)
• README
• terrains
• (아까 만든 지형)
• (기존 지형 1)
• (기존 지형 2)
• tests
HEAD
지형 파일 관리에 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, 321), …
백단향 (308, 209), …
생태계 시뮬레이션
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
…
Libraries
System tools
서버 코드 지형 관리 도구Other utilities
복잡한 지형 관리 시스템 구성
지형 관리 도구 배포
지형 관리 도구 + 필요한 것들
머신 1 머신 2 머신 3 머신 n…
지형 관리 도구 배포
배포 스크립트 복잡도
배
포
할
머
신
의
수
실패할확률
배포가 쉬워야 함
• 일회용 컴퓨팅 인스턴스, 탄력적 스케일링
• 여러대의 머신에 배포
• 쉽고 신뢰성 있는 배포 방식이 필요
그렇다면 Docker를 써보자
Got Docker?
Docker의 세계에 빠져보자
Docker?
• 소프트웨어가 구동되는데 필요한 모든 것 - 코드, 런타임 환경, 시스템 도구,
라이브러리 등 - 을 담고 있는 컨테이너를 제공
• 소프트웨어 배포에 관련된 여러가지 문제를 해결
전통적인 소프트웨어 배포 방식의 문제점
• 배포 환경마다 커널 버전, 설치된 라이브러리 등 런타임 환경이 상이함
• 개발자들의 전통적인 변명 “It works on my machine!”
문제는 표준 규격의 부재
• 소프트웨어 배포 방식의 표준이라고 할만한 것이 없음

배포 스크립트, 가상 머신 이미지, Chef/Puppet, 인스톨러
• 우리가 작성하는 프로그램이 수많은 외부 환경에 의존적인 것도 문제

커널 버전, 라이브러리, 프레임워크, 인터프리터
컨테이너
물류 업계는 ‘컨테이너’라는 통일된 규격을 만들
어서 물건의 종류에 상관 없이 전세계 어디로든
배송 가능하도록 문제를 해결했는데 우리는 왜 그
렇게 하지 못할까
그래서 고안된 것이 바로 Docker
• 컨테이너 안에만 들어가면 옥수수든 아이폰이든 물건의 종류의 상관 없이 원하
는 목적지까지 보낼 수 있다
• Docker 컨테이너로 패키징 된 소프트웨어는 Docker 실행 환경이 갖추어진
곳에서는 별다른 배포, 설치 절차 없이 바로 실행할 수 있다
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
소프트웨어 배포의 일곱가지 죄악
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
Docker가 해결해줄 수 있는 문제
• 나태: 배포 스크립트 미작성
• 탐욕: 싸구려 스테이징 서버
• 식탐: 대규모 변경
• 교만: 코드를 충분히 테스트하지 않음
• 색욕: 검증되지 않았지만 매력적인 도구들
• 시기: 구성원들간 의사소통이 원활하지 않음
• 분노: 현장 디버깅
https://lwn.net/Articles/562333/
가상머신으로도 그런 문제를 해결할 수 있지 않나요?
• 격리: 하나의 호스트 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 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
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 명령어를 실행하면 - 레드썬!

마치 다른 OS로 부팅한 것 같은 느낌 (커널은 바뀌지 않음)
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/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 프로세스 안의 또 다른 세상
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
진짜 천재같은 발상이다
그럼 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 install -y (some packages)
WORKDIR /opt/k1eco
RUN pip install -e .
COPY startup.sh ./
CMD ./startup.sh
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
베이스 이미지 지정
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
관리자 지정
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
환경변수 설정
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
소프트웨어 패키지 업데이트 & 설치
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
작업 디렉토리 변경
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
명령어 수행
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
로컬 파일 복사
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 진입점 명령어 지정 (오버라이드 가능)
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
…
…
577f02323aaf 1.052 KB
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
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
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
이미지 이름만으로 실행, 암시적으로 최신 버전
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
이미지 이름과 버전을 명시해서 실행
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
데몬으로 (백그라운드에서) 실행
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
포트 매핑 & 환경 변수
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 인터랙티브 모드로 실행
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)
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)이미지 빌드가

끝나면 이 상태
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)
이미지를 실행하면

레이어가 추가됨
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/
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
39387babad77 1.327 MB
876fc4769c5a 1,894 KB
32132a7c82e9 1,994 KB
6467734fa93c 2.403 MB
이미지 1 이미지 2
서로 다르게 빌드된 이미지라도 같은 내용을 가진 레이어가 있다면 상호간 공유 가능
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/photos/oneilsh/14601920735>
EC2 Container Service (ECS)
• Docker 컨테이너들을 실행하고 관리할 수 있는 환경과 도구를 제공
• 컨테이너를 실행하기 위해서는 EC2 인스턴스가 필요
• Docker 이미지를 저장할 수 있는 레지스트리 서비스인 ECR을 제공
Container Instance
• Docker 이미지가 실행되는 가상머신
• Docker 실행 환경 + ECS 데몬
• 개별 컨테이너 인스턴스에 신경쓰지 않고 Docker 컨테이너만 실행할 수 있는
서비스였으면 좋았겠지만…

Docker 엔진의 일부 동작이 루트 권한을 요구하기 때문에 보안상의 이유로 그
렇게 하기 어렵지 않았을까 하는 추측
Cluster
• EC2 컨테이너 인스턴스를 묶는 논리적 그룹
• 한 개 이상의 EC2 인스턴스로 구성
• 각 지역마다 고유함(region-specific)
Task Definition
• Docker 컨테이너의 속성을 정의하는 JSON 문서
• CPU, 메모리 요구 사항, 포트 매핑, 저장소 마운트, 환경 변수 정의, 컨테이너
이름 지정, 다른 컨테이너와 연결 등
• 많은 경우에 Docker 이미지 ≠ 수행하고자 하는 일
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainicon.com/download-icon/50348/docker
Container
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainicon.com/download-icon/50348/docker
Container
X
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainicon.com/download-icon/50348/docker
Container
X
Task Definition
ECS
Override
• Env. variables
• Port mappings
• Command
Task Definition
Image excerpted from http://plainicon.com/download-icon/50348/docker
Container
X
Docker 이미지를 어디에 저장하지? ➔ ECR
• EC2 Container Registry
• 아마존에 의해서 관리되는(fully-managed) Docker 이미지 저장소 서비스
• 인증 절차를 제외하고는 도커 허브(Docker Hub)와 동일한 방법으로 이용
• (2016년 4월) 현재는 버지니아 지역(us-east-1)에서만 이용 가능
ECS 클러스터와 ECR이 같은 지역에 있어야 하는 줄 알았어…
그래서 도쿄-버지니아 VPC간을 연결하는 VPN 망 구성

하지만 ECS 클러스터가 버지니아 이외의 지역에 있어도 된다는 것을 나중에 깨달음
VPN
Tokyo VA
다소 먼 길을 돌아왔지만
• 미래에는 다른 지역에도 <야생의 땅: 듀랑고>를 런칭할 계획도 있으니, 지역간
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은 바이너리 파일을 다루기에 적합하지 않음
• 지형을 추가, 수정할수록 히스토리가 걷잡을 수 없이 커지는 문제
• 지형 파일 저장소를 서버 코드 저장소의 서브모듈 형태로 관리, 사용하지 않는
지형까지 모두 체크아웃
• Docker 이미지를 빌드할 때에도 모든 지형이 다 들어가기 때문에 자원 낭비

지형 관리 도구가 서버 코드를 포함하고, 서버 코드 저장소가 지형 저장소를 포함하고 있기 때문에…
Dropping Git
• 지형 관리 프로세스에서 Git을 완전히 빼기로 결정함
지형 배포 시스템 개편
• 지형 파일을 Git 저장소에 저장
• 서버 코드 저장소에서 서브모듈로 지형 저장
소를 참조
• 서버 노드마다 모든 지형 파일을 다 가지고
있음
2세대1세대
• 지형 파일을 AWS S3에 저장
• 서버 설정 파일에 저장된 지형 ID를 참조
• 실제로 사용하는 지형만 그때그때 받아옴
지형 배포 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)을 제공
• Object versioning
• Multi-regional replications ➔ high-availability
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 스트림에 데이터가 들어오거나
• CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나
Lambda
• 명시적으로 호출할 수도 있고
• AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거
• S3에 파일이 올라오거나
• DynamoDB의 레코드가 업데이트 되거나
• Kinesis 스트림에 데이터가 들어오거나
• CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나
우리는 이것을 이용
Lambda
• 여러가지 제한들
• 최대 수행 시간: 300초 (5분)
• 코드 패키지 최대 크기: 250MB
• 사용할 수 있는 디스크 공간: 512MB
• (다른 제한들도 많지만, 공간이 협소하니 자세한 내용은 AWS 문서를 참고)
• 메모리 사용량, ms 단위로 측정된 수행 시간을 기준으로 과금
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에 업로드
• S3이벤트 트리거에 의해서 자동으로 지형
배포 태스크 실행
• 처리된 지형 파일들을 S3에 저장
• 프로그래머가 필요 없음

우리의 일자리가 위험…읍읍
자동화 된 지형 파일 배포
지형 파일 올리기 지형 파일 후처리 지형 저장소에 커밋 서버 저장소 업데이트
지형 파일 올리기
지형 제작자 프로그래머 프로그래머 프로그래머
지형 제작자
지형 파일 후처리 지형 저장소에 업로드
자동화 전
자동화 후
그러던 어느날
• CI 머신에서 디스크 용량 부족 오류 메세지가 뜨기 시작
• 디스크 사용량은 50% 미만이라 당황(!)
• 알고보니 파일 개수가 많아서 사용 가능한 inode를 모두 소진
• 몇년마다 한 번씩 겪는 문제라 매번 낚임. 오류 메세지를 수정해서 리눅스 커널
패치를 보내볼까…
너무 많은 파일 개수
• 지형 개수 = 약 1,000개 (미사용 지형 포함; 베타테스트 시작 전 갑자기 많아짐)
• 지형별 파일 개수 = 지형의 크기에 따라서 1,000-400,000개
• 총 파일 개수 = 약 1,300,000
• CI가 다섯번만 돌면 inode 모두 소진
해결책: .zip으로 압축하자
• 하나의 지형당 파일 하나
• 지형 배포 코드, 서버 코드에서 지형 파일 읽어오는 부분만 재빠르게 수정
• 더이상 안 쓰는 지형 파일도 지우자
또다른 문제점: .zip 파일 성능 병목
• 파일 개수가 많다보니 .zip 파일을 열기 위해서 많은 메모리를 사용
• 파일 색인을 위한 트리 구조를 메모리에 가지고 있기 때문
해결책: 전용 포맷을 만들자
• 지형 속성별(군계, 강, 호수, 바다, 온도, 습도, 랜드마크 등) 파일 한 개
• 청크 좌표만 가지고 바로 읽어올 수 있는 고정 크기 파일
• Sparse data일때 용량 낭비가 있지만, 스토리지는 싸니까 괜찮아!
지형 파일 성능 문제는 일단 해결이 되었도다
생태계 시뮬레이션 자동화
플레이어들이 나무를 마구 베어도 걱정 없어요
Image excerpted from https://en.wikipedia.org/wiki/Computer_simulation#/media/File:Typhoon_Mawar_2005_computer_simulation_thumbnail.gif
생태계 시뮬레이션 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
Gardener
…
시스템 구조 - 주기적으로 자연 상태 파악
ECSLambda
SQS
CloudWatch Events
CloudWatch Events Lambda ECS
Parkranger
Gardener
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 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/
스팟 인스턴스를 이용한 비용 절감
• 아마존에서 미사용(unused) 컴퓨팅 자원을 싸게 파는 일종의 경매 시스템
• 수요와 공급에 따라서 가격이 실시간으로 변화
스팟 인스턴스를 이용한 비용 절감
수요와 공급에 따라서 가격이 실시간으로 변화
스팟 인스턴스를 이용한 비용 절감
• 일주일간의 테스트 기간동안 고성능 인스턴스들을 원래 가격의 15-20% 수준
에 사용
• 특정 인스턴스 타입에 지불하고자 하는 최대 가격을 제출하고 그 가격이 시장가
보다 높거나 같으면 인스턴스 사용, 시장 가격보다 낮아지면 인스턴스가 꺼짐
• 인스턴스가 꺼졌을 때 적절히 대응할 수 있는 소프트웨어 아키텍처가 필요
지형 런타임 공급
• 지형을 미리 제작하고 배포하는 것은 과도기적 해결책
• 우리의 꿈은 빌드 타임에 지형을 공급하는 것이 아니라 런타임에 공급하는 것
지형 런타임 공급
지형 1
지형 2
지형 n
서버 1
서버 2
서버 3
서버 n
…
오늘 새로운 지형을
만들어볼까?
지형 제작 도구
지형 배포 도구
지형 풀(pool) 서버 코드 업데이트 없이

필요할때마다 지형 꺼내 쓰기
오늘 못다한 이야기는
@suminb
https://linkedin.com/in/suminb
suminb@nexon.co.kr
감사합니다
다음에 또 만나요

More Related Content

What's hot

위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점Ryan Park
 
게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해Seungmo Koo
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들MinGeun Park
 
이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017
이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017
이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017devCAT Studio, NEXON
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀승명 양
 
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇKieun Jang
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011devCAT Studio, NEXON
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018devCAT Studio, NEXON
 
스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나
스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나
스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나Lee Sangkyoon (Kay)
 
도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012
도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012
도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012Woojin Do
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception상현 조
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013devCAT Studio, NEXON
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012devCAT Studio, NEXON
 
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012devCAT Studio, NEXON
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기iFunFactory Inc.
 
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해Seungmo Koo
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건강 민우
 
스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들Hyunjik Bae
 
쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다Jinho Jung
 

What's hot (20)

위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
 
게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해게임제작개론: #1 게임 구성 요소의 이해
게임제작개론: #1 게임 구성 요소의 이해
 
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
[KGC2011_박민근] 신입 게임 개발자가 알아야 할 것들
 
이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017
이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017
이승재, 일정대로 출시하기 왜 & 어떻게: 개발자를 위한 제작진행개론, NDC2017
 
NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀NDC 11 자이언트 서버의 비밀
NDC 11 자이언트 서버의 비밀
 
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
[NDC2019] 전소현&장기은 - 시나리오 기획자는 대사만 잘쓰면 되는 거 아닌가요? ㅇㅅㅇ
 
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
김동건, 구세대 개발자의 신세대 플레이어를 위한 게임 만들기, NDC2011
 
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
전형규, 좋은 이름, 나쁜 이름, 이상한 이름, NDC2018
 
스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나
스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나
스토리텔링과 비주얼 내러티브: 놀 치프틴은 어떻게 형님이 되었나
 
도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012
도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012
도우진&김영수, 게임잼 운영과 게이미피케이션, NDC2012
 
게임강연정리
게임강연정리게임강연정리
게임강연정리
 
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with ExceptionGCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
GCGC- CGCII 서버 엔진에 적용된 기술 (5) - Executor with Exception
 
임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013임태현, 게임 서버 디자인 가이드, NDC2013
임태현, 게임 서버 디자인 가이드, NDC2013
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
최은영, 아티스트가 기획을 - 하이브리드의 길 Ver.1, NDC 2012
 
게임 서버 성능 분석하기
게임 서버 성능 분석하기게임 서버 성능 분석하기
게임 서버 성능 분석하기
 
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
게임제작개론 : #7 팀 역할과 게임 리소스에 대한 이해
 
마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건마비노기듀얼 이야기-넥슨 김동건
마비노기듀얼 이야기-넥슨 김동건
 
스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들스마트폰 온라인 게임에서 고려해야 할 것들
스마트폰 온라인 게임에서 고려해야 할 것들
 
쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다쩌는게임기획서 이렇게 쓴다
쩌는게임기획서 이렇게 쓴다
 

Viewers also liked

PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]Sumin Byeon
 
Deep learning as_WaveExtractor
Deep learning as_WaveExtractorDeep learning as_WaveExtractor
Deep learning as_WaveExtractor동윤 이
 
Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4동석 김
 
Luigi presentation NYC Data Science
Luigi presentation NYC Data ScienceLuigi presentation NYC Data Science
Luigi presentation NYC Data ScienceErik Bernhardsson
 
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Heungsub Lee
 
게임회사 취업을 위한 현실적인 전략 3가지
게임회사 취업을 위한 현실적인 전략 3가지게임회사 취업을 위한 현실적인 전략 3가지
게임회사 취업을 위한 현실적인 전략 3가지Harns (Nak-Hyoung) Kim
 
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출동윤 이
 
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임Imseong Kang
 
김병관 성공캠프 SNS팀 자원봉사 후기
김병관 성공캠프 SNS팀 자원봉사 후기김병관 성공캠프 SNS팀 자원봉사 후기
김병관 성공캠프 SNS팀 자원봉사 후기Harns (Nak-Hyoung) Kim
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012Esun Kim
 
Approximate nearest neighbor methods and vector models – NYC ML meetup
Approximate nearest neighbor methods and vector models – NYC ML meetupApproximate nearest neighbor methods and vector models – NYC ML meetup
Approximate nearest neighbor methods and vector models – NYC ML meetupErik Bernhardsson
 
8년동안 테라에서 배운 8가지 교훈
8년동안 테라에서 배운 8가지 교훈8년동안 테라에서 배운 8가지 교훈
8년동안 테라에서 배운 8가지 교훈Harns (Nak-Hyoung) Kim
 
Behavior Tree in Unreal engine 4
Behavior Tree in Unreal engine 4Behavior Tree in Unreal engine 4
Behavior Tree in Unreal engine 4Huey Park
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다Lee Dustin
 
NDC16 스매싱더배틀 1년간의 개발일지
NDC16 스매싱더배틀 1년간의 개발일지NDC16 스매싱더배틀 1년간의 개발일지
NDC16 스매싱더배틀 1년간의 개발일지Daehoon Han
 
Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발Chris Ohk
 
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Developing Success in Mobile with Unreal Engine 4 | David StelzerDeveloping Success in Mobile with Unreal Engine 4 | David Stelzer
Developing Success in Mobile with Unreal Engine 4 | David StelzerJessica Tams
 
Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Esun Kim
 
버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션동석 김
 

Viewers also liked (20)

PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
PyCon 2017 프로그래머가 이사하는 법 2 [천원경매]
 
Deep learning as_WaveExtractor
Deep learning as_WaveExtractorDeep learning as_WaveExtractor
Deep learning as_WaveExtractor
 
Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4Custom fabric shader for unreal engine 4
Custom fabric shader for unreal engine 4
 
Luigi presentation NYC Data Science
Luigi presentation NYC Data ScienceLuigi presentation NYC Data Science
Luigi presentation NYC Data Science
 
Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러Profiling - 실시간 대화식 프로파일러
Profiling - 실시간 대화식 프로파일러
 
게임회사 취업을 위한 현실적인 전략 3가지
게임회사 취업을 위한 현실적인 전략 3가지게임회사 취업을 위한 현실적인 전략 3가지
게임회사 취업을 위한 현실적인 전략 3가지
 
영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출영상 데이터의 처리와 정보의 추출
영상 데이터의 처리와 정보의 추출
 
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
NDC17 게임 디자이너 커리어 포스트모템: 8년, 3개의 회사, 4개의 게임
 
Docker
DockerDocker
Docker
 
김병관 성공캠프 SNS팀 자원봉사 후기
김병관 성공캠프 SNS팀 자원봉사 후기김병관 성공캠프 SNS팀 자원봉사 후기
김병관 성공캠프 SNS팀 자원봉사 후기
 
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
자동화된 소스 분석, 처리, 검증을 통한 소스의 불필요한 #if - #endif 제거하기 NDC2012
 
Approximate nearest neighbor methods and vector models – NYC ML meetup
Approximate nearest neighbor methods and vector models – NYC ML meetupApproximate nearest neighbor methods and vector models – NYC ML meetup
Approximate nearest neighbor methods and vector models – NYC ML meetup
 
8년동안 테라에서 배운 8가지 교훈
8년동안 테라에서 배운 8가지 교훈8년동안 테라에서 배운 8가지 교훈
8년동안 테라에서 배운 8가지 교훈
 
Behavior Tree in Unreal engine 4
Behavior Tree in Unreal engine 4Behavior Tree in Unreal engine 4
Behavior Tree in Unreal engine 4
 
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다레퍼런스만 알면 언리얼 엔진이 제대로 보인다
레퍼런스만 알면 언리얼 엔진이 제대로 보인다
 
NDC16 스매싱더배틀 1년간의 개발일지
NDC16 스매싱더배틀 1년간의 개발일지NDC16 스매싱더배틀 1년간의 개발일지
NDC16 스매싱더배틀 1년간의 개발일지
 
Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발Re:Zero부터 시작하지 않는 오픈소스 개발
Re:Zero부터 시작하지 않는 오픈소스 개발
 
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
Developing Success in Mobile with Unreal Engine 4 | David StelzerDeveloping Success in Mobile with Unreal Engine 4 | David Stelzer
Developing Success in Mobile with Unreal Engine 4 | David Stelzer
 
Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)Online game server on Akka.NET (NDC2016)
Online game server on Akka.NET (NDC2016)
 
버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션버텍스 셰이더로 하는 머리카락 애니메이션
버텍스 셰이더로 하는 머리카락 애니메이션
 

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

Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기iFunFactory Inc.
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발Jeongkyu Shin
 
Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4
Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4
Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4Sangcheol Hwang
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기SeungYong Oh
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기Chanwoong Kim
 
Bon voyage Docker_Kubernetes
Bon voyage Docker_KubernetesBon voyage Docker_Kubernetes
Bon voyage Docker_Kubernetesssuseraada82
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AIJoongi Kim
 
오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼Kenu, GwangNam Heo
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호용호 최
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)Sang Don Kim
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례Jeongsang Baek
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래NAVER D2
 
Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Changyeop Kim
 
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라MinKyu Kim
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019devCAT Studio, NEXON
 
Docker와 DevOps에서 Serverless와 NoOps로의 여정
Docker와 DevOps에서 Serverless와 NoOps로의 여정Docker와 DevOps에서 Serverless와 NoOps로의 여정
Docker와 DevOps에서 Serverless와 NoOps로의 여정Kyuhyun Byun
 
삶이편해지는_백엔드_개발자_지식.pdf
삶이편해지는_백엔드_개발자_지식.pdf삶이편해지는_백엔드_개발자_지식.pdf
삶이편해지는_백엔드_개발자_지식.pdfSeung kyoo Park
 

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

Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기Docker 로 Linux 없이 Linux 환경에서 개발하기
Docker 로 Linux 없이 Linux 환경에서 개발하기
 
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
머신러닝 및 데이터 과학 연구자를 위한 python 기반 컨테이너 분산처리 플랫폼 설계 및 개발
 
Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4
Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4
Tech planet 2015 Docker 클라우드 구축 프로젝트 - d4
 
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기[NDC17] Kubernetes로 개발서버 간단히 찍어내기
[NDC17] Kubernetes로 개발서버 간단히 찍어내기
 
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
[NDC18] 만들고 붓고 부수고 - 〈야생의 땅: 듀랑고〉 서버 관리 배포 이야기
 
Bon voyage Docker_Kubernetes
Bon voyage Docker_KubernetesBon voyage Docker_Kubernetes
Bon voyage Docker_Kubernetes
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
Docker osc 0508
Docker osc 0508Docker osc 0508
Docker osc 0508
 
SOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AISOSCON 2017 - Backend.AI
SOSCON 2017 - Backend.AI
 
오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼오픈 소스 사용 매뉴얼
오픈 소스 사용 매뉴얼
 
Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호Docker & Kubernetes 기초 - 최용호
Docker & Kubernetes 기초 - 최용호
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
[TD 2015] windows server에서 만나보는 docker와 windows container(최한홍)
 
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
(GameTech2015) Live Operation by Adbrix의 Node.js와 MongoDB를 이용한 멀티테넌트 인프라 구축사례
 
[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래[1A6]Docker로 보는 서버 운영의 미래
[1A6]Docker로 보는 서버 운영의 미래
 
Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기Kubernetes를 통한 laravel 개발프로세스 개선하기
Kubernetes를 통한 laravel 개발프로세스 개선하기
 
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
Packer, Terraform, Vault를 이용해 만드는 
재현 가능한 게임 인프라
 
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
전형규, SilvervineUE4Lua: UE4에서 Lua 사용하기, NDC2019
 
Docker와 DevOps에서 Serverless와 NoOps로의 여정
Docker와 DevOps에서 Serverless와 NoOps로의 여정Docker와 DevOps에서 Serverless와 NoOps로의 여정
Docker와 DevOps에서 Serverless와 NoOps로의 여정
 
삶이편해지는_백엔드_개발자_지식.pdf
삶이편해지는_백엔드_개발자_지식.pdf삶이편해지는_백엔드_개발자_지식.pdf
삶이편해지는_백엔드_개발자_지식.pdf
 

More from Sumin Byeon

BD Talk 2017 봄 - 원정코딩
BD Talk 2017 봄 - 원정코딩BD Talk 2017 봄 - 원정코딩
BD Talk 2017 봄 - 원정코딩Sumin Byeon
 
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법Sumin Byeon
 
Are Credit Cards Evil
Are Credit Cards EvilAre Credit Cards Evil
Are Credit Cards EvilSumin Byeon
 
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법Sumin Byeon
 
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가Sumin Byeon
 
2015 PyCon - 프로그래머가 이사하는 법
2015 PyCon - 프로그래머가 이사하는 법2015 PyCon - 프로그래머가 이사하는 법
2015 PyCon - 프로그래머가 이사하는 법Sumin Byeon
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담Sumin Byeon
 
Cross-Language Information Retrieval
Cross-Language Information RetrievalCross-Language Information Retrieval
Cross-Language Information RetrievalSumin Byeon
 
SLINKY: Static Linking Reloaded
SLINKY: Static Linking ReloadedSLINKY: Static Linking Reloaded
SLINKY: Static Linking ReloadedSumin Byeon
 
Project Proposal: Translation Example Search Engine
Project Proposal: Translation Example Search EngineProject Proposal: Translation Example Search Engine
Project Proposal: Translation Example Search EngineSumin Byeon
 
Self-Tuning Wireless Network Power Management
Self-Tuning Wireless Network Power ManagementSelf-Tuning Wireless Network Power Management
Self-Tuning Wireless Network Power ManagementSumin Byeon
 
Error tolerant search
Error tolerant searchError tolerant search
Error tolerant searchSumin Byeon
 
Git with bitbucket
Git with bitbucketGit with bitbucket
Git with bitbucketSumin Byeon
 
Git with bitbucket (draft)
Git with bitbucket (draft)Git with bitbucket (draft)
Git with bitbucket (draft)Sumin Byeon
 
RNA Secondary Structure Prediction
RNA Secondary Structure PredictionRNA Secondary Structure Prediction
RNA Secondary Structure PredictionSumin Byeon
 

More from Sumin Byeon (15)

BD Talk 2017 봄 - 원정코딩
BD Talk 2017 봄 - 원정코딩BD Talk 2017 봄 - 원정코딩
BD Talk 2017 봄 - 원정코딩
 
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
NDC 2017 마이크로토크 - 프로그래머가 뉴스 읽는 법
 
Are Credit Cards Evil
Are Credit Cards EvilAre Credit Cards Evil
Are Credit Cards Evil
 
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
NDC 2016 마이크로토크 - 프로그래머가 투자하는 법
 
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
더 나은 번역기는 나의 삶을 어떻게 바꾸었는가
 
2015 PyCon - 프로그래머가 이사하는 법
2015 PyCon - 프로그래머가 이사하는 법2015 PyCon - 프로그래머가 이사하는 법
2015 PyCon - 프로그래머가 이사하는 법
 
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
[야생의 땅: 듀랑고]의 식물 생태계를 담당하는 21세기 정원사의 OpenCL 경험담
 
Cross-Language Information Retrieval
Cross-Language Information RetrievalCross-Language Information Retrieval
Cross-Language Information Retrieval
 
SLINKY: Static Linking Reloaded
SLINKY: Static Linking ReloadedSLINKY: Static Linking Reloaded
SLINKY: Static Linking Reloaded
 
Project Proposal: Translation Example Search Engine
Project Proposal: Translation Example Search EngineProject Proposal: Translation Example Search Engine
Project Proposal: Translation Example Search Engine
 
Self-Tuning Wireless Network Power Management
Self-Tuning Wireless Network Power ManagementSelf-Tuning Wireless Network Power Management
Self-Tuning Wireless Network Power Management
 
Error tolerant search
Error tolerant searchError tolerant search
Error tolerant search
 
Git with bitbucket
Git with bitbucketGit with bitbucket
Git with bitbucket
 
Git with bitbucket (draft)
Git with bitbucket (draft)Git with bitbucket (draft)
Git with bitbucket (draft)
 
RNA Secondary Structure Prediction
RNA Secondary Structure PredictionRNA Secondary Structure Prediction
RNA Secondary Structure Prediction
 

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

  • 1. <야생의 땅: 듀랑고> 지형 관리 완전 자동화 생생한 AWS와 Docker 체험기 넥슨코리아 변수민
  • 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. 듀랑고 서버 개발자는 무슨 일을 할까요? 지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런 스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터 검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집 및 관리, 채팅방, 데이터베이스, 동기화, …
  • 4. 듀랑고 서버 개발자는 무슨 일을 할까요? 지형 배포, 전투 개선, 국제화, 블록 건축, 사유지 작업, 레벨 디자인, 거시적 밸런 스, 동물 배치, 생태계 시뮬레이션, 생활 컨텐츠 개선, 아이템 시스템 개선, 장터 검색, 화폐 시스템, 함정, 운영툴, 보안 관련 작업, 네트워크 기반 작업, 로그 수집 및 관리, 채팅방, 데이터베이스, 동기화, … 그 중에 제가 맡고 있는건 이정도…?
  • 5. 듀랑고 지형 통계 • 2차 LBT 참여자 수 = 6,937명 • 테스트 기간동안 발견된 섬의 수 = 836개 • 인구가 가장 많은 섬 = 플레밍 우랄맥 (504명)
  • 6. 지형 자동 생성 • 이번에 준비한 지형 개수 = 약 300개 • 지형을 수작업으로 만드는 것이 아니라 자동으로 생성하기 때문에 가능한 일
  • 7. 섬? 지형? 지형 + = 지질, 온도, 습도, 호수, 강, 바다, 식물 배치 섬 세부 사항
 (섬 생성시 자동 결정)
  • 8. 섬? 지형? 지형 + = 지질, 온도, 습도, 호수, 강, 바다, 식물 배치 섬 세부 사항
 (섬 생성시 자동 결정)
  • 9. 문제점: 지형 관리 병목 • (지형 스냅샷 작업중…) • “수민님, 지형 배포 해주세요”
  • 10. 문제점: 지형 관리 병목 • (장터 검색 기능 작업중…) • “수민님, 무슨무슨 섬에 생태계 시뮬레이션 돌려주세요”
  • 11. 그러다보니 다른 작업에 집중하기 어려움
  • 12. 해결책: 자동화를 하자 • 도전 과제는 크게 두 가지 • 지형 배포 - 지형 배포 자동화 • 자연물 관리 - 자연 상태 파악, 생태계 시뮬레이션 자동화
  • 13. 오늘 이야기 할 내용들 • <야생의 땅: 듀랑고>의 지형 제작과 배포, 생태계 시뮬레이션 • 지형 관리 자동화 과정에서 겪었던 문제들을 아마존 웹 서비스(AWS)와 Docker를 이용해서 해결한 이야기
  • 14. 지형 제작과 배포 과정 <야생의 땅: 듀랑고>의 지형은 어떻게 만들어질까?
  • 15. 지형 제작 & 배포 개요 • 전용 도구로 지형 파일들을 제작 • 여러가지 후처리를 거친 후 • 지형 파일을 Git 저장소에 올리고 • 서버 코드에서 해당 커밋을 참조하도록 변경
  • 16. 지형 제작 & 배포 도구 • WorldGen: 지형 파일 제작, C#으로 작성됨 • 지형 관리 도구: 지형 배포 및 관리에 필요한 기능을 제공, Python으로 작성됨
  • 17. 지형 관리 도구를 따로 만든 이유는 • 서버 코드가 파이썬으로 작성 되어있고 • 지형을 배포할 때 서버 코드를 그대로 이용하는 부분이 있기 때문 • 월드젠은 서버 코드와는 별개로 지형 파일만 제작
  • 18. 지형 배포 절차 지형 제작 도구 ‘월드젠’을 이용하여 지형을 제작
  • 19. 지형 배포 절차 청크별 빠른 색인을 위해 여러가지 지형 정보들을 청크별로 나눔
  • 20. 좌표 시스템 • cm 단위의 좌표: 동물의 위치 등 섬세한 위치 조정에 사용 • 타일(tile): 가로 세로 2m의 정사각형 ➔ 자연물, 건축물 등의 최소 단위 • 청크(chunk): 16x16 타일 ➔ pub-sub 토픽, 분산의 최소 단위
  • 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. 자연물? 자연물 = 식물, 광물, 기타 채집 가능한 것
  • 23. 지형 배포 절차 자동화된 검수 과정을 거침 assert x == y assert z == w assert essential_files_exist() assert terrain_contains_this_and_that() assert validate_chunked_tiles()
  • 24. 지형 배포 절차 • 지형 색인 파일 업데이트 • 지형 파일들을 지형 파일 저장소(Git)에 커밋 & 푸시
  • 25. 지형 배포 절차 Git 서브모듈 업데이트 • (서버 코드 저장소) • README • setup.py • lib • k1terrains.git • tests • (지형 파일 저장소) • README • terrains • (아까 만든 지형) • (기존 지형 1) • (기존 지형 2) • tests HEAD
  • 26. 지형 파일 관리에 Git을 쓰는 이유? 버전 1 지형 1 서버 저장소 지형 저장소 지형 2 지형 3 버전 1 지형 1 서버 저장소 지형 저장소 지형 2 지형 3 버전 2 지형 4 서버 코드와 함께 버전 관리를 하기 위함 없어진 지형을 참조하는 것을 방지
  • 27. 지형 파일 관리에 Git을 쓰는 이유? • 입사 전에 이미 만들어진 시스템이라 지형 파일을 Git으로 관리하는 것에 대한 별다른 의문을 가지지 않았지만 • 의문을 가져야 했었다
  • 28. 지형 배포 절차 • 복잡해보이지만 대부분 스크립트로 만들어 놓음 • 하지만 프로그래머가 아닌 사람이 보기엔 여전히 장벽이 높음
 이 부분에 대한 고민도 했어야…
  • 30. 플레이어들은 항상 무언가를 채집 벌목당한 숲울창한 나무 숲
  • 31. 훼손 상태를 파악 섬의 최초 상태와 비교하여 부족한 자연물의 종류와 수량을 파악
  • 32. 자연물 보충 훼손 상태가 임계점을 넘을 경우 필요한 자연물 종류와 개수를 생태계 시뮬레이터에 전달 지형 관리 도구 Ecosystem Simulator 산딸기 5 깃털나무 13 멀구슬나무 4 백단향 3 Manifest
  • 33. 자연물 보충 지형 관리 도구 Ecosystem Simulator 산딸기 5 깃털나무 13 멀구슬나무 4 백단향 3 산딸기 (132, 39), (133, 38), … 깃털나무 (88, 255), … 멀구슬나무 (187, 321), … 백단향 (308, 209), …
  • 34. 생태계 시뮬레이션 Frontend node 1 Frontend node 2 Frontend node n 서버 클러스터 … Ecosystem Simulator 지형 관리 도구 로컬 머신 데이터베이스
  • 35. 지형 관리 자동화 요구조건 • 고성능 계산 능력이 필요 • 플레이어의 행동에 따라 실행 주기, 작업 규모가 달라질 수 있음 • 여러대의 머신에서 동시에 실행될 수 있고 • 자유로운 스케일 아웃(scale-out)
  • 36. 지형 관리 시스템에 필요한 것들 Ubuntu Linux .NET runtime (mono) Python runtime Python package 1 Python package 2 Python package n … Libraries System tools 서버 코드 지형 관리 도구Other utilities 복잡한 지형 관리 시스템 구성
  • 37. 지형 관리 도구 배포 지형 관리 도구 + 필요한 것들 머신 1 머신 2 머신 3 머신 n…
  • 38. 지형 관리 도구 배포 배포 스크립트 복잡도 배 포 할 머 신 의 수 실패할확률
  • 39. 배포가 쉬워야 함 • 일회용 컴퓨팅 인스턴스, 탄력적 스케일링 • 여러대의 머신에 배포 • 쉽고 신뢰성 있는 배포 방식이 필요
  • 42. Docker? • 소프트웨어가 구동되는데 필요한 모든 것 - 코드, 런타임 환경, 시스템 도구, 라이브러리 등 - 을 담고 있는 컨테이너를 제공 • 소프트웨어 배포에 관련된 여러가지 문제를 해결
  • 43. 전통적인 소프트웨어 배포 방식의 문제점 • 배포 환경마다 커널 버전, 설치된 라이브러리 등 런타임 환경이 상이함 • 개발자들의 전통적인 변명 “It works on my machine!”
  • 44. 문제는 표준 규격의 부재 • 소프트웨어 배포 방식의 표준이라고 할만한 것이 없음
 배포 스크립트, 가상 머신 이미지, Chef/Puppet, 인스톨러 • 우리가 작성하는 프로그램이 수많은 외부 환경에 의존적인 것도 문제
 커널 버전, 라이브러리, 프레임워크, 인터프리터
  • 45. 컨테이너 물류 업계는 ‘컨테이너’라는 통일된 규격을 만들 어서 물건의 종류에 상관 없이 전세계 어디로든 배송 가능하도록 문제를 해결했는데 우리는 왜 그 렇게 하지 못할까
  • 46. 그래서 고안된 것이 바로 Docker • 컨테이너 안에만 들어가면 옥수수든 아이폰이든 물건의 종류의 상관 없이 원하 는 목적지까지 보낼 수 있다 • Docker 컨테이너로 패키징 된 소프트웨어는 Docker 실행 환경이 갖추어진 곳에서는 별다른 배포, 설치 절차 없이 바로 실행할 수 있다
  • 47. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 48. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 49. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 50. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 51. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 52. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 53. 소프트웨어 배포의 일곱가지 죄악 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 54. Docker가 해결해줄 수 있는 문제 • 나태: 배포 스크립트 미작성 • 탐욕: 싸구려 스테이징 서버 • 식탐: 대규모 변경 • 교만: 코드를 충분히 테스트하지 않음 • 색욕: 검증되지 않았지만 매력적인 도구들 • 시기: 구성원들간 의사소통이 원활하지 않음 • 분노: 현장 디버깅 https://lwn.net/Articles/562333/
  • 55. 가상머신으로도 그런 문제를 해결할 수 있지 않나요? • 격리: 하나의 호스트 OS에서 여러개의 게스트 OS를 실행하더라도 개별 게스 트 OS 안에서 보기엔 독립된 머신처럼 보임 • 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수 있음
  • 56. Docker의 장점 • 격리: 하나의 호스트에서 여러개의 Docker 컨테이너를 실행하더라도 개별 컨 테이너 안에서 보기엔 독립된 머신처럼 보임 • 자급자족성: 코드가 실행되는데 필요한 모든 조건을 미리 갖추고 있을 수 있음 • 자원 효율성: 각 컨테이너마다 커널을 따로 띄울 필요가 없음
  • 57. Docker의 장점 Virtual Machines Docker Containers Images excerpted from https://www.docker.com/what-docker 이렇게 각 게스트 OS를 실행하기 위해서 낭비되는 자원이 없음
  • 58. Docker의 장점 • 같은 성능의 호스트 머신이라도 더 많은 컨테이너를 띄울 수 있음 • 실제로 테스트 기간동안 하나의 머신에 수십개의 컨테이너를 띄우기도 했음
  • 59. Docker의 비밀 • 가상머신 없이 컨테이너마다 다른 환경을 갖출 수 있다니, 어떻게? • 그 비밀은 바로 chroot
  • 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
  • 62. chroot 임의의 디렉토리 안쪽에
 리눅스 시스템을 구성하는 파일들을 넣고 / /bin /boot /dev /etc /home /home/anotherworld /bin /boot /dev /etc …
  • 63. chroot / /bin /boot /dev /etc /home /home/anotherworld /bin /boot /dev /etc … chroot /home/anotherworld 명령어를 실행하면 - 레드썬!
 마치 다른 OS로 부팅한 것 같은 느낌 (커널은 바뀌지 않음)
  • 66. chroot chroot /home/anotherworld /home/anotherworld/bin/bash 새로운 루트 디렉토리 루트 디렉토리가 변경될 때
 실행될 명령어
 (생략 하면 현재 쉘)
  • 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. 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
  • 70. 그럼 Docker 컨테이너는 어떻게 만드나요?
  • 71. Dockerfile • Docker 이미지를 빌드하는 절차를 명시한 파일 • 명령어 하나당 레이어 하나 • 레이어를 쌓아 올리는 방식 - 재사용성 • 재현성 보장 (guaranteed repeatability)
  • 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. 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. 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. 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. 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. 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. 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. 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. 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 진입점 명령어 지정 (오버라이드 가능)
  • 82. Building a Docker Image • docker build /opt/docker-image Dockerfile이 있는 디렉토리
  • 83. Building a Docker Image • docker build /opt/docker-image • docker build -t ${저장소 주소}/k1eco-complete . Dockerfile이 있는 디렉토리 이미지 태그
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Storage Drivers Docker는 다양항 종류의 스토리지 드라이버를 제공 잘 모르겠으면 그냥 기본값으로 되어있는걸 쓰자
  • 97. Content Addressability 876fc4769c5a 1,894 KB File contents Cryptographic hash function
  • 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. Dockerizing • 애플리케이션이 Docker 환경에서 실행될 수 있도록 하는 일 • 입력은 환경 변수로 받고, 출력은 표준 출력으로
 (필수는 아니지만 이렇게 하면 일이 여러가지로 쉬워짐) • 포트 매핑
  • 100. 우리가 빌드한 Docker 이미지들 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete
  • 101. 우리가 빌드한 Docker 이미지들 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete CI
  • 102. 우리가 빌드한 Docker 이미지들 지형 관리 도구 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete CI
  • 103. 우리가 빌드한 Docker 이미지들 지형 관리 도구 런타임 환경 k1eco-base 런타임 환경 지형 관리 도구 k1eco-complete CI
  • 104. 로컬 개발 환경 • 로컬 개발 환경은 갖추어졌다 • 프로덕션 런타임 환경은? • Docker 이미지는 어디에 저장하지?
  • 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. EC2 Container Service (ECS) • Docker 컨테이너들을 실행하고 관리할 수 있는 환경과 도구를 제공 • 컨테이너를 실행하기 위해서는 EC2 인스턴스가 필요 • Docker 이미지를 저장할 수 있는 레지스트리 서비스인 ECR을 제공
  • 107. Container Instance • Docker 이미지가 실행되는 가상머신 • Docker 실행 환경 + ECS 데몬 • 개별 컨테이너 인스턴스에 신경쓰지 않고 Docker 컨테이너만 실행할 수 있는 서비스였으면 좋았겠지만…
 Docker 엔진의 일부 동작이 루트 권한을 요구하기 때문에 보안상의 이유로 그 렇게 하기 어렵지 않았을까 하는 추측
  • 108. Cluster • EC2 컨테이너 인스턴스를 묶는 논리적 그룹 • 한 개 이상의 EC2 인스턴스로 구성 • 각 지역마다 고유함(region-specific)
  • 109. Task Definition • Docker 컨테이너의 속성을 정의하는 JSON 문서 • CPU, 메모리 요구 사항, 포트 매핑, 저장소 마운트, 환경 변수 정의, 컨테이너 이름 지정, 다른 컨테이너와 연결 등 • 많은 경우에 Docker 이미지 ≠ 수행하고자 하는 일
  • 110. Task Definition ECS Override • Env. variables • Port mappings • Command Task Definition Image excerpted from http://plainicon.com/download-icon/50348/docker Container
  • 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. Task Definition ECS Override • Env. variables • Port mappings • Command Task Definition Image excerpted from http://plainicon.com/download-icon/50348/docker Container X
  • 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. Docker 이미지를 어디에 저장하지? ➔ ECR • EC2 Container Registry • 아마존에 의해서 관리되는(fully-managed) Docker 이미지 저장소 서비스 • 인증 절차를 제외하고는 도커 허브(Docker Hub)와 동일한 방법으로 이용 • (2016년 4월) 현재는 버지니아 지역(us-east-1)에서만 이용 가능
  • 115. ECS 클러스터와 ECR이 같은 지역에 있어야 하는 줄 알았어… 그래서 도쿄-버지니아 VPC간을 연결하는 VPN 망 구성
 하지만 ECS 클러스터가 버지니아 이외의 지역에 있어도 된다는 것을 나중에 깨달음 VPN Tokyo VA
  • 116. 다소 먼 길을 돌아왔지만 • 미래에는 다른 지역에도 <야생의 땅: 듀랑고>를 런칭할 계획도 있으니, 지역간 VPN 구축 작업이 시간 낭비는 아니었음
  • 117. 어부지리로 비용 절감 • c4.xlarge, 온-디맨드 인스턴스 기준 • 도쿄: $0.265/hr • 버지니아: $0.209/hr • 27% 차이
  • 118. 어부지리로 비용 절감 • 일주일간의 베타 테스트 기간동안 다양한 타입의 인스턴스를 켜놓았는데 • c4.xlarge 기준으로 인스턴스당 $9.408 절약 (1년이면 $491)
  • 119. AWS 비용 구조 > >Networking Computations Storage
  • 120. Resource Utilizations Networking Computations Storage 생태계 시뮬레이션을 담당하는 ECS 클러스터의 경우
  • 121. 지형 배포 자동화 환경이 갖추어졌으니 이제 진짜 일을 시작해볼까
  • 122. 지형 배포 Recap • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 Git 저장소에 커밋 & 푸시 • 서버 코드 저장소에도 반영
  • 123. 지형 배포 Recap • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 Git 저장소에 커밋 & 푸시 • 서버 코드 저장소에도 반영 이 부분을 좀 개선할 수는 없을까
  • 124. We’ve been abusing Git • Git은 바이너리 파일을 다루기에 적합하지 않음 • 지형을 추가, 수정할수록 히스토리가 걷잡을 수 없이 커지는 문제 • 지형 파일 저장소를 서버 코드 저장소의 서브모듈 형태로 관리, 사용하지 않는 지형까지 모두 체크아웃 • Docker 이미지를 빌드할 때에도 모든 지형이 다 들어가기 때문에 자원 낭비
 지형 관리 도구가 서버 코드를 포함하고, 서버 코드 저장소가 지형 저장소를 포함하고 있기 때문에…
  • 125. Dropping Git • 지형 관리 프로세스에서 Git을 완전히 빼기로 결정함
  • 126. 지형 배포 시스템 개편 • 지형 파일을 Git 저장소에 저장 • 서버 코드 저장소에서 서브모듈로 지형 저장 소를 참조 • 서버 노드마다 모든 지형 파일을 다 가지고 있음 2세대1세대 • 지형 파일을 AWS S3에 저장 • 서버 설정 파일에 저장된 지형 ID를 참조 • 실제로 사용하는 지형만 그때그때 받아옴
  • 127. 지형 배포 2세대 • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 지형 저장소(S3)에 올리기 • 서버 코드 저장소에도 반영
  • 128. 지형 배포 2세대 • 지형 데이터 생성 • 지형 파일 후처리 • 지형 파일을 지형 저장소(S3)에 올리기 • 서버 코드 저장소에도 반영 이 과정을 자동화
  • 129. 지형 배포 자동화 시스템 지형 파일
  • 130. 지형 배포 자동화 시스템 S3 지형 파일
  • 131. 지형 배포 자동화 시스템 S3 Lambda SQS 지형 파일
  • 132. 지형 배포 자동화 시스템 ECS S3 Lambda SQS 지형 파일 지형 배포
  • 133. 지형 배포 자동화 시스템 ECS S3 Lambda SQS 지형 파일 지형 배포
  • 134. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  • 135. 잠깐! • S3? • Lambda? • SQS? • CloudWatch?
  • 136. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  • 137. Simple Storage Service (S3) • 오브젝트 스토리지 • 주로 파일을 저장하는데 사용 • 상당수의 POSIX 파일시스템 시맨틱을 제공하지는 않지만,
 높은 확장성(scalability)을 제공 • Object versioning • Multi-regional replications ➔ high-availability
  • 138. Simple Storage Service (S3) .whl S3 지형 파일 에셋 파일 .zip 로그 파일
  • 139. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  • 140. Lambda • (사용자가 따로 서버를 마련하지 않고) AWS의 기반 시설에서 코드를 수행할 수 있는 서비스 • Java 8, Node.js 0.10, Node.js 4.3, Python 2.7
  • 141. Lambda • 명시적으로 호출할 수도 있고 • AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거 • S3에 파일이 올라오거나 • DynamoDB의 레코드가 업데이트 되거나 • Kinesis 스트림에 데이터가 들어오거나 • CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나
  • 142. Lambda • 명시적으로 호출할 수도 있고 • AWS의 다른 서비스에서 어떤 이벤트가 발생했을 때 트리거 • S3에 파일이 올라오거나 • DynamoDB의 레코드가 업데이트 되거나 • Kinesis 스트림에 데이터가 들어오거나 • CloudWatch Event에서 특정 시간마다 이벤트를 발생시키거나 우리는 이것을 이용
  • 143. Lambda • 여러가지 제한들 • 최대 수행 시간: 300초 (5분) • 코드 패키지 최대 크기: 250MB • 사용할 수 있는 디스크 공간: 512MB • (다른 제한들도 많지만, 공간이 협소하니 자세한 내용은 AWS 문서를 참고) • 메모리 사용량, ms 단위로 측정된 수행 시간을 기준으로 과금
  • 144. Lambda • 오래 걸리거나 자원 사용량이 많은 코드 (X) • Lambda에서 직접 처리하는 대신 ECS 태스크를 띄우기 (O)
  • 145. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  • 146. Simple Queue Service (SQS) • 분산 메세지 큐 서비스 • 신뢰성 있는 메세지 전달 보장 • 높은 확장성(scalability), 높은 가용성(availability)
  • 147. Simple Queue Service (SQS) Producer ConsumerB U F F E R 0 Producer Producer Consumer Consumer
  • 148. 지형 배포 자동화 시스템 CloudWatch ECS S3 Lambda SQS 지형 파일 지형 배포
  • 149. CloudWatch • AWS의 여러가지 자원을 모니터링 할 수 있는 서비스 • 각 서비스에 대한 여러가지 지표(metrics)들을 제공,
 사용자 정의 지표도 가능 • 로그 수집, 알람 기능
  • 150. 자동화 된 지형 파일 배포 • 로컬 가상머신에 지형 파일을 준비 • 지형 배포 명령어를 수동으로 수행 • 서버 코드 저장소에 변경사항 반영 • 프로그래머의 개입이 필요 자동화 시스템기존 시스템 • 지형 파일을 S3에 업로드 • S3이벤트 트리거에 의해서 자동으로 지형 배포 태스크 실행 • 처리된 지형 파일들을 S3에 저장 • 프로그래머가 필요 없음
 우리의 일자리가 위험…읍읍
  • 151. 자동화 된 지형 파일 배포 지형 파일 올리기 지형 파일 후처리 지형 저장소에 커밋 서버 저장소 업데이트 지형 파일 올리기 지형 제작자 프로그래머 프로그래머 프로그래머 지형 제작자 지형 파일 후처리 지형 저장소에 업로드 자동화 전 자동화 후
  • 152. 그러던 어느날 • CI 머신에서 디스크 용량 부족 오류 메세지가 뜨기 시작 • 디스크 사용량은 50% 미만이라 당황(!) • 알고보니 파일 개수가 많아서 사용 가능한 inode를 모두 소진 • 몇년마다 한 번씩 겪는 문제라 매번 낚임. 오류 메세지를 수정해서 리눅스 커널 패치를 보내볼까…
  • 153. 너무 많은 파일 개수 • 지형 개수 = 약 1,000개 (미사용 지형 포함; 베타테스트 시작 전 갑자기 많아짐) • 지형별 파일 개수 = 지형의 크기에 따라서 1,000-400,000개 • 총 파일 개수 = 약 1,300,000 • CI가 다섯번만 돌면 inode 모두 소진
  • 154. 해결책: .zip으로 압축하자 • 하나의 지형당 파일 하나 • 지형 배포 코드, 서버 코드에서 지형 파일 읽어오는 부분만 재빠르게 수정 • 더이상 안 쓰는 지형 파일도 지우자
  • 155. 또다른 문제점: .zip 파일 성능 병목 • 파일 개수가 많다보니 .zip 파일을 열기 위해서 많은 메모리를 사용 • 파일 색인을 위한 트리 구조를 메모리에 가지고 있기 때문
  • 156. 해결책: 전용 포맷을 만들자 • 지형 속성별(군계, 강, 호수, 바다, 온도, 습도, 랜드마크 등) 파일 한 개 • 청크 좌표만 가지고 바로 읽어올 수 있는 고정 크기 파일 • Sparse data일때 용량 낭비가 있지만, 스토리지는 싸니까 괜찮아!
  • 157. 지형 파일 성능 문제는 일단 해결이 되었도다
  • 158. 생태계 시뮬레이션 자동화 플레이어들이 나무를 마구 베어도 걱정 없어요 Image excerpted from https://en.wikipedia.org/wiki/Computer_simulation#/media/File:Typhoon_Mawar_2005_computer_simulation_thumbnail.gif
  • 159. 생태계 시뮬레이션 Recap • 자연 상태 파악 • 부족한 자연물 보충
  • 160. 자연 상태 파악 (0, 0): ♣ (5, 0): ♦ (3, 1): ♣ (4, 1): ♤ (2, 2): ♣ (3, 2): ♤ (4, 2): ♣ ♣ ♦ ♣ ♤ ♣ ♤ ♣ ♡ ♦ ♠ ♦ ♤ ♡ ♠ ♦
  • 161. 자연 상태 파악 디버깅 도구에서 본 가든 스냅샷
  • 162. 주기적으로 자연 상태 파악 • 모든 섬을 돌아다니며 자연 상태를 전수 조사 • 간단하게 구현할 수 있지만 비효율적인 방법
  • 163. 시스템 구조 - 주기적으로 자연 상태 파악 CloudWatch Events
  • 164. 시스템 구조 - 주기적으로 자연 상태 파악 LambdaCloudWatch Events
  • 165. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambdaCloudWatch Events Parkranger
  • 166. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambda SQS CloudWatch Events Parkranger
  • 167. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambda SQS CloudWatch Events CloudWatch Events Lambda ECS Parkranger Gardener Gardener Gardener Gardener …
  • 168. 시스템 구조 - 주기적으로 자연 상태 파악 ECSLambda SQS CloudWatch Events CloudWatch Events Lambda ECS Parkranger Gardener Gardener Gardener Gardener …
  • 169. Parkranger, Gardener 지형 관리 도구 Parkranger
 (task definition) 지형 관리 도구 Gardener
 (task definition) • Parkranger • 섬의 자연 상태를 조사 • 일정 수준 이상 훼손되었을 경우 생태계 시뮬레이션 작업 요청 • 정원사 • 큐에서 시뮬레이션 작업 요청 받아옴 • 작업 요청대로 시뮬레이션 실행 + +
  • 170. 선택적으로 자연 상태 파악 • 사람의 손이 닿지 않은 곳이라면 굳이 조사할 필요 없음 • 채집 활동이 활발한 섬 위주로 자연 상태 파악
  • 171. 시스템 구조 - 선택적으로 자연 상태 파악
  • 172. 시스템 구조 - 선택적으로 자연 상태 파악 자연물 채집
  • 173. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집
  • 174. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 ECS Aggregator
  • 175. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 ECS Aggregator
  • 176. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 CloudWatch Events Lambda ECS Gardener Gardener Gardener Gardener … ECS Aggregator
  • 177. 시스템 구조 - 선택적으로 자연 상태 파악 SQS자연물 채집 CloudWatch Events Lambda ECS Gardener Gardener Gardener Gardener … ECS Aggregator
  • 178. 이제야 마음 놓고 다른 일을 할 수 있겠군!
  • 179. Summary • 코드 배포 단순화 ➔ Docker • Docker 실행 환경 ➔ ECS • 지형 배포 자동화 • 생태계 시뮬레이션 자동화
  • 180. Future Works 이번에 해결하진 못했지만 앞으로 해결할 문제들 Image excerpted from https://commons.wikimedia.org/wiki/File:XOR_from_NOR.svg
  • 181. Supply & Demand Mismatches 시간 채집 활동 처리 용량
  • 182. Supply & Demand Mismatches 시간 채집 활동 처리 용량 잉여 처리 용량
 ➔ 비용 낭비
  • 183. Supply & Demand Mismatches 시간 채집 활동 처리 용량 잉여 처리 용량
 ➔ 비용 낭비 부족한 처리 용량
 ➔ 부정적 사용자 경험
  • 184. Supply & Demand Mismatches 시간 채집 활동 처리 용량 잉여 처리 용량
 ➔ 비용 낭비 부족한 처리 용량
 ➔ 부정적 사용자 경험 넥슨은 어서 갈대를 뿌려라!
  • 185. ECS 클러스터 오토 스케일링 • CPU, 메모리 사용량 등 다양한 지표 • 지표에 따라 EC2 인스턴스의 수를 조절 하여 수요 변화에 탄력적으로 대응 • 동시 접속자, 채집된 자연물의 수와 같 은 게임 내 지표를 참조할수도…
  • 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. 스팟 인스턴스를 이용한 비용 절감 • 아마존에서 미사용(unused) 컴퓨팅 자원을 싸게 파는 일종의 경매 시스템 • 수요와 공급에 따라서 가격이 실시간으로 변화
  • 188. 스팟 인스턴스를 이용한 비용 절감 수요와 공급에 따라서 가격이 실시간으로 변화
  • 189. 스팟 인스턴스를 이용한 비용 절감 • 일주일간의 테스트 기간동안 고성능 인스턴스들을 원래 가격의 15-20% 수준 에 사용 • 특정 인스턴스 타입에 지불하고자 하는 최대 가격을 제출하고 그 가격이 시장가 보다 높거나 같으면 인스턴스 사용, 시장 가격보다 낮아지면 인스턴스가 꺼짐 • 인스턴스가 꺼졌을 때 적절히 대응할 수 있는 소프트웨어 아키텍처가 필요
  • 190. 지형 런타임 공급 • 지형을 미리 제작하고 배포하는 것은 과도기적 해결책 • 우리의 꿈은 빌드 타임에 지형을 공급하는 것이 아니라 런타임에 공급하는 것
  • 191. 지형 런타임 공급 지형 1 지형 2 지형 n 서버 1 서버 2 서버 3 서버 n … 오늘 새로운 지형을 만들어볼까? 지형 제작 도구 지형 배포 도구 지형 풀(pool) 서버 코드 업데이트 없이
 필요할때마다 지형 꺼내 쓰기
  • 192.