More Related Content Similar to Mongo db로 배우는 nosql Similar to Mongo db로 배우는 nosql (20) Mongo db로 배우는 nosql2. 진행목표
- 쉽게
- 학습 시간 단축
- 기초를 닦아서 발판을 마련
- Use ME!!
2 MongoDB로배우는NoSQL
5. in recently
• 충분히
• 필요한 만큼
• 적절하게
• 잘 살아오고 있었다.
1983, DEC microcomputer (128kb ram)
5 MongoDB로배우는NoSQL
6. NoSQL
• Not Only SQL
• 데이터 스토어
• 비 관계형을 지향
• 대용량 처리를 목표
Q 구글은 어느 회사 DB를 쓸까?
직접 만들어서 쓰나?
6 MongoDB로배우는NoSQL
9. Data Models
• Relational
• Key-value
• Column-oriented
– Table no joins
• Document-oriented
– JSON or XML like, no joins
9 MongoDB로배우는NoSQL
10. Consistent, Available (CA) Systems
• 전통적인 RDBMS
• Vertica (column-oriented)
• Aster Data (relational)
• Greenplum (relational)
10 MongoDB로배우는NoSQL
11. Consistent, Partition-Tolerant (CP) Systems
• BigTable (column-oriented/tabular)
• Hypertable (column-oriented/tabular)
• HBase (column-oriented/tabular)
• MongoDB (document-oriented)
• Redis (key-value)
• MemcacheDB (key-value)
• Berkeley DB (key-value)
11 MongoDB로배우는NoSQL
12. Available, Partition-Tolerant (AP) Systems
• Dynamo (key-value) amazon
• Tokyo Cabinet (key-value)
• KAI (key-value)
• Cassandra (column-oriented) facebook p2p
• CouchDB (document-oriented)
• SimpleDB (document-oriented)
12 MongoDB로배우는NoSQL
13. 라이선스 및 구현 비교 정리
*출처 : 10gen slide “No SQL, No problem”
13 MongoDB로배우는NoSQL
14. 소개
14 MongoDB로배우는NoSQL
15. 몽고DB란?
• MongoDB (from humongous)는 확장가능
하고, 고성능을 지향하는 도큐먼트 기반의
오픈소스 데이터 베이스.
• C++로 작성되었음
by
15 MongoDB로배우는NoSQL
16. 특징
• Document-oriented storage
– JSON 스타일의 documents
– 간결하고 강력한 동적 스키마 구성
• Full Index Support
– 어느 속성에나 인덱스 설정 가능
• Replication High Availability
– LAN과 WAN을 이용한 미러링
16 MongoDB로배우는NoSQL
17. 특징 (계속)
• Auto-Sharding
– 기능 손실 없는 수평 확장
• Querying
– 풍부한 문서기반의 쿼리 지원
• Fast In-Place Updates
– 성능문제를 일으키지 않는 정교한 수정
• Map/Reduce
– 유연한 데이터 수집과 처리
17 MongoDB로배우는NoSQL
18. 특징 (계속)
• GridFS
– 다양한 크기의 파일을 쉽게 저장
• Commercial Support
– 기술 지원 기업이 존재, 교육, 컨설팅 지원 (
but 북미 이야기;;;)
• 고성능
• 간편한 관리
18 MongoDB로배우는NoSQL
19. 실
습
시작하기
19 MongoDB로배우는NoSQL
20. MongoDB 개요
• 데이터의 기본 단위는 Document
• 컬렉션은 Document의 집합
• 자바스크립트 쉘 내장
• 스키마가 없다.
20 MongoDB로배우는NoSQL
21. Schema
• 데이터베이스 스키마는
데이터베이스에서 자료의 구조, 자료의 표현 방법, 자
료 간의 관계를 정의한 것을 말하는 전산학 용어이다.
• 데이터베이스 관리 시스템(DBMS)이 주어진 설정에
따라 데이터베이스 스키마를 만들어 내며, 데이터베
이스 사용자가 자료를 저장, 조회, 삭제, 변경할 때 DB
MS는 그것이 생성한 데이터베이스 스키마를 참조하
여 명령을 수행한다.
21 MongoDB로배우는NoSQL
22. 도큐먼트Document
• key:value 쌍으로 이루어진 JSON-like
{
id: 1,
name: Foo,
price: 123,
tags: [Bar,Eek]
}
22 MongoDB로배우는NoSQL
23. 도큐먼트Document
{ “hello” : “world” } ß 문서
{
“이름” : “채수원”, ß 또 다른 문서
“직업” : “무직”,
“나이” : 5
}
23 MongoDB로배우는NoSQL
24. 컬렉션 Collection
• document의 모음
• schema-free
• system으로 시작하는
이름은 사용불가(예약어)
• db.컬렉션이름.명령어
– db.blog.insert(…)
24 MongoDB로배우는NoSQL
25. 실습
25 MongoDB로배우는NoSQL
26. 서버 실행
• mongod --dbpath ./data/db
• mongo
26 MongoDB로배우는NoSQL
27. Database
하나의 데이터 베이스는 자체 권한을 가지
고 있으며 각각 파일로 존재한다.
• admin
– root DB
• local
– 복제 제외 DB
• config
– 샤드(shard)정보 저장
27 MongoDB로배우는NoSQL
28. MongoDB shell
• Interactive console
• JavaScript 기반
28 MongoDB로배우는NoSQL
29. 기본CRUD(create, retrieve, update, delete)
• insert()
– insert( {“name” : “world” } )
• find()
• findOne()
• update()
• remove()
– remove( {“name” : “world” } )
29 MongoDB로배우는NoSQL
30. Shell Help
help
db.help()
db.mycollection.help()
db.mycollection.find().help()
db.mycollection.help??
30 MongoDB로배우는NoSQL
31. Shell database관련
db.version()
var titles = [blog, cafe, message];
db.blog.insert( titles );
for ( i in titles) {
print( db.blog[ titles[i] ]);
}
31 MongoDB로배우는NoSQL
32. Shell database관련
db.version()
use 데이터베이스_이름
show collections
32 MongoDB로배우는NoSQL
33. Data Types
• null
• boolean
• 32비트 정수
• 64비트 정수
• 64비트 부동소수점형
• 문자열
• 심볼형
33 MongoDB로배우는NoSQL
34. Data Types (이어서)
• 객체ID
– ObjectId()
• 날짜
– Date(), 1/1000초 단위
• 정규표현식
– { a : /wo/i }
34 MongoDB로배우는NoSQL
35. Data Types (이어서)
• 코드형
– { a” : function() { … } }
• 이진데이터형
• 최대값형
• 최소값형
• undefined
• 배열
• embedded document
35 MongoDB로배우는NoSQL
36. 숫자
• Shell에서 모든 숫자는 더블double형으로
취급 -- floating-point로 취급
36 MongoDB로배우는NoSQL
37. Embedded Document
{
name : John Doe,
address : {
street : 123 Street, city : ”Hamton,
state : NY
}
}
문제점은?
37 MongoDB로배우는NoSQL
38. _id
• ObjectId()
• o = new ObjectId()
• o.getTimestamp()
38 MongoDB로배우는NoSQL
39. Array
{things : [pie, 3.14]}
39 MongoDB로배우는NoSQL
40. Collections 문서작성실습
• db.getCollectionNames()
• document 생성 : 영화제목, 장르
• db.getCollectionNames()
• db.system.indexes.find()
40 MongoDB로배우는NoSQL
41. insert
• db.foo.insert( document );
• batch insert -- fast!!
– but one collection only
• document size는 16M 까지
• BSON
– Object.bsonsize( db.blog )
41 MongoDB로배우는NoSQL
42. update
• var robin = db.blog.findOne( {name :
robin } );
• robin.age = 18;
• db.blog.update( {name : robin}, robin
);
• delete robin.age
42 MongoDB로배우는NoSQL
43. update이어서
• $inc
– db.blog.update( {name : robin }, {$inc
: {age : 1 } } )
– db.blog.update( {name : robin }, {$inc
: {exp : 1 } } )
43 MongoDB로배우는NoSQL
44. update이어서
• $set
– db.blog.update( {name : robin }, {$set
: {pow : 10 } } )
• $unset
44 MongoDB로배우는NoSQL
45. update이어서
• $rename
– db.blog.update( {name : robin }, {$rena
me : {pow : pwr } } )
45 MongoDB로배우는NoSQL
46. update이어서
• upsert
db.blog.update( {name : robin }, robin, true
);
• multi
– db.blog.update( { }, {$set : {level : 1 } }
, false, true );
46 MongoDB로배우는NoSQL
47. update이어서
• $push
db.movie.insert({ title : dark knight })
db.movie.update({ title : dark knight} , {$push :
{ character : batman } } );
• $addToSet
• db.getLastError()
47 MongoDB로배우는NoSQL
48. save vs update
db.mycollection.save(x);
db.mycollection.update( { _id: x._id }, x, /
*upsert*/ true );
48 MongoDB로배우는NoSQL
49. drop vs remove
db.blog.remove( fake );
db.blog.drop();
49 MongoDB로배우는NoSQL
50. get-and-set
{
_id : ObjectId(),
status : state,
priority : N
}
50 MongoDB로배우는NoSQL
51. get-and-set 이어서
ps = db.processes.find({status : READY).sort({priority : -1})
.limit(1).next()
db.processes.update({_id : ps._id}, {$set : {status : RUNNING}})
do_something(ps);
db.processes.update({_id : ps._id}, {$set : {status : DONE}})
51 MongoDB로배우는NoSQL
52. get-and-set 이어서
ps = db.runCommand({findAndModify : processes,
query : {status : READY},
sort : {priority : -1},
update : {$set : {status : RUNNING}})
{
ok : 1,
value : {
_id : ObjectId(4b3e7a18005cab32be6291f7), priority : 1,
status : READY
}}
52 MongoDB로배우는NoSQL
53. get-and-set 이어서
• 형식
– findAndModify
– query
– sort
– update / remove
– new
• 오직 존재하는 문서만 갱신가능
53 MongoDB로배우는NoSQL
57. Query
db.users.find({age : 27})
db.users.find({username : joe, age
: 27})
db.users.find({}, {username : 1, email
: 1})
57 MongoDB로배우는NoSQL
58. 제약사항
• db.stock.find({in_stock : stock.no})
58 MongoDB로배우는NoSQL
59. Query 조건문
db.users.find({age : {$gte : 18, $lte
: 30}})
start = new Date(01/01/2007)
db.users.find({”D-day : {$lt : start}})
db.users.find({”name : {$ne : joe}})
59 MongoDB로배우는NoSQL
60. OR
db.raffle.find({ticket_no : {$in : [725,
542, 390]}})
db.raffle.find({ticket_no : {$nin : [725
, 542, 390]}})
db.raffle.find({$or : [{ticket_no : 725},
{winner : true}]})
60 MongoDB로배우는NoSQL
61. Not
db.users.find({id_num : {$mod : [5, 1
]}})
db.users.find({id_num : {$not : {$mo
d : [5, 1]}}})
61 MongoDB로배우는NoSQL
62. 조건 규칙
db.users.find(
{age : {$lt : 30, $gt : 20}})
62 MongoDB로배우는NoSQL
63. null
db.c.find()
{ _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null }
{ _id : ObjectId(4ba0f0dfd22aa494fd523622), y : 1 }
{ _id : ObjectId(4ba0f148d22aa494fd523623), y : 2 }
db.c.find({y : null})
{ _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null }
db.c.find({z : null})
{ _id : ObjectId(4ba0f0dfd22aa494fd523621), y : null }
{ _id : ObjectId(4ba0f0dfd22aa494fd523622), y : 1 }
{ _id : ObjectId(4ba0f148d22aa494fd523623), y : 2 }
63 MongoDB로배우는NoSQL
66. 배열검색$all
db.food.insert({_id : 1, fruit : [apple, banana, peach]})
db.food.insert({_id : 2, fruit : [apple, kumquat, orange]})
db.food.insert({_id : 3, fruit : [cherry, banana, apple]})
db.food.find({fruit : {$all : [apple, banana]}})
{_id : 1, fruit : [apple, banana, peach]}
{_id : 3, fruit : [cherry, banana, apple]}
db.food.find({fruit : [apple, banana]})
db.food.find({fruit.2 : peach})
66 MongoDB로배우는NoSQL
67. 배열검색$size
db.food.find({fruit : {$size : 3}})
db.food.update({$push : {fruit : strawberry}, $inc : {size : 1}})
db.food.find({size : {$gt : 3}})
67 MongoDB로배우는NoSQL
68. 배열검색$slice
db.blog.posts.findOne(criteria, {comments : {$slice : 10}})
db.blog.posts.findOne(criteria, {comments : {$slice : -10}})
db.blog.posts.findOne(criteria, {comments : {$slice : [23, 10]}})
{
_id : ObjectId(4b2d75476cc613d5ee930164),
title : A blog post,
content : ...,
comments : [
{
name : joe,
email : joe@example.com,
content : nice post. },
{
name : bob,
email : bob@example.com,
content : good post. }
]}
68 MongoDB로배우는NoSQL
70. Embedded Documents 검색
db.people.find({name : {first : Joe, last : Schmoe}})
db.people.find({name.first : Joe, name.last : Schmoe})
70 MongoDB로배우는NoSQL
71. Embedded Documents 검색
db.blog.find()
{
content : ...,
comments : [
{
author : joe, score : 3,
comment : nice post
},
{
author : mary,
score : 6,
comment : terrible post
}]
}
71 MongoDB로배우는NoSQL
73. Embedded Documents 검색
• db.blog.find({comments : {$elemMatch : {author : joe,
score : {$gte : 5}}}})
73 MongoDB로배우는NoSQL
74. Embedded Documents 검색
db.blog.find(
{comments : {$elemMatch : {aut
hor : joe”,score : {$gte : 5} }} } )
74 MongoDB로배우는NoSQL
75. $where
db.foo.insert({apple : 1, banana : 6, peach : 3})
db.foo.insert({apple : 8, spinach : 4, watermelon : 4})
db.foo.find({$where : this.x + this.y == 10})
db.foo.find({$where : function() { return this.x + this.y == 10; }})
75 MongoDB로배우는NoSQL
76. 커서cursor
for(i=0; i100; i++) {
... db.c.insert({x : i});
... }
var cursor = db.collection.find();
while (cursor.hasNext()) {
... obj = cursor.next();
... // do stuff
... }
76 MongoDB로배우는NoSQL
77. 커서cursor
var cursor = db.people.find();
cursor.forEach(function(x) {
... print(x.name);
... });
77 MongoDB로배우는NoSQL
78. Limits, Skips, Sorts
db.c.find().limit(3)
db.c.find().skip(3)
db.c.find().sort({username : 1, age : -1})
db.stock.find({desc : mp3}).limit(50).
sort({price : -1})
78 MongoDB로배우는NoSQL
79. skip 피하기
var page1 = db.foo.find(criteria).limit(100)
var page2 = db.foo.find(criteria).skip(100).limit(100) var page3 = db.fo
o.find(criteria).skip(200).limit(100)
var latest = null;
while (page1.hasNext()) { latest = page1.next();
display(latest);
}
var page2 = db.foo.find({date : {$gt : latest.date}});
page2.sort({date : -1}).limit(100);
79 MongoDB로배우는NoSQL
80. random
var total = db.foo.count()
var random = Math.floor(Math.random()*total)
db.foo.find().skip(random).limit(1)
db.people.insert({name : joe, random : Math.random()})
db.people.insert({name : john, random : Math.random()})
db.people.insert({name : jim, random : Math.random()})
var random = Math.random()
result = db.foo.findOne({random : {$gt : random}})
80 MongoDB로배우는NoSQL
81. 쿼리 결과의 일관성 유지
cursor = db.foo.find();
while (cursor.hasNext()) {
var doc = cursor.next();
doc = process(doc);
db.foo.save(doc);
}
81 MongoDB로배우는NoSQL
82. $snapshot
var cursor = db.foo.find().snapshot();
var cursor = db.foo.find( { $query :{}, $sna
pshot : true } );
82 MongoDB로배우는NoSQL
84. 인덱스
case1
{user : 1, date : -1}
vs
{date : -1, user : 1}
case2
index for sort
84 MongoDB로배우는NoSQL
85. 인덱스 설정
db.people.find({username : mark})
db.people.ensureIndex({username : 1})
85 MongoDB로배우는NoSQL
86. 인덱스 전략
case1
{user : 1, date : -1}
vs
{date : -1, user : 1}
case2
index for sort
86 MongoDB로배우는NoSQL
87. index name
• keyname1_dir1_keyname2_dir2…
• 인덱스 이름 변경
db.foo.ensureIndex(
{“a”:1…}, {“name”:”myindex”} )
87 MongoDB로배우는NoSQL
88. unique index
db.people.ensureIndex(
{“username”:1}, {“unique”:true} )
• use getLastError
예) db.getLastError()
• _id :default unique index
• compound unique index도 가능함
88 MongoDB로배우는NoSQL
89. 중복 제거
db.people.ensureIndex(
{“username”:1},
{“unique”:true, “dropDups”: true} )
89 MongoDB로배우는NoSQL
90. missing key
• db.things.ensureIndex(
{firstname: 1}, {unique: true});
db.things.save({lastname: Smith});
• db.things.save({lastname: Jones});
à error!!
90 MongoDB로배우는NoSQL
91. Index 관리
• system.indexes 컬렉션
91 MongoDB로배우는NoSQL
92. Index 삭제
• db.runcommand({“dropIndexes”:”people
”, “index”:”myIndex”} )
• db.runcommand(
{“dropIndexes”:”people”,“index”:”*”} )
• db.collection.dropIndexes();
92 MongoDB로배우는NoSQL
93. Index Rebuild
• db.myCollection.reIndex()
• db.runCommand( { reIndex : 'myCollecti
on' } )
93 MongoDB로배우는NoSQL
94. explain, hint
• db.collectionName.find(…).explain()
• db.collectionName.find(…).hint()
94 MongoDB로배우는NoSQL
95. sparse index
db.people.ensureIndex({title : 1}, {sparse : true})
db.people.save({name:Jim})
db.people.save({name:Sarah, title:Princess})
db.people.find()
{ _id : ObjectId(4de6abd5da558a49fc5eef29), name : Jim }
{ _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title :
Princess }
db.people.find().sort({title:1}) // only 1 doc returned because sparse
{ _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title :
Princess }
뒤로 이어서…
95 MongoDB로배우는NoSQL
96. sparse index (계속)
db.people.dropIndex({title : 1})
{ nIndexesWas : 2, ok : 1 }
db.people.find().sort({title:1}) // no more index, returns all documents
{ _id : ObjectId(4de6abd5da558a49fc5eef29), name : Jim }
{ _id : ObjectId(4de6abdbda558a49fc5eef2a), name : Sarah, title :
Princess }
96 MongoDB로배우는NoSQL
97. 2D Geospatial indexes
• db.places.ensureIndex( { loc : 2d } )
• 2d documents
{ loc : [ 50 , 30 ] }
{ loc : { x : 50 , y : 30 } }
{ loc : { foo : 50 , y : 30 } }
{ loc : { long : 40.739037, lat: 73.992964 } }
• only 1 geospatial index per collection
97 MongoDB로배우는NoSQL
98. 2D Geospatial indexes (계속)
• Query
db.places.find( { loc : [50,50] } )
db.places.find( { loc : { $near : [50,50] } } )
db.places.find( { loc : { $near : [50,50] } } ).li
mit(20)
db.places.find( { loc : { $near : [50,50] , $
maxDistance : 5 } } ).limit(20)
98 MongoDB로배우는NoSQL
99. 2D Geospatial indexes (계속)
• within
polygonA = [ [ 10, 20 ], [ 10, 40 ], [ 30, 40 ], [ 30, 20 ] ]
polygonB = { a : { x : 10, y : 20 }, b : { x : 15, y : 25 }, c : { x :
20, y : 20 } }
db.places.find(
{ loc : { $within : { $polygon : polygonA } } })
db.places.find(
{ loc : { $within : { $polygon : polygonB } } })
99 MongoDB로배우는NoSQL
100. 주의사항
• 일반적으로 ‘인덱스’가 갖는 특징을 동일
하게 갖는다.
• 쿼리 결과 반환비율
• CUD 부하
• Cardinality
• 공간차지
• 인덱스 생성시의 부하
100 MongoDB로배우는NoSQL
102. count
• db.movie.count()
• db.movie.count( {“title” : “shark”} )
• db.pageviews.count({date: {'$gte': new
Date(Nov 1, 2009), '$lt': new Date(De
c 1, 2009)}})
102 MongoDB로배우는NoSQL
103. distinct
{name : Ada, age : 20}
{name : Fred, age : 35}
{name : Susan, age : 60}
{name : Andy, age : 35}
db.runCommand({distinct : people,
key : age})
103 MongoDB로배우는NoSQL
104. group
select a,b,sum(c) csum from coll where a
ctive=1 group by a,b
104 MongoDB로배우는NoSQL
105. group
db.coll.group({
key: { a:true, b:true },
cond: { active:1 },
reduce: function(obj, prev) {
prev.csum += obj.c; },
initial: { csum: 0 }
});
105 MongoDB로배우는NoSQL
106. group
{day : 2010/10/03, price : 4.23}
{day : 2010/10/04, price : 4.27}
{day : 2010/10/03, price : 4.10}
{day : 2010/10/06, price : 4.30}
{day : 2010/10/04”, price : 4.01}
106 MongoDB로배우는NoSQL
107. group
db.stocks.group({
key : {day : true },
initial : {sum : 0},
$reduce : function(doc, prev) {
prev.sum += doc.price;
}
})
107 MongoDB로배우는NoSQL
108. group
ns
key
initial”
$reduce
condition
108 MongoDB로배우는NoSQL
113. Group $keyf
db.posts.group(
{ns : posts,
$keyf : function(x) {
return x.category.toLowerCase();
},
initializer : ... })
113 MongoDB로배우는NoSQL
114. MapReduce
- Google
- 페타바이트 이상의 대용량 데이터를 신
뢰할 수 없는 컴퓨터로 구성된 클러스터
환경에서 병렬 처리를 지원하기 위해서
개발
- map, reduce 함수로 구성
114 MongoDB로배우는NoSQL
115. MapReduce map
map = function () {
for (var key in this) {
emit(key, {count:1});
}
}
115 MongoDB로배우는NoSQL
116. MapReduce reduce
reduce = function (key, emits) {
total = 0;
for (var i in emits) {
total += emits[i].count;
}
return {count:total};
}
116 MongoDB로배우는NoSQL
119. RDBMS유저를 위한 Query 비
교
• http://www.mongodb.org/display/DOCS/
SQL+to+Mongo+Mapping+Chart
119 MongoDB로배우는NoSQL
120. Capped Collections
• very high performance
– 빠른 입력
– 바른 출력
• auto-FIFO age-out 기능
• Logging
• 입력순서 자동유지
• Caching
• Automatic Age Out
120 MongoDB로배우는NoSQL
121. Capped Collections이어서
• circular queues
• update, remove불가
• No index
• tailable지원
121 MongoDB로배우는NoSQL
123. GridFS
• 리플리케이션 설정시, 자동으로 파일 백업
• 한 디렉터리내에 수백만개의 파일 저장가능
• 파일과 함께 관련된 데이터 저장가능 (수정한 사람, 다운로드 수, 설명등
등)
• document당 1개만 첨부가능
123 MongoDB로배우는NoSQL
124. GridFS fs.files
{
_id : unspecified,
length : data_number,
chunkSize : data_number,
uploadDate : data_date,
md5 : data_string
}
124 MongoDB로배우는NoSQL
125. DBref
• {$ref : collection, $id : id_value}
• {$ref : collection, $id : id_value, $db
: database}
125 MongoDB로배우는NoSQL
126. DB관리
• startup/shutdown
• monitoring
– web
– mongostat
126 MongoDB로배우는NoSQL
127. 인증 Authentication
db.addUser(root, 1234);
db.addUser(read_only, 4321, true);
db.auth(root, 1234);
db.system.users.remove({user : test_
user});
127 MongoDB로배우는NoSQL
128. NoSQL 비교자료
http://kkovacs.eu/cassandra-vs-mongodb
-vs-couchdb-vs-redis
128 MongoDB로배우는NoSQL
130. mongodump/mongorestore
• $ ./mongodump -d test -o backup
• $ ./mongorestore -d foo --drop backup/t
est/
130 MongoDB로배우는NoSQL
131. fsync
db.runCommand({fsync : 1, lock : 1})
;
db.$cmd.sys.unlock.findOne();
131 MongoDB로배우는NoSQL
132. repairDatabase
db.repairDatabase()
mongod --dbpath=/data/db --repair
132 MongoDB로배우는NoSQL
133. 분산복제 replication
133 MongoDB로배우는NoSQL
134. master-slave
• $ mkdir -p ~/dbs/master
• $ ./mongod --dbpath ~/dbs/master --port 10000 --master
• $ mkdir -p ~/dbs/slave
• $ ./mongod --dbpath ~/dbs/slave --port 10001 --slave --source localhos
t:10000
134 MongoDB로배우는NoSQL
135. master-slave
• --only
• --slavedelay
• --fastsync
• --autoresync
• --oplogSize
master의 oplog size 지정(MB)
135 MongoDB로배우는NoSQL
136. master-slave 추가/제거
• $ ./mongod --slave --dbpath ~/dbs/slave --port 27018
use local
db.sources.insert({host : localhost:27017})
db.sources.find()
db.sources.insert({host : prod.example.com:27017})
db.sources.remove({host : localhost:27017})
136 MongoDB로배우는NoSQL
138. 레플리카 셋replica sets
• $ cat /etc/hostname
• $ mkdir -p ~/dbs/node1 ~/dbs/node2
• $ ./mongod --dbpath ~/dbs/node1 --port 10001 --replSet blog/earth:100
02
• $ ./mongod --dbpath ~/dbs/node2 --port 10002 --replSet blog/earth:100
01
• $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100
01
• $ ./mongod --dbpath ~/dbs/node3 --port 10003 --replSet blog/earth:100
01,morton:10002
138 MongoDB로배우는NoSQL
139. 레플리카 셋replica sets
• $ ./mongo morton:10001/admin
db.runCommand({replSetInitiate : {
_id : blog,
members : [
{
_id : 1,
host : earth:10001
},
{
_id : 2,
host : earth:10002
} ]}})
139 MongoDB로배우는NoSQL
140. 레플리카 셋replica sets
• standard
– 일반노드.투표에 참여. 주 노드가 될 수 있
음
• passive
– 전체 데이터를 가지고 있음
• arbiter
– 투표에만 참여. 복제본(X)
140 MongoDB로배우는NoSQL
141. 레플리카 셋replica sets
members.push({
... _id : 3,
... host : earth:10003,
... priority : 40
... });
141 MongoDB로배우는NoSQL
145. oplog
• operation log
• oplog.$main
db.slaves.find()
db.sources.find()
db.runCommand({getLastError: 1, w: N});
db.printReplicationInfo();
145 MongoDB로배우는NoSQL
146. 샤딩 sharding
146 MongoDB로배우는NoSQL
147. Sharding
• 현재 장비에 디스크 공간이 부족할 때
• 단인 mongod가 처리할 때 보다 빠르게
데이터를 쓰고 싶을 때
• 성능 향상을 위해 더 많은 데이터를 메모
리에 올려 두고 싶을 때
147 MongoDB로배우는NoSQL
149. Shard key
• name
• timestamp
• category
• local
• level type
• etc
149 MongoDB로배우는NoSQL
150. Autosharding
• Shard
• mongos
• config server
150 MongoDB로배우는NoSQL
151. Autosharding
• 설정서버 시작
• $ mkdir -p ~/dbs/config
• $ ./mongod --dbpath ~/dbs/config --port 20000
• mongos 기동
• $ ./mongos --port 30000 --configdb localhost:20000
151 MongoDB로배우는NoSQL
152. Autosharding
• 샤드추가
• $ mkdir -p ~/dbs/shard1
• $ ./mongod --dbpath ~/dbs/shard1 --port 10000
• $ ./mongo localhost:30000/admin
db.runCommand({addshard : localhost:10000, allowLocal : true})
• 컬렉션을 샤딩으로 지정
db.runCommand({enablesharding : foo})
db.runCommand({shardcollection : foo.bar, key : {_id : 1}})
152 MongoDB로배우는NoSQL
153. Autosharding
• $ mkdir -p ~/dbs/config1 ~/dbs/config2 ~/dbs/config3
• $ ./mongod --dbpath ~/dbs/config1 --port 20001
• $ ./mongod --dbpath ~/dbs/config2 --port 20002
• $ ./mongod --dbpath ~/dbs/config3 --port 20003
• $ ./mongos --configdb localhost:20001,localhost:20002,localhost:2000
3
153 MongoDB로배우는NoSQL