이 글은 로컬 디스크 백업 솔루션과 원격 스토리지 유틸리티 백업 솔루션 간의 비용에 대해 비교해 보고 원격 스토리지 백업에 대한 간단한 구현 가이드를 제공합니다.

백업어카이빙 은 다양한 용도에 쓰이고 여러 회사에서 광범위하게 쓰이고 있습니다. 전통적인 백업과 어카이빙 작업은 Sun StorageTek SL500 Modular Library System 같은 테입 라이브러리를 타겟으로 하고 있습니다. 시간이 갈수록 회사들은 접근시간 및 응답속도가 빠르고 비교적 "간단한" 솔루션인 로컬 디스크 스토리지를 사용하고 있습니다. 접근시간과 응답속도의 단축으로 인해 어카이빙이 여전히 각광받고 있고 복구 작업도 빠르게 증가하고 있는 SLA 를 만족할 수 있습니다.

로컬 디스크 솔루션의 장점(퍼포먼스 및 실시간 브라우징 기능)을 취할 수 있으면서 재해 복구를 위한 적정 수준의 원격 백업을 하는 동시에 현재 사용하고 있는 디스크 솔루션만을 이용해 이러한 작업을 간단하게 수행하려 하는 작은 규모의 회사들은 경쟁력있는 스토리지 유틸리티를 찾고 있습니다. SmugMugelephantdrive 같은 회사들은 하드웨어 비용을 줄이고 시스템 관리자의 부담을 덜어주기 위해 스토리지 유틸리티를 사용하고 있습니다. 스토리지 유틸리티는 단계적인 스토리지 관리, 기가바이트 대비 낮은 비용으로 대용량의 시스템 구축 가능, 그리고 대용량 데이타를 관리하기 위한 관리 툴 빌드를 통한 비용 절감을 통해서 규모의 경제를 좀 더 쉽게 이룰 수 있습니다. 이러한 절약은 더 작은 회사들에게 돌아가게 됩니다. 게다가 데이타 관리 경험이 풍부한 회사는 어플리케이션 소프트웨어나 스토어 저장소 관리에 강점이 있는 작은 회사들 보다 훨씬 안전하고 안정적인 솔루션을 제공할 수 있습니다.

호스팅 솔루션과 스토리지 유틸리티를 고려할때에는 여러가지 기억해두어야 할 사항들이 있습니다. 이러한 사항들의 대부분은 숫자로 측정이 가능하지만 몇몇은 (예를 들어 여러분 회사의 핵심 역량 같은) 그렇지 않을 수도 있습니다. 아래의 고려사항 및 요구사항은 필자가 고유의 솔루션을 만들기 혹은 스토리지 유틸리티를 활용하기 두개의 선택을 할 때에 고려했던 사항들에 대해 나열한 것입니다. 필자는 솔루션이 다음과 같은 혜택을 제공하기를 원했었습니다:

  • 원격 백업으로 12 테라바이트 이상의 접근 가능한 스토리지 (한달에 1TB 정도를 사용한다고 가정)
  • 아래와 같은 비용을 포함하여 일년이상 사용했을때 로컬에 위치하는 솔루션보다 좀 더 저렴한 월별 비용:
    • 하드웨어 비용
    • 전력 비용
    • 원격 호스팅 설비 비용
    • 네트워크 대역폭 비용
    • 시스템 관리자 비용

필자는 필자의 스토리지 소비 및 환경에 대한 몇가지 가정을 해 보았습니다. 여기서 숫자들은 모두 소숫점을 버렸습니다. 회사로 가정한다면 여러분은 분명 좀 더 공격 적으로 기대 사항들을 매핑시켰을 것입니다. 왜냐하면 모든 비용의 합산 및 비용의 정확성이 최종 비용을 고려하는데에 도움을 줄 것이기 때문입니다. 필자는 다음과 같이 가정 하였습니다:

  • 월별 사용량: 한달에 1TB 정도를 백업한다고 가정
  • 복구: 일년내내 두달에 한번꼴로 두번의 500MB 데이타 복구가 발생한다고 가정
  • 접근 시간: "일반적인" 네트워크 지연시간으로 용납가능
  • 접근 빈도: 100 Mbps 네트워크 접속으로 용납가능
  • 안정성: 같은 장소에서 사용하고 있는 솔루션과 스토리지 유틸리티는 동일한 가용성을 가지고 있다고 가정

