실시간 서비스 플랫폼 개발 사례

97
실시간 서비스 플랫폼 설계 Node.js 기반의 분산 서버 환경 구축 김요한 ([email protected])

Transcript of 실시간 서비스 플랫폼 개발 사례

Page 1: 실시간 서비스 플랫폼 개발 사례

실시간 서비스 플랫폼 설계Node.js 기반의 분산 서버 환경 구축

김요한 ([email protected])

Page 2: 실시간 서비스 플랫폼 개발 사례

기술은 공유되어야 하고, 서비스로 차별화 해야 한다.

김요한 GSSHOP architect

https://www.facebook.com/JohnKim0331 https://github.com/JohnKim [email protected]

Page 3: 실시간 서비스 플랫폼 개발 사례

요즘 유행하는

실시간 서비스 개발하기 위해

분산 서버 구성하고그리고 운영 하기

Service����������� ������������������  Platform����������� ������������������  ?

scalability����������� ������������������  ?

Monitoring����������� ������������������  ?

Page 4: 실시간 서비스 플랫폼 개발 사례

1. 실시간 서비스 플랫폼우리는 왜 플랫폼으로 만들어야 하는가 ?

Page 5: 실시간 서비스 플랫폼 개발 사례

실시간 서비스 플랫폼

Page 6: 실시간 서비스 플랫폼 개발 사례

실시간 서비스 플랫폼?

Page 7: 실시간 서비스 플랫폼 개발 사례
Page 8: 실시간 서비스 플랫폼 개발 사례

https://www.flickr.com/photos/xrrr/1750232320/

FIDS (Flight Information Display System)

Page 9: 실시간 서비스 플랫폼 개발 사례

실시간 서비스 플랫폼

Page 10: 실시간 서비스 플랫폼 개발 사례

실시간 서비스 플랫폼 ?

Page 11: 실시간 서비스 플랫폼 개발 사례

https://flic.kr/p/ajvCwR

Page 12: 실시간 서비스 플랫폼 개발 사례

Volkswagen Group Platform

Page 13: 실시간 서비스 플랫폼 개발 사례

REAL-TIME SERVICE PLATFORM

Dashboards Mobile Notifications

Messengers

Page 14: 실시간 서비스 플랫폼 개발 사례

is ideal for building dashboards, activity streams, notification and chat systems, backend-less apps and websites, real-time collaboration, live statistics, remote controls, multiplayer games, and more.

REAL-TIME SERVICE PLATFORM

Page 15: 실시간 서비스 플랫폼 개발 사례

https://www.hydna.com/

Page 16: 실시간 서비스 플랫폼 개발 사례

https://www.firebase.com/

Page 17: 실시간 서비스 플랫폼 개발 사례

Start with a Platform , and Then Use it for Everything.

Page 18: 실시간 서비스 플랫폼 개발 사례
Page 19: 실시간 서비스 플랫폼 개발 사례

2. 분산 서버 설계하기확장성을 고려한 서버 아키텍처 설계NodeJS����������� ������������������  +����������� ������������������  Socket.IO,����������� ������������������  NGINX,����������� ������������������  HAPROXY,����������� ������������������  ELB,����������� ������������������  Zookeeper,����������� ������������������  Redis

Page 20: 실시간 서비스 플랫폼 개발 사례

“무엇으로 만들 것인가 ? ”가장 많이 사용하고 있는 socket.io

Page 21: 실시간 서비스 플랫폼 개발 사례

http://socket.io/get-started/chat/

Page 22: 실시간 서비스 플랫폼 개발 사례
Page 23: 실시간 서비스 플랫폼 개발 사례

“그런데, 아프리카 처럼 ? ”서버 하나로는 부족하다!SCALE UP & SCALE OUT

Page 24: 실시간 서비스 플랫폼 개발 사례

SCALE UP

MemoryCPU

Page 25: 실시간 서비스 플랫폼 개발 사례

