ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • OpenStack Swift
    서버 2017. 1. 26. 17:55

    OpenStack Swift는 Object Storage 중 하나이며 Open Source Project입니다. 분산 구조의 Object 데이터의 저장 스토리지 체계로서 가장 많이 사용되는 Open Source Project가 바로 OpenStack Swift입니다. Object Storage가 비록 빠른 성능을 요구하는 경우에 쓰이기에는 부적절하지만 안정적이면서도 대용량의 저장공간이 필요할 때 사용하기 적절한 스토리지입니다. 

    개요

    OpenStack Swift는 OpenStack의 Object Storage 서비스를 위한 구성요소로 개발되어 최근 다양한 클라우드 서비스의 Object Storage 인프라로 가장 많이 사용되는 Open Source Project입니다. OpenStack Swift는 동영상, 이미지, 디스크 이미지 등의 대용량, 비정형 데이터를 저장하기에 적합한 스토리지로 데이터를 파일과 메타데이터로 저장하며 각각의 파일을 복제 방식을 이용해 분산 관리하고 계정마다 저장공간을 분리하지 않고 하나로 사용하여 공간을 최대한으로 활용하는 분산형 Object Storage입니다. Object Storage는 편리한 확장성을 제공하지만 Block Storage, File Storage에 비해서 성능이 떨어져 변경이 빈번한 파일에 부적합하며 비정형/대용량 데이터 관리에 적합니다. 파일의 관리는 Account 별로 관리되는 Container 내에 Object로 관리되며 파일 관리의 편리성을 위해 Pseudo Folder 기능도 제공합니다.

    Swift 장점

    • 동영상, 이미지, 디스크 이미지 등의 대용량, 비정형 데이터를 저장하기에 적합
    • 각각 Object 들은 고유한 URL을 갖고 API로 제어(외부 어플리케이션, 웹 등에서 동시에 접근 가능)
    • 멀티 테넌트로 구현이 가능하며 저장 공간에 제약이 없음(계정마다 저장공간을 할당받는 것이 아닌 모든 공간을 같이 사용)
    • 페타규모의 클러스터로 확장 가능하며 확장시에도 downtime없이 간단하게 확장 가능
    • 복제본은 격리된 환경(zone)으로 관리하여 안전하게 보관
    • 비공유 구조(shared-nothing)으로 단일 장애점이 없기 때문에 가용성이 높음
    • open source를 사용하여 적은 비용에 구축 가능

    Swift API

    Swift는 OpenStack의 통합 Console을 이용해 기본적인 Object 저장 및 다운로드 등의 기능을 이용할 수 있습니다. 하지만 OpneStack이 없는 상태로 Swift만 단독으로 사용하여 사용자가 원하는 기능을 구현하거나 또는 별도의 UI를 만들기 위해서는 Swift API를 이용해야 합니다. Swift는 API를 통해 Object를 관리할 수 있도록 다양한 기능을 제공하며 개발자의 편의를 위해 다양한 형태의 API를 제공합니다. Swift API는 기본적으로 REST API입니다. 이 REST API를 이용해 개발자의 편의를 위해 동일한 기능을 Java, PHP, C 등을 사용해 구현이 가능하도록 하는 것입니다. 또 OpenStack은 Python을 이용해 만들어진 프로젝트로 Python을 이용하면 더 많은 기능을 이용할 수도 있습니다. 그리고 Swift는 CLI도 별도로 제공하기 때문에 개발자의 환경 또는 개발 기능의 목적에 따라 다양한 형태의 API를 사용할 수 있습니다. 

    REST API 등을 사용하여 Object를 관리하기 위해서는 먼저 사용자 인증을 받아야 합니다. 일반적으로 OpenStack의 KeyStone Auth를 사용해 Token을 받습니다. 그리고 이 Token을 이용해 Object Storage의 데이터를 관리하게 됩니다. API 요청을 받아들이고 이를 처리하는 역할은 Proxy Server가 담당하며 요청의 종류에 따라 실제 데이터의 처리를 어디서 수행하게 될지를 결정합니다.

    API 기능

     

    Swift는 OpenStack의 API를 기본적으로 사용합니다. OpenStack API는 각각의 구성요소에 따라 서로 다른 API를 제공하는데 Swift 사용을 위해서는 크게 2가지, 즉 Identity API와 Object Storage API를 사용하게 됩니다. 제공되는 기능은 Account 및 User 관리 기능 및 Token 처리, Account Server의 데이터 관리, Container Server의 데이터 관리, 그리고 데이터의 본체인 Object에 대한 관리 기능을 제공합니다. 기본적으로 RESTful API이며 API를 적절하게 잘 사용하면 단순한 데이터 관리 기능 이외에 ACL, Large Object, Versioning 등의 고급 기능도 사용할 수 있습니다.

     

    OpenStack Swift Architecture

    OpenStack Swift는 인터넷을 기반으로 서비스를 제공하는 객체 기반 스토리지입니다. 따라서 HTTP를 통한 요청을 처리해야 하고 이에 따르는 적절한 처리를 수행할 수 있어야 합니다. 

    서비스 모델로서의 아키텍처를 살펴보면 사용자의 요청은 로드밸런서를 통해 Proxy Server에 전달됩니다. 이 때 원활한 요청의 처리를 위해 여러 대의 Proxy Server를 둘 수 있습니다. 요청이 오면 해당 요청이 Account에 대한 요청인지, 또는 Container, Object에 대한 요청인지를 확인하고 이에 대한 데이터가 어디에 있는지 확인하기 위해 Ring이라는 일종의 주소록을 참조해서 주소값을 얻어와서 데이터를 처리하게 됩니다. Proxy Server의 증설은 요청 처리 용량의 증설을 의미하고 각각의 Zone 내에 있는 서버의 증설은 Storage 용량의 증설을 의미합니다.

    Proxy Server

    키텍처의 주요 구성요소에 대해 하나씩 알아보도록 하겠습니다. 먼저 사용자의 요청에 따라 알맞은 서버에 연결하여 서비스를 제공하는 역할을 담당하는 Proxy Server입니다. Proxy Server는 Swift의 모든 요청을 Ring을 참고하여 적합한 서버에 처리를 분산하는 역할을 합니다. Proxy Server는 요청을 처리하는 서버로의 역할을 위해 인증관리, 상태 점검, 속도 향상을 위한 캐쉬 관리, 요청관리 등을 위한 다양한 데몬과 미들웨어를 가지고 있습니다. 그리고 분산 서버들의 정보를 가지고 있는 Ring이 있는데 이 Ring을 이용해 실제 요청을 처리할 서버와 스토리지 디바이스를 찾게 됩니다.

    Ring의 구조

    Ring은 데이터가 저장될 논리적 위치와 물리적인 저장 위치 간의 매핑을 제공하는 정보로서 전화번호부 또는 주소록과 비슷한 역할을 합니다. 전화번호부가 시시각각 변하지 않는 책이듯, Ring도 동적으로 변하는 것이 아니라 스토리지를 구성할 때 미리 만들어 놓고 사용하는 정보입니다.

     

    Ring은 Proxy Server 및 각각의 개체에 대한 Ring이 별도로 존재하며 Account에 대한 처리는 Proxy Server를 거쳐 Account Ring이 최종적인 처리를 담당하게 되며 각각의 Ring은 관리자가 직접 생성 작업을 수행해 두어야 합니다. Ring은 Account, Container, Object별로 존재하지만 Ring의 데이터 구조는 동일합니다. Account, Container는 Database로 정보를 관리하지만 일종의 파일구조이기 때문에 Object와 별도의 구성을 할 필요는 없는거죠. Ring은 크게 Device 목록과 Partition 목록, 그리고 모듈로 연산을 위한 Partition Shift 값으로 이루어집니다.

    Ring의 동작

     Ring은 Request API가 호출되면 해당 Request의 정보를 Hash > 변환 > 시프트연산을 거쳐 만들어진 Partition 번호 값을 이용해 API가 원하는 개체에 대한 작업을 수행할 수 있도록 동작합니다.

    Ring의 동작 단계는 크게 “사용자 요청” > “저장 디바이스의 탐색” > “파일 저장”으로 이루어집니다. 사용자의 요청단계에서는 전달된 요청을 통해 어떤 개체에 대한 요청인지를 파악합니다. 그리고 각각의 Path 정보에 따라 각각의 Controller에 전달합니다. 저장 디바이스 탐색의 단계에서는 요청 정보를 MD5 Hash로 만들고 난 다음, Hash 값을 숫자로 변환한 후 Shift 연산을 통해 파티션 크기에 맞게 Modulation을 하여 일정 범위 내의 값을 생성합니다. 생성된 값은 파티션의 번호입니다. 이 번호를 이용해 Ring을 조회합니다. 예를 들어 31685번 파티션이 저장될 위치를 Ring을 통해 찾는 것입니다. 마지막으로 파일을 저장하는 단계에서 Ring을 통해 찾은 디바이스에 파일을 저장하게 되는데 저장 시에는 원본 파일과 함께 복제 규칙에 따라 디바이스가 중복되지 않고 Zone이 분리되는 기본적인 규칙에 따라 복사본도 함께 저장됩니다.

     

     

    Account Server

    Account Server도 계정 정보 및 사용자 정보를 관리하고 각각의 계정별 컨테이너 정보를 관리하기 위해 다양한 데몬을 가지고 있습니다. 또한 계정정보 및 계정의 컨테이너 기록을 위해 별도의 저장공간으로 Database를 포함하고 있습니다.

    Container Server

    Container Server는 사용자 계정의 컨테이너를 관리하는 서버로 계정 하의 컨테이너들을 관리하며 컨테이너가 가지고 있는 Object들의 정보를 관리하는 역할을 합니다. 다른 서버들과 마찬가지로 서비스를 제공하기 위해 다양한 데몬을 포함하고 있으며 컨테이너 정보 및 컨테이너의 Object를 기록하고 관리하기 위해 별도의 Container DB를 가지고 있습니다.

     

    Object Server

    실제 데이터를 저장하고 있는 Object Server 입니다. Object Server는 실질적인 데이터를 Object로 관리/저장하고 이를 조회할 수 있는 기능을 제공합니다. 역시 서비스를 제공하기 위한 데몬과 실질적인 Object로 이루어져 있는 것을 볼 수 있습니다.

    기타 데몬

    마지막으로 앞서 설명한 Core Component에서 실행되는 주요한 데몬들에 대해 알아볼 수 있도록 하겠습니다.

     

    각각의 서버에는 다양한 데몬들이 실행되는데 그 중 가장 대표적인 데몬이 Replicator입니다. 말 그대로 복제를 담당하는 데몬입니다. Object의 유실을 방지하기 위해 Swift는 기본적으로 3개의 Replica를 만듭니다. 이 복제본은 각각의 Zone과 서로 다른 Device에 나누어 저장되며 데이터가 잘못 되었을 경우 이 Replicator에 의해 복구되는 프로세스가 실행됩니다. 그 외에 여러가지 복제 및 복구에 관련된 일을 수행하는 데몬이 바로 Replicator입니다.

     

    두번째로 Updater라는 데몬입니다. 이 데몬은 Object의 Update가 정상적으로 이루어질 수 있도록 도와주는 역할을 합니다. 특히 Object의 변경이 High Load 상태로 인해 지연되는 경우 이를 지속적으로 수행할 수 있도록 해주고 더불어 Object 변경에 따른 정보의 변경 처리도 담당하게 됩니다.

     

    세번째 데몬은 Auditor입니다. Object, Container, Account들의 무결정을 검사하는 데몬으로 이상이 발생하면 이상이 발생한 파일을 격리하고 Replicator를 이용해 복제본을 사용하여 파일을 대체하는 등의 일을 수행합니다.

     

    네번째 데몬은 Object-Expirer로서 Object가 일정한 시간 내에 삭제되어야 하는 등의 생명주기 관리 설정이 되어 있는 경우 이를 수행하기 위한 데몬입니다. 이 외에도 Swift는 많은 데몬과 미들웨어를 제공하고 있습니다.

    OpenStack Swift 기능

    OpenStack Swift는 API 또는 CLI를 이용해 Object Storage의 다양한 기능을 사용할 수 있습니다. 해당 기능을 WEB UI로 구현하여 다양한 서비스도 제공할 수 있습니다.

     

    첫번째는 Container, Object에 대한 생성 및 관리, 그리고 접근 관리입니다. 특히 접근관리를 통해 컨테이너 수준 및 Object 수준으로 특정 사용자에게 접근 권한을 할당할 수 있습니다. 그리고 Object에 대한 생명주기 관리를 통해 Object를 자동으로 삭제하는 등의 작업을 할 수 있습니다.

     

    두번째는 Object Versioning입니다. 파일의 현재 버전과 이전 버전을 관리하고 복구하며 삭제하는 등의 작업을 할 수 있습니다.

     

    세번째는 Object에 대한 다양한 고급 기능 지원입니다. 긴 리스트에 대해 페이징을 지원하고 가상의 계층형 폴더를 지원하며 5GB 이상의 큰 Object를 저장할 수 있도록 하는 기능, 그리고 여러 파일을 한번에 삭제하고, 자동 압축 풀림 아카이브 파일 설정, 그리고 마지막으로 컨테이너에 있는 파일을 이용해 정적인 웹 사이트 서비스를 할 수 있도록 하는 등 거의 Amazon S3가 제공하는 대부분의 기능이 포함되어 있습니다. 충분히 기능을 연구하고 보강하면 퍼블릭 수준의 Object Storage 서비스를 제공할 수 있게 되는 것입니다.

    댓글