본문 바로가기

Database/Nosql

mongodb sharding


mongodb sharding( 이하 샤딩으로 표기) 은 mongodb끼리의 데이터 복제함으로서 다른 서버와의 동기화 및 빅데이터를 저장하기 위해서 분산 저장을 하는것이  샤딩의 목적입니다. 





샤딩은 mongodb 두대로도 가능하지만 최소 3대를 권장하며, 실질적인 데이터 복제가 아닌 mongodb내의 oplog에 의한 명령어를 복사/ 실행함으로서 데이터를 유지합니다. 


여기서는 한 컴퓨터에서 서버를 3대를 실행합니다.

먼저 저장소가 서로 다르게 되어야 하므로 폴더를 따로 만들어 줍니다.

$ mkdir shard1 shard2 shard3


$ sudo ./mongod -shardsvr -dbpath /data/shard1 -port 40001

$ sudo ./mongod -shardsvr -dbpath /data/shard2 -port 40002

$ sudo ./mongod -shardsvr -dbpath /data/shard3 -port 40003




총 3대의 mongo서버를 실행하며 각각 저장 폴더 경로와 포트가 달라야 합니다. 

이제 위의 3대의 샤딩 서버의 설정을 감독하는 config 서버를 만들어줍니다. config 서버는 샤딩서버들에 어떤 데이터들이 어떤 식으로 분산되는지 감독하는 기능을 합니다. 

$ mkdir config


$ sudo mongod --configsvr -dbpath /data/config -port 50001

config 서버도 폴더와 포트를 다르게 하여 실행합니다. 



$ sudo ./mongos --configdb localhost:50001 --port 50000 --chunkSize 1

이제 mongos 로 서버를 실행하는데 config의 패스와 청크파일사이즈를 지정해야 합니다. 청크파일은 파일이 저장되는 파일의 단위이며 기본 단위는 M입니다. 



이제 서버로 접속합니다. 

$ sudo ./mongo localhost:50000

기존엔 디폴트 포트로 접속하였으나 이번엔 50000포트로 지정하였으니 위와 같이 경로:포트를 지정해서 접속합니다. 

이제부터는 샤딩에 관한 설정을 해 줘야 합니다. 

> use admin;


>  db.runCommand({addshard:"localhost:40001"});

>  db.runCommand({addshard:"localhost:40002"});

>  db.runCommand({addshard:"localhost:40003"});

샤딩으로 쓰이는 서버들을 등록해 줍니다. 다음으로 샤딩할 콜렉션을 지정해 줍니다. 

> db.runCommand({ listShards : 1});

> db.runCommand({enablesharding: 'person'});

> db.runCommand({ shardcollection : 'persion.users', key :{ _id:1}});

이로써 모든 준비가 완료 되었습니다. 




이제 부터는 어떻게 샤딩이 되는지 알아보겠습니다. 

> use person;

> for(i=0; i<1000000; i++){ db.users.save({name : 'name'+i}); }

users 콜렉션에 10만개의 데이터를 집어 넣어 봅니다. ( 입력되는데 사양에 따라 시간이 걸립니다. )

> db.users.find({name:'name999'}).explain();

뒤에 explain()을 붙여주면 해당 데이터의 샤딩 정보를 보여줍니다. 




위의 이미지에서 보는 바와 같이 name999는 샤딩 서버1 / 서버2 / 서버3 모두 데이터가 있는것으로 나옵니다. 사실 3대의 서버 어느 한곳에 데이터가 있지만 분산서버이기 떄문에 한서버처럼 행동하기때문에 사용자/개발자 입장에서는 한대의 서버로 운영하는것과 같이 작동합니다. 


> sh.status();

현재 샤딩에 대한 정보를 볼수 있습니다.




위의 이미지에서 아래쪽에 chunks의 갯수가 보입니다. 각 서버의 청크(데이터단위)는 각 서버에 거의 동일하게 들어가지만 몇개의 차이가 당연히 날수 있습니다. 데이터를 분산해서 저장하기 때문에 어느 한쪽에 몇개의 데이터가 더 저장될수 있습니다. 


> use admin;

> db.runCommand({ removeshard : 'localhost:40001' });

서버1의 샤딩을 멈췄습니다. 이제 서버1에 있던 청크들은 서버2와 서버3로 최대한 균등하게 이동하게 됩니다.  콘솔창을 보시면 분주하게 복사하는게 보입니다. ( 약간의 시간이 걸립니다.)

> sh.status();





다시 샤딩의 상태를 보면 서버1에 있던 청크들이 다른 서버들로 이동하여 청크의 갯수가 달라졌음을 확인할수 있습니다. 

'Database > Nosql' 카테고리의 다른 글

mongodb Replica Set  (0) 2016.05.12
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01