by kth 클라우드 솔루션 Lab 임성환
아마존AWS에서 downtime 최소화하기
서비스를 운영하다 보면 새벽에 시스템에 문제가 발생하여 상황실로부터 연락을 받고 원격으로 접속하여 장애처리를 하던 경험들이 있을 것이다. 실제 장애 처리 시간이 2~3분 밖에 걸리지 않아도 문제 발생시간부터 개발 담당자가 접속하기까지 상당한 시간이 소요될 수 있다. 그리고 갑자기 트래픽이 급증하여 서버 부하가 증가하고 긴급히 서버 증설이 필요할 경우, 유휴 서버를 찾아내고 셋팅하는데 몇 시간을 소요하는 경우가 많다.
이러한 트래픽 급증으로 인한 긴급한 서버 증설이 필요한 경우나 2대밖에 없는 웹서버 중 한대가 갑자기 다운되어 한 서버에 트래픽이 몰릴 경우, 자동으로 서버를 늘려준다면 downtime을 최소화 할 수 있을 것이다. 아마존의 EC2(Elastic Compute Cloud) 서비스가 이러한 Auto Scaling 기능을 제공한다. ‘Elastic’이라는 단어에서 알 수 있듯이 compute capacity를 탄력적으로 resizing을 가능하게 해 준다.
아마존에서 Auto Scale 사용하기
그렇다면 아마존의 EC2 서비스는 어떻게 Auto Scaling 기능을 제공할까?
[Amazon의 Auto Scaling]
아마존의 경우, 들어오는 HTTP 리퀘스트가 Elastic Load Balancer에 의해서 EC2 instance로 분산되어 들어간다. CloudWatch는 각 인스턴스들의 시스템 성능 데이터를 주기적으로 수집하여 저장하고 모니터링 용으로 활용한다. 모니터링 하고 있는 인스턴스의 CPU 사용률이 설정해 놓은 기준치(upper CPU limit)를 초과할 경우, auto scale이 수행되어 새로운 인스턴스가 자동으로 생성되고, Elastic Load Balancer에 새로운 인스턴스가 등록되어 HTTP 리퀘스트가 유입된다. 그러다가 트래픽이 감소하여 CPU 사용율이 설정되어 있는 최소 기준치(lower CPU limit)보다 낮아지면 새롭게 생성되었던 인스턴스가 제거가 된다.
아마존의 EC2 서비스를 신청하면 자동으로 Auto Scaling에 등록이 된다. 이런 EC2의 Auto Scaling 기능을 사용하기 위해서는 다음과 같은 절차가 필요하다.
1. Auto Scaling Command Line Tool과 CloudWatch Command Line Tool을 다운받아야 한다.
2. Elastic Load Balancer를 생성한다.
아래의 명령은 80 port로 들어오는 request를 8080 instance 포트로 forwarding하는 “my-load-balancer”라는 이름의 load balancer를 생성한다.
3. 자동으로 생성될 인스턴스에 대한 Launch config를 생성한다.
생성할 인스턴스의 type과 이미지(AMI)를 파라미터로 설정할 수 있다.
4. Auto Scaling Group을 생성한다.
위에서 설정한 load balancer와 launch config를 이용해서 max instance 개수를 11개, min instance 개수를 3개로 설정한다. 즉, 인스턴스를 새로 생성하더라도 11개가 넘어가도록 생성하지 않으며, 3개로 인스턴스를 사용하고 있디가 하나가 다운되었을 경우, 새로운 인스턴스를 생성하여 최소 3개를 유지할 수 있게 해준다. (Fault-Tolerance)
5. Auto Scale Trigger를 생성한다.
CPU사용율 기준으로 80% 이상일 때 scale out을 수행하고, 20% 미만일 때 scale in을 수행한다. Scale out을 수행할 때 인스턴스를 4개씩 증설하고, scale in 할 때에는 2개씩 감소시킨다.
Auto Scaling을 이용하기 위해서는 동작원리를 이해하고, Command Line Tool을 사용해야 하는 불편함이 있다. 그래서 아마존의 Auto Scaling 기능을 쉽게 사용할 수 있도록 해주는 enStratus (http://enstratus.com/) 나 SCALR(https://scalr.net/) 같은 3rd Party 들이 존재한다.
SCALR 소개 동영상 (https://scalr.net/screencast.html) 을 보면, 클라우드 기반의 Auto Scaling 및 Fault-Tolerance에 대해서 아주 쉽게 설명하고 있으니, 본 동영상(5분30초 길이)을 볼 것을 강추한다. ^^
아마존에서 데이터베이스의 Scaling 사용하기
갑자기 트래픽이 늘어났을 때, 단순히 웹서버만 문제가 생기는 것이 아니라, 데이터베이스 서버도 부하가 올라가서 서비스의 장애로 이어질 수 있다. 이럴 경우, 데이터베이스 서버를 사양이 더 높은 서버로 교체하거나, slave DB를 늘리면 해결할 수 있을 것이다. 이 또한 수작업으로 진행하기에는 많은 시간이 소요될 수 밖에 없다. 아마존 AWS에서는 어떤 scaling 기능을 제공하는지 알아보자.
데이터베이스에 대한 Auto Scaling은 상당 복잡하고, 아마존에서도 Auto Scaling 기능은 제공하지 않는다. 아마존은 RDS(Relational Database Service)를 통해 일부 Scaling 기능을 제공하고 있다. . Scaling 기능에는 CPU나 메모리 등의 인스턴스의 사양을 올리는 Scaling Up(or Down) 기능이 있고, 인스턴스의 개수를 늘리는 Scaling Out(or In) 기능이 있다. 데이터베이스의 성능을 쉽게 올릴 수 있는 방법으로 Scaling Up 기능을 주로 사용한다.
1. Scaling Up ( or Down)
데이터베이스 서비스로 아마존의 RDS 서비스를 사용하고 있다면 Scaling Up은 상당히 간단하다. 아래 그림과 같은 console 화면(Modify DB Instance)에서 DB Instance Class만 수정해 주면 된다. DB Instance 종류는 Small DB Instance, Large DB Instance, Extra Large DB Instance, High Memory Extra Large DB Instance 등 CPU나 메모리 사양에 따라 다양하다. 단, Instance가 바뀌는 동안의 downtime이 존재한다는 단점이 있다. 내부적인 동작원리는 사용하고 있는 Instance를 down시킨 다음, 붙어 있는 EBS 스토리지를 새로운(console에서 선택한) Instance에 붙여서 부팅시킨다.
2. Scaling Out
아마존의 RDS 서비스는 Sharding 또는 partitioning 된 DB에 대해서는 scaling out 기능을 제공하지 않는다. 단지 Master-slave type의 Scaling만을 지원한다. 아래의 그림에서처럼 console에서 쉽게 slave DB Instance를 생성할 수 있다.
[참고자료]
※ AWS의 autoscaling : http://aws.amazon.com/autoscaling/
※ Minimizing downtime on Amazon AWS : http://www.peecho.com/blog/minimizing-downtime-on-amazon-aws.html
※ How to Load Balancing and Auth Scale with Amazon’s EC2 : http://www.codebelay.com/blog/2009/08/02/how-to-load-balance-and-auto-scale-with-amazons-ec2/
※ Amazon Auto Scaling Help Pages : http://af-design.com/aws/auto_scaling/
※ How to Scale a Relational Database with Amazon EC2 : http://answers.oreilly.com/topic/2626-how-to-scale-a-relational-database-with-amazon-ec2/






