MongoDB란?


 MongoDB는 C++작성된 오픈소스 문서지향(Document-Oriented) 적 Cross-platform데이터베이스이며,

뛰어난 확장성과 성능을 자랑합니다. 또한, 현존하는 NOSQL 데이터베이스 중 인지도 1위를 유지하고 있습니다.


위에 나온 설명은 흔히 mongodb에 관해 설명을 할 때 많이 나오는 내용이다.

MongoDB를 제대로 이해하기 위해서는 NOSQL, 문서지향, Cross-platform이라는 용어에 집중할 필요가있다. 

NOSQL이란 ? 

  Not Only Sql로 RDBMS의 한계를 극복하기 위해 만들어진 새로운 형태의 저장소이다. 관계형 DB가 아니기에, RDBMS처럼 고정된 스키마 및 JOIN이 존재하지않는다.

문서지향이란 ?

MongoDB는 다른 데이터베이스와 다르게 조금 다른 형태의 데이터형식을 지원한다.

key-value pair형태의 Document을 제공하는데 아래 예를 보면 조금 더 이해가 쉬울거다.

 { "_id": ObjectId("5099804saf3f4948bd2f98231"), "username": "yjh", "name": { first: "jh", last: "y" } }


MongoDB에선 위의 json형태의 데이터가 Bson형식의 데이터로 저장된다. 


Cross-platform이란 ? 

간단히 설명하면 여러 종류의 컴퓨터플랫폼에서 동작할 수 있다는 것을 뜻한다.  둘이상의 플랫폼위에서 동작할 시 클로스 플랫폼이라한다. 

 

이제 MongoDB에 대해 간략히 알았다면 다른 SQL랑 용어를 비교해보자 

SQL 사용용어  

 MongoDB 사용용어

 데이터베이스 

 데이터베이스

 테이블 

 컬렉션

 행

문서 또는 BSON문서 

 열 

 필드

 색인

 색인

 테이블 조인

 내장문서 & 링킹

 기본키

기본키 

집합 

집합 프레임워크 







'apps > mongodb' 카테고리의 다른 글

Mongodb란?  (0) 2018.02.10
mongodb sharing  (0) 2018.01.28

Mongodb sharding


구성정보 : 


mongo01 : 192.168.0.2

 mongo02 : 192.168.0.3 



mongodb version : 3.6.2


그림 : https://docs.mongodb.com/manual/sharding/




위와같이 구성할꺼다.


 A MongoDB sharded cluster consists of the following components:

  • shard: Each shard contains a subset of the sharded data. Each shard can be deployed as a replica set.
  • mongos: The mongos acts as a query router, providing an interface between client applications and the sharded cluster.
  • config servers: Config servers store metadata and configuration settings for the cluster. As of MongoDB 3.4, config servers must be deployed as a replica set (CSRS).



설치법 : 

별도의 설명이 없다면 양쪽서버에서 진행하시면 됩니다. ^^


먼저 다운받는다.

$ wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.2.tgz 


압출을 풀어준다.

$ tar -zxvf mongodb-linux-x86_64-rhel70-3.6.2.tgz 


링크걸어준다. ( 편리하게 접근하기 위함 ) 

$ ln -s mongodb-linux-x86_64-rhel70-3.6.2 mongodb


mongodb폴더에서 각각의 dir을 만들어준다. 

$ mkdir pid
$ mkdir shardsvr
$ mkdir configsvr # 이 부분은 mongo01 에서만 진행합니다.

$ mkdir log

$ mkdir conf


먼저 config servers을 설치하고 구동시켜야한다. 

config servers은 1대아님 3대가 권장설정이기 때문에 mongo02서버에서는 생략 ( mongo_install_dir 에는 설치한 mongo dir경로를 넣어줌 된다 ) 

 

 $ vi $mongo_install_dir/conf/configsvr.conf

systemLog:
   verbosity: 5
   destination: file
   path: $mongo_install_dir/log/configsvr.log
   logAppend: true

storage:
   dbPath: $mongo_install_dir/mongodb/configsvr

processManagement:
   fork: true
   pidFilePath: $mongo_install_dir/mongodb/pid/configsvr.pid

net:
   bindIp: 0.0.0.0 # 이 부분이 중요하다 127.0.0.1일 시 local에서만 사용가능 
   port: 27022

#security:
#   keyFile: /home/unisecure/mongodb/key/mongodb.key

sharding:
   clusterRole: configsvr

replication:
   replSetName: configGroup