SCALE OUT

Page 26: 실시간 서비스 플랫폼 개발 사례

“Scale Out 은, 처음부터 고려하지 않으면 힘들다 ”

Page 27: 실시간 서비스 플랫폼 개발 사례

“가장 흔한 방법 부터 적용하자. 하지만 socket.io 에 맞게 해야 한다”

Page 28: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

?

가장 쉬운 방법

Page 29: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

NGINXHA PROXY

ELBElastic Load Balancing (AWS)

Page 30: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

NGINXHA PROXY

ELBElastic Load Balancing (AWS)

Websocket 을 지원하지 않는,IE 에서 socket.io로 접속할 때

xhr-polling

Page 31: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVERNGINX

HA PROXYELB

Elastic Load Balancing (AWS)

같은 서버에 polling 해야만 함

Page 32: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVERNGINX

HA PROXYELB

Elastic Load Balancing (AWS)

같은 서버에 polling 해야만 함

CHAT SERVERX

Page 33: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

NGINX

upstream io_nodes { ip_hash; server 127.0.0.1:6001; server 127.0.0.1:6002; server 127.0.0.1:6003; server 127.0.0.1:6004;}

Client 의 IP 를 해싱하여 분배

Page 34: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

backend io_nodes balance source server 127.0.0.1:6001 . . . . server 127.0.0.1:6002 . . . . server 127.0.0.1:6003 . . . . server 127.0.0.1:6004 . . . .

Client 의 IP 를 해싱하여 분배 (v1.5 부터 SSL 지원)

Page 35: 실시간 서비스 플랫폼 개발 사례

XCHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

ELBElastic Load Balancing (AWS)

Page 36: 실시간 서비스 플랫폼 개발 사례

XCHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

ELBElastic Load Balancing (AWS)

Page 37: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

ELBElastic Load Balancing (AWS)

TCP MODEHA

PROXY

HA PROXY

Page 38: 실시간 서비스 플랫폼 개발 사례

“역할 별로 분리 해서 확장하자”좀더 고민해서,

Page 39: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

메시지 송신 전용(HTTP RESTful)

메시지 수신 전용(socket)

Page 40: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

Page 41: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

Page 42: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

REDIS

publish

subscribe

Page 43: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

REDIS

publish

subscribe

Broker (pub/sub server)

Publisher

Subscriber 1

Subscriber 2

Subscriber 3

redis rabbitMQ

Page 44: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

Page 45: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

관리자가 메시지 발송 !!

Page 46: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

REDIS

publish

subscribe

Page 47: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY

HA PROXY

Page 48: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

메시지 송신 전용(HTTP RESTful)

메시지 수신 전용(socket)

Page 49: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT 서버 할당접속 인증

(HTTP RESTful)

CHAT 메시지 송/수신 전용(socket)

Page 50: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT 서버 할당접속 인증

(HTTP RESTful)

Page 51: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY123.0.0.2:9002

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

어느 서버에 접속해?

Page 52: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY123.0.0.2:9002

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

어느 서버에 접속해?

Page 53: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

HA PROXY123.0.0.2:9002

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

어느 서버에 접속해?

REDISABCDEFG01234인증 토큰

ABCDEFG01234

SET 토큰

GET 토큰

Page 54: 실시간 서비스 플랫폼 개발 사례

”“인증 처리 ! OAuth 2.0 로 별도의 서버로 구축한다

Page 55: 실시간 서비스 플랫폼 개발 사례

”“인증 처리 ! OAuth 2.0 로 별도의 서버로 구축한다

Page 56: 실시간 서비스 플랫폼 개발 사례

“인증 처리 ! OAuth 2.0 로 별도의 서버로 구축한다”

SPRING SECURITY OAUTH 2

Page 57: 실시간 서비스 플랫폼 개발 사례

“접속할 서버를 할당하려면 ? ”먼저, 서버 목록을 가지고 있어야 한다.

