NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

43
모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기 김진욱 ( [email protected] ) iFunFactory Inc.

description

모바일 게임 서비스를 위한 사설 클라우드를 개발/운영/디버깅 하면서 얻은 점들을 공유한다. 일반적인 하드웨어랑 오픈소스소프트웨어를 써서 사설 클라우드를 만들고 게임을 런치하면서 고생한 부분, 문제되었던 부분들을 짚어본다.

Transcript of NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Page 1: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기김진욱 ([email protected]) iFunFactory Inc.

Page 2: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Who Am I

소프트웨어 엔지니어

2013. 4 ~ : iFunFactory Inc.

2012. 4 ~ 2013. 4: NEXON Korea

2007. 2 ~ 2012. 3: NCsoft

C++ 기반의 게임 서버 / Python 기반의 백엔드 서비스 작성

Page 3: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Building Private Cloud for Mobile Games© Arun Kulshreshtha

Page 4: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

With CommodityHardware

일반적인 x86 서버

흔히 쓰는 네트워크 스위치

여러 가닥의 랜 선

적당한 파워소스

Page 5: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

With Open Source SoftwaresLinux KVM: linux 커널의 가상화 솔루션

OpenStack: 널리 쓰이는 클라우드 컨트롤러 프로젝트

Puppet: 패키지 제어 / 설정 제어

HAProxy: 로드밸런서

그리고 NGINX, uWSGI, dnsmasq, dpkg, Fabric, …

Page 6: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Currently Serves …2013년 9월부터 상용 서비스

신규 게임 수 개 런처

일부 기존 서비스 중인 게임 이전

Page 7: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Lots of Troubles© iStock.

Page 8: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

물리 인프라스트럭쳐(서버, 네트워크 스위치, …)

OS (서버, 스위치) / 가상화 SW

OS (가상 머신)

Applications(Web-server, PHP, JVM, …) 퍼블릭 클라우드

혹은 직접 서비스할 때 고민할 문제

직접 서비스 혹은퍼블리싱 문제

Problem Domain

Page 9: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Infrastructure물리적인 문제, 설정 관리, 패치 관리, 설치 자동화, …

© Fyodor Borisov

Page 10: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

물리적인 (?) 문제랜 선 문제: 불량 랜선으로 더 낮은 속도로 동작하는 경우

센서 문제: 센서 오작동; 센서 리셋하려면 머신 재시작해야…

파워 문제: 듀얼 파워 중 하나가 나가는 경우 발생

디스크 문제: IPMI 에서 디스크 오류를 계속해서 리포팅

IPMI 자체가 응답 안하는 경우 (…)

Page 11: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

설치 자동화 하기유사한 물리 서버들이 많다 => 설치 자동화가 쉽다

자동 설치 서비스 용 SW 스택:

저수준: PXE (네트워크 부팅 with DHCP, TFTP)

OS 설치 및 준비: Debian-Installer

서버 소프트웨어 스택 설정: Puppet, bash-scripts (…)

… 그리고 위를 써서 많은 걸 수정해야 함

Page 12: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

설치 자동화: DHCP 문제PXE 는 DHCP의 (제한된) 변형이 필요

(특정) 네트워크 스위치는 다른 스위치와 연결하면 해당 포트에 대해 DHCP 요청

DHCP 프로토콜은 특정 주소를 “반납”하라고 명령하기 힘들다

PXE + Debian-Installer: IP를 두 번 요청/할당받는다 (DHCP)

PXE: 부팅하면서 첫번째 IP 주소 요청

Debian-Installer: 설치할 때 IP 주소 요청; 이 때 스위치가 DHCP NACK을 보내서 설치 실패

Page 13: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

설치 자동화: Debian-Installer 문제Debian 패키지 시스템: .deb 과 .udeb

.udeb: OS를 설치할 때 사용하기 위해서 .deb 에서 몇 가지 부분과 제약을 제거한 상대적으로 크기가 작은 패키지