실행

#mongoldb/bin폴더에서 mongod 을 통해 실행

 $ ./mongod --config $mongo_install_dir/mongodb/conf/configsvr.conf 



config server설정 ( mongo01 에서 진행 )

$ mongo --host localhost --port 27022


rs.initiate({id:"configGroup",configsvr:true,members:[{ _id:0 , host:"192.168.0.2:27022"} ] })

# 이와 같이 설정해준다. config server가 여러대라면 members에 같은 형식으로 추가해주면된다.


rs.initiate({})

#config server가 한대라면 이 와같이 입력해도 무방하다.



# 상태확인

rs.status()



# 아래와 같이 나오면 성공 

configGroup:SECONDARY> rs.status()

{

        "set" : "configGroup",

        "date" : ISODate("2018-01-26T01:41:15.233Z"),

        "myState" : 1,

        "term" : NumberLong(1),

        "configsvr" : true,

        "heartbeatIntervalMillis" : NumberLong(2000),

        "optimes" : {

                "lastCommittedOpTime" : {

                        "ts" : Timestamp(1516930863, 3),

                        "t" : NumberLong(1)

                },

                "readConcernMajorityOpTime" : {

                        "ts" : Timestamp(1516930863, 3),

                        "t" : NumberLong(1)

                },

                "appliedOpTime" : {

                        "ts" : Timestamp(1516930863, 3),

                        "t" : NumberLong(1)

                },

                "durableOpTime" : {

                        "ts" : Timestamp(1516930863, 3),

                        "t" : NumberLong(1)

                }

        },

        "members" : [

                {

                        "_id" : 0,

                        "name" : “mongo01:27022",

                        "health" : 1,

                        "state" : 1,

                        "stateStr" : "PRIMARY",

                        "uptime" : 501,

                        "optime" : {

                                "ts" : Timestamp(1516930863, 3),

                                "t" : NumberLong(1)

                        },

                        "optimeDate" : ISODate("2018-01-26T01:41:03Z"),

                        "infoMessage" : "could not find member to sync from",

                        "electionTime" : Timestamp(1516930855, 1),

                        "electionDate" : ISODate("2018-01-26T01:40:55Z"),

                        "configVersion" : 1,

                        "self" : true

                }

        ],

        "ok" : 1,

        "operationTime" : Timestamp(1516930863, 3)

}

 



shard서버 구동 ( mongo01, mongo02서버에서 진행 )

# $mongo_install_dir / conf 디렉토리에서 파일수정

 $ vi shardsvr.conf

systemLog:

   verbosity: 4

   destination: file

   path: $mongo_install_dir/log/shardsvr.log

   quiet: true

   logAppend: true

   logRotate: rename


storage:

   dbPath: $mongo_install_dir/shardsvr

   directoryPerDB: true

   journal:

      enabled: true


processManagement:

   fork: true

   pidFilePath: $mongo_install_dir/pid/shardsvr.pid


net:

   bindIp: 0.0.0.0

   port: 27033


sharding:

   clusterRole: shardsvr


shard서버구동

# $mongo_install_dir / bin 디렉토리에서 mongod 실행

  ./mongod --config $mongo_install_dir/conf/shardsvr.conf 





mongos서버 구동 ( mongo01, mongo02서버에서 진행 )

# $mongo_install_dir / bin 디렉토리에서 mongos 실행 

./mongos --configdb configGroup/mongo01:27022 --bind_ip 0.0.0.0 --port 27011 --logpath $mongo_install_dir/mongodb/log/mongos.log & 


# admin으로 실행

mongos> use admin

switched to db admin


mongos> sh.addShard("mongo01:27033")

{

        "shardAdded" : "shard0000",

        "ok" : 1,

        "$clusterTime" : {

                "clusterTime" : Timestamp(1516934294, 4),

                "signature" : {

                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

                        "keyId" : NumberLong(0)

                }

        },

        "operationTime" : Timestamp(1516934294, 4)

}

mongos> sh.addShard("mongo02:27033")

{

        "shardAdded" : "shard0001",

        "ok" : 1,

        "$clusterTime" : {

                "clusterTime" : Timestamp(1516934300, 2),

                "signature" : {

                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

                        "keyId" : NumberLong(0)

                }

        },

        "operationTime" : Timestamp(1516934300, 2)

}


# 샤딩 상태확인

mongos> sh.status()

config.locks collection empty or missing. be sure you are connected to a mongos

