일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- JavaScript
- CentOS6
- Java
- jvm
- React
- memcached
- java8
- swagger
- java9
- SpringBoot
- Next.js 14
- generate entity
- 초기 구축
- generate pojos
- NextJS
- header setting
- 초기 세팅
- jpa entity자동
- dto valid
- 헤더 설정
- spring boot
- MySQL
- docker 설치
- 리눅스
- ollama langflow
- spring
- custom valid
- JPA
- 도커
- docker
- Today
- Total
개발자의 길
LevelDB...? 본문
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, 그리고, Unix의 DBM, 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(); }; |
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
- 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 |
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.