개발자의 길

LevelDB...? 본문

1. 개발자

LevelDB...?

자르르 2011. 9. 20. 13:27


LevelDB

Fast and Lightweight Key/Value Database

 

kth 공통플랫폼팀 이호철 (mystery@paran.com)

 

 

 LevelDB Google(Mapreduce, BigTable을 만든)Open Source Project로 만들고 있는 빠르고 가벼운 Key-Value 기반의 Storage Library 이다.

LevelDB - Fast and Lightweight Key/Value Database From the Authors of MapReduce and BigTable

 

Key/Value 기반의 Storage Library는 여러 가지가 있다. Google BigTable이나 Amazon Dynamo(SimpleDB), 그리고, 예전 Unix Like 시스템에서 Application 개발 시 많이 사용하던 BerkelyDB, 그리고, UnixDBM, DBM 라이브러리를 새로 구현한 Tokyo Cabinet 등이 있다.

LevelDB의 내용을 보면 BerkelyDB를 잘 발전 시킨 모양처럼 보인다. LevelDB는 대용량 서버용으로 개발되기 보다는 단말의 혹은 브라우저의 Storage Library 용도로 개발 되어 지는 느낌이다. , Embeded Database 이다.

 

요즘 어플리케이션 개발에 많이 사용되는 Embedded Database SQLite 이다. Public Domain Software SQLite iOS/Android 플랫폼에서도 많이 쓰이고 있으며, 웹 어플리케이션을 개발하기 위한 HTML5스펙인 Web SQL Database 의 구현용도로 이미 많은 브라우저가 사용하고 있다. 하지만, Web SQL Database는 이런 저런 이슈들때문에 HTML5 표준에서는 삭제되고 Tech Note 형식으로만 남게되었으며, 그 대안으로 키/밸류 기반의 IndexedDB 가 떠오르고 있다.

Indexed Database

향후 HTML5에서 Web Storage의 표준 Spec이 될 것이라 예상이 된다.

Indexed Database의 특징

o SQL 언어와 무관하며 단순한 저장구조(Key-Value Storage)

o 자바스크립트 객체 단위의 데이터 저장이 용이, 그 객체를 대상으로 인덱스 지정 가능

- Object 저장 가능

- 인덱스를 이용하여 보다 빠르게 검색 수행 : Cursor 이용

, 모바일 환경에서의 Local DB는 관계형 DB보다는 Indexed Database와 같은 객체 기반의

비관계형 DB가 더 잘 어울린다.

o 브라우저 지원

- 현재는 Firefox, Chrome 만 지원하고 있지만, IE10/Safari6.0 부터 지원을 시작으로 확대될 예정

- Firefox, IE9 브라우저에서는 Web SQL Database를 지원하지 않음

 o Web SQL Database Indexed Database 참고

-      Web SQL Database

var db = window.openDatabase("TestDB", "1",

                             "My Test database",

                             1024);

db.readTransaction(function(tx) {

  // Enumerate the entire table.

  tx.executeSql("SELECT nickname,phoneno FROM myfriends", function(tx, results) {

    var rows = results.rows;

    for (var index = 0; index < rows.length; index++) {

      var item = rows.item(index);

      // alert;(item.nickname);

    }

  });

});

    

 

 

 

 

 

 

 

  

-     

var request = window.indexedDB.open("TestDB",

                                    "My Test database");