패키지 미러링을 한다면 반드시 .udeb 파일을 포함해서 미러링해야

또한, 드라이버 지원이 맞도록 적당한 커널 버전을 지정해야

Page 14: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

설치 자동화 / 설정 관리: Puppet모든 제어는 puppet 설정으로 제어; 하지만,

인증서 signing 문제; 모든 물리 머신의 인증서를 확인?

노드 타입의 문제: 모든 물리 머신은 같은게 설치되는가?

패키지 버전, 의존성, …: 잘못된 의존성을 만들면 전혀 상관없는 라이브러리 업그레이드 후에 많은 서비스가 재시작 된다

커널 모듈 로딩 순서 문제: Puppet 실행 시점에 모든 커널 모듈 로드되지 않음

Page 15: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

패키지 저장소 문제 (1)설치 속도와 내부에서 수정한 패키지 때문에 로컬 저장소 운영

용량 문제:

Debian/Ubuntu 패키지 저장소: ≅700 GiB

3rd Party 패키지 저장소 (PPA): ≅??? GiB (10~100 GiB 수준)

PyPI 미러: ≅30 GiB

한 번도 쓰지 않는 패키지가 대부분

보안 문제: PyPI는 http 기반 (과거) + signing 없음

Page 16: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

패키지 저장소 문제 (2)내부 저장소 서버에 apt-cacher-ng 이용해서 패키지 캐시 (캐싱 프록시)

VM은 자기 밑에 있는 compute-node 에서만 패키지를 얻어옴

PyPI 미러링 추가 및 PyPI 자체가 CDN을 쓰게 바뀜 (2013년)

PyPI 접근 방식이 SSL 기반 (https) 로 변경

근데 이제 Centos 용 yum 저장소 (.rpm)도 추가하고 있다…

Page 17: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Resource Management물리 머신 자원 할당, Linux 네트워크 패러미터?, Disk Elevator,OOM Killer, Scale Out, …

© Neo139

Page 18: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

자원 할당 제한Linux의 ulimit 과 sysctl 의 여러 패러미터에서 자원 사용량을 제한

네트워크 서비스에서 쓰기에 기본 값이 낮거나 작다

특히 ulimit의 nofile 과 sysctl 설정을 소켓 수로 생각해서 늘려줘야 한다

연결이 단시간에 몰리기 쉬우니 somaxconn, netdev_max_backlog 값도 커야 한다 (메모리 총량 증가와 약간의 성능 저하만 있다)

Page 19: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Linux Network ParametersCompute node는 개별 VM에 넘겨줘야할 IP 패킷들을 linux conntrack 기능을 통해 관리한다 (=kernel netfilter)

한 물리 머신에 띄울 VM 수 x VM 별 최대 IP 세션 수 만큼 이 값이 커야 한다

TCP 관련 패러미터를 수정해서 이미 끊긴 연결을 최대한 빨리 table에서 제거

ip_conntrack_tcp_timeout_* 패러미터 수정

VM 에서 외부로 active하게 가는 연결이 많으면 ephemeral port의 범위도 늘려야 한다 (net.ipv4.ip_local_port_range)

Page 20: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

OOM KillerLinux의 메모리 할당은 꽤나 낙관적이다 => 믿지 말 것!

Live migration 하는 VM 의 메모리 연산이 매우 많은 경우, 물리 머신의 메모리 사용량 급증 => Out-Of-Memory Killer 동작 개시

꼭 살아야하는 프로세스, 즉 VM 들에 대해서 OOM Killer의 victim이 되지 않게 proc 설정을 고쳐야

Page 21: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Disk Elevator개별 회사에서는 여러 종류의 I/O 시스템을 사용한다

SSD RAID vs. SAS RAID vs. SATA RAID, …

하지만 정작 VM 수준에서는 이 패러미터 선택이 거의 차이가 없다

