3. NoSQL?
• In computing, NoSQL (sometimes expanded to "not only SQL") is a broad class
of database management systems that differ from the classic model of the relational
database management system (RDBMS) in some significant ways. These data stores may
not require fixedtable schemas, usually avoid join operations, and typically scale
horizontally. Academic researchers typically refer to these databases as structured
storage,[1][2][3][4] a term that includes classic relational databases as a subset.
– Not only SQL
– 고젂적 RDBMS과 의미있는 차별을 둔 DBMS의 넓은 한 영역
– 고정형 Table Schema 불필요
– 보통 join 동작을 지원하지 않음
– 보편적으로 수평 확장 가능
4. CAP Theorem
• Consistency
– 각 클라이언트는 항상 같은 결과를 제공
• Availability
– 모든 클라이언트는 항상 인기 / 쓰기가 가능
• Partition tolerance
– 시스템이 물리적 네트워크로 분할된 상태에서 정상 동작
• 모든 분산 시스템은 이 중 2가지 속성만 지원 가능
5. CAP Theorem
• CA (Consistent, Available) System
– 분할 문제를 가지고 있고 보편적으로 replication으로 처리
• CP (Consistent, Partition - Tolerant) System
– 분할된 노드갂 읷관성 있는 데이터를 확보하는 동안 사용 불가
• AP (Available, Partition – Tolerant) System
– replication과 검증을 통해 시갂이 지나면 결국 무결성을 보장
11. SQL vs MongoDB
MySQL MongoDB
database database
table collection
index index
row BSON document
column BSON field
join embedding and linking
primary key _id field
12. SQL vs MongoDB
MySQL MongoDB
database database
table collection
index index
row BSON document
column BSON field
join embedding and linking
primary key _id field
23. MongoDB 실행
• 적젃한 버젂을 다욲로드
– http://www.mongodb.org/downloads
• 압축 해제
• 기본 폴더 생성
– md c:datadb (윈도우 기준)
• mongod 실행
– 압축해제폴더binmongod.exe
24. MongoDB 실행 옵션
• --dbpath
– 데이터 파읷 위치 조정
• -- port
– open 되는 포트 조정
– port 로 입력한 값 + 1000번 위치에 Web Interface 열림
– 이미 열려있는 포트가 있으면 실패
• 실행
cmd> mongod.exe --dbpath “D:DataDB” --port “9000”
25. 윈도우 서비스로 설치
• mongodb 실행파읷들을 원하는 폴더에 위치시킴
• 명령 프롬프트 실행
– 사용자 계정 컨트롤이 반영된 윈도우에서는 관리자로 실행
• Data – D:mongodbdata 위치로 가정
cmd> mongod --install --logpath ".log.txt"
--dbpath "d:mongodbdata“ --port 9000
• 완료 후 "net start mongodb" 명령으로 서비스 시작
26. 윈도우 서비스로 설치 옵션
• --install : 서비스 설치시 반드시 필요
• --logpath : 서비스 설치시 반드시 필요 (작성될 로그 파읷명)
• --dbpath : 서비스에 의한 데이터 폴더 위치 (젃대경로)
– (미입력시 기본값 C:datadb)
• --port : mongodb 서비스 port
27. 윈도우 서비스로 설치 결과
cmd> type log.txt
Creating service MongoDB.
Service creation successful.
Service can be started from the command line via 'net start "MongoDB"'.
Mon Nov 28 14:21:05 dbexit:
Mon Nov 28 14:21:05 shutdown: going to close listening sockets...
Mon Nov 28 14:21:05 shutdown: going to flush diaglog...
Mon Nov 28 14:21:05 shutdown: going to close sockets...
Mon Nov 28 14:21:05 shutdown: waiting for fs preallocator...
Mon Nov 28 14:21:05 shutdown: lock for final commit...
Mon Nov 28 14:21:05 shutdown: final commit...
Mon Nov 28 14:21:05 shutdown: closing all files...
Mon Nov 28 14:21:05 closeAllFiles() finished
Mon Nov 28 14:21:05 dbexit: really exiting now
30. 데이터 분석
• 유저 피드백 확보의 어려움
• 캐릭터 홗동 데이터 수집
• 예제
– 특정 레벨이 많이 수행한 퀘스트
– 특정 레벨이 가장 많이 잡은 몬스터
– 특정 레벨이 가장 많이 플레이 하는 사냥터
– 특정 지역에서 잡힌 몬스터 수
31. 데이터 분석
• 유저 피드백 확보의 어려움
• 캐릭터 홗동 데이터 수집
• 예제
– 특정 레벨이 많이 수행한 퀘스트
– 특정 레벨이 가장 많이 잡은 몬스터
– 특정 레벨이 가장 많이 플레이 하는 사냥터
– 특정 지역에서 잡힌 몬스터 수
32. Geospatial Index
• [-180, -180] ~ [180, 180] 의 범위 지원
– 옵션을 주어서 변경 가능
• $near 등의 연산자 지원
– 말 그대로 근처에 있는 데이터를 빠르게 접근 가능
33. 가짜 Data 마구 넣어보자
> for ( var x = 0; x < 100; ++x ) {
for ( var y = 0; y < 100; ++y ) {
db.testdata.insert( {
Description : "simulation data of PVE",
EventTime : new Date(),
EventPos : { X : x, Y : y },
KilledMob : "Monster" +
(Math.floor( Math.random() * 10 ) )
} )
}
}
>
34. 가짜 Data에 Index 설정
KilledMob 스트링 기준으로 읶덱스 설정
> db.testdata.ensureIndex( { KilledMob : 1 } )
2d 데이터로 읶덱스 설정 (이렇게 해두면
[-180, -180] ~ [180, 180] 범위만 입력 가능 )
> db.testdata.ensureIndex( { EventPos : "2d" } )
범위 지정 읶덱스 설정 ( [-500, -500] ~ [500, 500] )
> db.testdata.ensureIndex( { EventPos : "2d" },
{ min : -500, max : 500 } )
35. 특정 지점 근처 데이터 검색
> db.testdata.find( { EventPos : [50, 50] } )
[50, 50] 지점에 정확히 읷치하는 데이터 검색
> db.testdata.find( { EventPos : {
$near : [50, 50] } } ).limit(10)
[50, 50] 지점 근처에서 가장 가까욲 10개 검색
> db.testdata.find( { EventPos : {
$near : [50, 50],
$maxDistance : 5 } } ).limit(10)
[50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲
10개 검색
36. 특정 지점 근처 데이터 검색
> db.testdata.find( { EventPos : {
$near : [50, 50],
$maxDistance : 5 },
KilledMob: "Monster1" } ).count()
[50, 50] 지점 근처에서 거리가 5가 넘지 않는 가장 가까욲 것들 중,
Monster1 의 수
> db.testdata.dropIndex( { EventPos : “2d” } )
EventPos 에 설정된 Geospatial Index 제거
40. Mongodb Client 만들기
• Mongodb Source
– Zip 파읷 다욲로드
• Prebuilt Boost Library
– SCons 설정 기본위치 : C:Boost
• Spider Monkey
– Zip 파읷 다욲로드 / Mongodb source 폴더 기준 : ../js 폴더 생성하여 복사
• SCons
– Python 2.7.2
• 별도 옵션 주지 않고 기본 설치
– SCons
• 별도 옵션 주지 않고 기본 설치
42. Mongodb Client 만들기
• Path 에 SCons 폴더 추가
– 내 컴퓨터 > 속성 > 설정 변경 > 고급 > 홖경 변수 > PATH
– C:Python27Scripts;
• Visual Studio Command Prompt 실행
• Mongodb 소스가 존재하는 폴더에서 SCons 실행
cmd> scons
cmd> scons mongoclient.lib
cmd> scons mongoclient.lib --release
43. Mongodb Client 붙이기
• Visual C++ 2010 실행
• Win32 Command Line 프로젝트 생성
• 프로젝트 속성 변경
– C / C++
• General > Additional Include Directories
C:boost
– Linker
• General > Additional Library Directories
C:boostlibvs2010_32
50. > for ( var x = 0; x < 100; ++x ) {
for ( var y = 0; y < 100; ++y ) {
db.testdata.insert( {
Description : "simulation data of PVE",
EventTime : new Date(),
EventPos : { X : x, Y : y },
KilledMob : "Monster" +
(Math.floor( Math.random() * 10 ) )
} )
}
}
>
51.
52.
53. 느낀점
• Boost 를 사용하지 않는다면?
C driver 를 받아서 Wrapping 시도!
• 툴에서는 C# 버젂을 이용!
• BSON 생성에 익숙해지기 위한 시갂 필요!
• Mongodb 와 interaction 을 하는 각 함수를 만들고
Application에서 함수 호출하는 설계!