NDC14 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기
Upcoming SlideShare
Loading in...5
×
 

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

on

  • 7,998 views

모바일 게임 서비스를 위한 사설 클라우드를 개발/운영/디버깅 하면서 얻은 점들을 공유한다. ...

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

Statistics

Views

Total Views
7,998
Views on SlideShare
1,646
Embed Views
6,352

Actions

Likes
17
Downloads
61
Comments
0

11 Embeds 6,352

http://blog.naver.com 3668
http://news.imaso.co.kr 2488
http://cafe.naver.com 90
http://lacti.me 47
https://twitter.com 21
http://blog.lacti.me 17
http://192.168.10.39 16
http://www.linkedin.com 2
http://plus.url.google.com 1
http://www.google.co.kr 1
http://memolog.blog.naver.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

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

  • 모바일 게임서비스를 위한 사설 클라우드 구축/운영 분투기 김진욱 (jinuk.kim@ifunfactory.com) iFunFactory Inc.
  • Who Am I 소프트웨어 엔지니어 2013. 4 ~ : iFunFactory Inc. 2012. 4 ~ 2013. 4: NEXON Korea 2007. 2 ~ 2012. 3: NCsoft C++ 기반의 게임 서버 / Python 기반의 백엔드 서비스 작성
  • Building Private Cloud for Mobile Games © Arun Kulshreshtha
  • With Commodity
 Hardware 일반적인 x86 서버 흔히 쓰는 네트워크 스위치 여러 가닥의 랜 선 적당한 파워소스
  • With Open Source Softwares Linux KVM: linux 커널의 가상화 솔루션 OpenStack: 널리 쓰이는 클라우드 컨트롤러 프로젝트 Puppet: 패키지 제어 / 설정 제어 HAProxy: 로드밸런서 그리고 NGINX, uWSGI, dnsmasq, dpkg, Fabric, …
  • Currently Serves … 2013년 9월부터 상용 서비스 신규 게임 수 개 런처 일부 기존 서비스 중인 게임 이전
  • Lots of Troubles © iStock.
  • 물리 인프라스트럭쳐 (서버, 네트워크 스위치, …) OS (서버, 스위치) / 가상화 SW OS (가상 머신) Applications (Web-server, PHP, JVM, …) 퍼블릭 클라우드 혹은 직접 서비스 할 때 고민할 문제 직접 서비스 혹은 퍼블리싱 문제 Problem Domain
  • Infrastructure 물리적인 문제, 설정 관리, 패치 관리, 설치 자동화, … © Fyodor Borisov
  • 물리적인 (?) 문제 랜 선 문제: 불량 랜선으로 더 낮은 속도로 동작하는 경우 센서 문제: 센서 오작동; 센서 리셋하려면 머신 재시작해야… 파워 문제: 듀얼 파워 중 하나가 나가는 경우 발생 디스크 문제: IPMI 에서 디스크 오류를 계속해서 리포팅 IPMI 자체가 응답 안하는 경우 (…)
  • 설치 자동화 하기 유사한 물리 서버들이 많다 => 설치 자동화가 쉽다 자동 설치 서비스 용 SW 스택: 저수준: PXE (네트워크 부팅 with DHCP, TFTP) OS 설치 및 준비: Debian-Installer 서버 소프트웨어 스택 설정: Puppet, bash-scripts (…) … 그리고 위를 써서 많은 걸 수정해야 함
  • 설치 자동화: DHCP 문제 PXE 는 DHCP의 (제한된) 변형이 필요 (특정) 네트워크 스위치는 다른 스위치와 연결하면 해당 포트에 대해 DHCP 요청 DHCP 프로토콜은 특정 주소를 “반납”하라고 명령하기 힘들다 PXE + Debian-Installer: IP를 두 번 요청/할당받는다 (DHCP) PXE: 부팅하면서 첫번째 IP 주소 요청 Debian-Installer: 설치할 때 IP 주소 요청; 이 때 스위치가 DHCP NACK을 보내 서 설치 실패
  • 설치 자동화: Debian-Installer 문제 Debian 패키지 시스템: .deb 과 .udeb .udeb: OS를 설치할 때 사용하기 위해서 .deb 에서 몇 가지 부분과 제약 을 제거한 상대적으로 크기가 작은 패키지 패키지 미러링을 한다면 반드시 .udeb 파일을 포함해서 미러링해야 또한, 드라이버 지원이 맞도록 적당한 커널 버전을 지정해야
  • 설치 자동화 / 설정 관리: Puppet 모든 제어는 puppet 설정으로 제어; 하지만, 인증서 signing 문제; 모든 물리 머신의 인증서를 확인? 노드 타입의 문제: 모든 물리 머신은 같은게 설치되는가? 패키지 버전, 의존성, …: 잘못된 의존성을 만들면 전혀 상관없는 라이브러리 업 그레이드 후에 많은 서비스가 재시작 된다 커널 모듈 로딩 순서 문제: Puppet 실행 시점에 모든 커널 모듈 로드되지 않음
  • 패키지 저장소 문제 (1) 설치 속도와 내부에서 수정한 패키지 때문에 로컬 저장소 운영 용량 문제: Debian/Ubuntu 패키지 저장소: ≅700 GiB 3rd Party 패키지 저장소 (PPA): ≅??? GiB (10~100 GiB 수준) PyPI 미러: ≅30 GiB 한 번도 쓰지 않는 패키지가 대부분 보안 문제: PyPI는 http 기반 (과거) + signing 없음
  • 패키지 저장소 문제 (2) 내부 저장소 서버에 apt-cacher-ng 이용해서 패키지 캐시 (캐싱 프록시) VM은 자기 밑에 있는 compute-node 에서만 패키지를 얻어옴 PyPI 미러링 추가 및 PyPI 자체가 CDN을 쓰게 바뀜 (2013년) PyPI 접근 방식이 SSL 기반 (https) 로 변경 근데 이제 Centos 용 yum 저장소 (.rpm)도 추가하고 있다…
  • Resource Management 물리 머신 자원 할당, Linux 네트워크 패러미터?, Disk Elevator,
 OOM Killer, Scale Out, … © Neo139
  • 자원 할당 제한 Linux의 ulimit 과 sysctl 의 여러 패러미터에서 자원 사용량을 제한 네트워크 서비스에서 쓰기에 기본 값이 낮거나 작다 특히 ulimit의 nofile 과 sysctl 설정을 소켓 수로 생각해서 늘려줘야 한다 연결이 단시간에 몰리기 쉬우니 somaxconn, netdev_max_backlog 값도 커야 한다 (메모리 총량 증가와 약간의 성능 저하만 있다)
  • Linux Network Parameters Compute 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)
  • OOM Killer Linux의 메모리 할당은 꽤나 낙관적이다 => 믿지 말 것! Live migration 하는 VM 의 메모리 연산이 매우 많은 경우, 물리 머신의 메모리 사용량 급증 => Out-Of-Memory Killer 동작 개시 꼭 살아야하는 프로세스, 즉 VM 들에 대해서 OOM Killer의 victim이 되 지 않게 proc 설정을 고쳐야
  • Disk Elevator 개별 회사에서는 여러 종류의 I/O 시스템을 사용한다 SSD RAID vs. SAS RAID vs. SATA RAID, … 하지만 정작 VM 수준에서는 이 패러미터 선택이 거의 차이가 없다 물리 머신 수준에서도 아주 약간의 차이만 난다 => 그래도 차이는 나니까 DISK array 타입에 맞는 설정을 고른다
  • Scale Out: Status Quo 많은 수의 게임 서버가 웹 기술 기반 웹 서버 — 응용 프로그램 서버 — 데이터베이스 구성 응용 프로그램:
 PHP (fastcgi), Python WSGI, JVM 기반의 여러 언어/프레임웍, 1 대의 게임 서버가 게임 요청을 다 처리 못하면 ?
  • Game Server Game Server Game Server Load Balancer Game Server Game Server Game Server Game Server Game Server Game Server Data Store Data Store Game Server Data Store 147.46.113.114 147.46.113.114 Scale Out: With Load Balancer
  • Scale Out: Deploying HAProxy HAProxy: 소프트웨어 로드 밸런서 실제 사용할 때 1 vCPU + 1G 메모리로 약 10k~100k HTTP request/sec 처리 단, 앞에서 언급한 ulimit, conntrack, … 등의 설정을 다 해둬야 HAProxy 의 stats socket 정보 확인 통해서 적절히 수정 설정 변경을 소프트-재시작으로 적용하면서 운용 HAProxy 처리 용량을 초과하면?
  • Game Server Game Server Game Server Load Balancer Game Server Game Server Game Server Game Server Game Server Game Server Data Store Data Store 147.46.113.114 Game Server Game Server Game Server Load Balancer Game Server Game Server Game Server Game Server Game Server Game Server Data Store Data Store 147.46.113.114 Load Balancer 147.46.113.115 Scale Out: Multiple HAProxies
  • Scale Out: DNS-RR + HAProxy 하나의 HAProxy로 처리 못하는 경우엔? 여러 대의 HAProxy 를 구성; {m 대의 LB} × {n 대의 게임 서버} 클라이언트: 여러 대의 Haproxy 를 어떻게 선택? DNS round-robin 으로 적당히 분배 DNS RR: 추가된 DNS 정보가 클라이언트한테 퍼질 때까지는 시간이 걸림 추가한 로드밸런서 IP를 어떻게 하면 빨리 전달할까?
  • Game Server Game Server Game Server Load Balancer Game Server Game Server Game Server Game Server Game Server Game Server Data Store Data Store 147.46.113.114, 147.46.113.115 Game Server Game Server Game Server Load Balancer Game Server Game Server Game Server Game Server Game Server Game Server Data Store Data Store 147.46.113.114 Load Balancer 147.46.113.115 Scale Out: Multiple Floating IPs
  • Scale Out: Multiple Floating IPs 간단한 방법: DNS 주소의 expiration을 줄인다 DNS query 계층의 캐싱 / 클라이언트 캐싱 / … => 잘 안됨 그래서, 하나의 로드 밸런서가 미리 여러 개의 IP를 할당 받는다 DNS 레코드는 처음부터 여러 개의 IP를 RR 부하가 커져서 한 대가 다 감당 못하면? 로드 밸런서를 추가하고 여러 개의 IP 중 일부를 옮긴다
  • Live with FOSS Free/open Source SW 버그 우회하기 Major 버전업 버그 패치 Hot-fix 대응하기 © OpenSource.org
  • OpenStack Bugs 오래된 베이스 이미지를 새로 설정한 hypervisor에서는 못찾는 버그 물리 머신 DNS 주소가 숫자로 시작하면 VM live migration 실패 물리 머신을 삭제하는 인터페이스 없음; 삭제 하면 웹 인터페이스 사망 네트워크 가상화 프로젝트 (Neutron; a.k.a quantum) 는 언제 완성? CPU topology 를 무시 => 4 core w/ HT -> 8 socket 1 core 1 threads …
  • OpenStack Missing Features Private DNS 구현 (지금은…) Compute host 를 구분할 DNS 서비스가 없다 (지금도…) 사용 중인 compute node 제거 (지금도…) 대시보드에서 호스트 지정해서 VM 띄우기 (간접적으로만…) 로드밸런서 (생기는 중; 언제?) VM 모니터링 (파워 상태만…)
  • HAProxy Limits 단일 스레드/프로세스 기반의 서비스 (실험적인 멀티 프로세스 구현이 있긴함) 하지만 성능은 2-core 일 때 더 좋다 (!) Stable 버전은 아직 SSL terminator 기능이 없다 Conntrack 제한에 주의: 들어오는 모든 연결 + 모든 응용프로그램서버 연결 Soft restart할 때에도 수십~수백ms의 glitch가 나타날 수 있다
  • 보안 취약점 대응하기 물리 머신 / VM 각 수준에서 모두 대응해야 자주(?) 일어나는 문제들: OpenSSL, libvirt, linux-kernel, apache-mod-*, kernel 혹은 재시작 문제: VM 패치 및 재시작은 쉽지만 물리 머신은? 개별 VM에서 사용하는 모든 패키지에 대한 정보가 있는게 아니다…
  • Microsoft Windows Windows on linux KVM, 새로운 패키징, 새로운 모니터링, …
  • Windows: OpenStack + KVM 문제 Windows 이미지가 크다: Linux 0.2 GiB vs. Windows 17 GiB
 => migration, resize, … VM 관련 연산이 느려진다 (복수의) arping 이 왔을 때 반응이 linux와 다르다 OpenStack + KVM이 CPU topology (소켓/코어/스레드 수) 를 제대로 전달하 지 않는다 초기화 문제: cloud-init 과 유사한 도구들이 지원하는 Windows 버전이 높다
  • Windows: A Whole New World 기존의 패키징 시스템 사용 불가: PyPI 만 이용 가능 => Nuget 용으로 별도 패키지 제작해야 모니터링을 위한 기본 유틸리티들이 linux와 다름 LDAP 없이 쉽게 PKI 기반 로그인을 유지하기 어렵다 라이센스 관리?!?!?!
  • Monitoring 문제 정의하기, 외부 서비스 장애, 문제 통지하기, … © Sergiomiguelrp
  • “문제” 정의하기 장애 상황을 정의하기 어렵다 CPU 사용량이 물리 머신/VM수 준에서 줄어들면 “문제”일까? 정기 점검? 통신사 장애?
 혹은 다른 외부 서비스 장애?
  • 블랙박스 테스트 모바일 게임도 클라이언트와 서버 는 통신 패킷 덤프 + 리버싱 HTTP, protobuf 따라하는 클라 이언트 만들기 가짜 클라이언트로 지속 테스트
  • 외부 서비스 장애 카카오톡 게임 서비스 장애? 통신사 망 (일부) 장애 내부 서비스 플랫폼 장애? Google/Apple 빌링서버 응답지연? 혹은, 특정 paygate 장애
  • Alarm 계속 들여다볼 순 없어서
 알림 기능 구현 emai: 밤에 안 깸 SMS: 적당한 API 제공자 ? 자동 전화 걸기: 가격!!!
  • Summary 평범한 하드웨어 위에 오픈소스 소프트웨어를 수정해서 사설 클라우드 구축 인프라스트럭처 설치 및 운용을 위해 소프트웨어를 개발 / 튜닝 OS / VM 수준의 패러미터를 수정하고 테스트 Windows는 다른 종류의 문제를 잔뜩… 전체 인프라, VM, 게임 서비스 API를 감시하고 모니터링