SlideShare a Scribd company logo
1 of 31
Download to read offline
SCALABILITY

DISTRIBUTED
채팅  서버  적용사례를  통한  분산서버  관리  방법  알아보기
github.com/xpush/node-­‐xpush
#  효과적인  부하  분산은  어떻게  하면  좋을까?
그냥  Round  Robin  하면  된다.
#  그런데..  대용량  처리를  위한  채팅  서버라면,  좀  다른  것  같다.
#  수십만명이  동시에  접속하는  온라인  인터넷  방송  ‘America  TV’  의  
      채팅  기능을  구현한다고  생각하자.
#  채팅  서버만해도  수십대  또는  수백대가  필요할  것인데,  
      어떻게  부하  분산하고  무중단  확장할  수  있을까?
실제로  이런거  없음.  그냥  예를  들어..
#  네트워크  비용을  최소화  하고,  성능을  극대화  하기  위한  방법이  필요하다
#  로컬  통신을  극대화  하기  위한  분산  기법이  될  수  있겠다.
분산  서버  아키텍처  설계는  네트워크  비용이  커질  수  밖에  없지.    분산된  서버들간에  데이터  통신이나  데이터  공유가  필요하니까  말이다.
분산  서버  아키텍처  설계에서  최대한으로  서버간  데이터  전송을  하지  않도록  해야  한다.  물론  모든  경우에  적합하지는  않다.채팅  같은  경우가  적합하겠지  말이다.
비용이라고,  꼭  돈만이  아니다!
이런거  크게  신경  쓰기  싫다면,  역시  Round  Robin  하면  된다.
#  채팅  서버가  어떻게  구성되어  있는지  부터  보자  !
#  분산된  채팅  서버를  할당해주는  Session  서버를  별도로  만들었다.
Session  Server  
-­‐ 채팅방  별  Channel  서버  할당

(할당할  서버목록을  가지고  있어야  함)  
-­‐ Channel  서버  접속을  위한  인증
Channel  Server  
-­‐ 실시간  메시지  송수신  처리  (채팅  서버)  
-­‐ 모든  Client  는  Channel  서버에  접속  유지  
-­‐ Client  수에  따라  유동적으로  Scale-­‐out  필요
session  서버는  zookeeper  의  channel  서버  목록을  동기화  하고  있다.
channel  서버가  실행되면,  zookeeper  에  znode를  생성
server  /  A^123.45.67.01:9001  
                            B^123.45.67.01:9002  
                            C^123.45.67.01:9001  
                            D^123.45.67.01:9002  
                            E^123.45.67.01:9001  
                            F^123.45.67.01:9002  
                            G^123.45.67.01:9001  
                            H^123.45.67.01:9002
Session  Server
Channel  Server  A
.  
.  
.  
.  
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
#  가장  먼저,  Session  서버는  접속할  Channel  Server  정보를  알려  준다.
server  /  A^123.45.67.01:9001  
                            B^123.45.67.01:9002  
                            C^123.45.67.02:9001  
                            D^123.45.67.02:9002  
                            E^123.45.67.03:9001  
                            F^123.45.67.03:9002  
                            G^123.45.67.04:9001  
                            H^123.45.67.04:9002
Session  Server
Channel  Server  A
.  
.  
.  
.  
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
hDps://session-­‐server/node/americatv/kimeve
hDps://session-­‐server/node/americatv/yumdaeng
채팅방  -­‐  kimeve
채팅방  -­‐  yumdaeng
server  :  C,  url  :  123.45.67.02:9001
server  :  F,  url  :  123.45.67.03:9002
-­‐ 실제로,  Session  서버는  client  의  접속  인증처리도  함께  해야  하기  때문에,  인증  Token  을  생성하여  Client  에  전달해야  할  것이다.  (인증  토큰은  Client  가  Channel  Server  에  접근할  때  함께  전달한다.)
#  그  다음,  Client  는  할당받은  channel  서버에  접속해서  메시지를  송수신  한다.
server  /  A^123.45.67.01:9001  
                            B^123.45.67.01:9002  
                            C^123.45.67.02:9001  
                            D^123.45.67.02:9002  
                            E^123.45.67.03:9001  
                            F^123.45.67.03:9002  
                            G^123.45.67.04:9001  
                            H^123.45.67.04:9002
Session  Server
Channel  Server  A
.  
.  
.  
.  
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
채팅방  -­‐  kimeve
채팅방  -­‐  yumdaeng
channel  :  kimeve  
server  :  C

url  :  123.45.67.02:9001
channel  :  yumdaeng  
server  :  F

