Sharding : 파티션, 데이터를 나누는 방법
Replica Set : 복제 셋(복구의 용도)
-> 둘은 거의 같이 사용
-> Shard는 홀수로 7개이상 하는 것을 권장
Shard key : index와 비슷
- chunk단위(하나의 온전한 단위)로 나누기 쉬워야 한다.
- shard에 64mb까지 가능.
- 일반적인 document라고 생각.
- _id 키로 설정하면 데이터가 한 곳에 몰릴 가능성이 존재.
(why? 시간에 따라서 id가 설정되기 때문에)
폴더 구조
shard -> -config 1
-config 2
-config 3
-shard -> -shard1 ->shardRep1,2,3 -> data -> db
-shard2 ->shardRep1,2,3 -> data -> db
-shard3 ->shardRep1,2,3 -> data -> db
config서버로 만들겠다?
mongod --configsvr --replSet <세트이름> --dbpath <config 서버 경로> --port
mongod --configsvr --replSet configRepl --dbpath C:\Users\bit-user\Desktop\김동운\shard\config1 --port 20001
mongod --configsvr --replSet configRepl --dbpath C:\Users\bit-user\Desktop\김동운\shard\config2 --port 20002
mongod --configsvr --replSet configRepl --dbpath C:\Users\bit-user\Desktop\김동운\shard\config3 --port 20003
//경로 C:\Users\bit-user\Desktop\김동운\shard\config3
config 서버에 접속
//접속한 20001번 port의 config server가 primary가 됨.
mongo --host localhost --port 20001
config서버 묶는 작업 :
-샤딩을 위한 ConfigServer들을 등록.
-다른 컴퓨터를 다룰 때는, localhost -> ip address
>rs.initiate({_id:"configRepl", configsvr:true, members:[{_id:0, host: "localhost:20001"},{_id:2, host: "localhost:20002"},{_id:3, host: "localhost:20003"}] })
rs.initiate(
{
_id:"configRepl",
configsvr:true,
members:[
{_id:value, host:"ip_address:port"},
{_id:value, host:"ip_address:port"},
{_id:value, host:"ip_address:port"}
]
}
)
Shard 서버
mongod --shardsvr --replSet <세트이름> --dbpath <shard sever path> --port 30001
mongod --shardsvr --replSet shardRepl1 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard1\shardRep1\data\db --port 30011
mongod --shardsvr --replSet shardRepl1 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard1\shardRep2\data\db --port 30012
mongod --shardsvr --replSet shardRepl1 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard1\shardRep3\data\db --port 30013
mongod --shardsvr --replSet shardRepl2 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard2\shardRep1\data\db --port 30021
mongod --shardsvr --replSet shardRepl2 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard2\shardRep2\data\db --port 30022
mongod --shardsvr --replSet shardRepl2 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard2\shardRep3\data\db --port 30023
mongod --shardsvr --replSet shardRepl3 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard3\shardRep1\data\db --port 30031
mongod --shardsvr --replSet shardRepl3 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard3\shardRep2\data\db --port 30032
mongod --shardsvr --replSet shardRepl3 --dbpath C:\Users\bit-user\Desktop\김동운\shard\shard\shard3\shardRep3\data\db --port 30033
mongo --host localhost --port 30011
mongo --host localhost --port 30021
mongo --host localhost --port 30031
rs.initiate(
{
_id:"shardRepl1",
shardsvr:true,
members:[
{_id:0, host:"localhost:30011"},
{_id:1, host:"localhost:30012"},
{_id:2, host:"localhost:30013"}
]
}
)
rs.initiate({_id:"shardRepl1", members:[{_id:0, host:"localhost:30011"},{_id:1, host:"localhost:30012"},{_id:2, host:"localhost:30013"}]})
rs.initiate({_id:"shardRepl2", members:[{_id:0, host:"localhost:30021"},{_id:1, host:"localhost:30022"},{_id:2, host:"localhost:30023"}]})
rs.initiate({_id:"shardRepl3", members:[{_id:0, host:"localhost:30031"},{_id:1, host:"localhost:30032"},{_id:2, host:"localhost:30033"}]})
5) mongos 연결하기 (클라이언트 위한 통로 만들기)
mongos --configdb <configReplSetName>/<host:port>,<host:port>,<host:port> --port 20000
mongos --configdb configRepl/localhost:20001,localhost:20002,localhost:20003 --port 20000
//20000번 포트로 몽고스 연결, config로 가는 mongos를 연결하겠다.
//직접 못가니깐 20000번 포트를 사용하겠다.
mongos 연결
mongo localhost:20000
Shard 붙이기(연결) //기존에 샤드를 결합했으므로 primary 들만 추가해주면 됨.
sh.addShard("<replSetName>/<localhost:port>")
sh.addShard("shardRepl1/localhost:30011")
sh.addShard("shardRepl2/localhost:30021")
sh.addShard("shardRepl3/localhost:30031")
sh.status()
//Sharding 가능한 데이터베이스 등록
sh.enableSharding("<database>")
sh.enableSharding("hellomongo")
//샤딩 설정전 컬렉션의 인덱스를 먼저 걸어줘야 한다.
use hellomongo
db.employees.createIndex({empno:1})
//인덱스를 통해 샤드 키를 생서하기 위해
//관리자 권한을 실행할 것.
use admin
>sh.shardCollection("<database>.<collection>", {<key> : <direction>})
sh.shardCollection("hellomongo.employees", {empno:"hashed"}) //샤딩 가능한 컬레션 등록하기(해쉬를 통해 분배되도록)
//샤드 확인
>db.runCommand({listshards:1})
예시 데이터 넣기
for (var n = 1; n<=1000; n++) db.employees.save({empno:n, ename:"test", sal:1000})
db.employees.count()
Direction key
Hashed Shard Key : 유일한 값으로 키 값을 설정하여 데이터가 몰리는 것을 방지
키를 기준으로 분배. (ex : num % 3)
검색 속도를 줄이고, 아이템이 저장된 그룹을 지정.
*검색에 대한 범위를 줄이는 것이 핵심
Ranged Shared Key : 데이터가 한 곳에 몰릴수도 있음.
(0~1000은 shard1, 1001~3000은 shard2, 3001~7000은 shard3)
Master_Slave
서버 실행
mongod --dbpath <path> --port<port_no> --master
//포트는 10000, 옵션을 master로 지정
mongod -dbpath C:\Users\bit-user\Desktop\김동운\repl1\master -port 10000
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl1\slave1 -port 10001 --slave --source <master_ip:master_port_no>
//슬레이브 서버는 마스터 종속도 표기, 마스터는 10000
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl1\slave1 -port 10001 --slave --source localhost:10000
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl1\slave2 -port 10002 --slave --source localhost:10000
마스터 접속
mongo localhost:10000
show dbs //마스터는 조작 가능
슬레이브 접속
mongo localhost:10001
show dbs //일반적으로 볼 수 있는 서버가 아니라 err
//not master and slaveOk = false
rs.slaveOk() //but, 해당 함수를 실행하면 slaveOk = true로 변환
use admin
db.shutdownServer()
del <마스터 경로\>*.* //일반 cmd
del C:\Users\bit-user\Desktop\김동운\repl1\master\*.*
슬레이브 경로에서 마스터경로로 복사
copy <slave1>\*.* <마스터경로>\*.* //일반 cmd
copy C:\Users\bit-user\Desktop\김동운\repl1\slave1\*.* C:\Users\bit-user\Desktop\김동운\repl1\master\*.*
UUID 사용할것
//아비터를 이용한 복구
mongod --dbpath <path> --port 10000 --replSet rptmongo --oplogSize 10 //지정하지 않으면 1GB
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl2\disc1 --port 10000 --replSet rptmongo --oplogSize 10
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl2\disc2 --port 10001 --replSet rptmongo --oplogSize 10
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl2\arbit --port 10002 --replSet rptmongo --oplogSize 10
//서버 접속
mongo localhost:10000/admin
//리플리카 셋 초기화
rs.initiate() //enter 더 쳐서 primary 확인!
disc1 ,disc2, arbit 서버 접속 후
primary server에서 슬레이브를 추가
>rs.add("localhost:10001") //리플리카 셋 추가하는 작업, secondary
아비터 추가
>rs.addArb("<ip_addr>:<port_no>")
>rs.addArb("localhost:10002")
상태확인
>rs.status() //10000 마스터
rs.add("localhost:10001")
rs.addArb("localhost:10002")
rs.status()
//각각 접속하여 secondary, arbiter, primary 확인!
//정보 확인
db.printReplicationInfo()
//슬레이브 정보 확인
db.printSlaveReplicationInfo()
mongo localhost:1000/admin
//primary 셧 다운 시켜서
10001(secondary) 접속 후 primary로 바뀌었는지 확인
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl2\disc1 --port 1000 --replSet rptmongo --oplogSize 10
10001포트 다시 살려서 secondary로 바뀌었는지 확인
mkdir C:\Users\bit-user\Desktop\김동운\repl2\disc3
mongod --dbpath C:\Users\bit-user\Desktop\김동운\repl2\disc3 --port 10004 --replSet rptmongo --oplogSize 10
//disc3 폴더를 생성 후에 해당 서버를 열어라
//기존 primary 서버 접속 mongo
db.printSlaveReplicationInfo()
rs.add("localhost:10004")
primary에서 use hellomongo
db.employees.insert({empno:1101, ename:"hello"})
mongo localhost:10001 //secondary로 접속
rs.slaveOk()
db.employees.find()
//arbiter
//다중 프로세서에서 중재 역할을 함
//서버가 다운되었을 때 다른 서버를 넣어줌.
'SKILL > DATABASE' 카테고리의 다른 글
몽고DB master/slave (2) | 2018.01.06 |
---|---|
몽고db 샤드, 리플리카 (0) | 2018.01.05 |
몽고db JDBC 예제 (0) | 2018.01.03 |
모델링 (0) | 2018.01.03 |
몽고db 실습예제 (0) | 2018.01.02 |