Page 58: 실시간 서비스 플랫폼 개발 사례

REST SERVER

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

Page 59: 실시간 서비스 플랫폼 개발 사례

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

서버 목록을 모두 가지고 있어야 함.장애난 서버와 신규 추가된 서버 정보도 동기화 되어야 함

Page 60: 실시간 서비스 플랫폼 개발 사례

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

zookeeper

watching node변경된 노드 정보 동기화

Page 61: 실시간 서비스 플랫폼 개발 사례

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

zookeeper

watching node변경된 노드 정보 동기화

create EPHEMERAL node임시 노드로 서버 정보 생성

The King of Coordinationapache zookeeper

- DISTRIBUTED LOCKING- SERVICE MANAGEMENT (LOAD BALANCER, DNS . . .)

Page 62: 실시간 서비스 플랫폼 개발 사례

REST SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

123.0.0.1:9001

123.0.0.2:9002

123.0.0.3:9004

zookeeper

watching node변경된 노드 정보 동기화

create EPHEMERAL node임시 노드로 서버 정보 생성

Page 63: 실시간 서비스 플랫폼 개발 사례

“서버는 어떻게 할당해 주는가?”같은 채팅방 사람들은 같은 서버에 접속하도록.

Page 64: 실시간 서비스 플랫폼 개발 사례

같은 채팅방 사람들은 같은 서버에 접속하도록.

Client 의 IP 를 해싱하여 분배

체팅방 키를 해싱하여 분배

NGINX 의 ip_hashHAPROXY 의 balance source

Page 65: 실시간 서비스 플랫폼 개발 사례

CONSISTENT HASHINGhttps://github.com/3rd-Eden/node-hashring

var  HashRing  =  require('hashring');  

var  ring  =  new  HashRing([          '127.0.0.1',          '127.0.0.2',          '127.0.0.3',            '127.0.0.4'      ]);  

ring.get('채팅방키’);  //  접속  서버  반환  

Page 66: 실시간 서비스 플랫폼 개발 사례

Weighted CONSISTENT HASHINGhttps://github.com/3rd-Eden/node-hashring

var  HashRing  =  require('hashring');  

var  ring  =  new  HashRing({          '127.0.0.1':  {  weight:  200  },          '127.0.0.2':  {  weight:  200  },          '127.0.0.3':  {  weight:  200  },            '127.0.0.4':  {  weight:  1000  }      });  

ring.get('채팅방키’);  //  접속  서버  반환  

Page 67: 실시간 서비스 플랫폼 개발 사례
Page 68: 실시간 서비스 플랫폼 개발 사례

3. 운영하기서버 실행 및 모니터링하기uptime,����������� ������������������  PM2,����������� ������������������  influxDB,����������� ������������������  grafana

Page 69: 실시간 서비스 플랫폼 개발 사례

https://github.com/foreverjs/forever

A simple CLI tool for ensuring that a given script runs continuously (i.e. forever).

Page 70: 실시간 서비스 플랫폼 개발 사례

$ npm install forever -g

$ forever start server.js

Page 71: 실시간 서비스 플랫폼 개발 사례

https://github.com/Unitech/pm2

PM2 is a production process manager for Node.js applications with a built-in load balancer . It allows you to keep applications alive forever , to reload them without downtime and to facilitate common system admin tasks.

Page 72: 실시간 서비스 플랫폼 개발 사례

$ npm install pm2 -g

$ pm2 start server.js

$ pm2 reload all

$ pm2 startup

-i 0

Page 73: 실시간 서비스 플랫폼 개발 사례

$ pm2 start server.js -i 0

node process 1

node process 2

node process 3

node process 4

load balancer

cluster mode

$ pm2 reload all

Page 74: 실시간 서비스 플랫폼 개발 사례
Page 75: 실시간 서비스 플랫폼 개발 사례
Page 76: 실시간 서비스 플랫폼 개발 사례

Grafana is a frontend for Graphite, InfluxDB and OpenTSDB with powerfull visualization features for time series data

Page 77: 실시간 서비스 플랫폼 개발 사례
Page 78: 실시간 서비스 플랫폼 개발 사례

InfluxDBdistributed, time series database with no external dependencies

Page 79: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

admin

Log Collector

InfluxDB

NGINX +

Page 80: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

admin

Log Collector

InfluxDB

NGINX

Socket.IO (separated namespace for monitoring)

{ pid : process.pid,

arch : process.arch, platform : process.platform, uptime : process.uptime(), memory : process.memoryUsage(),

// 그 외 // 서버에 연결된 Client 수 // 체팅방 수 등

}

Page 81: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

admin

Log Collector

InfluxDB

NGINX

Influx.writePoint()

Socket.IO-client

Page 82: 실시간 서비스 플랫폼 개발 사례

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

CHAT SERVER

admin

Log Collector

InfluxDB

NGINX + //  nginx  설정  

auth_basic                        "Restricted";  auth_basic_user_file    /path/to/my/htpasswd/file;

Page 83: 실시간 서비스 플랫폼 개발 사례
Page 84: 실시간 서비스 플랫폼 개발 사례

AWS 기반 실시간 서비스 플랫폼( 예시, 주요 인스턴스만 표기 함 )

Page 85: 실시간 서비스 플랫폼 개발 사례

Availability Zone #1

Auth Servers (EC2 instances)

Chat Servers (EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Page 86: 실시간 서비스 플랫폼 개발 사례

Availability Zone #1

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Availability Zone #2

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Auto Scaling group

VPC

Elastic Load Balancing

Page 87: 실시간 서비스 플랫폼 개발 사례

Availability Zone #1

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Availability Zone #2

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Auto Scaling group

VPC

Elastic Load Balancing

Page 88: 실시간 서비스 플랫폼 개발 사례

Availability Zone #1

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Availability Zone #2

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Auto Scaling group

VPC - Service Platform

Elastic Load Balancing

VPC - Operation

VPC peeringLog Collector (EC2 instances)

InfluxDB (EC2 instances)

Grafana (EC2 instance)

security group security group

Administrator

Page 89: 실시간 서비스 플랫폼 개발 사례

Availability Zone #1

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Availability Zone #2

Auth Servers (EC2 instances) Chat Servers

(EC2 instances)

redis (ElastiCache)

zookeeper (EC2 instances)

message DB (DynamoDB)

security group

security group security group security group

Auto Scaling group

VPC - Service Platform

Elastic Load Balancing

VPC - Operation

VPC peeringLog Collector (EC2 instances)

InfluxDB (EC2 instances)

Grafana (EC2 instance)

security group security group

Administrator

Page 90: 실시간 서비스 플랫폼 개발 사례

VPC - Authorization Service

VPC - AAA 서비스 플랫폼

VPC - BBB 서비스 플랫폼

VPC - 실시간 서비스 플랫폼

AAA 서비스 Clients 실시간 서비스 Clients

VPC - 운영관리 실시간 자원/성능 모니터링, 통합 로그 수집

. . . . .

VPC peering

Page 91: 실시간 서비스 플랫폼 개발 사례
Page 92: 실시간 서비스 플랫폼 개발 사례

왜 였나? “ ” 마지막 정리하면서….

Page 93: 실시간 서비스 플랫폼 개발 사례

성능 “ ” 하지만, 항상 빠르지는 않다

Page 94: 실시간 서비스 플랫폼 개발 사례

생산성 “ ” 이건 거의 중독될 수도 있다.

Page 95: 실시간 서비스 플랫폼 개발 사례

빠른 시작 “ 장애나면, 즉시 재시작하고 보자 !

Page 96: 실시간 서비스 플랫폼 개발 사례

그리고 ,

“실시간 서비스가 딱 맞다”

Page 97: 실시간 서비스 플랫폼 개발 사례