물리 머신 수준에서도 아주 약간의 차이만 난다 => 그래도 차이는 나니까 DISK array 타입에 맞는 설정을 고른다

Page 22: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Scale Out: Status Quo많은 수의 게임 서버가 웹 기술 기반

웹 서버 — 응용 프로그램 서버 — 데이터베이스 구성

응용 프로그램:PHP (fastcgi), Python WSGI, JVM 기반의 여러 언어/프레임웍,

1 대의 게임 서버가 게임 요청을 다 처리 못하면 ?

Page 23: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Game ServerGame ServerGame Server

Load Balancer

Game ServerGame ServerGame ServerGame ServerGame ServerGame Server

Data Store Data Store

Game Server

Data Store

147.46.113.114

147.46.113.114

Scale Out: With Load Balancer

Page 24: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Scale Out: Deploying HAProxyHAProxy: 소프트웨어 로드 밸런서

실제 사용할 때 1 vCPU + 1G 메모리로 약 10k~100k HTTP request/sec 처리

단, 앞에서 언급한 ulimit, conntrack, … 등의 설정을 다 해둬야

HAProxy 의 stats socket 정보 확인 통해서 적절히 수정

설정 변경을 소프트-재시작으로 적용하면서 운용

HAProxy 처리 용량을 초과하면?

Page 25: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Game ServerGame ServerGame Server

Load Balancer

Game ServerGame ServerGame ServerGame ServerGame ServerGame Server

Data Store Data Store

147.46.113.114

Game ServerGame ServerGame Server

Load Balancer

Game ServerGame ServerGame ServerGame ServerGame ServerGame Server

Data Store Data Store

147.46.113.114

Load Balancer

147.46.113.115

Scale Out: Multiple HAProxies

Page 26: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Scale Out: DNS-RR + HAProxy하나의 HAProxy로 처리 못하는 경우엔?

여러 대의 HAProxy 를 구성; {m 대의 LB} × {n 대의 게임 서버}

클라이언트: 여러 대의 Haproxy 를 어떻게 선택?

DNS round-robin 으로 적당히 분배

DNS RR: 추가된 DNS 정보가 클라이언트한테 퍼질 때까지는 시간이 걸림

추가한 로드밸런서 IP를 어떻게 하면 빨리 전달할까?

Page 27: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Game ServerGame ServerGame Server

Load Balancer

Game ServerGame ServerGame ServerGame ServerGame ServerGame Server

Data Store Data Store

147.46.113.114, 147.46.113.115

Game ServerGame ServerGame Server

Load Balancer

Game ServerGame ServerGame ServerGame ServerGame ServerGame Server

Data Store Data Store

147.46.113.114

Load Balancer

147.46.113.115

Scale Out: Multiple Floating IPs

Page 28: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Scale Out: Multiple Floating IPs간단한 방법: DNS 주소의 expiration을 줄인다

DNS query 계층의 캐싱 / 클라이언트 캐싱 / … => 잘 안됨

그래서, 하나의 로드 밸런서가 미리 여러 개의 IP를 할당 받는다

DNS 레코드는 처음부터 여러 개의 IP를 RR

부하가 커져서 한 대가 다 감당 못하면?

로드 밸런서를 추가하고 여러 개의 IP 중 일부를 옮긴다

Page 29: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Live with FOSSFree/open Source SW 버그 우회하기 Major 버전업 버그 패치 Hot-fix 대응하기

© OpenSource.org

Page 30: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

OpenStack Bugs오래된 베이스 이미지를 새로 설정한 hypervisor에서는 못찾는 버그

물리 머신 DNS 주소가 숫자로 시작하면 VM live migration 실패

물리 머신을 삭제하는 인터페이스 없음; 삭제 하면 웹 인터페이스 사망

네트워크 가상화 프로젝트 (Neutron; a.k.a quantum) 는 언제 완성?