request.onsuccess = function(event) {

  // Enumerate the entire object store.

  request = event.result.objectStore("myfriends").openCursor();

  request.onsuccess = function(event) {

    var cursor = event.result;

    // If cursor is null then we've completed the enumeration.

    if (!cursor) {

      return;

    }

    // alert;(cursor.value.nickname);

    cursor.continue();

  };

Indexed Database

 

 

 

 

 

 

 

 

 

 

 

LevelDB 주요 특징

LevelDB는 앞선 Indexed Database HTML5 API의 기반이 될 것이다. 정식 Spec에 앞서 Chrome브라우저에 이를 지원 할 것이라고 예고했다.

Upcoming versions of the Chrome browser include an implementation of the IndexedDB HTML5 API that is built on top of LevelDB.

 

 o C++ 개발

 o 데이터가 구글의 Snappy 압축방식으로 압축되어 저장됨

   - Snappy의 특징은 압축률은 아주 높지 않지만 속도가 빠름

   - 초당 250M 압축, 초당 500M 압축해제

    Snappy compresses at about 250 MB/sec or more and decompresses at about 500 MB/sec or more.

 o Key Value Byte Arrays 타입 (가변사이즈 Key, 효과적인 메모리 사용)

 o Data Key로 정렬해서 저장

 o Froward / Backward  Iteration 지원

leveldb::Iterator* it = db->NewIterator(leveldb::ReadOptions());

for (it->SeekToFirst(); it->Valid(); it->Next()) {

cout << it->key().ToString() << ": "  << it->value().ToString() << endl;

}

assert(it->status().ok());  // Check for any errors found during the scan

delete it;

 

 

 

 

 

 

 

o Put(key, value), Get(Key), Delete(Key) 함수

 o 여러 명령을 한번의 batch로 만들어 처리 가능

   - Batch 쓰기는 실질적으로 성능을 향상시키는데 도움이 됨

 o Snapshot을 제공

 o Checksums

   - 데이터와 함께 Checksum을 저장

   - 데이터베이스가 손상된 경우, leveldb::RepairDB 함수를 통해 데이터 복구

 

LevelDB 제한

 향후 개선은 되겠지만, LevelDB는 구조상 아래와 같은 이슈들이 존재한다.

o SQL Database가 아니기 때문에, 관계 데이터 모델이 없음, SQL Query또한 제공되지 않음

 o Single Processing : 하나의 프로세스만이 한번에 특정 데이터베이스에 접근 가능

 o Scalability Issue (확장성 이슈)

-      저장된 데이터 파일은 하나의 디렉토리 내에 존재한다. 파일시스템에 따라 문제의 원인이 될 소지가 있음.

 

LevelDB Interface

 현재까지 구현되어 제공되어 지는 Programming Language Interface는 아래와 같다. C++로 개발되어져 있기 때문에 다양한 다른 언어로 Wrapping 가능하리라 본다.

o Java

-      LevelDB JNI (https://github.com/fusesource/leveldbjni)

o Perl

-      Tie::LevelDB (https://metacpan.org/module/SARFY/Tie-LevelDB-0.03/lib/Tie/LevelDB.pm)

o Python

-      py-leveldb (http://code.google.com/p/py-leveldb/)

 

LevelDB 성능

Google이 테스트한 성능평가로 전반적으로 뛰어난 성능을 보이지만, 큰 데이터를 쓰는 부분에 대해서는 오히려 성능 저하

o 비교대상

-      LevelDB (revision39)

-      SQLite3 (version 3.7.6.3)

-      Kyoto Cabinet’ (Version 1.2.67) TreeDB

o 대상 데이터

-      Key : 16 bytes

-      Value : 100 bytes

o 일반적인 상황 테스트 결과

-      전반적으로 뛰어난 성능

이미지를 클릭하시면 원본크기로 보실수 있습니다.


-      LevelDB Random Reads 항목을 제외한 나머지 부분에서 다른 2개의 성능을 능가

-      Random Reads 성능이 Kyoto TreeDB가 좋은 이유는 RAM에 캐시되어 있기 때문

o 큰 값(Large Value)에 대한 Write 성능

-      100,000 byte values 쓰기 테스트

이미지를 클릭하시면 원본크기로 보실수 있습니다.


-      큰 데이터 값을 Write 하는 성능시험은 LevelDB가 매우낮음

-      LevelDB가 최소 2회 이상 Key/Value Write하기 때문임(첫번째는 Transaction Log, 두번째는 압축하는 동안 소팅하기 위해)

 

o 기타 Synchronous Writes, Batch Writes 성능시험에서는 LevelDB가 모두 타DB보다 탁월.

                                                                                 

LevelDB 향후

LevelDB SQLite를 대체 할 것이며, HTML5 Web SQL Database를 대신하여 표준으로 자리 잡을 Indexed Database API의 기반이 될 것이다.

Open Source Project로 진행 중 이며, 아직 더 보완할 사항은 많겠지만, 단말에서의 Light dbms 용도로는 현재로도 충분하리라 본다. 미래를 위해 Web Application 들은 Indexed Database 기반으로도 준비가 되어야 할 것이다.

 

Reference

http://highscalability.com/blog/2011/8/10/leveldb-fast-and-lightweight-keyvalue-database-from-the-auth.html

-       LevelDB - Fast and Lightweight Key/Value Database From the Authors of MapReduce and BigTable

http://www.readwriteweb.com/hack/2011/07/google-open-sources-nosql-data.php

-       Google Open-Sources NoSQL Database Called LevelDB

http://code.google.com/p/leveldb/

-       LevelDB Project

http://code.google.com/p/indexeddb/

-       IndexedDB

http://code.google.com/p/snappy/

-       Google Snappy 압축


'1. 개발자' 카테고리의 다른 글

이클립스 implementors 파일  (0) 2014.10.30
facebook oauth client 하는 방식 - 단순  (0) 2012.07.03
웹 페이지 속도 향상  (4) 2010.08.25
soap 통신이란?  (0) 2010.02.26
ping 테스트?  (0) 2010.02.24


이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments