모바일 게임 하이브 런칭기
최용호
발표자 소개
● 열혈강호 제작 중
● 하이브 with Naver Webtoon
● 화이트데이
● 클럽 엠스타 온라인
● 와리가리 삼총사 for Kakao
● 어스토니시아VS for Kakao
● 다함께 차차차
● 어스토니시아 온라인
● 열혈강호2 온라인
참여 프로젝트
● 자바카페 커뮤니티 운영진
○ 매주 운영진 스터디
○ 매월 운영진 회의 및 세미나
○ 분기별 공개 강의 및 스터디
○ 공감 세미나 및 KCD 참여
○ 상/하반기 운영진 워크샵
○ 페이스북 / 기술 블로그 운영
활동
게임 소개
Agenda
사내 개발환경
자동화에 대한 고민
성능 모니터링에 대한 고민
AWS 활용 해보기
네트워크 구성에 대한 고민
서비스 선택에 대한 고민
부하 테스트에 대한 고민
게임 데이터 활용에 대한 고민
사내 개발 환경
다운로드부터 설치까지 한땀~ 한땀~
자동으로 해줄 수 있는 무언가가 필요
개발 환경 구축을 위해 Docker 도입
Docker
서비스 별로 디렉토리를 만들어 Docker 파일 관리
Dockerfile 관리
Docker 파일과 설정 파일들
docker 컨테이너를 구동할 때 사용할 설정파일 관리
동료 개발자들이 docker-compose 명령을 몰라도 사용할 수 있도록 script 제공
compose 명령을 최대한 간편하게 하기 위한 스크립트
빌드 및 배포 자동화를 위해 Jenkins 도입
Jenkins
빌드 및 배포를 자동화 하기 위해 Jenkins 도입
My Company Private
Network
Jenkins
Server
S3
Elastic Beanstalk
container
instances
1. 빌드 된 war파일 업로드
2. 배포
3. 업로드 된 war 파일로 배포 수
행
My Company Private
Network
Jenkins
Server
EC2 instance contents
tomcat
tomcat mariadb
redis
Operating
Tool
Statist
ics
각 서버 빌드 및 배포
Redis 및 Mariadb
스키마 갱신 및 초기화
● Elastic Beanstalk 배포 ● 운영 및 관리를 위한 서버 배포
docker-compose를 활용하여 10분 내로 사내 환경 구성
tomcat
mariadb redis
Logstash elasticse
arch
kibanahttpd
Client
Pinpoint-
hbase
Pinpoint-
collector
Pinpoint-
web
Docker-
compose
Docker-
compos
e
Docker-
compose
Amazon
ECR
Jenkin
s
Kibana와 Pinpoint를 통해 서버 상태 확인
Docker Image들은 ECR을 사용하여 버
전 관리
사내 서버들의 빌드 및 배포는
Jenkins를 통해 자동화
누구나 간편하게 사용할 수 있게 되어 작업이 활발해짐
AWS 활용 해보기
네트워크 구성에 대한 고민
VPC
VPC 구성을 어떻게 할까?
Availability Zone 1 Availability Zone 2
VPC 안에는 두개의 가용 영역이 존재 (서울 리전 기준)
VPC
Availability Zone 1 Availability Zone 2
VPC
VPC 내에 서브넷 구성을 할 수가 있는데 이는 가용영역 별로 생성이 가능
subnet subnet
Availability Zone 1 Availability Zone 2
VPC
새로 생성한 VPC에 IGW 연결
subnet subnet
Availability Zone 1
Private subnet
Public subnet
Availability Zone 2
Private subnet
Public subnet
VPC
IGW가 연결되지 않은 서브넷(private)과 연결된 서브넷(public)으로 구분
Availability Zone 1
Private subnet
Public subnet
Availability Zone 2
Private subnet
Public subnet
VPC
고객은 ELB를 통해서만, 관리자는 public 서브넷의 EC2 인스턴스를 통해서만
Elastic
Load balancer
User
Admin
instance
instance instance
AWS 네트워크 신규기능 업데이트 - 강동환 솔루션즈 아키텍트
https://youtu.be/FDFmI0nU4Wg
천만 사용자를 위한 AWS 아키텍처 보안 확장 모범 사례 - 윤석찬, 테크에반젤리스트
https://youtu.be/wn_-FtheGDY
가상 데이터 센터 만들기 - VPC 기본 및 연결 옵션 - 양승도 솔루션즈 아키텍트
https://youtu.be/R1UWYQYTPKo
서비스 선택에 대한 고민
Docker를 활용해보고 싶어서 컨테이너 기반 서비스 검토
Amazon ECS
검토 당시 서울리전에서 제공되지 않아 포기
Amazon ECS
EC2 인스턴스에 Docker Swarm 구축
Docker의 manager역할을 수행할 AMI와 worker 역할을 할 AMI를 생성
Swarm
Manager AMI
Swarm
Worker AMI
AMI를 통해 EC2 인스턴스가 구동되면
Worker는 UserData 스크립트를 통해 Manager에 Join
Swarm
Manager AMI
Swarm
Worker AMI
Join
docker scale 명령을 통해 컨테이너를 확장
Scale
docker scale 명령을 수작업으로 해야한다는 불편함 존재
Scale
미리 scale을 넉넉히 걸어두고 한 머신에 구동될 수 있는 컨테이너를 제한하는 편법 사용
docker service create --name test-tomcat --publish 8080:8080 --reserve-cpu 1 tomcat
docker service scale test-tomcat=100
해 놓고 보니 scale 명령으로 유연한 컨테이너 구동의 장점이 사라짐
결국 우리 서비스에서 docker를 활용하는 것은 욕심이라 판단.
docker service create --name test-tomcat --publish 8080:8080 --reserve-cpu 1 tomcat
docker service scale test-tomcat=100
Docker와 Docker Swarm은 포기하기로
AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 -
김충섭 개발자(퍼플웍스)
https://youtu.be/16LNWMqphOA
[AWS] EC2 인스턴스에서 docker swarm 서비스를 통해 웹서버 구동 및 확장
http://yongho1037.tistory.com/729
Elastic Beanstalk 도입
Amazon
Elastic
Beanstalk
용도에 맞게 환경을 생성해서 관리
ELB부터 오토스케일링, 보안, 롤링 패치 등 까지 손쉽게 설정
배포와 동시에 버전관리가 되기 때문에 언제든지 이전 버전으로 롤백 가능
설정을 저장해 두면 동일한 설정으로 편리하게 환경 생성 가능
게임 서버에 대한 고민 해결
변경 시 모든 인스턴스를 종료하고 새로 생성
주의해서 변경해야 할 설정들
● 오토스케일링의 시작 구성(Launch Configuration
● VPC 설정
● 인스턴스 type 변경
● AMI 변경
● SSH key 변경
● 등등.. 더 있을 수도..
[AWS] Elastic Beanstalk 생성과 Hook, .ebextensions를 통해 EC2 인스턴스 설정
http://yongho1037.tistory.com/731
부하테스트에 대한 고민
Java 기반이고 익숙한 IDE에서 자유롭게 개발 후
jar파일을 배포하여 사용할 수 있기 때문에 선택
머신만 확장하면 무제한의 유저를 유입시킬 수 있는 구조가 목표
instances
instance
instance
instance
Classic
Load
Balancer
JMeter
JMeter
JMeter
스팟 인스턴스, ssm, jmeter를 활용하여 부하테스트
instance
Spot
Instance
ssm
bucket
Output Log
Run Command
instances
부하 전달
Loadtest
Server
Spot
Instance
Spot
Instance
스팟 인스턴스를 생성하고,
생성된 인스턴스들에 대한 상태 확인과
명령을 내리기 위한 서버
Classic
Load
Balancer
팀원들 누구나 부하테스트를 해볼 수 있도록 툴 제공
jmeter 가 여러대에서 동작 중이기 때문에
동작 상황을 알 수가 없어서 CloudWatch의 로그 활용
성능 측정은 naver의 오픈소스인 pinpoint로
pinpoint 독립형
https://github.com/YonghoChoi/pinpoint-single-docker
pinpoint 분산형
https://github.com/YonghoChoi/pinpoint-docker
런칭 전에 pinpoint 또한 관리 요소때문에 X-Ray로 변경
각 요청의 응답시간 확인 후 오래 걸린 작업들을 수정하여 성능 최적화
AWS X-Ray를 통한 서버리스 분산 애플리케이션 추적하기 - 윤석찬 (AWS 테크에반젤리스트)
https://www.youtube.com/watch?v=BEg__eV1mT8&t=1350s
게임 데이터
활용에 대한 고민
데이터 수집부터 가공, 집계까지 해주는 Elastic Stack 선택
지표용 로그에 대한 설계
사용자 계정
캐릭터
무기
아이템
상점
...
가입
로그인
구매
판매
...
Title SubTitle
지표용 로그에 대한 설계
사용자 계정
가입 로그인 탈퇴 복귀
Title
SubTitle
id값을 통해 사용자 행위에 연관된 데이터 탐색
스테이지 클리어
재화 획득
아이템 획득
캐릭터 획득
경험치 획득
퀘스트 달성
...
ID : 10000
ID : 10001, parentID : 10000
ID : 10002, parentID : 10000
ID : 10003, parentID : 10000
ID : 10004, parentID : 10000
ID : 10005, parentID : 10000
재화 획득에 대한 실제 데이터
{
"id": "b46adf7e5bf14c4ca18868f930e2670f",
"uid": 5824735036189904000,
"nickname": "yongho",
"title": "GOODS",
"subTitle": "TAKE",
"detail": {
"gold": 120,
"diamondBonus": 0,
"diamondCash": 0,
"survivalCoin": 0,
"pvpCoin": 0,
"stamina": 1,
"supplies": 0,
"component": 0,
"exp": 0
},
"parentId": "d9388af36d63482b851e33f78225a9be",
"parentTitle": "STAGE",
"parentSubTitle": "CLEAR",
"timestamp": "2017-11-08T06:00:19.551Z",
"loglevel": "TRACE"
}
parent 정보를 통해 어디서 획득한 것인지 알 수 있음
{
"id": "b46adf7e5bf14c4ca18868f930e2670f",
"uid": 5824735036189904000,
"nickname": "yongho",
"title": "GOODS",
"subTitle": "TAKE",
"detail": {
"gold": 120,
"diamondBonus": 0,
"diamondCash": 0,
"survivalCoin": 0,
"pvpCoin": 0,
"stamina": 1,
"supplies": 0,
"component": 0,
"exp": 0
},
"parentId": "d9388af36d63482b851e33f78225a9be",
"parentTitle": "STAGE",
"parentSubTitle": "CLEAR",
"timestamp": "2017-11-08T06:00:19.551Z",
"loglevel": "TRACE"
}
parentId로 검색하면 해당 행위와 연관된 사항들을 확인 가능
{
"id": "b46adf7e5bf14c4ca18868f930e2670f",
"uid": 5824735036189904000,
"nickname": "yongho",
"title": "GOODS",
"subTitle": "TAKE",
"detail": {
"gold": 120,
"diamondBonus": 0,
"diamondCash": 0,
"survivalCoin": 0,
"pvpCoin": 0,
"stamina": 1,
"supplies": 0,
"component": 0,
"exp": 0
},
"parentId": "d9388af36d63482b851e33f78225a9be",
"parentTitle": "STAGE",
"parentSubTitle": "CLEAR",
"timestamp": "2017-11-08T06:00:19.551Z",
"loglevel": "TRACE"
}
이 id 값은 제가 UUID로 만든 값
"id": "b46adf7e5bf14c4ca18868f930e2670f"
엘라스틱 서치에서는 _id 값을 지정하지 않으면 엘라스틱서치가 생성
"_id": "AWHRtsHJUGsDUVnVAG4k"
이 _id 값을 샤드 사이즈 Mod 연산하여 샤드 위치 결정
_id % ShardSize
내가 만든 UUID로 _id를 사용했다가 균등하게 분배가 안되면 어쩌지?
_id % ShardSize
final int SHARD_SIZE = 5;
int[] shards = new int[SHARD_SIZE];
for(int i = 0; i < 100000; i++) {
int hash =
Math.abs(Murmur3HashFunction.hash(String.valueOf(i)));
int shardId = hash % SHARD_SIZE;
shards[shardId]++;
Thread.sleep(1);
}
for(int i = 0; i < SHARD_SIZE; i++) {
System.out.println(String.format("shardId : %d,
count : %d", i, shards[i]));
}
엘라스틱서치에서 샤드 분배하는 로직을 가져다 테스트
final int SHARD_SIZE = 5;
int[] shards = new int[SHARD_SIZE];
for(int i = 0; i < 100000; i++) {
int hash =
Math.abs(Murmur3HashFunction.hash(String.valueOf(i)));
int shardId = hash % SHARD_SIZE;
shards[shardId]++;
Thread.sleep(1);
}
for(int i = 0; i < SHARD_SIZE; i++) {
System.out.println(String.format("shardId : %d,
count : %d", i, shards[i]));
}
// 결과
shardId : 0, count : 19740
shardId : 1, count : 20016
shardId : 2, count : 19905
shardId : 3, count : 20032
shardId : 4, count : 20307
거의 균등하게 document가 분배됨
final int SHARD_SIZE = 5;
int[] shards = new int[SHARD_SIZE];
for(int i = 0; i < 100000; i++) {
int hash =
Math.abs(Murmur3HashFunction.hash(String.valueOf(i)));
int shardId = hash % SHARD_SIZE;
shards[shardId]++;
Thread.sleep(1);
}
for(int i = 0; i < SHARD_SIZE; i++) {
System.out.println(String.format("shardId : %d,
count : %d", i, shards[i]));
}
// 결과
shardId : 0, count : 19740
shardId : 1, count : 20016
shardId : 2, count : 19905
shardId : 3, count : 20032
shardId : 4, count : 20307
id 필드를 따로 만들지 않고 샤드 분배 걱정 없이
_id를 직접 할당해서 사용하는 것이 더 효율적일 듯
파일에 기록되는 Web 서버 로그를 수집하기 위해 Filebeat 사용
Web
Server
EC2
Instance
filebeat
Filebeat를 통해 logstash로 데이터 전달
Web
Server
EC2
Instance
EC2
Instance
filebeat
logstash
logstash에서 가공한 데이터를 elasticsearch에 색인
Web
Server
EC2
Instance
EC2
Instance
EC2
Instance
filebeat
logstash elasticsearch
Web
Server
EC2
Instance
EC2
Instance
EC2
Instance
filebeat
logstash elasticsearch
elasticsearch 클러스터 구성을 위해 한 서버에서 얼마나 수용 가능한지 확인
원활하게 동작하는 상태 (r4.large)
GC가 급격하게 발생하면서 CPU가 바빠짐
부하 발생하는 시점의 샤드 수와 도큐먼트 수, 사용 용량 등을 확인하여 확장 여부 결정
웹 서버에서 장애가 발생하여 인스턴스가 종료될 경우를 대비해
보내지 못한 데이터 처리 필요
Web
Server
EC2
Instance
EC2
Instance
EC2
Instance
filebeat
logstash elasticsearch
logstash에 대한 확장이나 장애에 대한 대비도 필요
Web
Server
EC2
Instance
EC2
Instance
EC2
Instance
filebeat
logstash elasticsearch
elasticsearch에 데이터가 너무 많이 쌓이거나
장애 대응을 위해 클러스터링 필요
Web
Server
EC2
Instance
EC2
Instance
EC2
Instance
filebeat
logstash elasticsearch
Amazon Elasticsearch Service 도입
Amazon
Elasticsearch
Service
ElasticsearchAmazon
Kinesis
Streams
Lambda
function
Amazon
Kinesis–
enabled app
런칭을 앞두고 관리 요소 때문에 AWS의 관리형 서비스로 전환
Filebeat 대신 Kinesis Agent 사용
ElasticsearchAmazon
Kinesis
Streams
Lambda
function
Amazon
Kinesis–
enabled app
Logstash 대신 Kinesis를 통해 데이터를 받아
Lambda를 통해 데이터 가공
ElasticsearchAmazon
Kinesis
Streams
Lambda
function
Amazon
Kinesis–
enabled app
EC2 인스턴스에 설치형 Elasticsearch 대신 Amazon Elasticsearch Service 사용
ElasticsearchAmazon
Kinesis
Streams
Lambda
function
Amazon
Kinesis–
enabled app
AWS 빅데이터 아키텍처 패턴 및 모범 사례
- 남궁영환 빅데이터 컨설턴트(AWS 코리아)
https://www.youtube.com/watch?v=D1yxmpD4VDc
AWS Summit Seoul 2016 - Amazon Kinesis 와 Elasticsearch 서
비스로 만드는 실시간 데이터 분석 플랫폼 (박철수, AWS)
https://www.youtube.com/watch?v=SHVWcAW4RQ8&t=1645s
Amazon Elasticsearch Service 소개 및 활용 방법 (윤석찬) - 2016년 월간 웨비나
https://www.youtube.com/watch?v=QeGL4om9m-Q
Kinesis에서 Elasticsearch로 색인하기 위한
Lambda 코드는 Github 참조
https://docs.aws.amazon.com/ko_kr/elasticsearch-service/latest/developerguide/es-
aws-integrations.html
https://github.com/aws-samples/amazon-elasticsearch-lambda-
samples
데이터 이중화를 위해서 서버로 부터 생성된
파일 로그를 crontab을 사용하여 S3에 전송
S3Amazon
Kinesis–
enabled app
S3에 쌓인 데이터는 Athena를 사용하여 확인
데이터 유실이나 디버그용 로그 확인할 때 편리했음
S3 Amazon
Athena
Amazon
Kinesis–
enabled app
S3에 로그 레벨별로 버킷을 생성하고
하위에 년도, 일자별로 파일을 저장
2018년 2월의 DEBUG 레벨 로그 파일들
일자별로 로그 파일 관리
Athena에서는 월별, 일자별로 테이블을 생성하여 파일 탐색 범위를 최소화
Athena를 활용하여 엘라스틱서치에서 유실된 데이터를 복구하거나
CS 처리를 위해 상세한 로그를 확인
Kibana를 사용하면 손쉽게 시각화가 가능
런칭하고 보니 키바나만으로는 사업부의 요청을 전부 수용하기가 힘들었음
결국 지표용 웹 페이지 제작
현재는 비용 때문에 다시 이 구성으로 준비 중
(게임이 잘 안되어서….)
Web
Server
EC2
Instance
EC2
Instance
EC2
Instance
filebeat
logstash elasticsearch
최종 아키텍처
VPC
Availability Zone 1
Private subnet
Public subnet
Availability Zone 2
Private subnet
Public subnet
Elastic Beanstalk container
Auto Scaling group
instance instanceAurora ElastiCache
Redis
ElastiCache
Redis
Aurora
instance
Classic
Load
Balancer
NAT
Gateway
Route 53
User
CloudFront S3
ElasticsearchAmazon
Kinesis
Streams
Lambda
function
Web
Serv
er
Web
Server
Operating
Tool
instance
Statistics
Server
Amazon
CloudWatch
SMS
API Provider
Admin
Amazon
Athena
Log data
Statistics
data
Client Resource
instance
Bastion
X-ray
감사합니다.

모바일 게임 하이브 런칭기 - 최용호

  • 1.
    모바일 게임 하이브런칭기 최용호
  • 2.
    발표자 소개 ● 열혈강호제작 중 ● 하이브 with Naver Webtoon ● 화이트데이 ● 클럽 엠스타 온라인 ● 와리가리 삼총사 for Kakao ● 어스토니시아VS for Kakao ● 다함께 차차차 ● 어스토니시아 온라인 ● 열혈강호2 온라인 참여 프로젝트 ● 자바카페 커뮤니티 운영진 ○ 매주 운영진 스터디 ○ 매월 운영진 회의 및 세미나 ○ 분기별 공개 강의 및 스터디 ○ 공감 세미나 및 KCD 참여 ○ 상/하반기 운영진 워크샵 ○ 페이스북 / 기술 블로그 운영 활동
  • 3.
  • 4.
    Agenda 사내 개발환경 자동화에 대한고민 성능 모니터링에 대한 고민 AWS 활용 해보기 네트워크 구성에 대한 고민 서비스 선택에 대한 고민 부하 테스트에 대한 고민 게임 데이터 활용에 대한 고민
  • 5.
  • 6.
  • 7.
    자동으로 해줄 수있는 무언가가 필요
  • 8.
    개발 환경 구축을위해 Docker 도입 Docker
  • 9.
    서비스 별로 디렉토리를만들어 Docker 파일 관리 Dockerfile 관리
  • 10.
    Docker 파일과 설정파일들 docker 컨테이너를 구동할 때 사용할 설정파일 관리
  • 11.
    동료 개발자들이 docker-compose명령을 몰라도 사용할 수 있도록 script 제공 compose 명령을 최대한 간편하게 하기 위한 스크립트
  • 12.
    빌드 및 배포자동화를 위해 Jenkins 도입 Jenkins
  • 13.
    빌드 및 배포를자동화 하기 위해 Jenkins 도입 My Company Private Network Jenkins Server S3 Elastic Beanstalk container instances 1. 빌드 된 war파일 업로드 2. 배포 3. 업로드 된 war 파일로 배포 수 행 My Company Private Network Jenkins Server EC2 instance contents tomcat tomcat mariadb redis Operating Tool Statist ics 각 서버 빌드 및 배포 Redis 및 Mariadb 스키마 갱신 및 초기화 ● Elastic Beanstalk 배포 ● 운영 및 관리를 위한 서버 배포
  • 14.
    docker-compose를 활용하여 10분내로 사내 환경 구성 tomcat mariadb redis Logstash elasticse arch kibanahttpd Client Pinpoint- hbase Pinpoint- collector Pinpoint- web Docker- compose Docker- compos e Docker- compose Amazon ECR Jenkin s Kibana와 Pinpoint를 통해 서버 상태 확인 Docker Image들은 ECR을 사용하여 버 전 관리 사내 서버들의 빌드 및 배포는 Jenkins를 통해 자동화
  • 15.
    누구나 간편하게 사용할수 있게 되어 작업이 활발해짐
  • 16.
  • 17.
  • 18.
  • 19.
    Availability Zone 1Availability Zone 2 VPC 안에는 두개의 가용 영역이 존재 (서울 리전 기준) VPC
  • 20.
    Availability Zone 1Availability Zone 2 VPC VPC 내에 서브넷 구성을 할 수가 있는데 이는 가용영역 별로 생성이 가능 subnet subnet
  • 21.
    Availability Zone 1Availability Zone 2 VPC 새로 생성한 VPC에 IGW 연결 subnet subnet
  • 22.
    Availability Zone 1 Privatesubnet Public subnet Availability Zone 2 Private subnet Public subnet VPC IGW가 연결되지 않은 서브넷(private)과 연결된 서브넷(public)으로 구분
  • 23.
    Availability Zone 1 Privatesubnet Public subnet Availability Zone 2 Private subnet Public subnet VPC 고객은 ELB를 통해서만, 관리자는 public 서브넷의 EC2 인스턴스를 통해서만 Elastic Load balancer User Admin instance instance instance
  • 24.
    AWS 네트워크 신규기능업데이트 - 강동환 솔루션즈 아키텍트 https://youtu.be/FDFmI0nU4Wg 천만 사용자를 위한 AWS 아키텍처 보안 확장 모범 사례 - 윤석찬, 테크에반젤리스트 https://youtu.be/wn_-FtheGDY 가상 데이터 센터 만들기 - VPC 기본 및 연결 옵션 - 양승도 솔루션즈 아키텍트 https://youtu.be/R1UWYQYTPKo
  • 25.
  • 26.
    Docker를 활용해보고 싶어서컨테이너 기반 서비스 검토 Amazon ECS
  • 27.
    검토 당시 서울리전에서제공되지 않아 포기 Amazon ECS
  • 28.
  • 29.
    Docker의 manager역할을 수행할AMI와 worker 역할을 할 AMI를 생성 Swarm Manager AMI Swarm Worker AMI
  • 30.
    AMI를 통해 EC2인스턴스가 구동되면 Worker는 UserData 스크립트를 통해 Manager에 Join Swarm Manager AMI Swarm Worker AMI Join
  • 31.
    docker scale 명령을통해 컨테이너를 확장 Scale
  • 32.
    docker scale 명령을수작업으로 해야한다는 불편함 존재 Scale
  • 33.
    미리 scale을 넉넉히걸어두고 한 머신에 구동될 수 있는 컨테이너를 제한하는 편법 사용 docker service create --name test-tomcat --publish 8080:8080 --reserve-cpu 1 tomcat docker service scale test-tomcat=100
  • 34.
    해 놓고 보니scale 명령으로 유연한 컨테이너 구동의 장점이 사라짐 결국 우리 서비스에서 docker를 활용하는 것은 욕심이라 판단. docker service create --name test-tomcat --publish 8080:8080 --reserve-cpu 1 tomcat docker service scale test-tomcat=100
  • 35.
  • 36.
    AWS와 Docker Swarm을이용한 쉽고 빠른 컨테이너 오케스트레이션 - 김충섭 개발자(퍼플웍스) https://youtu.be/16LNWMqphOA [AWS] EC2 인스턴스에서 docker swarm 서비스를 통해 웹서버 구동 및 확장 http://yongho1037.tistory.com/729
  • 37.
  • 38.
    용도에 맞게 환경을생성해서 관리
  • 39.
    ELB부터 오토스케일링, 보안,롤링 패치 등 까지 손쉽게 설정
  • 40.
    배포와 동시에 버전관리가되기 때문에 언제든지 이전 버전으로 롤백 가능
  • 41.
    설정을 저장해 두면동일한 설정으로 편리하게 환경 생성 가능
  • 42.
  • 43.
    변경 시 모든인스턴스를 종료하고 새로 생성 주의해서 변경해야 할 설정들 ● 오토스케일링의 시작 구성(Launch Configuration ● VPC 설정 ● 인스턴스 type 변경 ● AMI 변경 ● SSH key 변경 ● 등등.. 더 있을 수도..
  • 44.
    [AWS] Elastic Beanstalk생성과 Hook, .ebextensions를 통해 EC2 인스턴스 설정 http://yongho1037.tistory.com/731
  • 45.
  • 46.
    Java 기반이고 익숙한IDE에서 자유롭게 개발 후 jar파일을 배포하여 사용할 수 있기 때문에 선택
  • 47.
    머신만 확장하면 무제한의유저를 유입시킬 수 있는 구조가 목표 instances instance instance instance Classic Load Balancer JMeter JMeter JMeter
  • 48.
    스팟 인스턴스, ssm,jmeter를 활용하여 부하테스트 instance Spot Instance ssm bucket Output Log Run Command instances 부하 전달 Loadtest Server Spot Instance Spot Instance 스팟 인스턴스를 생성하고, 생성된 인스턴스들에 대한 상태 확인과 명령을 내리기 위한 서버 Classic Load Balancer
  • 49.
    팀원들 누구나 부하테스트를해볼 수 있도록 툴 제공
  • 50.
    jmeter 가 여러대에서동작 중이기 때문에 동작 상황을 알 수가 없어서 CloudWatch의 로그 활용
  • 51.
    성능 측정은 naver의오픈소스인 pinpoint로
  • 52.
  • 53.
    런칭 전에 pinpoint또한 관리 요소때문에 X-Ray로 변경
  • 54.
    각 요청의 응답시간확인 후 오래 걸린 작업들을 수정하여 성능 최적화
  • 55.
    AWS X-Ray를 통한서버리스 분산 애플리케이션 추적하기 - 윤석찬 (AWS 테크에반젤리스트) https://www.youtube.com/watch?v=BEg__eV1mT8&t=1350s
  • 56.
  • 57.
    데이터 수집부터 가공,집계까지 해주는 Elastic Stack 선택
  • 58.
    지표용 로그에 대한설계 사용자 계정 캐릭터 무기 아이템 상점 ... 가입 로그인 구매 판매 ... Title SubTitle
  • 59.
    지표용 로그에 대한설계 사용자 계정 가입 로그인 탈퇴 복귀 Title SubTitle
  • 60.
    id값을 통해 사용자행위에 연관된 데이터 탐색 스테이지 클리어 재화 획득 아이템 획득 캐릭터 획득 경험치 획득 퀘스트 달성 ... ID : 10000 ID : 10001, parentID : 10000 ID : 10002, parentID : 10000 ID : 10003, parentID : 10000 ID : 10004, parentID : 10000 ID : 10005, parentID : 10000
  • 61.
    재화 획득에 대한실제 데이터 { "id": "b46adf7e5bf14c4ca18868f930e2670f", "uid": 5824735036189904000, "nickname": "yongho", "title": "GOODS", "subTitle": "TAKE", "detail": { "gold": 120, "diamondBonus": 0, "diamondCash": 0, "survivalCoin": 0, "pvpCoin": 0, "stamina": 1, "supplies": 0, "component": 0, "exp": 0 }, "parentId": "d9388af36d63482b851e33f78225a9be", "parentTitle": "STAGE", "parentSubTitle": "CLEAR", "timestamp": "2017-11-08T06:00:19.551Z", "loglevel": "TRACE" }
  • 62.
    parent 정보를 통해어디서 획득한 것인지 알 수 있음 { "id": "b46adf7e5bf14c4ca18868f930e2670f", "uid": 5824735036189904000, "nickname": "yongho", "title": "GOODS", "subTitle": "TAKE", "detail": { "gold": 120, "diamondBonus": 0, "diamondCash": 0, "survivalCoin": 0, "pvpCoin": 0, "stamina": 1, "supplies": 0, "component": 0, "exp": 0 }, "parentId": "d9388af36d63482b851e33f78225a9be", "parentTitle": "STAGE", "parentSubTitle": "CLEAR", "timestamp": "2017-11-08T06:00:19.551Z", "loglevel": "TRACE" }
  • 63.
    parentId로 검색하면 해당행위와 연관된 사항들을 확인 가능 { "id": "b46adf7e5bf14c4ca18868f930e2670f", "uid": 5824735036189904000, "nickname": "yongho", "title": "GOODS", "subTitle": "TAKE", "detail": { "gold": 120, "diamondBonus": 0, "diamondCash": 0, "survivalCoin": 0, "pvpCoin": 0, "stamina": 1, "supplies": 0, "component": 0, "exp": 0 }, "parentId": "d9388af36d63482b851e33f78225a9be", "parentTitle": "STAGE", "parentSubTitle": "CLEAR", "timestamp": "2017-11-08T06:00:19.551Z", "loglevel": "TRACE" }
  • 64.
    이 id 값은제가 UUID로 만든 값 "id": "b46adf7e5bf14c4ca18868f930e2670f"
  • 65.
    엘라스틱 서치에서는 _id값을 지정하지 않으면 엘라스틱서치가 생성 "_id": "AWHRtsHJUGsDUVnVAG4k"
  • 66.
    이 _id 값을샤드 사이즈 Mod 연산하여 샤드 위치 결정 _id % ShardSize
  • 67.
    내가 만든 UUID로_id를 사용했다가 균등하게 분배가 안되면 어쩌지? _id % ShardSize
  • 68.
    final int SHARD_SIZE= 5; int[] shards = new int[SHARD_SIZE]; for(int i = 0; i < 100000; i++) { int hash = Math.abs(Murmur3HashFunction.hash(String.valueOf(i))); int shardId = hash % SHARD_SIZE; shards[shardId]++; Thread.sleep(1); } for(int i = 0; i < SHARD_SIZE; i++) { System.out.println(String.format("shardId : %d, count : %d", i, shards[i])); } 엘라스틱서치에서 샤드 분배하는 로직을 가져다 테스트
  • 69.
    final int SHARD_SIZE= 5; int[] shards = new int[SHARD_SIZE]; for(int i = 0; i < 100000; i++) { int hash = Math.abs(Murmur3HashFunction.hash(String.valueOf(i))); int shardId = hash % SHARD_SIZE; shards[shardId]++; Thread.sleep(1); } for(int i = 0; i < SHARD_SIZE; i++) { System.out.println(String.format("shardId : %d, count : %d", i, shards[i])); } // 결과 shardId : 0, count : 19740 shardId : 1, count : 20016 shardId : 2, count : 19905 shardId : 3, count : 20032 shardId : 4, count : 20307 거의 균등하게 document가 분배됨
  • 70.
    final int SHARD_SIZE= 5; int[] shards = new int[SHARD_SIZE]; for(int i = 0; i < 100000; i++) { int hash = Math.abs(Murmur3HashFunction.hash(String.valueOf(i))); int shardId = hash % SHARD_SIZE; shards[shardId]++; Thread.sleep(1); } for(int i = 0; i < SHARD_SIZE; i++) { System.out.println(String.format("shardId : %d, count : %d", i, shards[i])); } // 결과 shardId : 0, count : 19740 shardId : 1, count : 20016 shardId : 2, count : 19905 shardId : 3, count : 20032 shardId : 4, count : 20307 id 필드를 따로 만들지 않고 샤드 분배 걱정 없이 _id를 직접 할당해서 사용하는 것이 더 효율적일 듯
  • 71.
    파일에 기록되는 Web서버 로그를 수집하기 위해 Filebeat 사용 Web Server EC2 Instance filebeat
  • 72.
    Filebeat를 통해 logstash로데이터 전달 Web Server EC2 Instance EC2 Instance filebeat logstash
  • 73.
    logstash에서 가공한 데이터를elasticsearch에 색인 Web Server EC2 Instance EC2 Instance EC2 Instance filebeat logstash elasticsearch
  • 74.
  • 75.
  • 76.
  • 77.
    부하 발생하는 시점의샤드 수와 도큐먼트 수, 사용 용량 등을 확인하여 확장 여부 결정
  • 78.
    웹 서버에서 장애가발생하여 인스턴스가 종료될 경우를 대비해 보내지 못한 데이터 처리 필요 Web Server EC2 Instance EC2 Instance EC2 Instance filebeat logstash elasticsearch
  • 79.
    logstash에 대한 확장이나장애에 대한 대비도 필요 Web Server EC2 Instance EC2 Instance EC2 Instance filebeat logstash elasticsearch
  • 80.
    elasticsearch에 데이터가 너무많이 쌓이거나 장애 대응을 위해 클러스터링 필요 Web Server EC2 Instance EC2 Instance EC2 Instance filebeat logstash elasticsearch
  • 81.
    Amazon Elasticsearch Service도입 Amazon Elasticsearch Service
  • 82.
  • 83.
    Filebeat 대신 KinesisAgent 사용 ElasticsearchAmazon Kinesis Streams Lambda function Amazon Kinesis– enabled app
  • 84.
    Logstash 대신 Kinesis를통해 데이터를 받아 Lambda를 통해 데이터 가공 ElasticsearchAmazon Kinesis Streams Lambda function Amazon Kinesis– enabled app
  • 85.
    EC2 인스턴스에 설치형Elasticsearch 대신 Amazon Elasticsearch Service 사용 ElasticsearchAmazon Kinesis Streams Lambda function Amazon Kinesis– enabled app
  • 86.
    AWS 빅데이터 아키텍처패턴 및 모범 사례 - 남궁영환 빅데이터 컨설턴트(AWS 코리아) https://www.youtube.com/watch?v=D1yxmpD4VDc AWS Summit Seoul 2016 - Amazon Kinesis 와 Elasticsearch 서 비스로 만드는 실시간 데이터 분석 플랫폼 (박철수, AWS) https://www.youtube.com/watch?v=SHVWcAW4RQ8&t=1645s
  • 87.
    Amazon Elasticsearch Service소개 및 활용 방법 (윤석찬) - 2016년 월간 웨비나 https://www.youtube.com/watch?v=QeGL4om9m-Q
  • 88.
    Kinesis에서 Elasticsearch로 색인하기위한 Lambda 코드는 Github 참조 https://docs.aws.amazon.com/ko_kr/elasticsearch-service/latest/developerguide/es- aws-integrations.html https://github.com/aws-samples/amazon-elasticsearch-lambda- samples
  • 89.
    데이터 이중화를 위해서서버로 부터 생성된 파일 로그를 crontab을 사용하여 S3에 전송 S3Amazon Kinesis– enabled app
  • 90.
    S3에 쌓인 데이터는Athena를 사용하여 확인 데이터 유실이나 디버그용 로그 확인할 때 편리했음 S3 Amazon Athena Amazon Kinesis– enabled app
  • 91.
    S3에 로그 레벨별로버킷을 생성하고 하위에 년도, 일자별로 파일을 저장
  • 92.
    2018년 2월의 DEBUG레벨 로그 파일들
  • 93.
  • 94.
    Athena에서는 월별, 일자별로테이블을 생성하여 파일 탐색 범위를 최소화
  • 95.
    Athena를 활용하여 엘라스틱서치에서유실된 데이터를 복구하거나 CS 처리를 위해 상세한 로그를 확인
  • 96.
    Kibana를 사용하면 손쉽게시각화가 가능 런칭하고 보니 키바나만으로는 사업부의 요청을 전부 수용하기가 힘들었음
  • 97.
    결국 지표용 웹페이지 제작
  • 98.
    현재는 비용 때문에다시 이 구성으로 준비 중 (게임이 잘 안되어서….) Web Server EC2 Instance EC2 Instance EC2 Instance filebeat logstash elasticsearch
  • 99.
  • 100.
    VPC Availability Zone 1 Privatesubnet Public subnet Availability Zone 2 Private subnet Public subnet Elastic Beanstalk container Auto Scaling group instance instanceAurora ElastiCache Redis ElastiCache Redis Aurora instance Classic Load Balancer NAT Gateway Route 53 User CloudFront S3 ElasticsearchAmazon Kinesis Streams Lambda function Web Serv er Web Server Operating Tool instance Statistics Server Amazon CloudWatch SMS API Provider Admin Amazon Athena Log data Statistics data Client Resource instance Bastion X-ray
  • 101.