'Database/Nosql'에 해당하는 글 5건


replica set(이하 리플리카셋)은 여러 대의 서버에 원본을 복사해 두고,

장애가 발생시  자동으로 장애 이외의 디비 중 하나를 선택하여 원본 디비처럼 사용할 수 있도록 있습니다. 이로 인해 서비스를 끊기지 않고 지속적으로 유지할 수 있습니다. 

리플리카셋에서 첫번째 입력을 담당하는 서버를 primary 서버라 부르며 그밖의 서버를 secondary 서버라 부릅니다. 프라이머리 서버는 세컨더리 서버를 2초 마다 상태 체크하여 데이터 동기화를 하기 위해 HeartBeat(일종의 ping 확인)를 확인합니다. 이때 세컨더리서버가 사용할수 없더라도 프라이머리 서버는 살아있으므로 서비스는 유지 됩니다. 

만일 프라이머리 서버에 이상이 생길 경우 세컨더리서버 끼리의 선거를 통해 프라이머리서버를 선출하여 작동하게 됩니다. 이때 세컨더리->프라이머리 서버로 변환시 디비에 대한 입출력데이터는 손실될수 있습니다. 

리플리카셋 또한 샤딩과 마찬가지로 저장할 공간을 만들고 서버 셋팅만 해주면 됩니다.

 $ mkdir repl1 repl2 repl3

먼저 리플리카셋에 저장할 디렉토리를 생성합니다. 

$ sudo mongod --replSet replicasetTest -dbpath /data/repl1 -port 10000

$ sudo mongod --replSet replicasetTest -dbpath /data/repl2 -port 10001

$ sudo mongod --replSet replicasetTest -dbpath /data/repl3 -port 10002


서버를 실행하였으니 이제 접속하여 리플리카셋을 설정해 줍니다. 먼저 첫번째 서버에 접속합니다. 

$ sudo mongo localhost:10000

> var config={_id:'replicasetTest', members:[{_id:0, host:'localhost:10000'}, {_id:1, host:'localhost:10001'}, {_id:2, host:'localhost:10002'}] };

리플리카셋으로 지정할 서버들의 목록을 만들어준 후 

> rs.initiate(config);

리플리카셋으로 등록합니다. 


등록후 위와 같이 현재 첫번째 서버가 프라이머리서버가 되었음을 확인할수 있습니다. 

> exit


두번째 서버로 접속하여 확인해 보면 

$ sudo mongo localhost:10001


위와 같이 세컨더리 서버가 되었음을 확인할수 있습니다. 

>exit

$ sudo mongo localhost:10000

다시 첫번째 프라이머리 서버로 들어가서 서버를 종료시켜 보겠습니다. 

> use admin;

> db.shutdownServer();

프라이머리 서버 셧다운 후 두번째 혹은 세번째 서버로 접속해 보면 (어떤 서버가 프라이머리 서버가 됐는지는 접속해야 알수 있습니다. 서버 셋팅시 서버에 대한 우선순위를 지정하여 어떤 서버가 다음 프라이머리 서버가 될수 있도록 할수 있으나 실제 서비스 상에서는 어떤 서버가 프라이머리 서버가 되든 서비스가 죽지 않기 때문에 알 필요가 없습니다. )

$ sudo mongo localhost:10001 

혹은 

$ sudo mongo localhost:10002


저의 경우엔 세번째 서버가 프라이머리 서버가 되어 동작함을 확인 할수 있습니다. 

이렇듯 끊임없는 서비스 제공을 위해서 레플리카셋은 꼭 필요한 기능입니다. 

저작자 표시
신고

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

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

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

mongodb sharding

Database/Nosql 2016.05.11 23:50


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 sharding  (0) 2016.05.11
mongodb 기본 CRUD  (0) 2016.05.10
mongodb 기초 쿼리  (0) 2013.03.03
초간단 ubuntu 에 mongodb 설치하기  (0) 2013.03.01

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret



1. insert (save)

>  db.scores.save({num:99}); 

db.scores.save({num:99}) -> scores 콜렉션에 num:99 를 넣으시요. 

데이터 확인 find()

db.scores.find();


db.scores.find(); -> scores 콜렉션에 있는 모든 데이터를 가져오시오.


>  for(i=0; i<10; i++){ db.scores.save({num:i, name:"name"+i}); }

scores에 num과 name 값을 열번 넣으시요.

db.scores.find();





2. Read (find)


> db.scores.find({num:0});

db.scores.find({num:0}); -> num이 0인것을 찾으시오

_id는 mongodb가 각각의 데이터에 부여하는 객체 id 값 입니다. (고유값) 해당 id로 찾기 위해선 objectid 로 변환해줘야 합니다. 





db.scores.find( {num: {$gt:5}} );

db.scores.find({num: {$gt:5}}); -> num의 값중 5보다 큰값을 찾으시오.



db.scores.find( {num: {$lt:5}} );

db.scores.find({num: {$lt:5}}); -> num의 값중 5보다 작은 값을 찾으시오.



db.scores.find({num: {$gte:5, $lte:7}});

db.scores.find({num: {$gte:5, $lte:7}}); -> num의 값중 5보다 크거나 같으며 7보다 작거나 같은 값들을 찾으시오.


db.scores.find({ $or : [{num : {$gt: 1, $lt : 3} }, { num : {$gte: 7, $lt : 9}}] });

db.scores.find({ $or : [{num : {$gt: 1, $lt : 3} }, { num : {$gte: 7, $lt : 9}}] });

-> num에서 1보다 크며 3보다 작은 값과 7보다 크거나 같으며 9보다 작은 값들을 모두 보여주시오. 



db.scores.find({ num : { $in : [0, 99]} });

db.scores.find({ num : { $in : [0, 99]} }); -> num의 값중 0과 99인 값을 찾아 보여주시오.


db.scores.find({ num : { $nin : [0, 99]} });

db.scores.find({ num : { $nin : [0, 99]} }); -> num의 값중 0과 99인 값을 제외한 값을 찾아 보여주시오.





3. Update 


db.scores.update({num: 9} , {num: 9, name : "name99"});

db.scores.update({num: 9} , {num: 9, name : "name99"}); -> num이 9 인 데이터의 name를 name99로 변경하시오.



4. Delete(remove)


db.scores.remove({num:99});

db.scores.remove({num:99}); -> num이 99인 값을 삭제하시오.



저작자 표시
신고

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

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

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

상세하게 쓸려고 미친듯이 포스팅을 했으나....


사이트에서 제공하는 예제보다 잘할 자신이 없어서 포기....


http://docs.mongodb.org/manual/reference/sql-comparison/


정말 잘 나왔으니 한번씩 따라해보세요.





저작자 표시
신고

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

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

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret

초간단! 우분투에 mongodb 설치 하기 입니다.


1. 다른 패키지 설치 처럼 apt-get명령어로 설치 가능합니다.

$ sudo apt-get install mongodb


2. 엄청 많은 패키지들이 필요하군요.. 설치를 계속 할것인지 묻습니다.

당연히 Y


3. 쭉쭉 설치가 되다가 mongodb statr/running 라는 말이 나옵니다.

정상적으로 작동하는군요. 설치 완료입니다.ㅎ 참쉽죠?


4. mongodb 를 실행하고 싶다면 mongo명령어를 실행하면됩니다.

$ mongo


-이제부터가 mongodb의 시작입니다.



저작자 표시
신고

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

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

WRITTEN BY
No.190
세계정복의 시작점

받은 트랙백이 없고 , 댓글이 없습니다.
secret