Akashic Records

MongoDB, 설치와 간단 사용법 본문

오래된글/DataBase

MongoDB, 설치와 간단 사용법

Andrew's Akashic Records 2018. 4. 17. 15:26
728x90

MongoDB(from “humongous”)는 전통적인 RDBMS의 대안인 NOSQL Family의 일부로 오픈 소스 “Document-Oriented Database”을 지향하고 있습니다.

MongoDB에서 Data는 JSON과 같은 Dynamic Schema 형태의 Document(문자열로 구성된 단위라고 생각하면 됩니다.)구조로 저장 되는데 MongoDB에서는 이를 BSON 이라 합니다.

MongoDB가 다른 문서 데이터베이스와 구별되는 한 가지 기능은 SQL문을 MongoDB 쿼리 함수 호출로 매우 간단하게 변환하는 기능있어 기존 RDBMS를 쉽게 마이그레이션 할 수 있다고 합니다.

MogoDB가 최근에 주목을 받게 된 이유는 Mobile 환경의 확대와 SNS의 활성화로 설명 할 수 있을 것 같습니다.


Mobile환경의 확대

  1. 최근 모바일 어플리케이션은 Hybrid 형태을 띄며 Data을 기본적으로 Server Side에 저장하기 때문에 지속적으로 Server Side로 부터 Data을 받아오는게 사용자 사용성에 중요한 척도가 되었다.

  2. 모바일 어플리케이션 개발 기술 중 Server/Client 통신 기술은 Open API 형태로 WebService을 사용하며 그 중 RESTFul 방식으로 전문형태는 JSON을 사용하는 것이 거의 표준으로 잡혀 있음.

  3. MogoDB와 같은 Document 기반 DB는 JSON형태로 저장되기 때문에 Data와 어플리케이션간 통합에 최적의 구조를 가진다.


SNS의 활성화

  1. 모바일 환경에서 SNS가 활성화 되고 나서 엄청난 규모의 Data가 발생한다.

  2. 전통적인 RDBMS로는 현재 규모의 Big Data을 저장하고 관리하기 어렵다.

  3. 새로운 형태의 NoSQL 기술이 필요하게 되었고 가장 적합한 형태가 MongoDB이다.


MongoDB의 특징

다양한 데이터 모델

Row라는 개념을 보다 유연한 모델인 Document로 바꾸었다. 내장 문서와 배열을 문서에 사용할수 있기 때문에 문서 지향 모델은 복잡한 계층 관계를 하나의 레코드로 표현할 수 있게 한다. 이 방식은 최신 객체지향 언어를 사용하는 개발자의 관점에 매우 적합함.

순쉬운 확장

문서 지향 데이터 모델은 데이터를 여러 서버에 자동적으로 분산해준다. 문서를 자동으로 재분배 함으로써 클러스터 내 데이터의 양과 부하를 조절할 수 있다.

다양한 기능

  • 색인: 다양한 쿼리의 속도를 빠르게 할 수 있는 여러가지의 색인 기능을 제공한다.

  • 저장 자바스크립트: 저장 프로시저 대신에 자바스크립트 함수와 값을 서버 단에 저장해 쓸수 있다.

  • 집계: 다양한 집계 기능을 제공

  • 고정 크기 컬렉션: 크기가 고정되어 있는 컬렉션은 로그 같은 특정 유형의 데이터에 유용하다.

  • 파일 저장소: 큰 파일과 파일의 메타데이터를 편리하게 저장할 수 있는 프로토콜을 제공한다.

고성능

MongoDB는 모든면에서 고성능을 위해 설계 되었다.

간편한 관리

서버들은 가능하면 스스로 관리하게 설계되어 있다.


Collections

다른 구조의 문서라도 같은 컬렉션에 저장할 수 있는데 왜 별도의 컬렉션이 필요한가?

  • 다른 종류의 문서를 같은 컬렉션에 저장하는 것은 개발자와 관리자에게는 악몽이 될 수 있다. 개발자들은 각 쿼리가 특정 종류의 문서를 반환하거나 그렇지 않다면 쿼리를 수행한 코드가 다른 구조의 문서들을 다룰 수 있는지 확실히 해야 한다.

  • 각 컬렉션별로 목록 뽑기가 한 컬렉션 내 특정 데이터형별로 쿼리해 목록을 뽑을 때보다 훨씬 빠르다.

  • 같은 종류의 데이터를 하나의 컬렉션에 모아 두는 것은 데이터 지역성을 위해서도 좋다.

  • 색인을 만들게 되면 문서는 특정 구조를 가져야 한다. 이러한 색인은 컬렉션별로 정의 한다. 하나의 컬렉션에 단일한 데이터형의 문서를 넣게 되면 보다 효율적인 색인을 생성할 수 있다.


