2. 발표자 소개
• 이정행 (@eincs)
• VCNC에서 비트윈을 개발하고 있는 개발자
• 서버팀에서 잡다한 것을 개발 중
• http://eincs.com
3. 비트윈
• 커플들을 위한 모바일 서비스
• 아이폰, 안드로이드 어플리케이션 제공
• 채팅, 기념일, 사진, 메모, 캘린더 기능 제공
• 전 세계에서 1000만+ 다운로드 (as of 2014.12)
• http://between.us
• http://engineering.vcnc.co.kr
4. 비트윈 서버 구조
• Java로 작성되어 있음
• 데이터 저장소로 HBase를 사용함
• Haeinsa를 통해 HBase에 접근시 ACID 트랜잭션 이용
• Thrift 서비스를 Netty위에 올려서 서비스함
• 채팅의 경우, Thrift를 이용해 클라이언트와 통신함
• AWS Tokyo리전에서 운영되고 있음
7. EC2
웹서비스를 띄우기 위해
EC2 인스턴스를 만들어보았습니다.
설정해야 하는 값들: InstanceType, AMI, AvailabilityZone,
SecurityGruop, Volumes, KeyName Tags…
8. EC2
데이터를 저장하기 위해서
RDS를 이용하기로 하였습니다.
설정해야 하는 값들: DBName, DBSecurityGroup, Engine, EngineVersion, MultiAZ,
MaintenanceWindow, AllocatedStorage, AllowMajorVersonUpgrade…
RDS
9. RDS
EC2
EC2
트래픽이 많아져서 EC2를 더 띄웠습니다.
ELB를 통해 로드밸런싱을 합니다.
설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone,
ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…
10. RDS
EC2
EC2
트래픽이 많아져서 EC2를 더 띄웠습니다.
ELB를 통해 로드밸런싱을 합니다.
설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone,
ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…
손토스케일링™
(hand)
11. RDS
EC2
EC2
트래픽이 많아져서 EC2를 더 띄웠습니다.
ELB를 통해 로드밸런싱을 합니다.
설정해야 하는 값들: ELB Name, AvailabilityZone, LIsteners,CrossZone,
ConnectionDrainingPolicy, LBCookieStickinessPolicy, Tags…
손토스케일링™ = 서버 개발자가 잠을 잘 수 없다.
12. RDS
EC2
EC2
트래픽에 따라 유연하게 대응하기 위해
AutoScalingGroup을 이용하기로 하였습니다.
설정해야 하는 값들: AvailabilityZone, Cooldown,
Max/Min/DesiredCapacity, LoadBalancerName, ScalingPolicy…
13. RDS
EC2
EC2
어떤 매트릭에 대해 알람을 걸 것인지 결정하고
알람을 하나하나 등록해야합니다.
혹시 있을 장애 상황에 빠르게 대응하기 위해
CloudWatch를 이용하여 알림을 받기로 하였습니다.
17. 비트윈 서버
로그 수집 서버
비트윈 채팅 서버
이벤트박스 서버
공지사항 서버
더보기탭 서버
광고 배너 서버
광고 알림 서버스티커 스토어
모바일쿠폰샵
OAuth 서버
리딤 서버
Kharon 서버
비트윈 Worker
각종 프리젠터
……
운영하는 서버의 종류가 많아진다면?
18. 비트윈 서버
로그 수집 서버
비트윈 채팅 서버
이벤트박스 서버
공지사항 서버
더보기탭 서버
광고 배너 서버
광고 알림 서버스티커 스토어
모바일쿠폰샵
OAuth 서버
리딤 서버
Kharon 서버
비트윈 Worker
각종 프리젠터
……
운영하는 서버의 종류가 많아진다면?
함정 카드 발동: 만들고 설정해야 할게 몇 개인지 세기도 어렵다
40. CloudFormation의 추가 기능
• Mapping을 이용하여 조건에 따라 다른 값 설정 가능
• Condition를 이용하여 조건에 따라 리소스의 생성 여부나
리소스의 설정값을 경우에 따라 다르게 할 수 있음
• 여러 연산자(Fn::Join, Fn::Equals…)를 이용하여 데이터를
조합하여 새로운 데이터를 만들어 낼 수 있음
• 뭔가 업데이트 되는 경우 Notification로 알려주는 기능
• StackPolicy를 이용해 특정 리소스의 변경을 막는 기능
41. 스택을 업데이트 하는 경우
• 템플릿을 변경하거나 원래 있던 템플릿은 그대로 사용하면
서 파라메터만 변경하는 식으로 업데이트가 가능
• 스택이 관리하던 리소스들의 상태가 업데이트되거나 지워졌
다가 새로 만들어 질 수 있음
• 리소스가 중단없이 업데이트 될지, 지웠다가 새로 만들어질
지는 변경되는 값에 따라 다르며 문서에 명시되어 있음
• AutoScalingGroup의 경우 UpdatePolicy를 지정하여 자동
으로 롤링 업데이트를 시킬 수 있음
42. CloudFormation 노하우
• 처음에는 만들 수 있는 Stack 갯수가 20개로 제한되어 있지
만 늘릴 수 있음
• 하나의 템플릿에 너무 많이 담으려고 할 필요가 없음
(여러 Stack을 조합하여 전체 시스템을 구성하기)
• Output을 잘 정의하면 다른 스택을 만들때 들어가는
Parameter값을 쉽게 작성 할 수 있음
43. CloudFormation의 불편한 점
• JSON형태로 되어 있어서 주석을 쓸 수가 없음
• 비슷한 구성의 스택을 만드는 경우 반복되는 코드가 많아짐
• 최신 기능들을 제공하지 않는 경우가 있음
• 기존에 만들었던 인프라를 CloudFormation으로 관리하려
면 전부 다시 만들어야함
45. 정리하기
• CloudFormation은 좋으며 시작하기도 어렵지 않음
• 인프라 구성을 소스코드 처럼 관리 가능함 (리뷰도 가능)
• 다른 사람에게 말로 구성에 대해 설명할 필요 없음
• 사람이 관여하는 부분이 적어 실수 방지 가능
• CloudFormation 꼭 쓰세요. 두 번 쓰세요.
50. 제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
Chef
DSL
(Ruby기반)
필요 Ruby
Puppet DSL 필요 Ruby
유명한 서버 구성 소프트웨어와의 비교
51. 제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
Chef
DSL
(Ruby기반)
필요 Ruby
Puppet DSL 필요 Ruby
비교적 간단한 형태의 yml을 이용해 정의를 하므로 쉽게 배울 수 있다.
52. 제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
Chef
DSL
(Ruby기반)
필요 Ruby
Puppet DSL 필요 Ruby
Agent를 미리 프로비저닝 할 필요 없어서 편리하다.
53. 제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
Chef
DSL
(Ruby기반)
필요 Ruby
Puppet DSL 필요 Ruby
개발 언어에 따라 배포하는 방식도 달라질 수 있다.
54. 제품 DSL Agent 개발언어
Ansible yml 없음 (SSH) Python
Chef
DSL
(Ruby기반)
필요 Ruby
Puppet DSL 필요 Ruby
함정 카드 발동: 그 날 따라 gem이 엄청 느렸습니다…
개발 언어에 따라 배포하는 방식도 달라질 수 있다.
59. 정리하기
• Ansible은 좋음
• 서버 구성을 소스코드 처럼 관리 가능함 (리뷰도 가능)
• Agent를 따로 설치할 필요가 없어 시작이 비교적 간단함
• 잘 활용하면 Ansible을 잘 몰라도 서버 구성을 할 수 있음
• Puppet, Chef에 대한 좋은 대안이 될 수 있음
70. 함정 카드 리스트
• 생각보다 설정 할 것들이 많다.
• 비슷한 것들을 반복해서 만들어야 할때도 있다.
• 만들다가 실수로 설정을 빼먹는다면?
• 여러 사람에게 지식을 알려주기가 힘들다.
• AMI를 새로 만들어야할 때도 있다.
71. 함정 카드 리스트
• 생각보다 설정 할 것들이 많다.
• 비슷한 것들을 반복해서 만들어야 할때도 있다.
• 만들다가 실수로 설정을 빼먹는다면?
• 여러 사람에게 지식을 알려주기가 힘들다.
• AMI를 새로 만들어야할 때도 있다.
모두 CloudFormation, Ansible로 해결 가능!