.NET 을 위한 Key-Value NoSQL DB – RaptorDB

옛날 웹 어플리케이션을 만들었을때, 기존 세션에서 좀 더 확실성있게 만들고, 확장성이 용이 (Mono 지원 등)한 세션 시스템을 만들고자 했었다.

지랄을 하세요 필자야. 그냥 Nancy가 ASP.NET 자체 세션 지원 안한다고 얘기를 해라.

여튼, NoSQL 세계에 뛰어들고자 닷넷 개발자도 고심 안할 일은 없잖아.

그래서 준비했다.

NoSQL 은 왜이렇게 자바가 많이 활성화됐어? 씌봥!

맞다. 전 세계적으로 닷넷반 자바반 이렇게들 얘기를 하지만 (한국은 시발 독과점에 존나 관대해) 자바가 많이 활성화된건 부정할 수 없는 사실이다. 무엇보다도 크로스 플랫폼, 독립적인 운영 환경이라는 장점이 엄청나다. 그렇다보니 NoSQL 에서 많은 환경을 부여하는게 자바 종특인건 어쩔 수 없다.

그렇다고 닷넷 개발자들이여 기죽지 마라.

NoSQL 에서 Document 기반 DB를 이룩해준 언어가 .NET 이다. MongoDB가 그 대표적인 예인데, MongoDB의 경우, 당연히 다른 언어도 지원하는데, 닷넷 언어도 썼다. 용도는 정확히 더 알아봐야겠지만, 위키피디아에 MongoDB 는 C 언어와 .NET 으로 만들었다.

당연히 Core 부분은 C가 담당했을 것이다. 그리고 클라이언트 등은 .NET으로 해도 되니까. (굳이 없어도 되지만..)

그렇다. 그게 다다. 자바 진영은 하둡부터 시작해 (하둡은 DB가 아니지만) 카산드라와 HBase 도 있다. 그밖에도 더 있지만 그건 패스. 미국의 인터넷 전문 사이트인 페북이나 넷플릭스 등도 카산드라를 쓴다.

RDBMS의 대안은 아닌거 안다. 모른다면 그렇게 알아야 한다. NoSQL은 RDBMS의 단점을 해결했지만 장점을 수용할 수 있는 구조는 아니니까.

자. 이제 본론으로 들어가보자.

RaptorDB 가 있다. 마소 종속의 닷넷에서 벗어나고픈 나같은 사람은 검색하면 나온다.

http://www.codeproject.com/Articles/316816/RaptorDB-The-Key-Value-Store-V2

순수 닷넷으로 만든 자체 정렬 알고리즘으로 만든 Key-Value 기반 내장형 DB다. 임베디드라고. 니 앱에 붙여먹을 수 있다는 얘기다.

이걸로 세션 열나게 돌려봤지만, 꽤 좋은 성과를 줬다. 내장에다가 순수 닷넷 치고 뻑나가거나, 충돌나거나 그런 일은 없었고, 그렇다고 뻑나갔다 해도 자체 리빌드 기능이 알아서 다시 정상으로 돌아가게 해준다.

이녀석의 특징을 알려주겠다.

  • 존나 빠른 성능
  • ~50kb 의 가벼운 라이브러리 크기.
  • 존속성 따위 없다.
  • 읽고 쓰기에 멀티 쓰레드 지원.
  • 데이터 페이지가 존나 잘 나눠져 있다, 그래서 필요에 의해서, 또는 니가 원하면 메모리 확보도 해준다.
  • 뻑나갔을 경우 시작시 인덱스 복구를 해준다.
  • 문자열 키는 UTF8 를 지원하며 별도의 설정값이 없다면 60 바이트 지원 (최대값 255 문자).
  • RaptorDBString 클래스로 더 긴 문자열의 키를 생성해준다.
  • 중복 키는 빠른 성능과 접근성을 위하여 WAH Bitmap Index 를 사용했다.
  • 2가지 초기화 모드를 지원한다. 즉시 또는 지연 방식. (뻑나가서 데이터 나가는 불미스러운 일 방지).
  • 인덱스 열거 지원.
  • 스토리지 파일 열거 또한 지원.
  • 키 삭제 지원.