DataBase

MongoDB는 문서를 컬렉션으로 모아 두는 것과 함께, 여러 컬렉션을 데이터베이스로 모은다. 여러 데이터베이스를 호스팅할 수 있으며, 각 데이터베이스를 완전히 독립적으로 취급할 수 있다. 하나의 데이터베이스는 자체 권한을 가지고 있으며 따로 분리된 파일로 디스크에 저장된다. 한 어플리케이션의 데이터는 동일한 데이터베이스에 저장하는 편이 좋다.


설치하기

Download(현재버전 2.2.3) : http://www.mongodb.org/downloads

환경에 맞는 설치 파일을 다운로드 받는다.(저는 Linux 32-bit) 64bit용을 받게되면 메모리 사용에 제약을 받지 않지만 32bit을 사용하는 경우 2G이상 사용할 수 없다고 한다. 일반적인 경우 64bit을 사용하기를 권장하고 있다.

또한 다양한 language의 Driver을 지원하고 있기 때문에 필요한 Driver도 다운 받는다.


Ubuntu OS에 설치해보기

Step 1 ‘.deb’ 페키지를 설치하기 위해 GPG 키를 등록 한다.

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

Step 2 command ‘sudo apt-get update’

Step 3 command ‘sudo apt-get install mongodb’


MongoDB 설정

  • 설정 파일 : /etc/mongodb.conf

  • 실행 설정 파일: /etc/init.d/mongodb.

  • 라이브러리 위치: /var/lib/mongodb

  • 로그 위치: /var/log/mongodb


시작과 종료

  • Start: command ‘sudo service mongodb start’

  • Stop: command ‘sudo service mongodb stop’

  • Restart: command ‘sudo servcie mongodb restart’


초간단 사용해보기

  • local 접속: ‘mongo’cd

  • remote 접속: 'mongo localhost:27017/test’ 27017은 default port, test는 기본생성 DB


Shell은 온전한 자바스크립트 해석기로 임의의 자바스크립트 프로그램을 실행할 수도 있다.


yunchang-lee@HSK01-INTER999:/var/log/mongodb$ mongo localhost:27017/test

MongoDB shell version: 2.0.6

connecting to: localhost:27017/test → Connection

> db → 현재 접속한 DB 확인

test

> show dbs → 모든 DB 확인

local (empty)

test (empty)

> use mydb → 사용할 DB 지정, 없는 경우 자동 생성된다.

switched to db mydb

> db → 정말 바꿔졌는지 확인

mydb

> help → 도움말 보기

db.help()                    help on db methods

db.mycoll.help()             help on collection methods

rs.help()                    help on replica set methods

help admin                   administrative help

help connect                 connecting to a db help

help keys                    key shortcuts

help misc                    misc things to know

help mr                      mapreduce


show dbs                     show database names

show collections             show collections in current database

show users                   show users in current database

show profile                 show most recent system.profile entries with time >= 1ms

show logs                    show the accessible logger names

show log [name]              prints out the last segment of log in memory, 'global' is default

use <db_name>                set current database

db.foo.find()                list objects in collection foo

db.foo.find( { a : 1 } )     list objects in foo where a == 1

it                           result of the last line evaluated; use to further iterate

DBQuery.shellBatchSize = x   set default number of items to display on shell

exit                         quit the mongo shell

> db.help() → DB 메소드 도움말 보기

DB methods:

db.addUser(username, password[, readOnly=false])

db.auth(username, password)

db.cloneDatabase(fromhost)

db.commandHelp(name) returns the help for the command

db.copyDatabase(fromdb, todb, fromhost)

db.createCollection(name, { size : ..., capped : ..., max : ... } )

db.currentOp() displays the current operation in the db

db.dropDatabase()

db.eval(func, args) run code server-side

db.getCollection(cname) same as db['cname'] or db.cname

db.getCollectionNames()

db.getLastError() - just returns the err msg string

db.getLastErrorObj() - return full status object

db.getMongo() get the server connection object

db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair

db.getName()

db.getPrevError()

db.getProfilingLevel() - deprecated

db.getProfilingStatus() - returns if profiling is on and slow threshold

db.getReplicationInfo()

db.getSiblingDB(name) get the db at the same server as this one

db.isMaster() check replica primary status

db.killOp(opid) kills the current operation in the db

db.listCommands() lists all the db commands

db.logout()

db.printCollectionStats()

db.printReplicationInfo()