url  :  123.45.67.03:9002
socket  (TCP)
socket  (TCP)
-­‐ 실제로,  Client  가  Channel  Server  에  연결  요청할  때는,  인증  토큰을  함께  전달하고,  Channel  Server  는  인증  토큰이  유효한  값인지  확인하고  ConnecOon  을  맺어야  할  것이다.
같은  채팅방에  있는  Client  는  모두  같은  서버에  접속하게  해서,  Local  통신하게  하자  !!  (  네트워크  비용이나,  성능  향상  )
#  그럼  이제  본론이다.  
      Session  서버는  어떻게  Channel  서버를  할당해야  할까?
#  STEP  1.  Consistent  Hashing
server  /  A^123.45.67.01:9001  
                            B^123.45.67.01:9002  
                            C^123.45.67.01:9001  
                            D^123.45.67.01:9002  
                            E^123.45.67.01:9001  
                            F^123.45.67.01:9002  
                            G^123.45.67.01:9001  
                            H^123.45.67.01:9002
Session  Server
Channel  Server  A
.  
.  
.  
.  
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
zookeeper  로  부터  동기화  되는  서버  목록  데이터를  기반으로

Session  서버에는  Consistent  Hashing  함수  구현한다.
A
B
C
D
value
 =
 HASH(key)
Service
 Server
Token
 Ring
#  STEP  1.  Consistent  Hashing
A
B
C
D
value
 =
 HASH(key)B C
D
A
B
C
D
D
A
B
C
D
A
B
CAB
C
D
A
B
C
A
A
B
C
D
A
B C
D
value
 =
 HASH(key2)
#  STEP  1.  Consistent  Hashing  -­‐  replica  !!
A
B
C
D
B C
D
A
B
C
D
D
A
B
C
D
A
B
CAB
C
D
A
B
C
A
A
B
C
D
A
B C
D
value
 =
 HASH(key2)
value
 =
 HASH(key)
#  STEP  1.  Consistent  Hashing
https://weblogs.java.net/blog/tomwhite/archive/2007/11/consistent_hash.html
standard  devia@on
#  STEP  1.  Consistent  Hashing
#  그런데,  
      Channel  서버가  추가되거나  삭제되면,  Consistent  Hashing  값이  달라진다.
kimeve  채팅방은  Channel  Server  C  를  할당했다.  신규  Channel  Server  를  추가해서  Consistent  Hashing  을  갱신했더니,    이제  Channel  Server  F  를  할당하더라.
#  STEP  2.  Using  allocaRon  data  table
Session  Server
Channel  Server  A
.  
.  
.  
.  
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
REDIS
hDps://session-­‐server/node/americatv/kimeve
Consistent  Hashing  함수를  통해  ‘Channel  Server  C’  를  할당한다.
HSET
socket  (TCP)
kimeve    :    C    :    1
접속한  정보는  실시간으로  REDIS  에서  관리한다.
KEY 서버이름
현재  접속자  수

(당연히,  처음  적속했다면  1  이다)
GET
In-­‐Memory  DB  에  현재  접속  정보를  관리하고,  서버  할당시  확인한다.
속도  때문에  redis  를  사용했지,  꼭  이것만  할  수  있는건  아니다.
REDIS  에  서버  접속  정보가  있는지  확인한다.

KEY값이  kimeve  인  데이터가  REDIS  에  있는지  확인한다.
1
2
3
Session  Server
Channel  Server  A
.  
.  
.  
.  
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
REDIS
hDps://session-­‐server/node/americatv/kimeve
REDIS  에서  조회한  Channel  Server  C  정보를  반환한다.
HSET
socket  (TCP)
kimeve    :    C    :    2
접속한  정보는  실시간으로  REDIS  에서  관리한다.
KEY 서버이름
현재  접속자  수

현재  접속자  수는  Channel  Server  에서  구해서

REDIS  의  값을  갱신한다.

(이제  2명이  되었다!)
GET
In-­‐Memory  DB  에  현재  접속  정보를  관리하고,  서버  할당시  확인한다.
이미  접속한  Client
REDIS  에  서버  접속  정보가  있는지  확인한다.  있다!!!

KEY값이  kimeve  인  데이터가  REDIS  에  있는지  확인한다.
1
2
3
새로  접속하는  2번째  client
#  STEP  2.  Using  allocaRon  data  table
Session  Server
Channel  Server  A
zookeeper
Channel  Server  B
Channel  Server  C Channel  Server  D
Channel  Server  E Channel  Server  F
Channel  Server  G Channel  Server  H
.  
.  
.  
.  
watching
create  Node
123.45.67.01:9001 123.45.67.01:9002
123.45.67.02:9001 123.45.67.02:9002
123.45.67.03:9001 123.45.67.03:9002
123.45.67.04:9001 123.45.67.04:9002
REDIS
HSET
kimeve    :    C    :    2
GET
Channel  Server  I
신규  추가된  Channel  서버
123.45.67.05:9001
server  /  A^123.45.67.01:9001  
                            B^123.45.67.01:9002  
                            C^123.45.67.02:9001  
                            D^123.45.67.02:9002  
                            E^123.45.67.03:9001  
                            F^123.45.67.03:9002  
                            G^123.45.67.04:9001  
                            H^123.45.67.04:9002  
                              I  ^123.45.67.05:9002Zookeeper  에  Node  생성
