※다운로드하시면 더 선명한 자료를 보실 수 있습니다.
동접 200만 명이 접속할 수백 대의 게임 서버가 최소한의 MySQL 서버만으로 서비스할 수 있는 구조를 설명합니다.
고성능/고효율의 MySQL 스케일링 기법을 공유합니다. 대규모 게임 서비스에서 이미 검증된 것은 안 비밀~
목차
1. 기본적인 아기텍처
2. ProxySQL을 이용한 더 나은 아키텍처
3. 최종 아키텍처
대상
- 대규모 게임 서비스에 MySQL을 사용한 경험에 관심 있는 분
- ProxySQL에 관심이 있는 서버 개발자 혹은 DBA
- 게임 서버 개발 과정에서 DB 쪽을 유연하게 구성하고 싶은 분
■관련 동영상: https://youtu.be/8Eb_n7JA1yA
어느 해커쏜에 참여한 백엔드 개발자들을 위한 교육자료
쉽게 만든다고 했는데도, 많이 어려웠나봅니다.
제 욕심이 과했던 것 같아요. 담번엔 좀 더 쉽게 !
- 독자 : 백엔드 개발자를 희망하는 사람 (취준생, 이직 희망자), 5년차 이하
- 주요 내용 : 백엔드 개발을 할 때 일어나는 일들(개발팀의 일)
- 비상업적 목적으로 인용은 가능합니다. (출처 명기 필수)
※다운로드하시면 더 선명한 자료를 보실 수 있습니다.
동접 200만 명이 접속할 수백 대의 게임 서버가 최소한의 MySQL 서버만으로 서비스할 수 있는 구조를 설명합니다.
고성능/고효율의 MySQL 스케일링 기법을 공유합니다. 대규모 게임 서비스에서 이미 검증된 것은 안 비밀~
목차
1. 기본적인 아기텍처
2. ProxySQL을 이용한 더 나은 아키텍처
3. 최종 아키텍처
대상
- 대규모 게임 서비스에 MySQL을 사용한 경험에 관심 있는 분
- ProxySQL에 관심이 있는 서버 개발자 혹은 DBA
- 게임 서버 개발 과정에서 DB 쪽을 유연하게 구성하고 싶은 분
■관련 동영상: https://youtu.be/8Eb_n7JA1yA
어느 해커쏜에 참여한 백엔드 개발자들을 위한 교육자료
쉽게 만든다고 했는데도, 많이 어려웠나봅니다.
제 욕심이 과했던 것 같아요. 담번엔 좀 더 쉽게 !
- 독자 : 백엔드 개발자를 희망하는 사람 (취준생, 이직 희망자), 5년차 이하
- 주요 내용 : 백엔드 개발을 할 때 일어나는 일들(개발팀의 일)
- 비상업적 목적으로 인용은 가능합니다. (출처 명기 필수)
GDB와 strace로 Hang 걸린 Python Process 원격 디버깅Youngmin Koo
Python 프로그램을 디버깅하실 때 어떤 툴을 사용하시나요? 아무래도 가장 많이 사용하고 계신 툴은 PyCharm이 아닐까 싶습니다. PyCharm은 JetBrains에서 만든 GUI 환경에서 사용할 수 있는 Python IDE입니다.
PyCharm은:
로컬 컴퓨터에서 디버깅 모드로 (PyDev로) Python 프로세스를 실행할 수 있습니다.
로컬 컴퓨터에서 실행 중인 Python 프로세스에 Attach해 디버깅할 수 있습니다.
원격 서버에서 디버깅 모드로 (PyDev로) Python 프로세스를 실행할 수 있습니다.
하지만 원격에서 동작하고 있는 프로세스에 디버거를 Attach하는 기능은 제공하지 않고 있습니다. 또한 Python 디버깅 모듈인 pdb를 사용하여도 동작하고 있는 프로세스에 Attach하는 것은 지원하고 있지 않습니다.
로컬 환경에서는 문제 없이 돌아갔던 Python 프로그램이 원격 서버에서는 아무런 로그 없이 멈춰 버리는 경우 어디서부터 손을 대야 할지 정말 막막합니다. 이 때 GDB와 strace를 이용하면 어디에서 문제가 발생했는지 진단할 수 있습니다. 이 세션에서는 GDB와 strace를 이용해 디버깅하여 원격 리눅스 서버에서 Python Process가 Hang 되어 버리는 문제를 진단하고 해결했던 경험을 공유하려고 합니다.
1. 하용호 @yonghosee
'하용호' 라고 합니다. kth 클라우드연구소 분산기술랩에서 즐겁게 일하고
있습니다. '프리즘 파일 시스템'이라는 분산파일 시스템, 'iLock'이라 이름 붙
인 분산 동기화 서비스, 그리고 새로운 검색엔진을 만들고 있습니다. 분산처
리, 데이터마이닝을 연구해 왔습니다. 대량의 자료를 다루는 것을 좋아합니
다. Data Scientist를 지향합니다.
파이썬으로 클라우드 하고 싶어요.
파이썬은 쉬운 구조와 빠른 작성 속도를 강점으로 하여 이미 주류언어로 대
중화 되었습니다. 과거에 비교적 간단한 작업에 많이 쓰였던 파이썬을 분산
처리, 병렬처리를 사용하여 큰 문제들을 풀어내는 데 활용하는 방법들을 알
아봅니다. 멀티코어를 이용하고, 수십 대의 컴퓨터로 병렬처리하고,
Hadoop과 아마존 클라우드를 사용하여 분산 처리하는 방법들까지 알아봅
니다.
29. 해답은
Md5 해쉬값을 구하고 싶어요?
그건 일도 아니죠.
파일을 압축하고 싶어요?
hashlib.md5(“python is so powerful").hexdigest()
import gzip
그건 일도 아니죠.
f = gzip.open('example.txt.gz', 'wb')
f.write('Contents of the example go here.n')
f.close()
웹페이지를 긁어오고 싶어요?
import urllib2
그건 일도 아니죠.
response = urllib2.urlopen('http://google.com/')
data = response.read()
print data
REST 웹서버를 만들고 싶어요?from flask import Flask
app = Flask(__name__)
그건 일도 아니죠. @app.route("/“, methods=[‘GET’])
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
31. 해답은
작성하는데 굉장히 어렵다.
작성 완전 쉬워요
관련되어 많은 라인을 써야 한다.
쉽게 가져다 쓸 라이브러리가 많아요
네트워크나 디스크가 병목점일 때가 많다.
계산이 느린 것은 상쇄됩니다.
의외로 반복 사용이 되지 않는다.
한번 쓸 코드 짜기 딱 좋죠
조금씩 고쳐야 되는 일은 많다.
인터프리터 좋다는 게 뭔가요^^
41. from threading import Thread
start부터
def do_work(start, end, result):
sum = 0 end까지
for i in range(start, end): 더해요
sum += i
result.append(sum)
return 쓰레드
if __name__ == "__main__":
2개를
START, END = 0, 20000000 써봅시다.
result = list()
th1 = Thread(target=do_work, args=(START, END/2, result))
th2 = Thread(target=do_work, args=(END/2, END, result))
th1.start()
th2.start()
th1.join()
th2.join()
print "Result : ", sum(result)
42. 쓰레드 1개 쓰레드 2개
$ time python 1thread.py $ time python 2thread.py
Result : 199999990000000 Result : 199999990000000
real 0m3.523s real 0m4.225s
응-_-?
61. CPU READ/WRITE
프로그램이 I/O를 많이쓰면 Python 쓰레드도 좋다!
C
P READ/WRITE
U
우리가 하는
일반 프로그래밍은
대부분 I/O bound!!
놀 C
아 P READ/WRITE
요 U
이득 봅니다~!
C
놀아요 P READ/WRITE
U
65. 프로세스
쓰레드 놀아요 쓰레드
놀아요 쓰레드 놀아요
multiprocessing 모듈은
쓰레드 대신 프로세스를 띄워줍니다.
프로세스
일합니다.
프로세스
일합니다.
66. from multiprocessing import Process, Queue
def do_work(start, end, result):
sum = 0
for i in range(start, end):
sum += i
result.put(sum)
return
if __name__ == "__main__":
START, END = 0, 20000000
result = Queue()
pr1 = Process(target=do_work, args=(START, END/2, result))
pr2 = Process(target=do_work, args=(END/2, END, result))
pr1.start()
pr2.start()
pr1.join()
pr2.join()
result.put('STOP')
sum = 0
while True:
tmp = result.get()
if tmp == 'STOP': break
else: sum += tmp
print "Result : ", sum
67. 쓰레드 2개 프로세스 2개
$ time python 2thread.py $ time python 2process.py
Result : 199999990000000 Result : 199999990000000
real 0m4.225s real 0m1.880s
성공!
수행시간(sec)
4.2
1.8
2 thread 2 process
68. Multiprocessing 은
쓰레드 쓰듯 프로세스를 쓸 수 있습니다.
th1 = Thread(target=do_work, args=(START, END, result))
th1.start()
th1.join()
pr1 = Process(target=do_work, args=(START, END, result))
pr1.start()
pr1.join()
69. Multiprocessing 은
동기화 도구들도 모두 지원합니다.
threading.Condition multiprocessing.Condition
threading.Event multiprocessing.Event
threading.Lock multiprocessing.Lock
threading.RLock multiprocessing.RLock
threading.Semaphore multiprocessing.Semaphore
코드 수정 없이 이름만 바꾸어줘도 동작합니다.
92. 애들을 풀어 일을 나눠 시킵니다.
map
KTH 1 많이 1 KTH 1 사장님 1 월급 1
멋있다 1 지원 1 많이 1 많이 1
하세요 1 멋있다 1 지원 1
93. 몇 명이 결과를 모아 계산합니다.
reduce
KTH 1 많이 1 KTH 1 사장님 1 월급 1
멋있다 1 지원 1 많이 1 많이 1
하세요 1 멋있다 1 지원 1
나는 A~Z를 모을께~ 난 ㄱ~ㅁ 난 ㅅ~끝까지
KTH 2 많이 3 사장님 1
멋있다 2 월급 1 지원 2
하세요 1
94. MapReduce
큰 작업을
잘게 나누기(map)
종류별로 모으기(reduce)
로 처리하는 방식을 말합니다.
106. 반장의 단어 세기 프로그램 : mrjob을 이용한 버전
from mrjob.job import MRJob 문장을 나누
고 (단어, 1)
class MRWordCounter(MRJob):
def mapper(self, key, line): 을 리턴해요
for word in line.split():
yield word, 1
def reducer(self, word, occurrences):
yield word, sum(occurrences)
if __name__ == '__main__': 들어온 단어
MRWordCounter.run() 를 세어요
107. 디버깅을 위해서, 굳이 Hadoop을 띄우지 않고 로컬로
$ python word_count.py data.txt --runner=local --output-dir=result
Hadoop으로 할때는 runner만 변경하면 됨
$ export HADOOP_HOME=~~~~~
$ python word_count.py data.txt --runner=hadoop --output-dir=result