2. 발표자 소개
● 열혈강호 제작 중
● 하이브 with Naver Webtoon
● 화이트데이
● 클럽 엠스타 온라인
● 와리가리 삼총사 for Kakao
● 어스토니시아VS for Kakao
● 다함께 차차차
● 어스토니시아 온라인
● 열혈강호2 온라인
참여 프로젝트
● 자바카페 커뮤니티 운영진
○ 매주 운영진 스터디
○ 매월 운영진 회의 및 세미나
○ 분기별 공개 강의 및 스터디
○ 공감 세미나 및 KCD 참여
○ 상/하반기 운영진 워크샵
○ 페이스북 / 기술 블로그 운영
활동
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를 통해 자동화
19. Availability Zone 1 Availability Zone 2
VPC 안에는 두개의 가용 영역이 존재 (서울 리전 기준)
VPC
20. Availability Zone 1 Availability Zone 2
VPC
VPC 내에 서브넷 구성을 할 수가 있는데 이는 가용영역 별로 생성이 가능
subnet subnet
21. Availability Zone 1 Availability Zone 2
VPC
새로 생성한 VPC에 IGW 연결
subnet subnet
22. Availability Zone 1
Private subnet
Public subnet
Availability Zone 2
Private subnet
Public subnet
VPC
IGW가 연결되지 않은 서브넷(private)과 연결된 서브넷(public)으로 구분
23. 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
24. AWS 네트워크 신규기능 업데이트 - 강동환 솔루션즈 아키텍트
https://youtu.be/FDFmI0nU4Wg
천만 사용자를 위한 AWS 아키텍처 보안 확장 모범 사례 - 윤석찬, 테크에반젤리스트
https://youtu.be/wn_-FtheGDY
가상 데이터 센터 만들기 - VPC 기본 및 연결 옵션 - 양승도 솔루션즈 아키텍트
https://youtu.be/R1UWYQYTPKo
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
36. AWS와 Docker Swarm을 이용한 쉽고 빠른 컨테이너 오케스트레이션 -
김충섭 개발자(퍼플웍스)
https://youtu.be/16LNWMqphOA
[AWS] EC2 인스턴스에서 docker swarm 서비스를 통해 웹서버 구동 및 확장
http://yongho1037.tistory.com/729
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
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
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
83. Filebeat 대신 Kinesis Agent 사용
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
100. 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