본문 바로가기
  • AI (Artificial Intelligence)
Legacy Skills/OpenStack

Object Storage – OpenStack Swift

by 로샤스 2015. 11. 2.

OpenStack을 글로만 배웠는지 아니면 책을 쓸려고 몇번해본건지.. 책쓰는 사람들이 인터넷에 OpenStack에 대해 왈가왈부 하면 정말 어이가 없어서 말이 안나온다..

4년 전부터 OpenStack으로 이것저것 해보면서 제대로된 한글 문서하나 없다고?! 화를 냈을까? 아니다.. 다 기업 비밀이다. 그 당시는 너도나도 다 한다고 시작단계여서 알려주면 기업비밀을 노출하는 것과 같았다. 때마침 이러한 사정을 잘알고.. 첫 줄에 쓴거처럼 책을 팔려고 쓴 사람들이 뭘 알고 쓰는건지 전혀 이해할 수 없는 느낌의 전달들을 보면서 영어가 대수구나 해석만 잘하고 인용만 잘하면 책을쓰는구나 하는 생각들을 한다.

사실 업무도중에 글을 막써서 그리고 열좀 받아서.. 제대로 글을 쓰고 있는지 모르겠다.

아무튼 오늘 여기 기업의 블로그를보고 와.. 다르네.. 벌써 저렇게 정리해서 뭔가를 다했겠네 이런 생각들이 든다.. 이런게 정리다. 잘봐라 책쟁이들..

 

이번에는 Object Storage 중에 Open Source Project인 OpenStack의 Object Storage인 OpenStack Swift에 대해 알아보도록 하겠습니다.

최근 들어 분산 구조의 Object 데이터의 저장 스토리지 체계로서 가장 많이 사용되는 Open Source Project가 바로 OpenStack Swift죠. 이번 포스트에서 Swift에 대한 개요 및 아키텍처, Core Component, 주요 기능 등을 알아보도록 하겠습니다.

OpenStack Swift 개요

앞서 이야기 했지만 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 API

Swift는 OpenStack의 통합 Console을 이용해 기본적인 Object 저장 및 다운로드 등의 기능을 이용할 수 있습니다. 하지만 OpneStack이 없는 상태로 Swift만 단독으로 사용하여 사용자가 원하는 기능을 구현하거나 또는 별도의 UI를 만들기 위해서는 Swift API를 이용해야 합니다. Swift는 API를 통해 Object를 관리할 수 있도록 다양한 기능을 제공하며 개발자의 편의를 위해 다양한 형태의 API를 제공합니다.

API 개요 및 아키텍처

Swift API는 기본적으로 REST API입니다. 이 REST API를 이용해 개발자의 편의를 위한 다양한 Language Specific 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를 제대로 사용하려면 기본적으로 API를 잘 사용할 수 있어야 합니다. OpenStack과 함께 사용하지 않으면 별도의 UI를 만들어야 하고 이를 관리도 해야 하는데 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도 동적으로 변하는 것이 아니라 스토리지를 구성할 때 미리 만들어 놓고 사용하는 정보입니다.

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은 어떤 과정을 통해 실제 데이터를 저장하거나 데이터를 가져올 수 있게 되는 것일까요? Ring은 Request API가 호출되면 해당 Request의 정보를 Hash > 변환 > 시프트연산을 거쳐 만들어진 Partition 번호 값을 이용해 API가 원하는 개체에 대한 작업을 수행할 수 있도록 동작합니다.

Ring의 동작 단계는 크게 “사용자 요청” > “저장 디바이스의 탐색” > “파일 저장”으로 이루어집니다.

사용자의 요청단계에서는 전달된 요청을 통해 어떤 개체에 대한 요청인지를 파악합니다. 그리고 각각의 Path 정보에 따라 각각의 Controller에 전달합니다.

저장 디바이스 탐색의 단계에서는 요청 정보를 MD5 Hash로 만들고 난 다음, Hash 값을 숫자로 변환한 후 Shift 연산을 통해 파티션 크기에 맞게 Modulation을 하여 일정 범위 내의 값을 생성합니다. 생성된 값은 파티션의 번호입니다. 이 번호를 이용해 Ring을 조회합니다. 예를 들어 31685번 파티션이 저장될 위치를 Ring을 통해 찾는 것입니다.

마지막으로 파일을 저장하는 단계에서 Ring을 통해 찾은 디바이스에 파일을 저장하게 되는데 저장 시에는 원본 파일과 함께 복제 규칙에 따라 디바이스가 중복되지 않고 Zone이 분리되는 기본적인 규칙에 따라 복사본도 함께 저장됩니다.

Account Server

다음은 사용자 계정 관리 및 계정별 컨테이너의 정보를 관리하는 기능을 가진 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 서비스를 제공할 수 있게 되는 것입니다.

마치며...

클라우드 솔루션에서 관리 기능을 빼고 나면 가장 중요한 기능 중 하나가 스토리지입니다. 가상화된 스토리지가 적절한 성능을 내주어야 하고 또 데이터를 저장하는 공간이니 안정성도 높아야 합니다. 안정성을 높이면서도 디스크 공간을 최대한 활용하여 낭비를 줄이기도 해야 합니다.

Object Storage가 비록 빠른 성능을 요구하는 경우에 쓰이기에는 부적절하지만 안정적이면서도 대용량의 저장공간이 필요할 때 사용하기 적절한 스토리지입니다. 이번 포스트가 OpenStack Swift에 대한 이해를 돕는데 조금이나마 도움이 되었길 바라면서 다음을 기약하겠습니다. 감사합니다

 

 

 

 

 

 

 

 

 

 

 

출처 : http://blog.bizmerce.com/?p=2171

좋은자료 공개해주셔서 감사합니다.

 

 

 

 

 

 

 

 

 

댓글