실시간 서비스 플랫폼 개발 사례
-
Upload
john-kim -
Category
Technology
-
view
3.871 -
download
19
Transcript of 실시간 서비스 플랫폼 개발 사례
실시간 서비스 플랫폼 설계Node.js 기반의 분산 서버 환경 구축
김요한 ([email protected])
기술은 공유되어야 하고, 서비스로 차별화 해야 한다.
김요한 GSSHOP architect
https://www.facebook.com/JohnKim0331 https://github.com/JohnKim [email protected]
요즘 유행하는
실시간 서비스 개발하기 위해
분산 서버 구성하고그리고 운영 하기
Service����������� ������������������ Platform����������� ������������������ ?
scalability����������� ������������������ ?
Monitoring����������� ������������������ ?
1. 실시간 서비스 플랫폼우리는 왜 플랫폼으로 만들어야 하는가 ?
실시간 서비스 플랫폼
실시간 서비스 플랫폼?
https://www.flickr.com/photos/xrrr/1750232320/
FIDS (Flight Information Display System)
실시간 서비스 플랫폼
실시간 서비스 플랫폼 ?
https://flic.kr/p/ajvCwR
Volkswagen Group Platform
REAL-TIME SERVICE PLATFORM
Dashboards Mobile Notifications
Messengers
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
https://www.hydna.com/
https://www.firebase.com/
Start with a Platform , and Then Use it for Everything.
2. 분산 서버 설계하기확장성을 고려한 서버 아키텍처 설계NodeJS����������� ������������������ +����������� ������������������ Socket.IO,����������� ������������������ NGINX,����������� ������������������ HAPROXY,����������� ������������������ ELB,����������� ������������������ Zookeeper,����������� ������������������ Redis
“무엇으로 만들 것인가 ? ”가장 많이 사용하고 있는 socket.io
http://socket.io/get-started/chat/
“그런데, 아프리카 처럼 ? ”서버 하나로는 부족하다!SCALE UP & SCALE OUT
SCALE UP
MemoryCPU
SCALE OUT
“Scale Out 은, 처음부터 고려하지 않으면 힘들다 ”
“가장 흔한 방법 부터 적용하자. 하지만 socket.io 에 맞게 해야 한다”
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
?
가장 쉬운 방법
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
NGINXHA PROXY
ELBElastic Load Balancing (AWS)
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
NGINXHA PROXY
ELBElastic Load Balancing (AWS)
Websocket 을 지원하지 않는,IE 에서 socket.io로 접속할 때
xhr-polling
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVERNGINX
HA PROXYELB
Elastic Load Balancing (AWS)
같은 서버에 polling 해야만 함
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVERNGINX
HA PROXYELB
Elastic Load Balancing (AWS)
같은 서버에 polling 해야만 함
CHAT SERVERX
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 를 해싱하여 분배
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 지원)
XCHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
ELBElastic Load Balancing (AWS)
XCHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
ELBElastic Load Balancing (AWS)
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
ELBElastic Load Balancing (AWS)
TCP MODEHA
PROXY
HA PROXY
“역할 별로 분리 해서 확장하자”좀더 고민해서,
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
메시지 송신 전용(HTTP RESTful)
메시지 수신 전용(socket)
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
REDIS
publish
subscribe
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
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
관리자가 메시지 발송 !!
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
REDIS
publish
subscribe
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
HA PROXY
HA PROXY
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
메시지 송신 전용(HTTP RESTful)
메시지 수신 전용(socket)
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT 서버 할당접속 인증
(HTTP RESTful)
CHAT 메시지 송/수신 전용(socket)
REST SERVER
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT 서버 할당접속 인증
(HTTP RESTful)
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
어느 서버에 접속해?
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
어느 서버에 접속해?
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 토큰
”“인증 처리 ! OAuth 2.0 로 별도의 서버로 구축한다
”“인증 처리 ! OAuth 2.0 로 별도의 서버로 구축한다
“인증 처리 ! OAuth 2.0 로 별도의 서버로 구축한다”
SPRING SECURITY OAUTH 2
“접속할 서버를 할당하려면 ? ”먼저, 서버 목록을 가지고 있어야 한다.
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
REST SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
123.0.0.1:9001
123.0.0.2:9002
123.0.0.3:9004
서버 목록을 모두 가지고 있어야 함.장애난 서버와 신규 추가된 서버 정보도 동기화 되어야 함
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변경된 노드 정보 동기화
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 . . .)
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임시 노드로 서버 정보 생성
“서버는 어떻게 할당해 주는가?”같은 채팅방 사람들은 같은 서버에 접속하도록.
같은 채팅방 사람들은 같은 서버에 접속하도록.
Client 의 IP 를 해싱하여 분배
체팅방 키를 해싱하여 분배
NGINX 의 ip_hashHAPROXY 의 balance source
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('채팅방키’); // 접속 서버 반환
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('채팅방키’); // 접속 서버 반환
3. 운영하기서버 실행 및 모니터링하기uptime,����������� ������������������ PM2,����������� ������������������ influxDB,����������� ������������������ grafana
https://github.com/foreverjs/forever
A simple CLI tool for ensuring that a given script runs continuously (i.e. forever).
$ npm install forever -g
$ forever start server.js
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.
$ npm install pm2 -g
$ pm2 start server.js
$ pm2 reload all
$ pm2 startup
-i 0
$ 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
Grafana is a frontend for Graphite, InfluxDB and OpenTSDB with powerfull visualization features for time series data
InfluxDBdistributed, time series database with no external dependencies
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
admin
Log Collector
InfluxDB
NGINX +
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 수 // 체팅방 수 등
}
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
CHAT SERVER
admin
Log Collector
InfluxDB
NGINX
Influx.writePoint()
Socket.IO-client
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;
AWS 기반 실시간 서비스 플랫폼( 예시, 주요 인스턴스만 표기 함 )
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 #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
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
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
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
VPC - Authorization Service
VPC - AAA 서비스 플랫폼
VPC - BBB 서비스 플랫폼
VPC - 실시간 서비스 플랫폼
AAA 서비스 Clients 실시간 서비스 Clients
VPC - 운영관리 실시간 자원/성능 모니터링, 통합 로그 수집
. . . . .
VPC peering
왜 였나? “ ” 마지막 정리하면서….
성능 “ ” 하지만, 항상 빠르지는 않다
생산성 “ ” 이건 거의 중독될 수도 있다.
빠른 시작 “ 장애나면, 즉시 재시작하고 보자 !
”
그리고 ,
“실시간 서비스가 딱 맞다”