Consistent  Hashing  갱신  !!!
kimeve  채팅방은
Consistent  Hashing  결과  값은  C  였지만,
Channel  Server  I  가  추가된  후
Consistent  Hashing  결과  값이  H  가  되었다.
하지만,
REDIS  에는  C  이므로,
kimeve  채팅방에  C  를  할당할  수  있다.
만약,  kimeve  채팅방이  다시  만들어  진다면,
그때는  H를  할당  한다.
#  STEP  2.  Using  allocaRon  data  table

More Related Content

What's hot

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템QooJuice
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직Hoyoung Choi
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현YEONG-CHEON YOU
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advanceDaeMyung Kang
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010devCAT Studio, NEXON
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3Heungsub Lee
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍Chris Ohk
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019devCAT Studio, NEXON
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현noerror
 
무정지&무점검 서버 개발과 운영 사례
무정지&무점검 서버 개발과 운영 사례무정지&무점검 서버 개발과 운영 사례
무정지&무점검 서버 개발과 운영 사례Taehyun Kim
 
Neovim으로 생산성 퀀텀점프하기 by 이재열
Neovim으로 생산성 퀀텀점프하기 by 이재열Neovim으로 생산성 퀀텀점프하기 by 이재열
Neovim으로 생산성 퀀텀점프하기 by 이재열Excelcon
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)Heungsub Lee
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree AlgorithmMerry Merry
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018devCAT Studio, NEXON
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드KwangSeob Jeong
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCHo Gyu Lee
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr내훈 정
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Esun Kim
 

What's hot (20)

테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템테라로 살펴본 MMORPG의 논타겟팅 시스템
테라로 살펴본 MMORPG의 논타겟팅 시스템
 
중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직중앙 서버 없는 게임 로직
중앙 서버 없는 게임 로직
 
MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
How to build massive service for advance
How to build massive service for advanceHow to build massive service for advance
How to build massive service for advance
 
송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010송창규, unity build로 빌드타임 반토막내기, NDC2010
송창규, unity build로 빌드타임 반토막내기, NDC2010
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
인프콘 2022 - Rust 크로스 플랫폼 프로그래밍
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현NDC12_Lockless게임서버설계와구현
NDC12_Lockless게임서버설계와구현
 
무정지&무점검 서버 개발과 운영 사례
무정지&무점검 서버 개발과 운영 사례무정지&무점검 서버 개발과 운영 사례
무정지&무점검 서버 개발과 운영 사례
 
Neovim으로 생산성 퀀텀점프하기 by 이재열
Neovim으로 생산성 퀀텀점프하기 by 이재열Neovim으로 생산성 퀀텀점프하기 by 이재열
Neovim으로 생산성 퀀텀점프하기 by 이재열
 
Redis
RedisRedis
Redis
 
파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)파이썬 생존 안내서 (자막)
파이썬 생존 안내서 (자막)
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
이승재, 실버바인 서버엔진 2 설계 리뷰, NDC2018
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
Ndc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABCNdc14 분산 서버 구축의 ABC
Ndc14 분산 서버 구축의 ABC
 
Multithread & shared_ptr
Multithread & shared_ptrMultithread & shared_ptr
Multithread & shared_ptr
 
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
Akka.NET 으로 만드는 온라인 게임 서버 (NDC2016)
 

Similar to 채팅서버의 부하 분산 사례

[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용
[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용
[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용NAVER CLOUD PLATFORMㅣ네이버 클라우드 플랫폼
 
Rhea_MMO_SNG_Convergence_Server_Architecture
Rhea_MMO_SNG_Convergence_Server_ArchitectureRhea_MMO_SNG_Convergence_Server_Architecture
Rhea_MMO_SNG_Convergence_Server_ArchitectureRhea Strike
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축Ji-Woong Choi
 
Amazon Connect를 이용한 outbound call 서비스 개발하기
Amazon Connect를 이용한 outbound call 서비스 개발하기Amazon Connect를 이용한 outbound call 서비스 개발하기
Amazon Connect를 이용한 outbound call 서비스 개발하기창훈 현
 
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...Amazon Web Services Korea
 
Webservice cache strategy
Webservice cache strategyWebservice cache strategy
Webservice cache strategyDaeMyung Kang
 
Kerberos Authentication - 버티카 케르베로스 연동하기
Kerberos Authentication - 버티카 케르베로스 연동하기Kerberos Authentication - 버티카 케르베로스 연동하기
Kerberos Authentication - 버티카 케르베로스 연동하기Kee Hoon Lee
 
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)Cloud-Barista Community
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례if kakao
 
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...Cloud-Barista Community
 
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기Jongwon Han
 
TXGX 2019_Jesse_Klaytn API Service
TXGX 2019_Jesse_Klaytn API ServiceTXGX 2019_Jesse_Klaytn API Service
TXGX 2019_Jesse_Klaytn API ServiceKlaytn
 
[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기NAVER D2
 
Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...
Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...
Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...Cloud-Barista Community
 

Similar to 채팅서버의 부하 분산 사례 (15)

[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용
[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용
[네이버클라우드플랫폼 온라인 교육 시리즈] 네이버클라우드플랫폼 CLI 소개 및 활용
 
Rhea_MMO_SNG_Convergence_Server_Architecture
Rhea_MMO_SNG_Convergence_Server_ArchitectureRhea_MMO_SNG_Convergence_Server_Architecture
Rhea_MMO_SNG_Convergence_Server_Architecture
 
SSL/TLS 1.3 Deep Dive
SSL/TLS 1.3 Deep Dive SSL/TLS 1.3 Deep Dive
SSL/TLS 1.3 Deep Dive
 
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
[오픈소스컨설팅]쿠버네티스를 활용한 개발환경 구축
 
Amazon Connect를 이용한 outbound call 서비스 개발하기
Amazon Connect를 이용한 outbound call 서비스 개발하기Amazon Connect를 이용한 outbound call 서비스 개발하기
Amazon Connect를 이용한 outbound call 서비스 개발하기
 
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
PUBG: Battlegrounds 라이브 서비스 EKS 전환 사례 공유 [크래프톤 - 레벨 300] - 발표자: 김정헌, PUBG Dev...
 
Webservice cache strategy
Webservice cache strategyWebservice cache strategy
Webservice cache strategy
 
Kerberos Authentication - 버티카 케르베로스 연동하기
Kerberos Authentication - 버티카 케르베로스 연동하기Kerberos Authentication - 버티카 케르베로스 연동하기
Kerberos Authentication - 버티카 케르베로스 연동하기
 
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)
Cloud-Barista 제5차 오픈 컨퍼런스 : 멀티클라우드 가상 네트워크 (CB-Larva)
 
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
글로벌 게임 플랫폼에서 무정지, 무점검 서버 개발과 운영 사례
 
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...
Cloud-Barista 제4차 오픈 컨퍼런스 : CB-Larva - 멀티클라우드 인프라 및 응용을 위한 네트워킹 (Networking f...
 
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
Daily Continuous Deployment를 위한 Custom CLI 개발 및
 AWS Elastic Beanstalk에 적용하기
 
TXGX 2019_Jesse_Klaytn API Service
TXGX 2019_Jesse_Klaytn API ServiceTXGX 2019_Jesse_Klaytn API Service
TXGX 2019_Jesse_Klaytn API Service
 
[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기[252] 증분 처리 플랫폼 cana 개발기
[252] 증분 처리 플랫폼 cana 개발기
 
Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...
Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...
Cloud-Barista 제1차 오픈세미나 - CB-Spider : 멀티 클라우드 인프라 연동 프레임워크(1st Open Seminar, ...
 

More from John Kim

How to build Design System?
How to build Design System?How to build Design System?
How to build Design System?John Kim
 
Nginx basic configurations
Nginx basic configurationsNginx basic configurations
Nginx basic configurationsJohn Kim
 
Play node conference
Play node conferencePlay node conference
Play node conferenceJohn Kim
 
플랫폼이란 무엇인가 (IoT Platform)
플랫폼이란 무엇인가 (IoT Platform)플랫폼이란 무엇인가 (IoT Platform)
플랫폼이란 무엇인가 (IoT Platform)John Kim
 
2015 AWS IoT HACK DAY
2015 AWS IoT HACK DAY2015 AWS IoT HACK DAY
2015 AWS IoT HACK DAYJohn Kim
 
실시간 서비스 플랫폼 개발 사례
실시간 서비스 플랫폼 개발 사례실시간 서비스 플랫폼 개발 사례
실시간 서비스 플랫폼 개발 사례John Kim
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기John Kim
 
vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습John Kim
 
vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기John Kim
 
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술John Kim
 

More from John Kim (10)

How to build Design System?
How to build Design System?How to build Design System?
How to build Design System?
 
Nginx basic configurations
Nginx basic configurationsNginx basic configurations
Nginx basic configurations
 
Play node conference
Play node conferencePlay node conference
Play node conference
 
플랫폼이란 무엇인가 (IoT Platform)
플랫폼이란 무엇인가 (IoT Platform)플랫폼이란 무엇인가 (IoT Platform)
플랫폼이란 무엇인가 (IoT Platform)
 
2015 AWS IoT HACK DAY
2015 AWS IoT HACK DAY2015 AWS IoT HACK DAY
2015 AWS IoT HACK DAY
 
실시간 서비스 플랫폼 개발 사례
실시간 서비스 플랫폼 개발 사례실시간 서비스 플랫폼 개발 사례
실시간 서비스 플랫폼 개발 사례
 
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기NODE.JS 글로벌 기업 적용 사례  그리고, real-time 어플리케이션 개발하기
NODE.JS 글로벌 기업 적용 사례 그리고, real-time 어플리케이션 개발하기
 
vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습vert.x 소개 및 개발 실습
vert.x 소개 및 개발 실습
 
vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기vert.x 를 활용한 분산서버 개발하기
vert.x 를 활용한 분산서버 개발하기
 
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
DEVIEW - 오픈소스를 활용한 분산아키텍처 구현기술
 

채팅서버의 부하 분산 사례

  • 1. SCALABILITY
 DISTRIBUTED 채팅  서버  적용사례를  통한  분산서버  관리  방법  알아보기 github.com/xpush/node-­‐xpush
  • 2. #  효과적인  부하  분산은  어떻게  하면  좋을까? 그냥  Round  Robin  하면  된다.
  • 3. #  그런데..  대용량  처리를  위한  채팅  서버라면,  좀  다른  것  같다.
  • 4. #  수십만명이  동시에  접속하는  온라인  인터넷  방송  ‘America  TV’  의        채팅  기능을  구현한다고  생각하자. #  채팅  서버만해도  수십대  또는  수백대가  필요할  것인데,        어떻게  부하  분산하고  무중단  확장할  수  있을까? 실제로  이런거  없음.  그냥  예를  들어..
  • 5. #  네트워크  비용을  최소화  하고,  성능을  극대화  하기  위한  방법이  필요하다 #  로컬  통신을  극대화  하기  위한  분산  기법이  될  수  있겠다. 분산  서버  아키텍처  설계는  네트워크  비용이  커질  수  밖에  없지.    분산된  서버들간에  데이터  통신이나  데이터  공유가  필요하니까  말이다. 분산  서버  아키텍처  설계에서  최대한으로  서버간  데이터  전송을  하지  않도록  해야  한다.  물론  모든  경우에  적합하지는  않다.채팅  같은  경우가  적합하겠지  말이다. 비용이라고,  꼭  돈만이  아니다! 이런거  크게  신경  쓰기  싫다면,  역시  Round  Robin  하면  된다.
  • 6. #  채팅  서버가  어떻게  구성되어  있는지  부터  보자  !
  • 7. #  분산된  채팅  서버를  할당해주는  Session  서버를  별도로  만들었다. Session  Server   -­‐ 채팅방  별  Channel  서버  할당
 (할당할  서버목록을  가지고  있어야  함)   -­‐ Channel  서버  접속을  위한  인증 Channel  Server   -­‐ 실시간  메시지  송수신  처리  (채팅  서버)   -­‐ 모든  Client  는  Channel  서버에  접속  유지   -­‐ Client  수에  따라  유동적으로  Scale-­‐out  필요 session  서버는  zookeeper  의  channel  서버  목록을  동기화  하고  있다. channel  서버가  실행되면,  zookeeper  에  znode를  생성 server  /  A^123.45.67.01:9001                              B^123.45.67.01:9002                              C^123.45.67.01:9001                              D^123.45.67.01:9002                              E^123.45.67.01:9001                              F^123.45.67.01:9002                              G^123.45.67.01:9001                              H^123.45.67.01:9002 Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002
  • 8. #  가장  먼저,  Session  서버는  접속할  Channel  Server  정보를  알려  준다. server  /  A^123.45.67.01:9001                              B^123.45.67.01:9002                              C^123.45.67.02:9001                              D^123.45.67.02:9002                              E^123.45.67.03:9001                              F^123.45.67.03:9002                              G^123.45.67.04:9001                              H^123.45.67.04:9002 Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 hDps://session-­‐server/node/americatv/kimeve hDps://session-­‐server/node/americatv/yumdaeng 채팅방  -­‐  kimeve 채팅방  -­‐  yumdaeng server  :  C,  url  :  123.45.67.02:9001 server  :  F,  url  :  123.45.67.03:9002 -­‐ 실제로,  Session  서버는  client  의  접속  인증처리도  함께  해야  하기  때문에,  인증  Token  을  생성하여  Client  에  전달해야  할  것이다.  (인증  토큰은  Client  가  Channel  Server  에  접근할  때  함께  전달한다.)
  • 9. #  그  다음,  Client  는  할당받은  channel  서버에  접속해서  메시지를  송수신  한다. server  /  A^123.45.67.01:9001                              B^123.45.67.01:9002                              C^123.45.67.02:9001                              D^123.45.67.02:9002                              E^123.45.67.03:9001                              F^123.45.67.03:9002                              G^123.45.67.04:9001                              H^123.45.67.04:9002 Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 채팅방  -­‐  kimeve 채팅방  -­‐  yumdaeng channel  :  kimeve   server  :  C
 url  :  123.45.67.02:9001 channel  :  yumdaeng   server  :  F
 url  :  123.45.67.03:9002 socket  (TCP) socket  (TCP) -­‐ 실제로,  Client  가  Channel  Server  에  연결  요청할  때는,  인증  토큰을  함께  전달하고,  Channel  Server  는  인증  토큰이  유효한  값인지  확인하고  ConnecOon  을  맺어야  할  것이다. 같은  채팅방에  있는  Client  는  모두  같은  서버에  접속하게  해서,  Local  통신하게  하자  !!  (  네트워크  비용이나,  성능  향상  )
  • 10. #  그럼  이제  본론이다.        Session  서버는  어떻게  Channel  서버를  할당해야  할까?
  • 11. #  STEP  1.  Consistent  Hashing server  /  A^123.45.67.01:9001                              B^123.45.67.01:9002                              C^123.45.67.01:9001                              D^123.45.67.01:9002                              E^123.45.67.01:9001                              F^123.45.67.01:9002                              G^123.45.67.01:9001                              H^123.45.67.01:9002 Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 zookeeper  로  부터  동기화  되는  서버  목록  데이터를  기반으로
 Session  서버에는  Consistent  Hashing  함수  구현한다.
  • 13.  =
  • 16.  Ring #  STEP  1.  Consistent  Hashing
  • 18.  =
  • 20.  =
  • 21.  HASH(key2) #  STEP  1.  Consistent  Hashing  -­‐  replica  !!
  • 23.  =
  • 25.  =
  • 26.  HASH(key) #  STEP  1.  Consistent  Hashing
  • 28. #  그런데,        Channel  서버가  추가되거나  삭제되면,  Consistent  Hashing  값이  달라진다. kimeve  채팅방은  Channel  Server  C  를  할당했다.  신규  Channel  Server  를  추가해서  Consistent  Hashing  을  갱신했더니,    이제  Channel  Server  F  를  할당하더라.
  • 29. #  STEP  2.  Using  allocaRon  data  table Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 REDIS hDps://session-­‐server/node/americatv/kimeve Consistent  Hashing  함수를  통해  ‘Channel  Server  C’  를  할당한다. HSET socket  (TCP) kimeve    :    C    :    1 접속한  정보는  실시간으로  REDIS  에서  관리한다. KEY 서버이름 현재  접속자  수
 (당연히,  처음  적속했다면  1  이다) GET In-­‐Memory  DB  에  현재  접속  정보를  관리하고,  서버  할당시  확인한다. 속도  때문에  redis  를  사용했지,  꼭  이것만  할  수  있는건  아니다. REDIS  에  서버  접속  정보가  있는지  확인한다.
 KEY값이  kimeve  인  데이터가  REDIS  에  있는지  확인한다. 1 2 3
  • 30. Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 REDIS hDps://session-­‐server/node/americatv/kimeve REDIS  에서  조회한  Channel  Server  C  정보를  반환한다. HSET socket  (TCP) kimeve    :    C    :    2 접속한  정보는  실시간으로  REDIS  에서  관리한다. KEY 서버이름 현재  접속자  수
 현재  접속자  수는  Channel  Server  에서  구해서
 REDIS  의  값을  갱신한다.
 (이제  2명이  되었다!) GET In-­‐Memory  DB  에  현재  접속  정보를  관리하고,  서버  할당시  확인한다. 이미  접속한  Client REDIS  에  서버  접속  정보가  있는지  확인한다.  있다!!!
 KEY값이  kimeve  인  데이터가  REDIS  에  있는지  확인한다. 1 2 3 새로  접속하는  2번째  client #  STEP  2.  Using  allocaRon  data  table
  • 31. Session  Server Channel  Server  A zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 REDIS HSET kimeve    :    C    :    2 GET Channel  Server  I 신규  추가된  Channel  서버 123.45.67.05:9001 server  /  A^123.45.67.01:9001                              B^123.45.67.01:9002                              C^123.45.67.02:9001                              D^123.45.67.02:9002                              E^123.45.67.03:9001                              F^123.45.67.03:9002                              G^123.45.67.04:9001                              H^123.45.67.04:9002                                I  ^123.45.67.05:9002Zookeeper  에  Node  생성 Consistent  Hashing  갱신  !!! kimeve  채팅방은 Consistent  Hashing  결과  값은  C  였지만, Channel  Server  I  가  추가된  후 Consistent  Hashing  결과  값이  H  가  되었다. 하지만, REDIS  에는  C  이므로, kimeve  채팅방에  C  를  할당할  수  있다. 만약,  kimeve  채팅방이  다시  만들어  진다면, 그때는  H를  할당  한다. #  STEP  2.  Using  allocaRon  data  table
  • 32. #  Channel  서버의  접속량에  따라  가중치를  부여해보자. Session  서버는,  더  많이  처리할  수  있는  스펙  좋은  Channel  서버나  접속량이  적어  놀고  있는  Channel  서버가  더  많이  할당  되도록  해야  할  것이다.
  • 33. server  /  A^123.45.67.01:9001  (160)                              B^123.45.67.01:9002  (160)                              C^123.45.67.01:9001  (160)                              D^123.45.67.01:9002  (160)                              E^123.45.67.01:9001    (320)                              F^123.45.67.01:9002    (320)                              G^123.45.67.01:9001  (160)                              H^123.45.67.01:9002  (160) Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 #  STEP  3.  Weighted  Consistent  Hashing Consistent  Hashing  Ring  에  replica  수가  가중치가  된다. Default  는    160  개의  relica  가  생성되며,
 스펙  좋은  서버는  relica  수를  더  많이  한다. 다른  서버에  비해  CPU  나  메모리  상황이  좋은  서버들  (E,  F) Create  Node  with  Data zookeeper  node  생성시  replica  수를  함께  저장한다.
  • 34. server  /  A^123.45.67.01:9001  (1)                              B^123.45.67.01:9002  (1)                              C^123.45.67.01:9001  (160)                              D^123.45.67.01:9002  (1)                                E^123.45.67.01:9001    (1)                              F^123.45.67.01:9002    (320)                              G^123.45.67.01:9001  (1)                              H^123.45.67.01:9002  (160) Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching Update  Node  Data 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 #  STEP  3.  Weighted  Consistent  Hashing relica  수를  1로  설정하여  Consistent  Hashing  을  다시  생성하면,  서버  할당  대상이  되기  희박하다.   (하지만,  같은  채팅방에  Client  접속이  늘어난다면,  계속  할당해주기는  할  것이다.) Client  의  ConnecXon  이  적은  서버들  (C,  F,  H) 2500 15 2610 1890 3150 1979 24 32 Client  의  ConnecXon  이  
 많이  연결된  서버들  (A,B,D,E,G) channel  서버의  현재  연결된  Client  수가  초기  설정한  임계치를  초과  하면,
 zookeeper  node  의  데이터(replica  수)를  1  로  수정한다. 현재  ConnecOon  수  (예)
  • 35. #  만약  엄청  유명한  BJ  라면,  한대의  채팅  서버가  감당할  수  없다! 네트워크  비용을  최소화  하기  위해  같은  채팅방의  Client  가  하나의  Channel  서버와  연결한다는  것은.....  사실은  현실적이지  못했다.  
 ‘마리텔’  을  생각해보자.  박종원  쉐프  방송에  수천명이  접속해  대화  할  것이  아닌가?  이걸  단일  서버에서  처리한다는건  말도  안된다.     (솔직히...  수천명의  대화  내용을  읽는  것도  이해  할  수  없다.)
  • 36. Session  Server Channel  Server  A zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching create  Node 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 REDISPUB SUB  ‘G’ 123.45.67.05:9001 kimeve    채팅방  접속  Clients PUB SUB  ‘C’ PUB #  STEP  4.  Sharing  messages  between  distributed  servers  채팅방당  최대  연결  가능  수를  임계치로  설정하고,  초과  하면  다른  Channel  서버에  접속하도록  한다.  어쩔  수  없다  ㅠ,.ㅠ
 Channel  서버간  통신은  Redis  의  Pub/Sub  을  사용한다. 채팅방  당  최대  400  까지 Channel  서버가  Startup  될  때  Redis  에  서버ID  를  키로하여     Subscribe  한다. Channel  서버  C  는  총  ConnecOon  1,300  중   kimeve  채팅방이  ConnecOon  400  으로  임계치를  초과  했다!     그러므로,  Session  서버는  다른  새로운  Channel  서버를  할당해  준다.
  • 37. #  드디어,  정말  부하  분산이  잘될  것이다! 표준편차도  계산해본  Consistent  Hashing  을  적용했을  뿐더러,  서버  부하  상황에  따라  가중치도  자동  조절  되도록  했다!   최대한  네트워크  비용을  줄였다!  같은  채팅방에  접속한  Client들은  모두  같은  서버에  접속하기  때문에,  하지만  Client  가  너무  많으면  어쩔  수  없이  나누긴  했지만  말이다.  
  • 38. #  그런데.  이상하다!        여전히  하나의  서버에  몰릴  때가  있다. 이정도라면,  할만큼  한거  아닌가?  ㅠ  ,.  ㅠ
  • 39. #  STEP  5.  Changing  replica  quanRty  SOFTLY Channel  서버는  ConnecOon  수에  따라  Session  서버가  분배를  유연하게  할  수  있도록  해야  한다.   그래서,  Channel  서버는  ConnecOon  수에  따라  Replica  수를  결정하여  Consistent  Hashing  을  상황에  따라  수시로  최적화  해야  한다. server  /  A^123.45.67.01:9001  (1)                              B^123.45.67.01:9002  (1)                              C^123.45.67.01:9001  (160)                              D^123.45.67.01:9002  (1)                                E^123.45.67.01:9001    (1)                              F^123.45.67.01:9002    (320)                              G^123.45.67.01:9001  (1)                              H^123.45.67.01:9002  (160) Session  Server Channel  Server  A .   .   .   .   zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H .   .   .   .   watching Update  Node  Data 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 123.45.67.04:9001 123.45.67.04:9002 Client  의  ConnecXon  이  적은  서버들  (C,  F,  H) 2500 15 2610 1890 3150 1979 24 32 Client  의  ConnecXon  이  
 많이  연결된  서버들  (A,B,D,E,G) channel  서버의  현재  연결된  Client  수가  초기  설정한  임계치를  초과  하면,
 zookeeper  node  의  데이터(replica  수)를  1  로  수정한다. #  STEP  3.  Weighted  Consistent  Hashing  ?  이제는..  160  에서  바로  1  로  줄어드는것이  문제다!  
  • 40. SCALE 60 BUFFER 10 MAX_LEVEL 4 REPLICA_BASE_NUM 4 Channel  서버의  ConnecOon  수에  따라  Replica  수를  결정하는  변수를  정하자! ConnecOon  수  증가 SCALE  :  60 600 120 180 240 Replica  수  변화의  단계 50 70 110 130 230 250170 190 BUFFER  :  10 Replica  수를  결정하는  모수 Channel  서버의  ConnecOon  수  임계치  결정  모수 Channel  서버의  ConnecOon  수  임계치  변경  버퍼 ConnecOon  수  :  1  ~  70 Replica 수 는 = REPLICA_BASE_NUM ^ LEVEL Replica = 4^4 = 256 ConnecOon  수  :  70  ~  130 Replica = 4^3 = 64 ConnecOon  수  :  130  ~  190 Replica = 4^2 = 16 ConnecOon  수  :  190  ~  250 Replica = 4^1 = 4 ConnecOon  수  :  250  ~ Replica = 4^0 = 1 ConnecOon  수  :  50  ~  0 Replica = 4^4 = 256 ConnecOon  수  :  110  ~  50 Replica = 4^3 = 64 ConnecOon  수  :  170  ~  110 Replica = 4^2 = 16 ConnecOon  수  :  230  ~  170 Replica = 4^1 = 4 ConnecOon  수  :    ~  230 Replica = 4^0 = 1 #  STEP  5.  Changing  replica  quanRty  SOFTLY  예 시  
  • 41. SCALE 60 BUFFER 10 MAX_LEVEL 4 REPLICA_BASE_NUM 4 Channel  서버의  ConnecOon  수에  따라  Replica  수를  결정하는  변수를  정하자! Replica  수  변화의  단계 Replica  수를  결정하는  모수 Channel  서버의  ConnecOon  수  임계치  결정  모수 Channel  서버의  ConnecOon  수  임계치  변경  버퍼 #  STEP  5.  Changing  replica  quanRty  SOFTLY server  /  A^123.45.67.01:9001  (4)                              B^123.45.67.01:9002  (256)                              C^123.45.67.01:9001  (64)                              D^123.45.67.01:9002  (256)                              E^123.45.67.01:9001  (64)                              F^123.45.67.01:9002  (256)                              G^123.45.67.01:9001  (256)                              H^123.45.67.01:9002  (1)   config  /  SCALE  (60)                              BUFFER  (10)                              MAX_LEVEL  (4)                              REPLICA_BASE_NUM  (4) Session  Server Channel  Server  A zookeeper Channel  Server  B Channel  Server  C Channel  Server  D Channel  Server  E Channel  Server  F Channel  Server  G Channel  Server  H watching watching     update  Node  Data 123.45.67.01:9001 123.45.67.01:9002 123.45.67.02:9001 123.45.67.02:9002 123.45.67.03:9001 123.45.67.03:9002 Channel  서버는  ConnecOon  수와  설정  변수를  바탕으로  
 replica  수를  변경하여  Zookeeper  데이터를  갱신한다.   그리고,  replica  수가  변경되면  
 Session  서버가  Consistent  Hashing  을  재구성  한다. zookeeper  의  데이터를  수정하면,  
 모든  Channel  서버의  설정값이  모두  일괄  변경된다.
  • 42. #  이상하게  복잡해  보이지만  .  .  .
      그냥,  Replica  수를  천천히  조절하며  Consistant  Hashing  을  최적화  하는  거임.
  • 43. #  github.com/xpush/node-­‐xpush  에서  구현하고  있는데...        정리가  다  되려면,  추석은  지나야  될  듯.  
      명절에는  고향에서  코딩이죠!! xpush.io@gmail.com   2015.08 프로젝트  관련  문의는  yohany@gmail.com  로  주세요.