물론 필자가 비슷한 수준에서의 비교를 원했기 때문에 이 글의 범주에 들어가지 않는다고 생각한 수많은 것들이 있습니다. 개인의 스토리지 관리 능력이 좀 더 향상될 수록 비용 절감에 도움을 주는 좀 더 많은 솔루션들이 존재 합니다. 필자의 목표는 간결함 이였고 그러므로 몇가지 것들은 이 글의 범위에 넣지 않았습니다:

  • 복잡한 로컬 스토리지와 네트워크 솔루션들 (이 글에서는 단일 X4500 장비를 네트워크를 통해 백업 한다고 가정함)
  • 테잎 백업

필자는 아래 그림처럼 "간단하게" 일대일로 연결된 파일 기반의 백업 인프라가 존재한다고 가정합니다.

사용자 삽입 이미지
"간단하게" 일대일로 연결된 파일 기반의 백업 인프라

일반적인 시작 포인트로 ZFS 파일 시스템을 선정했습니다. 다른 파일 시스템도 사용 가능하지만 퍼포먼스 측면에서의 우월성과 스냅샷, 복구 기능 때문에 ZFS 를 선택했습니다. 만약 특정 파일 시스템과 실제로 다른 점을 발견한다면 저에게 구현체를 보내 주시면 여러분의 이름과 함께 제 블로그 에 내용을 올려 드리겠습니다. 또한 필자는 위키 사이트를 파일럿 운영하고 있고 이러한 패턴을 여러분이 "수정 가능"하도록 의도했었습니다. 그러므로 여러분은 패턴의 분기를 만들거나 여러분의 솔루션을 추가할 수 있고 또한 변경할 수도 있습니다.

Amazon Simple Storage Service (Amazon S3) 는 스토리지 유틸리티 중에서도 흥미로운 선택입니다. 필자는 다음과 같은 이유로 이 유틸리티를 선택하였습니다:

  • 업계에서 널리 쓰이는 대중성
  • 안정적이고 예측 가능한 비용 모델이자 업계에서 가장 낮은 수준의 가격임. 그러므로 가장 좋은 "최적의 케이스" 라고 생각함
  • 신뢰할만한 스토리지 소스

Amazon S3 의 호스팅 비용은 다음과 같습니다:

  • 한달에 1TB 를 소모, 일년에 12TB 정도를 사용함
    • 하드웨어 비용: $0
    • 전력 비용: $0 (원격 호스팅 비용 포함)
    • 스토리지 유틸리티 비용: $11,700 (1TB + 2TB + ... + 12TB @ $0.15 / GB-Month: $150 + $300 + ... + $1,800)
    • 대역폭 비용: $1,380 (Inbound: 12 * $0.10/GB * 1000 = $1200, Outbound: 2 * 500GB * 0.18/GB = $180)
    • 시스템 관리자 비용: $0
    • 첫번째 해의 총 소유 비용 (TCO): $13,080

이러한 특별한 패턴의 본래 요구사항은 스토리지 백업 비용을 줄여보자는 것이였습니다. SmugMug 는 고유의 디스크를 사는 것 대신에 Amazon S3 를 이용함으로써 절약한 비용에 대한 간단한 분석 을 실시 했고 이를 통해서 그들은 7달간 $340,000 을 절약했다고 합니다.

여러분의 고유의 내부 정보를 기반으로 전체 비용에 대한 분석에 시간을 투자 하는 것은 매우 중요 합니다. 왜냐하면 Amazon S3 서비스는 고정 요금 구조이므로 수년간의 비용을 계산해 보면 실제로 12TB 의 스토리지를 가진 서버를 소유 하는 것이 훨씬 낳을 수도 있기 때문입니다.

