1. 클라우드 컴퓨팅(Cloud Computing)이란?
클라우드 컴퓨팅에 대해서는 현재 매우 다양한 정의가 존재한다. 이 중 몇 가지를 정리하면 다음과 같다. 첫 번째 정으로 클라우드 컴퓨팅은 다양한 클라이언트 디바이스에서 필요할 때 언제든지 인터넷을 이용한 공유 풀에 있는 서버, 스토리지, 어플리케이션, 서비스 등과 같은 IT 리소스에 쉽게 접근할 수 있게하는 모델이다.
또 다른 정의로는 서로 다른 물리적 위치에 존재하는 컴퓨터들의 리소스를 가상화 기술로 통합해 제공하는 기술이라고도 생각할 수 있다. 개인적으로 클라우드 컴퓨팅의 개념을 이해는데 세일즈포스닷컴(www.salesforce.com)1이 만든 이 동영상2이 전반적인 이해를 돕는데 매우 유용하다. 아래 그림은 여러 대표적인 클라우드 서비스들의 사용 예를 보여주고 있다.
1.1. 클라우드 컴퓨팅의 장점3
사용자가 자신의 필요에 따라 무한정의 컴퓨팅 자원을 사용할 수 있다는 환상(Illusion)을 제공한다. 그러므로 사용자는 하드웨어와 소프트웨어 시스템을 제공하는 계획을 미리 세울 필요가 없다. 사용자는 작은 시스템으로부터 시작할 수 있고 시스템 자원에 대한 요구가 증가함에 따라 시스템 자원을 증가시키면 된다. 필요에 따라 짧은 시간을 단위로 (예를 들어 프로세서를 시간 당 또는 스토리지를 날짜 당) 사용하고 비용을 지불하면 되고 필요가 사라지면 자원을 더 사용하지 않을 수 있다.
1.2. 기존 클라우드 컴퓨팅 사례
1.2.1. 아마존
- EC2(컴퓨팅 서비스)
- Auto Scaling(자동으로 서버 생성 가능)
- Elastic Load Balancing(소프트웨어 로드벨런싱 기능)
- CloudWatch(모니터링 정보 제공)
- Amazon Elastic Block Store(EBS, 빠르고 안정적인 스토리지)
- Amazon Simple Storage Service(Amazon S3, 스토리지 서비스)
- SimpleDB(데이터베이스 서비스)
1.2.2. 구글
- GFS(구글파일시스템, 대용량 파일 처리 가능 시스템)
- MapReduce(대용량 데이터의 분산 병렬 처리)
- Bigtable4(관계형이 아닌 대용량을 위한 디비)
- Sawzall(맵리듀스를 위한 스크립트)
- Chubby(분산시스템간의 락 관리를 위한 작은 파일시스템)
- Protocol Buffer
1.3. 클라우드 컴퓨팅의 분류
1.3.1. 서비스 제공에 의한 분류
- SaaS(Software as a Service)
- 소프트웨어를 설치하는 것이 아니라 서비스 형태로 제공한다는 의미
- PaaS(Platform as as Service)
- 구글 앱 엔진같은 서비스, 어플리케이션이 실행되는 환경을 제공
- IaaS(Infrastructure as a Service)
- 시스템의 구축이 필요한 자원을 제공, 아마존은 AWS서비스 중 EC2, S3, 등의 서비스
1.3.2. 서비스 배치에 의한 분류
- 퍼블릭 클라우드(Public Cloud)
- 특정 기업이나 사용자를 위한 서비스가 아닌 인터넷에 접속 가능한 모든 사용자를 위한 클라우드 서비스
- 프라이빗 클라우드(Private Cloud)
- 제한된 네트워크상에서 특정 기업이나 특정 사용자만을 대상으로 하는 클라우드 서비스
- 하이브리드 클라우드(Hybrid Cloud)
- 퍼블릭, 프라이빗을 병행하여 사용하는 방식. 보안이 중요한 부분은 프라이빗, 나머지는 퍼블릭으로 구성한다.
1.4. 클라우드 컴퓨팅 아키텍처
1.4.1. 진화과정5
- 웹 어플리케이션
- Facade 패턴6 적용(특정 모듈을 호출하는 Facade를 이용하여 분산)
- 여러 서버로 확장
- 서비스 풀 구성
- 데이터 분산 저장
- 캐시 계층 추가
- 외부 노출 서비스 선택
- 서비스 게이트웨이 구축
- 외부 게이트웨이 구축
- 서비스 버전 관리 기능 추가
- 클라우드 컴퓨팅 서비스 활용
2. 경량 어플리케이션 서버
전통적인 방법은 RPC를 이용하는 것이다. 하지만 이 방법은 IDL(Interface Definition Language)7로 변환하는 과정을 대부분 거치게 되는데 이 과정에서 많은 비용이 발생한다. 만약 이상적인 RPC 가 있다면 IDL로 변환하지 않고 사용할 수 있어야 할 것이다.
2.1. Thrift8
- 페이스북의 어플리케이션 서버
- 다양한 언어를 지원하는 RPC(Remote Procedure Call) 서버와 이 서비스를 호출하는 클라이언트 코드를 생성해주는 프레임워크
- 언어별 소켓 서버에 대한 구현을 알 필요 없음
- 사용자 정의 타입 사용 가능
- 프로그래밍 언어 제약 없으므로 쉽게 개발 할 수 있다.
2.2. Avro9
- 이기종 간 데이터 타입을 교환할 수 있는 체계 제공하는 프레임워크
- 아파치 하둡의 서브 프로젝트에서 승격
- 데이터 직렬화(Serialization)을 기본으로 RPC호출을 이기종간에 가능하게하게 함
- Thrift 보다 사용 범위가 넓음.
- Protocol Buffer, BERT, BSON10 가 유사 프로젝트
- JSON 기반으로 편리함
- Pig, Hive 등 하둡을 사용하는 다른 플랫폼에서 생성된 다양한 데이터를 상호교환하고 데이터 타입을 처리하고 위한 목적
- 하둡 자체적으로 개발된 RPC가 Java 기반에서만 동작하기 때문에 한계 극복하기 위함
2.3. Jetty11
- 톰켓과 같은 서블릿 컨테이너로 동작
- 독립적인 프로세스로 실행되면서 jsp나 서블릿 클래스에서 정의된 기능 수행
- 내장형 웹서버로도 사용 가능
- jsp, 서블릿 컨테이너 역할도 같이 할 수 있는 프로그램 개발 가능
3. 분산 코디네이터### ### 3.1. 분산된 환경에서의 고려사항
3.1.1. 네임서비스 부하 분산(Round-robin DNS)12
- 일반적인 방법은 여러 웹서버를 두고 L4 사용함
- DNS를 이용한 부하 분산(Round-robin DNS)을 사용하기도 함
- L4를 이용한 방법의 문제점
- 어플리케이션 서버의 추가 제거가 발생할 경우 DNS의 수정 필요
- L4는 하드웨어 인접 서버만 가능하다는 제약 조건 있음
- 클라이언트의 DNS캐시로 인해 장애상황시 즉시 해결되지 않을 수도 있다.
- 분산 락이나 동기화 문제
3.1.2. 공유되는 변수의 동기화 문제
- 해결 방법
- NFS(Network File System) 와 같은 파일시스템 마운트
- SPOF(Single Point Of Failure) 문제 발생
- 데이터베이스 이용방법
- 락 요청이 많아지면 부하 발생
- 장애가 발생하거나 데드락 문제 생길 수 있음
3.1.3. 장애 상황 판단 문제
- 고가용성을 위해 이중화 구성
- Active - Active
- 동일 자원에 대한 동시 접근 동기화 등 문제 방생 가능
- Active - Stanby
- 동기화 문제는 해결, 고 비용
- 네트워크 단절 문제로 Split Brain 문제 방생가능
- Split Brain 이란 네트워크 단절로 서로의 상태를 확인할 수 없는 상황을 말함
- JEUS의 이중화 구성 (Active-Stanby)13
- Split Brain 개념14
3.1.4. 환경설정 값 관리
-
.properties 파일 설정 값에 저장하고 프로그램 시작 시 메모리 로드
-
설정 값 변경시 모든 서버 배포해야 하는 문제
-
데이터베이스에 저장하고 필요할 경우 조회하여 메모리 로드
- 많은 조회로 인한 성능 저하
- 디비 부하 집중 및 SPOF 문제
3.2. ZooKeeper15
- 분산 코디네이터 서비스(Distributed Coordinator Service)를 제공하는 아파치 오픈소스
- 분산 환경에서 락, 네이밍서비스, 클러스터 멤버십 등 쉽게 구현 가능
- 사례
- 네임 서비스, 환경 설정, 그룹 멤버십
- Double Barriers
- 우선순위 큐
- 공유 락 제어
- 두 단계 커밋
- 리더 선출
4. Hadoop16 분산 파일 시스템
클라우드 컴퓨팅 서비스는 사용자의 모든 데이터가 클라우드 인프라 내부에 저장되기 때문에 기본적으로 대량의 데이터나 파일을 저장할 수 있는 저장소를 필요로한다. NAS(Network Attached Storage) 나 SAN(Storage Area Network)을 사용한다. SAN이 NAS보다 속도가 빠르고 안정적이여서 중요한 데이터 사용을 위해 더 많이 사용하지만 두가지 모두 가격이 비싸다는 단점이 있다. 하지만 분산파일 시스템은 싼 가격의 장비에서도 훌륭하게 동작한다.
4.1. 네트워크 공유 파일 시스템###
- 전통적인 클라이언트 - 서버 파일시스템
- 서버에서 접근 요청하고 마운트하는 과정이 필요
- 파일시스템 상 전송 시 오버헤드 발생, 하지만 편리함
- SUN에서 개발한 NFS(Network File System) 또는 MS에서 개발한 CIFS(Common Internet File System)등이 대표적
4.2. 클러스터 파일 시스템
- 언제 어디서나 웹을 통해 서비스 받을 수 있는 클라우드 플랫폼 필요에 의해 탄생
- 장애가 발생하더라도 안정적인 서비스 제공
- 비대칭형(Asymmetric) 클러스터 파일시스템 지원
- 성능과 가용성 면에서 적합
- 파일 메타데이터를 관리하는 서버를 별도로 둠
- 메타 데이터에 접근하는 경로와 데이터에 접근하는 경로 분리
- 메타 데이터 서버에 부하가 집중될 수 있다는 SPOF 의 잠재적 문제
- 클러스터 파일시스템
- 구글 파일 시스템17에 대한 논문 기반
- 야후에서 개발한 Hadoop 이 대표적
4.3. 구글 파일 시스템(GFS or GoogleFS)
- 저가형 서버로 구성된 환경, 장애가 빈번하다고 가정
- 파일은 대용량으로 가정, 대용량 환경에서 효과적으로 설계
- 연속적으로 많은 데이터를 읽는 연산이거나 임의의 영역에서 적은 데이터를 읽는 연산 작업으로 구성
- 쓰기 연산은 순차적으로 데이터 추가하는 연산, 파일에 대한 수정은 드물게 발생가정
- 여러 클라이언트에서 동시에 동일한 파일에 데이터를 추가하는 환경에서 동기화 오버헤드 최소화
- 낮은 응답지연 시간보다 높은 처리율
- POSIX는 지원안함
4.4. 하둡 파일시스템### ### 4.4.1. 특징과 장단점
- 선형적인 확장성 제공
- 글로벌 네임스페이스 제공
- 비용 절감
- 전체 처리 용량 증가
- 데이터 분석 처리에 활용
- 응용 프로그램 기반의 파일 시스템
- 불변 파일(Immutable File)만 저장
- 네임스페이스 관리는 네임노드 메모리에 저장
- 네임노드 이중화 문제
4.4.2. 대용량 데이터 분석 프레임워크 맵리듀스### ### 4.4.2.1. 소개 및 구조
- 대용량 데이터를 병렬로 처리하기 위한 소프트웨어 프레임워크
- 입력 파일은 라인단위로 맵 함수에 전달
- 맵 함수의 출력 결과를 정렬/병합
- 정렬/병합된 결과를 리듀스 함수에 전달
- 맵 함수를 분산된 서버에서 수행
- 분산 처리된 맵 결과를 리듀스가 수행될 서버로 전송
5. NoSQL
- 그동안 관계형 디비가 주로 사용됨.
- Not Only SQL, SQLess, Free Style Data Storage, Hybrid Data Storage 등의 의미
- 관계형 디비는 대규모 데이터를 저장하기 위해 스케일 아웃(Scale-Out) 방식으로 확장하기 어려움
- 대부분 고가
- 새로운 인터넷 환경은 join 같은 작업 불필요
- 조회만 가능하면 되는 경우 많음
-
서비스 종류
- 구글의 BigTable
- 아마존의 다이나모(Dynamo) 등
5.1. CAP 이론
분산환경에서 데이터 관리 시스템을 구성할 경우 적용되는 이론, 이 세가지 조건을 모두 만족시키는 분산시스템을 구성할 수 없다.
- 정합성(Consistency)
- 가용성(Availability)
- 단절내성(Partition Tolerance)
Visual Guide to NoSQL Systems18
5.2. NoSQL의 CAP은?
네트워크 단절시 어느 서버로 접속하더라도 같은 데이터를 읽을 수 있는 정합성 만족한다. 동일한 데이터가 여러 개의 슬래이브에 저장되기 때문에 특정 슬레이브가 장애 상황이 되더라도 읽기 연산 가능한 가용성 만족시킬 다수 있다. 네트워크 단절된 후 수정이 발생하면 데이터가 다를 수 있어 단절내성 만족하지 않는다.
5.3. NoSQL의 특징과 분류
- 관계형 데이터 모델이 아닌 key-value 또는 key-value를 응용한 데이터 모델
- 안정적이고 고가은 하드웨어가 아닌 다수의 값 싼 하드웨어 이용
- 데이터는 분산된 노드에 파티션에 복제
- 데이터의 정합성에 대한 요구사항보다는 단절내성에 대한 요구 중요
- 2단계 커밋(2 phases commit) 수준의 트랜잭션보다는 Quorum 기반의 트랜잭션을 선호
5.4. NoSQL의 종류
5.5. NoSQL의 주의점
- NoSQL은 범용적인 저장소가 아니다
- 프로그램, 데이터 모델 경험이 부족하다. (최근 많이 나아졌다.)
- 관리 도구가 부족하다.
- 시스템 자원 사용을 모니터링 해야한다.
- 커뮤니티에 적극적으로 참여하는것이 좋다.
- 성능과 안정성 테스트는 실제 데이터를 이용하라.
- 솔루션에서 제공하는 자료를 맹신해서는 안된다.
6. 로그 수집과 분석
6.1. 하둡 기반의 로그 저장 분석 솔루션
6.1.1. Chukwa24
-
장점
- 하둡 프로젝트의 서브 프로젝트로 로그 분석 솔루션
- 로그를 생성하는 응용 프로그램을 수정하지 않고 로그 수집할 수 있음
- 최종 로그 파일이 하둡 파일 시스템에 저장되기 때문에 로그파일 안정적 보관
-
준 실시간(Near Real Time)과 실시간 수집을 지원
-
단점
- 하둡이 설치되어야 사용가능
- 최종 로그파일이 SequenceFile25(Binary File)로 생성되기 때문에 별도 뷰어 필요
6.1.2. Scribe26
- 페이스북의 로그 관리 솔루션
- Thrift 에서 만든로그를 수신하는 서버와 접속하는 클라이언트 모듈만 제공
- 하둡과 같은 저장소는 직접 구성해야 함
- 척와가 기존 어플리케이션을 수정하지 않아도 되는 반면 스크리아브는 제공하는 API를 이용하여 기록하야함
- tail을 이용해 스크라이브 서버로 전송하는 에이전트를 만들어도 됨
- 성능향상을 위한 필수 요소
7. 메모리 캐시
-
고려사항
- 메모리를 얼마나 사용할 것인가?
- 실제 데이터가 변경되었을 때 캐시에 저장된 데이터와 불일치 문제 해결방법
7.1. memcached27
- 원격 분산 메모리 캐시 시스템
- 데이터베이스 부하를 줄여 웹 어플리케이션의 성능을 높이기 위한 용도
- http://www.membase.com 에서 memcached 를 유지보수하고 있음
- 분산처리를 위한 기능 없음
- key-value 쌍으로 기록
- memcached 프로토콜을 이용하여 처리
7.2. membase28
- 분산 memcached 서버
-
다음의 경우 사용을 고려해 볼 수 있다.
- memcached 서버 처럼 빠르면서 persistence 서비스를 제공받고 싶은 경우
- memcached 서버에 장애 복구 기능을 추가해 좀 더 안전한 서비스를 제공받고 싶은 경우
- 특정 서버의 memcached에 장애가 발생해 급히 해당 서버를 제거하고 재구성해야 하는 경우
- 모든 memcached 서버에서 메모리가 부족해져 긴급히 메모리를 추가해야 하는 경우
- 특정 서비스에서 많은 메모리를 사용해 사용량이 적은 서비스의 데이터가 캐시 아이템 교체 전략으로 제거되는 현상이 발생하는 경우
- 특정 서비스의 캐시 데이터를 모두 삭제하고 싶은 경우
- memcached 는 권한을 줄 수 없는데 하나의 클러스터로 여러 서비스가 같이 사용하고 싶은 경우
- 복제 기능을 이용해 지워지지 않는 캐시 시스템을 구축하고 싶은 경우
8. Reference
-
(2006). Salesforce.com 한국. Retrieved May 21, 2013, from http://www.salesforce.com/kr/. ↩
-
(2009). 클라우드 컴퓨팅이란? (What is Cloud Computing … - YouTube. Retrieved May 21, 2013, from http://www.youtube.com/watch?v=Gm0gU1wrWuw. ↩
-
심영철 (2009). 클라우드 컴퓨팅의 기술 동향과 가상화 기반 관리 기술. KNOM Review, 12(1), 20-32. ↩
-
Chang, F. (2006). Bigtable - Research at Google. Retrieved from http://research.google.com/archive/bigtable-osdi06.pdf. ↩
-
(2010). 클라우드 컴퓨팅 구현 기술 – Daum 책. Retrieved May 21, 2013, from http://book.daum.net/detail/book.do?bookid=KOR9788960771703. ↩
-
퍼사드 패턴 - 위키백과, 우리 모두의 백과사전 - 위키백과 - Wikipedia. Retrieved May 22, 2013, from http://ko.wikipedia.org/wiki/%ED%8D%BC%EC%82%AC%EB%93%9C_%ED%8C%A8%ED%84%B4. ↩
-
(2005). IDL (programming language) - Wikipedia, the free encyclopedia. Retrieved May 22, 2013, from http://en.wikipedia.org/wiki/IDL_(programming_language). ↩
-
(2009). Apache Thrift. Retrieved May 22, 2013, from http://thrift.apache.org/. ↩
-
(2010). Welcome to Apache Avro!. Retrieved May 22, 2013, from http://avro.apache.org/. ↩
-
(2010). BSON - Binary JSON. Retrieved May 23, 2013, from http://bsonspec.org/. ↩
-
(2009). Jetty - Servlet Engine and Http Server - Eclipse. Retrieved May 22, 2013, from http://www.eclipse.org/jetty/. ↩
-
(2006). Round-robin DNS - Wikipedia, the free encyclopedia. Retrieved May 22, 2013, from http://en.wikipedia.org/wiki/Round-robin_DNS. ↩
-
(2011). 의 “제3장 JEUS MQ 장애 극복” - TechNet. Retrieved May 23, 2013, from http://technet.tmax.co.kr/kr/edocs/jeus/60/mq/failover.html. ↩
-
(2012). 서버 MCCS - IBM. Retrieved May 22, 2013, from http://www-903.ibm.com/edm/R1112/1208_ehc_thanks/3.pdf. ↩
-
(2010). Apache ZooKeeper - Home. Retrieved May 22, 2013, from http://zookeeper.apache.org/. ↩
-
(2007). Welcome to Apache™ Hadoop®!. Retrieved May 22, 2013, from http://hadoop.apache.org/. ↩
-
Ghemawat, S. (2003). The Google File System. Retrieved from http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/de//archive/gfs-sosp2003.pdf. ↩
-
(2010). Visual Guide to NoSQL Systems - Nathan Hurst’s Blog. Retrieved May 22, 2013, from http://blog.nahurst.com/visual-guide-to-nosql-systems. ↩
-
(2010). cloudata. Retrieved May 22, 2013, from http://www.cloudata.org/. ↩
-
(2010). HBase - Apache HBase™ Home. Retrieved May 22, 2013, from http://hbase.apache.org/. ↩
-
(2012). Amazon DynamoDB - Amazon Web Services. Retrieved May 22, 2013, from http://aws.amazon.com/dynamodb/. ↩
-
(2010). The Apache Cassandra Project. Retrieved May 22, 2013, from http://cassandra.apache.org/. ↩
-
(2008). MongoDB. Retrieved May 22, 2013, from http://www.mongodb.org/. ↩
-
(2010). Welcome to Apache Chukwa. Retrieved May 22, 2013, from http://incubator.apache.org/chukwa/. ↩
-
(2012). SequenceFile (Apache Hadoop Main 2.0.4-alpha API). Retrieved May 22, 2013, from http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/SequenceFile.html. ↩
-
(2010). facebook/scribe · GitHub. Retrieved May 22, 2013, from https://github.com/facebook/scribe. ↩
-
(2006). memcached - a distributed memory object caching system. Retrieved May 22, 2013, from http://memcached.org/. ↩
-
(2010). membase (Membase) · GitHub. Retrieved May 22, 2013, from https://github.com/membase. ↩