db.printSlaveReplicationInfo()

db.printShardingStatus()

db.removeUser(username)

db.repairDatabase()

db.resetError()

db.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 }

db.serverStatus()

db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all

db.shutdownServer()

db.stats()

db.version() current version of the server

db.getMongo().setSlaveOk() allow queries on a replication slave server

db.fsyncLock() flush data to disk and lock server for backups

db.fsyncUnock() unlocks server following a db.fsyncLock()

> j={name:"mongo"} → 데이터를 넣어보기 위해, JSON 형태의 DATA 생성

{ "name" : "mongo" }

> k={x:3} → 처음과 다른 형태의 JSON 형태 생성, MongoDB는 JSON 형태가 다르더라도 같은 Collection에 넣을 수 있다.

{ "x" : 3 }

> db.things.insert(j) → 생성한 ‘j’ collection 'things’에 넣는다.

> db.things.insert(k) → 생성한 ‘k’ collection 'things’에 넣는다.

> show collections → 어떤 collection들이 있는지 확인해본다.

system.indexes

things → j, k 가 포함된 things가 보인다.

> db.things.find() → things에 포함된 Document을 조회 한다, "_id”는 MongoDB가 collection에 입력되는 순간 자동으로 부여하며, mogoDB내에서 유니크 하다.

{ "_id" : ObjectId("5111e871abd47e5e659ee261"), "name" : "mongo" }

{ "_id" : ObjectId("5111e8f1abd47e5e659ee262"), "x" : 3 }

> for(var i=1; i<=20; i++) db.things.insert({x:4,j:i}) → for 문을 이용해서 다중 문서를 넣어본다.

> db.things.find()

{ "_id" : ObjectId("5111e871abd47e5e659ee261"), "name" : "mongo" }

{ "_id" : ObjectId("5111e8f1abd47e5e659ee262"), "x" : 3 }

{ "_id" : ObjectId("5111e97babd47e5e659ee263"), "x" : 4, "j" : 1 }

{ "_id" : ObjectId("5111e97babd47e5e659ee264"), "x" : 4, "j" : 2 }

{ "_id" : ObjectId("5111e97babd47e5e659ee265"), "x" : 4, "j" : 3 }

{ "_id" : ObjectId("5111e97babd47e5e659ee266"), "x" : 4, "j" : 4 }

{ "_id" : ObjectId("5111e97babd47e5e659ee267"), "x" : 4, "j" : 5 }

{ "_id" : ObjectId("5111e97babd47e5e659ee268"), "x" : 4, "j" : 6 }

{ "_id" : ObjectId("5111e97babd47e5e659ee269"), "x" : 4, "j" : 7 }

{ "_id" : ObjectId("5111e97babd47e5e659ee26a"), "x" : 4, "j" : 8 }

{ "_id" : ObjectId("5111e97babd47e5e659ee26b"), "x" : 4, "j" : 9 }

{ "_id" : ObjectId("5111e97babd47e5e659ee26c"), "x" : 4, "j" : 10 }

{ "_id" : ObjectId("5111e97babd47e5e659ee26d"), "x" : 4, "j" : 11 }

{ "_id" : ObjectId("5111e97babd47e5e659ee26e"), "x" : 4, "j" : 12 }

{ "_id" : ObjectId("5111e97babd47e5e659ee26f"), "x" : 4, "j" : 13 }

{ "_id" : ObjectId("5111e97babd47e5e659ee270"), "x" : 4, "j" : 14 }

{ "_id" : ObjectId("5111e97babd47e5e659ee271"), "x" : 4, "j" : 15 }

{ "_id" : ObjectId("5111e97babd47e5e659ee272"), "x" : 4, "j" : 16 }

{ "_id" : ObjectId("5111e97babd47e5e659ee273"), "x" : 4, "j" : 17 }

{ "_id" : ObjectId("5111e97babd47e5e659ee274"), "x" : 4, "j" : 18 }

has more

> it → 더 있는 경우 ‘it'

{ "_id" : ObjectId("5111e97babd47e5e659ee275"), "x" : 4, "j" : 19 }

{ "_id" : ObjectId("5111e97babd47e5e659ee276"), "x" : 4, "j" : 20 }

>



728x90

'오래된글 > DataBase' 카테고리의 다른 글

Oracle 중요 Hint  (0) 2018.04.17
MongoDB, mogo Shell  (0) 2018.04.17
MongoDB 제한자  (0) 2018.04.17
Index가 옵티마이저에 의해 수행되는 경우  (0) 2018.04.15
Hashing  (0) 2018.04.15
Comments