저의 구현은 다음과 같은 가정을 하고 있습니다:


참고자료

이번 구현의 버전은 "간단한 것이 우아하다" 라는 진리를 따를 것입니다. ZFS 의 기본 기능을 이용해서 스냅샷을 뜨고, 저장하고 복구할 것입니다. 그리고 간단한 파이프를 이용해서 파일 시스템과 Amazon S3 간의 데이타를 이동시킬 것입니다. "스냅샷" 은 the Storage Networking Industry Association (SNIA) 에서 : "정의된 데이타의 집합으로 완벽히 사용한 복사본으로써 복사가 된 시점의 데이타의 이미지입니다. 스냅샷은 그것이 나타내고 있는 데이타의 복사 본 혹은 복제 본이 될 수 있습니다" 라고 정의 하였습니다. ZFS 의 스냅샷 기능은 매우 훌륭하고 기본적으로 제공 되는 기능이며 대부분의 파일 시스템에서 사용 가능합니다.

또한 여기서의 프로세스를 반대로 함으로써 Amazon S3 에서 ZFS 로 파일 시스템을 복구 할 수도 있습니다.

시스템 설정을 위해:

  1. 하나의 스토리지 풀을 만듭니다:

    zfs create media c0t1d0
      

  2. 미디어 스토리지 풀 내에 파일 시스템을 생성합니다l:

    zfs create media/mypictures
      

  3. 마운트포인트를 /export 로 변경합니다:

    zfs set mountpoint=/export/media/mypictures media/mypictures
      

  4. NFS 를 이용해서 공유 가능하도록 설정합니다:

    zfs set sharenfs=on media/mypictures
      

  5. 압축 기능을 사용합니다:

    zfs set compression=on media/pictures
      

  6. 사진들을 media/pictures 디렉토리로 복사 합니다. (적정한 수준의 스냅샷을 만드는데 충분하도록)

우리의 첫번째 프로세스는 스냅샷을 만들고 이 스냅샷을 백업을 위해 Amazon S3 로 보내는 것으로 구성되어 있습니다. 이 시점에서 몇가지 가정이 필요 합니다:

  • 여러분은 백업을 하려고 하는 볼륨 혹은 파일 시스템을 가지고 있어야 합니다 (위에서 생성했던 대로)
  • 스냅샷 사이즈는 Amazon S3 라이센스 혹은 여러분과 Amazon S3 의 서비스 계약에 맞게 적절해야 합니다

우리가 진행할 단계는:

  • 파일 시스템 스냅샷 생성하기
  • 스냅샷을 데이타 스트림으로 변환하기
  • 스냅샷 압축하기
  • 적절한 메타데이타와 함께 Amazon S3 에 전송하기

스냅샷을 생성해서 저장하기 위해서는:

  1. 스냅샷을 생성하기 위해 zfs snapshot 커맨드를 이용합니다. 필자는 /export/media/mypictures 디렉토리 전체를 스냅샷 했고 스냅샷을 아래와 같은 커맨드를이용해서 "20070607" 로 지었습니다:

    zfs snapshot media/mypictures@20070607
    

    스냅샷은 초기에 파일 시스템에 추가적인 공간을 차지하지 않아야 합니다. 파일이 변경될 수록 스냅샷 공간도 늘어나야 합니다. 왜냐하면 데이타의 변경이 반드시 복사가 되어야 하기 때문입니다.

  2. 상대적으로 스냅샷 자체를 데이타 스트림으로 변경하는 것은 간단합니다. send 커맨드를 이용해서 스냅샷을 파일로 전송합니다:

    zfs send media/mypictures@20070607 > ~/backups/20070607
      

  3. 우리는 또한 파이프를 통해서 압축을 할 수 있습니다. 그러므로 필자가 사용한 커맨드는 다음과 같습니다:

    zfs send media/mypictures@20070607 | gzip > ~/backups/20070607.gz
      

  4. 마지막으로 우리는 스냅샷을 Amazon S3 에 전송할 수 있습니다.