CPU topology 를 무시 => 4 core w/ HT -> 8 socket 1 core 1 threads

Page 31: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

OpenStack Missing FeaturesPrivate DNS 구현 (지금은…)

Compute host 를 구분할 DNS 서비스가 없다 (지금도…)

사용 중인 compute node 제거 (지금도…)

대시보드에서 호스트 지정해서 VM 띄우기 (간접적으로만…)

로드밸런서 (생기는 중; 언제?)

VM 모니터링 (파워 상태만…)

Page 32: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

HAProxy Limits단일 스레드/프로세스 기반의 서비스 (실험적인 멀티 프로세스 구현이 있긴함)

하지만 성능은 2-core 일 때 더 좋다 (!)

Stable 버전은 아직 SSL terminator 기능이 없다

Conntrack 제한에 주의: 들어오는 모든 연결 + 모든 응용프로그램서버 연결

Soft restart할 때에도 수십~수백ms의 glitch가 나타날 수 있다

Page 33: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

보안 취약점 대응하기물리 머신 / VM 각 수준에서 모두 대응해야

자주(?) 일어나는 문제들: OpenSSL, libvirt, linux-kernel, apache-mod-*,

kernel 혹은 재시작 문제: VM 패치 및 재시작은 쉽지만 물리 머신은?

개별 VM에서 사용하는 모든 패키지에 대한 정보가 있는게 아니다…

Page 34: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Microsoft WindowsWindows on linux KVM, 새로운 패키징, 새로운 모니터링, …

Page 35: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Windows: OpenStack + KVM 문제Windows 이미지가 크다: Linux 0.2 GiB vs. Windows 17 GiB=> migration, resize, … VM 관련 연산이 느려진다

(복수의) arping 이 왔을 때 반응이 linux와 다르다

OpenStack + KVM이 CPU topology (소켓/코어/스레드 수) 를 제대로 전달하지 않는다

초기화 문제: cloud-init 과 유사한 도구들이 지원하는 Windows 버전이 높다

Page 36: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Windows: A Whole New World기존의 패키징 시스템 사용 불가: PyPI 만 이용 가능

=> Nuget 용으로 별도 패키지 제작해야

모니터링을 위한 기본 유틸리티들이 linux와 다름

LDAP 없이 쉽게 PKI 기반 로그인을 유지하기 어렵다

라이센스 관리?!?!?!

Page 37: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Monitoring문제 정의하기, 외부 서비스 장애, 문제 통지하기, …

© Sergiomiguelrp

Page 38: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

“문제” 정의하기장애 상황을 정의하기 어렵다

CPU 사용량이 물리 머신/VM수준에서 줄어들면 “문제”일까?

정기 점검?

통신사 장애?혹은 다른 외부 서비스 장애?

Page 39: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

블랙박스 테스트모바일 게임도 클라이언트와 서버는 통신

패킷 덤프 + 리버싱

HTTP, protobuf 따라하는 클라이언트 만들기

가짜 클라이언트로 지속 테스트

Page 40: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

외부 서비스 장애카카오톡 게임 서비스 장애?

통신사 망 (일부) 장애

내부 서비스 플랫폼 장애?

Google/Apple 빌링서버 응답지연?

혹은, 특정 paygate 장애

Page 41: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Alarm계속 들여다볼 순 없어서알림 기능 구현

emai: 밤에 안 깸

SMS: 적당한 API 제공자 ?

자동 전화 걸기: 가격!!!

Page 42: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기

Summary평범한 하드웨어 위에 오픈소스 소프트웨어를 수정해서 사설 클라우드 구축

인프라스트럭처 설치 및 운용을 위해 소프트웨어를 개발 / 튜닝

OS / VM 수준의 패러미터를 수정하고 테스트

Windows는 다른 종류의 문제를 잔뜩…

전체 인프라, VM, 게임 서비스 API를 감시하고 모니터링

Page 43: NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기