원작자가 소개한 성능 소개한다. 천만 건의 데이터를 읽고 쓰는 테스트를 수행했다고 한다. 단위는 초.

raptordbkv2/computers.png

쓰기/초 및 읽기/초 는 높을수록 좋다. 당연히 컴이 좋을수록 좋은거다. AMD 같은 똥컴에서도 결코 뒤지지 않는 성능을 보여줬다.

이번엔 정렬 알고리즘에 따른 천만건 데이터를 읽고 쓴 성능표이다.

raptordbkv2/compare.png

단위는 초이며, 당연히 낮을 수록 빠른거다.

다음은 데이터량에 따른 걸린 시간 표이며, 메모리 얼마나 처먹었는지도 보여준다. 위 표에 HP120G5 로 했다고 한다.

raptordbkv2/bigdata.png

천만건인데 메모리 2기가밖에 안먹으니 말 다했다. NT는 테스트 안했다는 뜻이란다. 왜죠?

그리고 현재 배포중인 2.3 버전의 성능표이다. 첫번째 테이블 그림과 같이 테스트했다.

raptordbkv2/v23perf.png

똥컴의 경우 get 성능이 느려졌지만 set 속도는 드럽게 빨라졌다. 그 외의 컴퓨터는 괜찮은 향상을 이룩했다.

일단 NoSQL 특성상 쓰기 속도는 중요한 역할을 하니 Get 속도는 조금이나마 성능향상한 거에 대해 칭찬해줄 만 하다.

읽기가 중점이라면 걍 SQL 써라. 그건 다른 NoSQL도 마찬가지다.

성능은 됐고 사용법이나 보자.

// 복제 기능 없이 DB 열기
var guiddb = RaptorDB.RaptorDB<Guid>.Open("c:\\RaptorDbTest\\multithread", false);

// 키 문자열 길이를 100 문자로 (UTF8) 정의하여 복제 기능을 활성화하며 DB 열기
var strdb = RaptorDB.RaptorDB<string>.Open("c:\\intdb", 100, true); 

참고로 없으면 알아서 만드니 걍 쓰면 된다.

데이터 집어넣고 빼는 법은 아래와 같다.

Guid g = Guid.NewGuid();
guiddb.Set(g, "somevalue");

string outstr="";
if(guiddb.Get(g, out outstr)) 
{
   // 성공시 outstr 값에 뭐 들어간다.
}

<

p>

참고로 왜 키값 크기가 255문자밖에 지원을 안하냐면. 데이터 영구 저장을 위해 파일 방식으로 저장하는데.. 파일명 최대크기가 255문자인건 알잖나.

이 녀석은 닷넷 프로그램 어느 용도에 쓰면 좋을까?

  • 앱 로그 기록
  • ASP.NET 세션 방식 대체 (내가 그랬지만 그냥 파일기반보다 PHP삘 나니 괜찮. PHP도 파일기반 세션이라.)
  • 채팅 로그 기록 (웹이던 앱이던 니 땡기는대로.)

그냥 쉽게 말해줄게. NoSQL 에 맞는 용도라고 하자. 그담부터는 잘 찾아보면 나온다. 

덤으로 구글이 만든 LevelDB도 닷넷으로도 쓸 수 있게 해놨다. (이미 자바나 파이썬으로도 지원한다. 원체 C언어로 만들었으니 닷넷도 그렇지만 자바는 JNI 쓰는게 함정. 둘 다 운영체제 가려가면서 쓰도록.)

https://www.meebey.net/projects/leveldb-sharp/

그럼 끝.

composite / 2013년 12월 30일 / 미분류
태그:, , , , , , ,

답글 남기기

Your email address will not be published / Required fields are marked *