필자는 "Buckets"(Amazon S3 에 데이타를 저장할 공간) 이 이미 생성 되어 있다 고 가정하고 최종 압축된 스냅샷을 단지 bucket 에 전송하겠습니다. 정직하게 얘기해서 필자는 Curl, Perl 그리고 다양한 것을을 시도해 봤지만 서명을 생성하기 위한 적절한 라이브러리를 찾지 못했습니다. 그래서 인터넷을 여기저기 찾아 다니면서 컴파일 플래그를 변경하고 재컴파일 하기를 반복했었습니다. 그러다가 자바를 이용해서 REST 를 이용한 접근을 시도 했습니다.

Amazon S3 Library for REST in Java 라이브러리를 이용합니다. 이 라이브러리는 Amazon S3 의 모든 작업을 수행 할 수 있는 클래스들을 제공해주고 사용하기 또한 간편합니다. 필자는 아래의 "간단한" 프로그램을 만들어서 키와 업로드를 위해 uuencode 를 이용해 인코딩 된 스냅샷의 위치를 전달 했습니다. (이 프로그램은 Amazon S3 의 샘플에 기반하고 있습니다.)

public static void main(String args[]) throws Exception {
        if (awsAccessKeyId.startsWith("<INSERT")) {
            System.err.println("Please examine S3Driver.java and update it with your credentials");
            System.exit(-1);
        }
        
        if (args.length < 2) {
            System.err.println("Send snapshot key and location with program: SendSnapshot key path");
            System.exit(-1);
        }
        
        AWSAuthConnection conn =
                new AWSAuthConnection(awsAccessKeyId, awsSecretAccessKey);
        
        System.out.println("----- putting object -----");
        S3Object object = new S3Object("this is a test".getBytes(), null);
        
        
        try {
            File file = new File(args[1]);
            InputStream is = new FileInputStream(file);
            long length = file.length();
            if (length > Integer.MAX_VALUE) {
                System.err.println("File too large: "+args[1]);
                System.exit(-1);
            }
            
            byte[] bytes = new byte[(int)length];
            int offset = 0;
            int numRead = 0;
            while (offset < bytes.length
                    && (numRead=is.read(bytes, offset, bytes.length-offset)) >= 0) {
                offset += numRead;
            }
            
            // Ensure all the bytes have been read in
            if (offset < bytes.length) {
                throw new IOException("Could not completely read file "+args[1]);
            }
            
            // Close the input stream and return bytes
            is.close();
            
            object = new S3Object(bytes, null);
        } catch (IOException ioe) {
            System.err.println("Error reading file: "+args[1]);
            System.exit(-1);
        }
        
        Map headers = new TreeMap();
        headers.put("Content-Type", Arrays.asList(new String[] { "text/plain" }));
        System.out.println(
                conn.put(bucketName, args[0], object, headers).connection.getResponseMessage()
                );
        
        System.out.println("----- listing bucket -----");
        System.out.println(conn.listBucket(bucketName, null, null, null, null).entries);
        
    }
} 

스냅샷을 전송하고 완료 했습니다!

여러분이 데이타를 잃어 버렸거나 여러분의 역사 중에 특정 시간대로 돌아가기 위해 스냅샷을 검색하고 복구 하는 과정은 역시 상대적으로 간단합니다. 간단히 위의 단계를 역순으로 수행하기만 하면 됩니다. 아래의 자바 코드를 살펴 보시기 바랍니다 (Amazon S3 Java REST libraries).

