View
4.706
Download
13
Embed Size (px)
DESCRIPTION
Citation preview
Redis로����������� ������������������ 소셜게임개발자����������� ������������������ 구출하기
CTO,����������� ������������������ SUNDAYTOZ
임현수
@fribirdz
소셜게임(서버)의����������� ������������������ 특성
쓰기(Create,����������� ������������������ Update,����������� ������������������ Delete)가����������� ������������������ 읽기(Read)보다����������� ������������������ 훨씬����������� ������������������ 많다.
데이터는����������� ������������������ 계속����������� ������������������ 변한다.
하나의����������� ������������������ 인스턴스를����������� ������������������ 여러명이����������� ������������������ 갱신하는����������� ������������������ 경우가����������� ������������������ 많다.
트랜잭션����������� ������������������ 단위의����������� ������������������ 요청이����������� ������������������ 많다.
서비스����������� ������������������ 중인����������� ������������������
소셜게임서버의����������� ������������������ 어려움
업데이트����������� ������������������ =����������� ������������������ 부하����������� ������������������ 상승
업데이트가����������� ������������������ 계속되면����������� ������������������ 게임의����������� ������������������ 기능도����������� ������������������ 추가되거나����������� ������������������ 보강된다.
기능이����������� ������������������ 보강되는����������� ������������������ 경우����������� ������������������ 기존����������� ������������������ 기능����������� ������������������ +����������� ������������������ 추가����������� ������������������ 요소����������� ������������������ or����������� ������������������ 기존����������� ������������������ 기능����������� ������������������ +����������� ������������������ 소셜����������� ������������������ 기능일����������� ������������������ 때가����������� ������������������ 많다.
그럴수록����������� ������������������ 게임의����������� ������������������ 복잡도는����������� ������������������ 늘어나고,����������� ������������������ 계산해야����������� ������������������ 할����������� ������������������ 양도����������� ������������������ 지수적으로����������� ������������������ 늘어날����������� ������������������ 수����������� ������������������ 있다.
업데이트����������� ������������������ =����������� ������������������ 부하����������� ������������������ 상승
작물����������� ������������������ 심기작물����������� ������������������ 심기����������� ������������������ +����������� ������������������ 친구����������� ������������������ 작물����������� ������������������ 축복하기
작물����������� ������������������ 심기����������� ������������������ +친구����������� ������������������ 작물����������� ������������������ 축복하기����������� ������������������ +����������� ������������������ 하루에����������� ������������������ 한번����������� ������������������ 내����������� ������������������ 작물에����������� ������������������ 물����������� ������������������ 주기����������� ������������������ +����������� ������������������ 작물����������� ������������������ 도둑����������� ������������������ vs����������� ������������������ 경
찰����������� ������������������ 기능
작물����������� ������������������ 심기����������� ������������������ +친구����������� ������������������ 작물����������� ������������������ 축복하기����������� ������������������ +����������� ������������������ 하루에����������� ������������������ 한번����������� ������������������ 내����������� ������������������ 작물에����������� ������������������ 물����������� ������������������ 주기
서버����������� ������������������ 부하����������� ������������������ 해결의����������� ������������������ 어려움
(웹서버의����������� ������������������ 부하를����������� ������������������ 해결하고����������� ������������������ 난����������� ������������������ 뒤에����������� ������������������ 남은)����������� ������������������ 대부분의����������� ������������������ 부하는����������� ������������������ DB����������� ������������������ 부하이다.
DB����������� ������������������ 부하는����������� ������������������ 최적화와����������� ������������������ 튜닝만으로는����������� ������������������ 처리에����������� ������������������ 한계가����������� ������������������ 있다.
DB����������� ������������������ Replication
소셜게임서버의����������� ������������������ DB����������� ������������������ 읽기/쓰기����������� ������������������ 비율은����������� ������������������ 3:7~5:5
Replication을����������� ������������������ 해도,����������� ������������������ 쓰기의����������� ������������������ 부하는����������� ������������������ 줄어드지����������� ������������������ 않는다.
게임����������� ������������������ 데이터는����������� ������������������ 계속����������� ������������������ 변한다.����������� ������������������ Master����������� ������������������ -����������� ������������������ Slave����������� ������������������ 동기화의����������� ������������������ 시간차가����������� ������������������ 커지면����������� ������������������ 게임로직의����������� ������������������ 오류로����������� ������������������ 전파될����������� ������������������ 수����������� ������������������ 있다.
DB����������� ������������������ Sharding
나눠진����������� ������������������ DB����������� ������������������ 간의����������� ������������������ Join,����������� ������������������ Transaction의����������� ������������������ 어려움
공평하게����������� ������������������ 분산하는����������� ������������������ 것도����������� ������������������ 쉽지����������� ������������������ 않음
최근����������� ������������������ 가입한����������� ������������������ 회원들이����������� ������������������ 더����������� ������������������ 요청을����������� ������������������ 많이����������� ������������������ 함
Hash를����������� ������������������ 통해����������� ������������������ 분산한다면,����������� ������������������ 서버를����������� ������������������ 추가했을����������� ������������������ 때����������� ������������������ 처리가����������� ������������������ 복잡해짐
서버����������� ������������������ 설계����������� ������������������ 단계부터����������� ������������������ 고려되어야����������� ������������������ 함
Scale����������� ������������������ Up?
SATA����������� ������������������ ->����������� ������������������ SAS����������� ������������������ ->����������� ������������������ SSD����������� ������������������ ->����������� ������������������ FusionIO����������� ������������������ ->����������� ������������������ 그����������� ������������������ 이후엔?
AWS와����������� ������������������ 같은����������� ������������������ 클라우드����������� ������������������ 서버는����������� ������������������ I/O����������� ������������������ 성능이����������� ������������������ 매우����������� ������������������ 떨어진다.
NoSQL로����������� ������������������ 교체!
“매일����������� ������������������ 수십만명에게����������� ������������������ 서비스하는����������� ������������������ 게임의����������� ������������������ DB를����������� ������������������ 어떻게����������� ������������������ 뒤엎어요.����������� ������������������ ㅎㄷㄷㄷ����������� ������������������ 잘못되면����������� ������������������ 사����������� ������������������ to����������� ������������������ the����������� ������������������ 망”
Memcached
영구적이지����������� ������������������ 않음.
MemcacheDB,����������� ������������������ Membase����������� ������������������ 와����������� ������������������ 같은����������� ������������������ 해결책은����������� ������������������ 있음
읽기를����������� ������������������ 줄일����������� ������������������ 수는����������� ������������������ 있지만,����������� ������������������ 쓰기를����������� ������������������ 줄일����������� ������������������ 수는����������� ������������������ 없음
DB를����������� ������������������ memcached로����������� ������������������ 교체하면����������� ������������������ 해결할����������� ������������������ 수����������� ������������������ 있음.
하지만....
“매일����������� ������������������ 수십만명에게����������� ������������������ 서비스하는����������� ������������������ 게임의����������� ������������������ DB를����������� ������������������ 어떻게����������� ������������������ 뒤엎어요.����������� ������������������ ㅎㄷㄷㄷ����������� ������������������ 잘못되면����������� ������������������ 사����������� ������������������ to����������� ������������������ the����������� ������������������ 망”
전략
MySQL의����������� ������������������ 쓰기����������� ������������������ 작업����������� ������������������ 중
부하가����������� ������������������ 심한데����������� ������������������ Memcached나����������� ������������������ NoSQL로����������� ������������������ 떼어낼����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 작업은����������� ������������������ 없을까?
소셜게임의����������� ������������������ 특성
하루에����������� ������������������ N번씩����������� ������������������ 할����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 행동
N분마다����������� ������������������ 1번씩����������� ������������������ 할����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 행동
내����������� ������������������ 작물에����������� ������������������ 1번씩����������� ������������������ 할수����������� ������������������ 있는����������� ������������������ 행동
내����������� ������������������ 친구한테����������� ������������������ 1번씩����������� ������������������ 할����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 행동
내����������� ������������������ 친구����������� ������������������ 작물에����������� ������������������ 1번씩����������� ������������������ 할����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 행동...
Redis
고성능
Persistance����������� ������������������ Storage
다양한����������� ������������������ Data����������� ������������������ Structures����������� ������������������ 지원
다양한����������� ������������������ Data����������� ������������������ Structures!
String
SET,����������� ������������������ Sorted����������� ������������������ SET
LIST
Hash
유용한����������� ������������������ 기능들
KEYS
INCR,����������� ������������������ INCRBY
DECR,����������� ������������������ DECRBY
TTL
SDIFF
명령어
공통
exists,����������� ������������������ del,����������� ������������������ type
keys,����������� ������������������ randomkeys
flushdb
ttl,����������� ������������������ expire
명령어
String
get,����������� ������������������ set,����������� ������������������ getset
mget,����������� ������������������ mset
incr,����������� ������������������ incrby
decr,����������� ������������������ decrby
명령어
List
pop,����������� ������������������ pop
index
lrange,����������� ������������������ ltrim,����������� ������������������ llen
blpop,����������� ������������������ brpop
rpoplpush,����������� ������������������ brpoplpush
명령어
SET
sadd,����������� ������������������ srem,����������� ������������������ spop,����������� ������������������ smove
scard,����������� ������������������ sismember,����������� ������������������ smembers,����������� ������������������ srandmember
sinter,����������� ������������������ sinterstore,����������� ������������������ sunion,����������� ������������������ sunionstore
sdiff,����������� ������������������ sdiffstore
명령어
SET
sadd,����������� ������������������ srem,����������� ������������������ spop,����������� ������������������ smove
scard,����������� ������������������ sismember,����������� ������������������ smembers,����������� ������������������ srandmember
sinter,����������� ������������������ sinterstore,����������� ������������������ sunion,����������� ������������������ sunionstore
sdiff,����������� ������������������ sdiffstore
장점
RDBMS에서����������� ������������������ N번의����������� ������������������ 쿼리로����������� ������������������ 해야할����������� ������������������ 일을����������� ������������������ 1번의����������� ������������������ 쿼리로����������� ������������������ 수행할����������� ������������������ 수����������� ������������������ 있다.
RDBMS에서����������� ������������������ N개의����������� ������������������ row를����������� ������������������ 검색해서����������� ������������������ 얻어야����������� ������������������ 하는����������� ������������������ 결과를����������� ������������������ 적절한����������� ������������������ data����������� ������������������ structure를����������� ������������������ 사용해서����������� ������������������ 적은����������� ������������������ cost로����������� ������������������ 수행할����������� ������������������ 수����������� ������������������ 있다.
유용한����������� ������������������ 기능들
INCR,����������� ������������������ INCRBY
redis>����������� ������������������ SET����������� ������������������ visitors����������� ������������������ "10"
OK
redis>����������� ������������������ INCRBY����������� ������������������ visitors����������� ������������������ 5
(integer)����������� ������������������ 15
내����������� ������������������ 농장����������� ������������������ 오늘/전체����������� ������������������ 방문자����������� ������������������ 수
(오늘)����������� ������������������ 선물����������� ������������������ 보낸����������� ������������������ 횟수
소셜����������� ������������������ 에너지����������� ������������������ 카운팅(with����������� ������������������ expire)
유용한����������� ������������������ 기능들����������� ������������������ :����������� ������������������ SET
하루에����������� ������������������ 한번만����������� ������������������ 할����������� ������������������ 수����������� ������������������ 있는����������� ������������������ 행동들에����������� ������������������ 사용
Key에����������� ������������������ expire를����������� ������������������ 주거나,����������� ������������������ daily����������� ������������������ DB를����������� ������������������ flush
SADD����������� ������������������ (set에����������� ������������������ member����������� ������������������ 추가)
SCARD����������� ������������������ (count)
SRANDMEMBER����������� ������������������ (랜덤����������� ������������������ member����������� ������������������ 추출)
SISMEMBER����������� ������������������ (특정����������� ������������������ member가����������� ������������������ set����������� ������������������ 안에����������� ������������������ 존재하는지����������� ������������������ 확인)
유용한����������� ������������������ 기능들����������� ������������������ :����������� ������������������ SET
친구의����������� ������������������ 농장에서����������� ������������������ 보물상자를����������� ������������������ 열����������� ������������������ 수����������� ������������������ 있다.
친구����������� ������������������ 1명당����������� ������������������ 하루에����������� ������������������ 1번����������� ������������������ 열����������� ������������������ 수����������� ������������������ 있다.
User����������� ������������������ B가����������� ������������������ 보물상자를����������� ������������������ 연����������� ������������������ 친구들의����������� ������������������ 목록
SMEMBERS����������� ������������������ OPEN_BOX:USER_B
User����������� ������������������ B가����������� ������������������ 보물상자를����������� ������������������ 연����������� ������������������ 횟수����������� ������������������ (일일����������� ������������������ 제한)
SCARD����������� ������������������ OPEN_BOX:USER_B
User����������� ������������������ A가����������� ������������������ User����������� ������������������ B의����������� ������������������ 농장에서����������� ������������������ 보물상자를����������� ������������������ 열었는지����������� ������������������
SISMEMBER����������� ������������������ OPEN_BOX:USER_A����������� ������������������ USER_B
유용한����������� ������������������ 기능들����������� ������������������ :����������� ������������������ LIST
LLEN����������� ������������������ (get����������� ������������������ the����������� ������������������ length����������� ������������������ of����������� ������������������ a����������� ������������������ list)
LPUSH����������� ������������������ (prepend����������� ������������������ a����������� ������������������ vlue����������� ������������������ to����������� ������������������ a����������� ������������������ list)
LREM����������� ������������������ (remove����������� ������������������ elements����������� ������������������ from����������� ������������������ a����������� ������������������ list)
LTRIM����������� ������������������ (trim����������� ������������������ a����������� ������������������ list����������� ������������������ to����������� ������������������ the����������� ������������������ specified����������� ������������������ range)
유용한����������� ������������������ 기능들����������� ������������������ :����������� ������������������ LIST
최근����������� ������������������ 내����������� ������������������ 농장에서����������� ������������������ 친구들이����������� ������������������ 취한����������� ������������������ 액션들
최근����������� ������������������ 30개
최근����������� ������������������ 순서대로
Mysql����������� ������������������ vs����������� ������������������ Redis
TBD
Redis의����������� ������������������ 단점
sharding을����������� ������������������ 직접����������� ������������������ 구현해야����������� ������������������ 한다.
REDIS����������� ������������������ 3.0에서는����������� ������������������ Clustering����������� ������������������ 지원����������� ������������������ 예정
데이터����������� ������������������ 사이즈가����������� ������������������ 커지면����������� ������������������ (특히����������� ������������������ string)����������� ������������������ 메모리����������� ������������������ 사용량이����������� ������������������ 급격히����������� ������������������ 늘어난다.
메모리의����������� ������������������ 데이터를����������� ������������������ Disk로����������� ������������������ snapshotting할����������� ������������������ 때����������� ������������������ I/O가����������� ������������������ 급격히����������� ������������������ 상승한다.����������� ������������������ 데이터의����������� ������������������ 크기가����������� ������������������ 커질수록����������� ������������������ 더����������� ������������������ 심하다.