--- Sharding Status ---

  sharding version: {

        "_id" : 1,

        "minCompatibleVersion" : 5,

        "currentVersion" : 6,

        "clusterId" : ObjectId("5a6a8cf0744d26f58db56f3b")

  }

  shards:

        {  "_id" : "shard0000",  "host" : “mongo01:27033",  "state" : 1 }

        {  "_id" : "shard0001",  "host" : "mongo02:27033",  "state" : 1 }

  active mongoses:

        "3.6.2" : 1

  balancer:

        Currently enabled:  yes

        Currently running:  no

        Failed balancer rounds in last 5 attempts:  0

        Migration Results for the last 24 hours:

                No recent migrations

  databases:


 


mongos 에서 database와 collection을 활성화시켜야 사용가능하다.


샤딩활성화 ( test데이터베이스 활성화 ) 

 mongos> sh.enableSharding("test")

{

        "ok" : 1,

        "$clusterTime" : {

                "clusterTime" : Timestamp(1516934488, 5),

                "signature" : {

                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

                        "keyId" : NumberLong(0)

                }

        },

        "operationTime" : Timestamp(1516934488, 5)

}




컬렉션 샤딩설정 ( test db의 t1 컬렉션 활성화 ) 

mongos> sh.shardCollection("test.t1",{regdate:"hashed"})

{

        "collectionsharded" : "test.t1",

        "collectionUUID" : BinData(4,"eM/P3uVVS9OKYMNGmylDwA=="),

        "ok" : 1,

        "$clusterTime" : {

                "clusterTime" : Timestamp(1516934531, 4),

                "signature" : {

                        "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),

                        "keyId" : NumberLong(0)

                }

        },

        "operationTime" : Timestamp(1516934531, 4)

}

 


설정확인


mongos> sh.status()

config.locks collection empty or missing. be sure you are connected to a mongos

--- Sharding Status ---

  sharding version: {

        "_id" : 1,

        "minCompatibleVersion" : 5,

        "currentVersion" : 6,

        "clusterId" : ObjectId("5a6a8cf0744d26f58db56f3b")

  }

  shards:

        {  "_id" : "shard0000",  "host" : “mongo01:27033",  "state" : 1 }

        {  "_id" : "shard0001",  "host" : "mongo02:27033",  "state" : 1 }

  active mongoses:

        "3.6.2" : 1

  balancer:

        Currently enabled:  yes

        Currently running:  no

        Failed balancer rounds in last 5 attempts:  0

        Migration Results for the last 24 hours:

                No recent migrations

  databases:

        {  "_id" : "test",  "primary" : "shard0001",  "partitioned" : true }

                test.t1

                        shard key: { "regdate" : "hashed" }

                        unique: false

                        balancing: true

                        chunks:

                                shard0001       2

                        { "regdate" : { "$minKey" : 1 } } -->> { "regdate" : NumberLong(0) } on : shard0001 Timestamp(1, 0)

                        { "regdate" : NumberLong(0) } -->> { "regdate" : { "$maxKey" : 1 } } on : shard0001 Timestamp(1, 1) 



검증

샤딩서버로 접속

  ./mongo localhost:27033


# mongo01에서 진행

# mongos서버에서 지정했던 sharding 테이블에 데이터를 집어넣는다.


> use test

switched to db test

>

>

> db.t1.insert([ { name: "Abet", age: 19, regdate: ISODate() },{ name: "Betty", age: 20, regdate: ISODate() } ]);

BulkWriteResult({

        "writeErrors" : [ ],

        "writeConcernErrors" : [ ],

        "nInserted" : 2,

        "nUpserted" : 0,

        "nMatched" : 0,

        "nModified" : 0,

        "nRemoved" : 0,

        "upserted" : [ ]

})

>

>

> show collections;

t1

> db.t1.find({name:"Abet"})

{ "_id" : ObjectId("5a6a9bb0e9e058fc826770c5"), "name" : "Abet", "age" : 19, "regdate" : ISODate("2018-01-26T03:08:32.564Z") }



mongo02에서도 체크 

 ./mongo localhost:27033

> use test

switched to db test

> db.t1.find({name:"Abet"})

{ "_id" : ObjectId("5a6a9bb0e9e058fc826770c5"), "name" : "Abet", "age" : 19, "regdate" : ISODate("2018-01-26T03:08:32.564Z") }












 

'apps > mongodb' 카테고리의 다른 글

Mongodb란?  (0) 2018.02.10
mongodb sharing  (0) 2018.01.28

+ Recent posts