public static void main(String args[]) throws Exception {
        if (awsAccessKeyId.startsWith("<INSERT")) {
            System.err.println("Please examine S3Driver.java and update it with your credentials");
            System.exit(-1);
        }

        if (args.length < 2) {
            System.err.println("Get snapshot and write data needs 2 parameters: GetSnapshot key path");
            System.exit(-1);
        }        
        
        AWSAuthConnection conn =
            new AWSAuthConnection(awsAccessKeyId, awsSecretAccessKey);

        System.out.println("----- getting object -----");
        byte[] bytes = conn.get(bucketName, args[0], null).object.data;
        
        try {
            FileOutputStream fos = new FileOutputStream(args[1]);
            fos.write(bytes);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 

gzip 으로 압축된 스냅샷을 가져 오면 압축을 풀기 위해 다음의 커맨드를 이용합니다:

# gunzip 20070607.gz

이제 여러분은 여러분의 스냅샷으로 무엇을 할지 결정해야 합니다. 필자는 현재의 mypictures 풀을 이동시키고 기존의 스냅샷을 복구 해서 "시간 여행" 을 하기로 결정하였습니다. 아래의 커맨드를 이용하였습니다:

# zfs rename media/mypictures media/mypictures.old
# zfs receive media/mypictures < 20070607

이게 끝입니다! /export/media/mypictures 는 2007년 6월 7일에 스냅샷 했었던 사진들로 보국 되었습니다!

Amazon S3 의 비용 청구는 아주 간단합니다. 필자는 크레딧 카드 정보를 미리 입력하였고 달마다 청구서를 받고 있습니다. 이 글을 위해 사용한 전체 스토리지의 비용 청구서의 복사본입니다.

Greetings from Amazon Web Services,

This e-mail confirms that your latest billing statement is available on the AWS 
web site. Your account will be charged the following:

Total: $0.09

Please see the Account Activity area of the AWS web site for detailed account 
information:

http://aws-portal.amazon.com/gp/aws/developer/account/index.html?action=activity
-summary

Thank you for your continuing interest in Amazon Web Services.

Sincerely,

Amazon Web Services

This message was produced and distributed by Amazon Web Services LLC, 1200 12th 
Avenue South, Seattle, Washington 98144-2734

구현과 관련된 이슈들

아래의 이슈들에 대한 반박 혹은 피드백은 언제든지 환영 합니다. 혹은 추가해야할 사항이 있으면 알려 주시기 바랍니다.
  • Amazon S3 사이즈 제한:"Terms of Use" 에서 Amazon S3 는 다음과 같이 기술하고 있습니다: "You may not, however, store 'objects' (as described in the user documentation) that contain more than 5Gb of data, or own more than 100 'buckets' (as described in the user documentation) at any one time." 결과적으로 우리들은 스냅샷을 적절하게 분할해서 Amazon S3 의 규정을 준수해야 합니다. 혹은 Amazon S3 와 협력해서 다른 방법을 찾을 수도 있을 것입니다. 이러한 제한은 HTTPS 프로토콜 자체의 길이 제약 때문에 완벽히 합리적이긴 합니다.
  • 암호화: 써드 파티 스토리지 사이트에 전송되기 전에 데이타는 반드시 암호화 되어야 합니다.
  • Cron Job: 시간별 스냅샷은 자동으로 만들어질 수도 있습니다.
  • 비-자바: 스크립트로 모든 과정을 진행할 수 있으면 매우 훌륭할 것입니다. 그러나 키 생성 부분에서 필자는 포기 했고 필자의 전문인 자바 코드를 사용했습니다.


이 글의 영문 원본은
Storage Utilities in Practice: ZFS Snapshot to Amazon S3
에서 보실 수 있습니다.

"개발자코너" 카테고리의 다른 글

2008/04/17 09:33 2008/04/17 09:33

TRACKBACK :: http://blog.sdnkorea.com/blog/trackback/545

  1. cecildesk의 생각

    Tracked from cecildesk's me2DAY  삭제

    스토리지 유틸리티 실습: ZFS 스냅샷과 Amazon S3 연동

    2008/10/20 21:21

댓글을 달아 주세요

[로그인][오픈아이디란?]

◀ Prev 1  ... 107 108 109 110 111 112 113 114 115  ... 624  Next ▶