2014년 10월 12일 일요일

몽고디비2.6 샤딩

1.0 컨피스 서버용 디렉토리 만들기
cd test
mkdir log //로그용 디렉토리
mkdir configsvr
cd configsvr/
mkdir server1
mkdir server2
  mkdir server3

1.1 컨피그 서버 뛰우기
컨피그 서버는 총 3대를 뛰운다
컨피그 서버중 1대라도 죽으면 컨피그 서버의 메타 데이터는 읽기 전용이된다.
샤딩용 데이터 목록만 저장하고 있기 때문에 많은 자원을 소모하지 않는다.
옵션 --configsvr 는 --port 27019 --dbpath /data/configdb 를 추가하는 기능만 있음
덥어 쓸수 있음

구성 서버 데이터를 자주 백업 받고 유지보수 작업시에도 반드시 데이터를 백업 받자

mongod --configsvr --dbpath /test/configsvr/server1  --logpath /test/log/config_server_1 --fork --port 28001
mongod --configsvr --dbpath /test/configsvr/server2  --logpath /test/log/config_server_2 --fork --port 28002
mongod --configsvr --dbpath /test/configsvr/server3  --logpath /test/log/config_server_3 --fork --port 28003

1.2 몽고s 뛰우기
컨피그 서버가 뜬다음에 뛰울수 있다.

mongos --configdb 127.0.0.1:28001,127.0.0.1:28002,127.0.0.1:28003 --logpath /test/log/mongos_1 --fork --port 10000

1.3 이미 있는 복제셋 추가하기
mongo --port 10000
sh.addShard('rs0/127.0.0.1:27001,127.0.0.1:27002,127.0.0.1:27003')

sh.status()
--- Sharding Status ---
 sharding version: {
"_id" : 1,
"version" : 4,
"minCompatibleVersion" : 4,
"currentVersion" : 5,
"clusterId" : ObjectId("543a70e0e74f6e2fe12c8638")
}
shards:
{  "_id" : "rs0",  "host" : "rs0/127.0.0.1:27001,127.0.0.1:27002,127.0.0.1:27003" }
databases:
{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
{  "_id" : "test",  "partitioned" : false,  "primary" : "rs0" }

1.4 mongos 가 뛰어 졌으면 샤드에 직접적으로 접속 하지 못하게 방화벽 규칙을 설정한다.
1.5 샤딩을 추가할떄는 빈 복제셋을 추가하면된다.
샤드 별로 다른 디비를 만들어서 추가 할수 도 있다.
이럴 경우 디비 별로 샤딩 된다.

1.6 테스트2 복제 셋을 만들어서 샤딩에 추가해보
디렉토리를 만들자
cd test
mkdir rs1
mkdir server1
mkdir server2
mkdir server3

mongod --port 29001 --dbpath /test/rs1/server1 --replSet 'rs1' --logpath /test/log/rs1_server_1 --fork
mongod --port 29002 --dbpath /test/rs1/server2 --replSet 'rs1' --logpath /test/log/rs1_server_2 --fork
mongod --port 29003 --dbpath /test/rs1/server3 --replSet 'rs1' --logpath /test/log/rs1_server_3 --fork

mongo --port 29001
var rsconfig = {"_id":"rs1", "members":[{"_id":1, "host":"127.0.0.1:29001"},{"_id":2, "host":"127.0.0.1:29002"},{"_id":3, "host":"127.0.0.1:29003"}]}

rs.initiate(rsconfig)

use test2
function insertTest(count){
for(var i = 0; i< count; i++){
db.test1.insert({a:i, b:i});
}
}

insertTest(1000);

> mongos 접속
sh.addShard('rs1/127.0.0.1:29001,127.0.0.1:29002,127.0.0.1:29003')

1.7 샤딩하기
디비를 샤딩한다.
> mongos 접속
use test
sh.enableSharding('test')db.enableSharding('test');

sh.status()
 databases:
{  "_id" : "admin",  "partitioned" : false,  "primary" : "config" }
{  "_id" : "test",  "partitioned" : true,  "primary" : "rs0" }
{  "_id" : "test2",  "partitioned" : false,  "primary" : "rs1" }

partitioned true 확인

1.8 컬랙션 샤딩하기
db.test1.ensureIndex({a:1})
샤딩 키에 인덱스가 없으면 에러가 발생한다.
sh.shardCollection('test.test1',{a:1})

function insertTest(count){
for(var i = 0; i< count; i++){
db.test1.insert({a:i, b:i});
}
}

insertTest(10000);
sh.status()
databases:
{  "_id" : "test",  "partitioned" : true,  "primary" : "rs0" }
test.test1
shard key: { "a" : 1 }
chunks:
rs1 1
rs0 1
{ "a" : { "$minKey" : 1 } } -->> { "a" : 0 } on : rs1 Timestamp(2, 0)
{ "a" : 0 } -->> { "a" : { "$maxKey" : 1 } } on : rs0 Timestamp(2, 1)
아래와 같이 청크가 샤딩 된걸 확일 할수 있다.