Gisida님의 Database Operator In Kubernetes study(=DOIK) 스터디 진행 중 테스트 한 내용입니다.
Percona Distribution for MongoDB - 샤딩 (3/3)
1. MongoDB 샤드 구성
2. MongoDB 샤드정보 확인
3. MongoDB 샤딩 테스트
- Shard : 데이터베이스의 Replica Set
- Mongos : 클라이언트 애플리케이션의 쿼리를 처리하는 라우터
- Config Servers : Replica Set 의 메타데이터와 샤드 클러스터의 정보를 저장
- 샤드 접근 : mongos Pods - query routers, which acts as an entry point for client applications,
1. MongoDB 샤드 구성
▶ 샤드구성 및 테스트를 위해 이전에 생성하였던 파드들 삭제
$ kubectl delete psmdb $MYNICK-db
$ kubectl get pod -l app.kubernetes.io/instance=miny-db -owide
▶ 파드삭제 확인 후 PVC삭제
$ kubectl delete pvc -l app.kubernetes.io/instance=miny-db
▶ yaml 파일 확인
$ ls -lrt ~/DOIK/4/mycluster2.yaml
-rw-r--r-- 1 root root 14657 Jun 19 11:24 /root/DOIK/4/mycluster2.yaml
▶ 클러스터 생성 : 복제 셋 2개(rs-0, rs1), mongos(파드 3개), cfg(파드 3개)
$ MYNICK=miny
$ MYCLUSTERNAME=$MYNICK envsubst < ~/DOIK/4/mycluster2.yaml | kubectl apply -f -
▶ 클러스터 생성 정보 확인
$ kubectl get psmdb
NAME ENDPOINT STATUS AGE
miny-db initializing 2m2s
▶ 클러스터 파드정보 확인
$ kubectl get pod -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
miny-db-cfg-0 1/1 Running 0 75s 172.16.3.6 k8s-w3 <none> <none>
miny-db-cfg-1 1/1 Running 0 55s 172.16.1.8 k8s-w1 <none> <none>
miny-db-cfg-2 1/1 Running 0 35s 172.16.2.11 k8s-w2 <none> <none>
miny-db-rs0-0 1/1 Running 0 75s 172.16.1.6 k8s-w1 <none> <none>
miny-db-rs0-1 1/1 Running 0 55s 172.16.3.9 k8s-w3 <none> <none>
miny-db-rs0-2 1/1 Running 0 32s 172.16.2.12 k8s-w2 <none> <none>
miny-db-rs1-0 1/1 Running 0 75s 172.16.2.8 k8s-w2 <none> <none>
miny-db-rs1-1 1/1 Running 0 53s 172.16.3.10 k8s-w3 <none> <none>
miny-db-rs1-2 1/1 Running 0 30s 172.16.1.10 k8s-w1 <none> <none>
$ kubectl get sts -owide
NAME READY AGE CONTAINERS IMAGES
miny-db-cfg 3/3 90s mongod percona/percona-server-mongodb:5.0.7-6
miny-db-rs0 3/3 90s mongod percona/percona-server-mongodb:5.0.7-6
miny-db-rs1 3/3 90s mongod percona/percona-server-mongodb:5.0.7-6
▶ 클러스터 서비스 정보 확인
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
miny-db-cfg ClusterIP None <none> 27017/TCP 108s
miny-db-mongos ClusterIP 10.200.1.49 <none> 27017/TCP 17s
miny-db-rs0 ClusterIP None <none> 27017/TCP 108s
miny-db-rs1 ClusterIP None <none> 27017/TCP 108s
▶ 클러스터 엔드포인트, 엔드포인트슬라이스 정보 확인
$ kubectl get endpoints,endpointslice
NAME ENDPOINTS AGE
endpoints/miny-db-cfg 172.16.1.8:27017,172.16.2.11:27017,172.16.3.6:27017 2m1s
endpoints/miny-db-mongos 172.16.1.11:27017,172.16.3.11:27017 30s
endpoints/miny-db-rs0 172.16.1.6:27017,172.16.2.12:27017,172.16.3.9:27017 2m1s
endpoints/miny-db-rs1 172.16.1.10:27017,172.16.2.8:27017,172.16.3.10:27017 2m1s
NAME ADDRESSTYPE PORTS ENDPOINTS AGE
endpointslice.discovery.k8s.io/miny-db-cfg-hnbz5 IPv4 27017 172.16.3.6,172.16.1.8,172.16.2.11 2m1s
endpointslice.discovery.k8s.io/miny-db-mongos-fbtc6 IPv4 27017 172.16.1.11,172.16.3.11 30s
endpointslice.discovery.k8s.io/miny-db-rs0-fjgc4 IPv4 27017 172.16.1.6,172.16.3.9,172.16.2.12 2m1s
endpointslice.discovery.k8s.io/miny-db-rs1-m6ts6 IPv4 27017 172.16.2.8,172.16.3.10,172.16.1.10 2m1s
▶ (옵션) 설치 리소스 확인
$ kubectl get all --namespace=psmdb
2. MongoDB 샤드정보 확인
▶ mongos 라우터 접속 서비스 정보 확인
$ kubectl get svc miny-db-mongos
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
miny-db-mongos ClusterIP 10.200.1.49 <none> 27017/TCP 5m41s
▶ [터미널1] 클러스터 접속(ADMIN_USER)
kubectl exec -it myclient1 -- mongo --quiet "mongodb://userAdmin:userAdmin123456@miny-db-mongos.psmdb.svc.cluster.local/admin?ssl=false"
mongos> db
admin
mongos> show dbs
admin 0.000GB
config 0.003GB
▶ [터미널2] 클러스터 접속(CLUSTER_USER)
$ kubectl exec -it myclient2 -- mongo --quiet "mongodb://clusterAdmin:clusterAdmin123456@miny-db-mongos.psmdb.svc.cluster.local/admin?ssl=false"
mongos> use config
switched to db config
▶ [터미널2] 샤드 목록 정보 확인
mongos> db.shards.find().pretty()
{{
"_id" : "rs0",
"host" : "rs0/miny-db-rs0-0.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-1.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-2.miny-db-rs0.psmdb.svc.cluster.local:27017",
"state" : 1,
"topologyTime" : Timestamp(1655635914, 2)
}
{
"_id" : "rs1",
"host" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017",
"state" : 1,
"topologyTime" : Timestamp(1655635917, 2)
}
▶ 샤드 클러스터 상태 확인 : 기본 정보, 샤드 정보, 밸런서 정보, 샤딩 설정이 된 컬렉션 정보, 청크 정보 등 출력
mongos> sh.help()
mongos> sh.status({"verbose":1}) # 모든 정보 출력
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("62aeff70e9827296b1244a76")
}
shards: # 샤드 정보, 샤드의 상태 state 정보
{ "_id" : "rs0", "host" : "rs0/miny-db-rs0-0.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-1.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-2.miny-db-rs0.psmdb.svc.cluster.local:27017", "state" : 1, "topologyTime" : Timestamp(1655635914, 2) }
{ "_id" : "rs1", "host" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017", "state" : 1, "topologyTime" : Timestamp(1655635917, 2) }
active mongoses: # 라우터 정보
"5.0.7-6" : 3
autosplit:
Currently enabled: yes
balancer: # 밸런서 정보 : 활성화 여부, 현재 작동 여부, 밸런싱 실패한 횟수나 24시간 이내에 몇번이나 '청크 이동 migration'이 있었는지 확인 >> 불필요한 청크 이동 점검 확인
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration results for the last 24 hours:
322 : Success
databases: # 데이터베이스 정보 : 샤드 클러스터에서 admin 과 config 를 제외한 데이터베이스 정보를 표시
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
rs0 702
rs1 322
too many chunks to print, use verbose if you want to force print
▶ (옵션) 설정 서버에 저장된 메타데이터 확인
mongos> show collections
changelog # 메타메이터가 변경된 내용을 기록한 목록
chunks # 샤딩된 컬렉션의 청크 정보, 어떤 샤드에 어떤 범위로 있는지 확인 가능
collections # 샤드 클러스터 컬렉션 목록
image_collection #
lockpings # 샤드 클러스터의 구성원이 서로의 연결상태를 확인한 일시가 있는 목록
locks # 컬렉션 잠금에 대한 목록. 서로 다른 mongos 가 보낸 명령 충돌을 방지한다
migrations
mongos # 실행중인 라우터 mongos 목록
reshardingOperations
shards # 샤드 클러스터에 등록된 샤드 목록
tags
transactions
version # 샤드 클러스터 메타데이터 전체에 대한 버전 정보, 동기화를 위한 필요
mongos> db.changelog.find().pretty() # 메타메이터가 변경된 내용을 기록한 목록
mongos> db.chunks.find().pretty() # 샤딩된 컬렉션의 청크 정보, 어떤 샤드에 어떤 범위로 있는지 확인 가능
3. MongoDB 샤딩 작동 테스트
▶ [터미널1] 클러스터 접속 (miny)
$ kubectl exec -it myclient1 -- mongo --quiet "mongodb://miny:qwe123@$MYNICK-db-mongos.psmdb.svc.cluster.local/admin?ssl=false"
mongos> db
admin
mongos> show dbs
admin 0.000GB
config 0.004GB
▶ [터미널1] miny 테이터베이스 선택(없으면 데이터베이스 생성됨)
mongos> use miny
switched to db miny
▶ [터미널1] 도큐먼트 추가
mongos> db.test.insertOne({ hello: 'world' })
{
"acknowledged" : true,
"insertedId" : ObjectId("62af0410e9a3c358d161d33e")
}
▶ [터미널1] 콜렉션에서 도큐먼트 조회
mongos> db.test.find()
{ "_id" : ObjectId("62af0410e9a3c358d161d33e"), "hello" : "world" }
mongos>
mongos> db.test.find({},{_id:0})
{ "hello" : "world" }
▶ [터미널2] 클러스터 접속(CLUSTER_USER)
$ kubectl exec -it myclient2 -- mongo --quiet "mongodb://clusterAdmin:clusterAdmin123456@miny-db-mongos.psmdb.svc.cluster.local/admin?ssl=false"
mongos> use config
switched to db config
▶ [터미널2] 샤드 클러스터 상태 확인 : 기본 정보, 샤드 정보, 밸런서 정보, 샤딩 설정이 된 컬렉션 정보, 청크 정보 등 출력
mongos> sh.status()
--- Sharding Status ---
sharding version: {
"_id" : 1,
"minCompatibleVersion" : 5,
"currentVersion" : 6,
"clusterId" : ObjectId("62aeff70e9827296b1244a76")
}
shards:
{ "_id" : "rs0", "host" : "rs0/miny-db-rs0-0.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-1.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-2.miny-db-rs0.psmdb.svc.cluster.local:27017", "state" : 1, "topologyTime" : Timestamp(1655635914, 2) }
{ "_id" : "rs1", "host" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017", "state" : 1, "topologyTime" : Timestamp(1655635917, 2) }
active mongoses:
"5.0.7-6" : 3
autosplit:
Currently enabled: yes
balancer:
Currently enabled: yes
Currently running: no
Failed balancer rounds in last 5 attempts: 0
Migration results for the last 24 hours:
512 : Success
databases:
{ "_id" : "config", "primary" : "config", "partitioned" : true }
config.system.sessions
shard key: { "_id" : 1 }
unique: false
balancing: true
chunks:
rs0 512
rs1 512
too many chunks to print, use verbose if you want to force print
{ "_id" : "miny", "primary" : "rs1", "partitioned" : false, "version" : { "uuid" : UUID("19512d28-7dff-4546-ba4e-4bbe326de163"), "timestamp" : Timestamp(1655637008, 3), "lastMod" : 1 } }
▶ miny 데이터베이스에서 샤딩을 활성화
mongos> sh.enableSharding("miny")
{
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1655637193, 2),
"signature" : {
"hash" : BinData(0,"BTU65ZaIuCdE3HXqddNVutErGkE="),
"keyId" : NumberLong("7110901718166011919")
}
},
"operationTime" : Timestamp(1655637193, 2)
}
▶ 샤딩 테스트를 위한 chunksize 변경 : 기본 64MB -> 1MB
mongos> db.settings.save({_id: "chunksize", value: 1})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : "chunksize" })
mongos> db.settings.find()
{ "_id" : "chunksize", "value" : 1 }
▶ [터미널1] 샤딩 활성화를 위해서 샤딩하려는 키에 해시 인덱스를 생성
mongos> db.test.createIndex({"username" : "hashed"})
## 혹은 인덱스 생성
mongos> db.test.createIndex({"username" : 1})
▶ [터미널2] 클러스터 접속(CLUSTER_USER) : 이제 "username" 으로 컬렉션을 샤딩할 수 있다
mongos> sh.shardCollection("miny.test", {"username" : "hashed"})
## 혹은
mongos> sh.shardCollection("miny.test", {"username" : 1})
## 몇 분 기다렸다가 다시 샤드 클러스터 상태 확인 : 휠씬 많은 정보가 표시됨
mongos> sh.status()
▶ [터미널1] 클러스터 접속(miny) : 대량의 도큐먼트 생성 (10분 넘게 소요)
mongos> for (i=0; i<100000; i++) {db.test.insert({"username" : "user"+i, "created_at" : new Date()})}
▶ [터미널2] 클러스터 접속(CLUSTER_USER) : 콜렉션 조회
$ kubectl exec -it myclient3 -- mongo --quiet "mongodb://miny:qwe123@miny-db-mongos.psmdb.svc.cluster.local/admin?ssl=false"
mongos> use miny
switched to db miny
mongos> db.test.find({},{_id:0})
~
~
mongos> db.test.count()
6605
mongos> db.test.count()
6639
mongos> db.test.count()
6653
▶ [터미널2] 데이터가 여러 샤드에 분산됐으므로 몇 가지 쿼리를 시도해서 확인 : 쿼리 정상 작동 확인
mongos> db.test.find({username: "user1234"})
▶ 쿼리 explain 확인
mongos> db.test.find({username: "user1234"})
{ "_id" : ObjectId("62af058ee9a3c358d161d811"), "username" : "user1234", "created_at" : ISODate("2022-06-19T11:16:30.865Z") }
mongos>
mongos> db.test.find({username: "user1234"}).explain()
{
"queryPlanner" : {
"mongosPlannerVersion" : 1,
"winningPlan" : {
"stage" : "SINGLE_SHARD",
"shards" : [
{
"shardName" : "rs1",
"connectionString" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017",
"serverInfo" : {
"host" : "miny-db-rs1-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"namespace" : "miny.test",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "user1234"
}
},
"queryHash" : "379E82C5",
"planCacheKey" : "44E4BA17",
"maxIndexedOrSolutionsReached" : false,
"maxIndexedAndSolutionsReached" : false,
"maxScansToExplodeReached" : false,
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"username" : {
"$eq" : "user1234"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : "hashed"
},
"indexName" : "username_hashed",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[8720327145141812260, 8720327145141812260]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : 1
},
"indexName" : "username_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"username" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[\"user1234\", \"user1234\"]"
]
}
}
}
]
}
]
}
},
"serverInfo" : {
"host" : "miny-db-mongos-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"serverParameters" : {
"internalQueryFacetBufferSizeBytes" : 104857600,
"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
"internalQueryProhibitBlockingMergeOnMongoS" : 0,
"internalQueryMaxAddToSetBytes" : 104857600,
"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
},
"command" : {
"find" : "test",
"filter" : {
"username" : "user1234"
},
"lsid" : {
"id" : UUID("0cfa7055-cc02-4b84-b8d0-c6288c29cac9")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1655637511, 16),
"signature" : {
"hash" : BinData(0,"S2V182rlL4p+XCcOqBiYTcOXY3A="),
"keyId" : NumberLong("7110901718166011919")
}
},
"$db" : "miny"
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1655637511, 54),
"signature" : {
"hash" : BinData(0,"S2V182rlL4p+XCcOqBiYTcOXY3A="),
"keyId" : NumberLong("7110901718166011919")
}
},
"operationTime" : Timestamp(1655637511, 54)
}
mongos> db.test.find({username: "user9851"}).explain()
{
"queryPlanner" : {
"mongosPlannerVersion" : 1,
"winningPlan" : {
"stage" : "SINGLE_SHARD",
"shards" : [
{
"shardName" : "rs1",
"connectionString" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017",
"serverInfo" : {
"host" : "miny-db-rs1-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"namespace" : "miny.test",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "user9851"
}
},
"queryHash" : "379E82C5",
"planCacheKey" : "44E4BA17",
"maxIndexedOrSolutionsReached" : false,
"maxIndexedAndSolutionsReached" : false,
"maxScansToExplodeReached" : false,
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"username" : {
"$eq" : "user9851"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : "hashed"
},
"indexName" : "username_hashed",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[-8090243295106338627, -8090243295106338627]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : 1
},
"indexName" : "username_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"username" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[\"user9851\", \"user9851\"]"
]
}
}
}
]
}
]
}
},
"serverInfo" : {
"host" : "miny-db-mongos-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"serverParameters" : {
"internalQueryFacetBufferSizeBytes" : 104857600,
"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
"internalQueryProhibitBlockingMergeOnMongoS" : 0,
"internalQueryMaxAddToSetBytes" : 104857600,
"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
},
"command" : {
"find" : "test",
"filter" : {
"username" : "user9851"
},
"lsid" : {
"id" : UUID("0cfa7055-cc02-4b84-b8d0-c6288c29cac9")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1655637531, 97),
"signature" : {
"hash" : BinData(0,"SUDWaCT/o/FNAS+KkrAevS7dosI="),
"keyId" : NumberLong("7110901718166011919")
}
},
"$db" : "miny"
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1655637532, 85),
"signature" : {
"hash" : BinData(0,"Z70Dtg6rAkZhlOM0ykjg1R6hUlM="),
"keyId" : NumberLong("7110901718166011919")
}
},
"operationTime" : Timestamp(1655637532, 85)
}
mongos> db.test.find({username: "user9851"}).explain()
{
"queryPlanner" : {
"mongosPlannerVersion" : 1,
"winningPlan" : {
"stage" : "SINGLE_SHARD",
"shards" : [
{
"shardName" : "rs1",
"connectionString" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017",
"serverInfo" : {
"host" : "miny-db-rs1-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"namespace" : "miny.test",
"indexFilterSet" : false,
"parsedQuery" : {
"username" : {
"$eq" : "user9851"
}
},
"queryHash" : "379E82C5",
"planCacheKey" : "44E4BA17",
"maxIndexedOrSolutionsReached" : false,
"maxIndexedAndSolutionsReached" : false,
"maxScansToExplodeReached" : false,
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"username" : {
"$eq" : "user9851"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : "hashed"
},
"indexName" : "username_hashed",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[-8090243295106338627, -8090243295106338627]"
]
}
}
},
"rejectedPlans" : [
{
"stage" : "FETCH",
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"username" : 1
},
"indexName" : "username_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"username" : [ ]
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"username" : [
"[\"user9851\", \"user9851\"]"
]
}
}
}
]
}
]
}
},
"serverInfo" : {
"host" : "miny-db-mongos-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"serverParameters" : {
"internalQueryFacetBufferSizeBytes" : 104857600,
"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
"internalQueryProhibitBlockingMergeOnMongoS" : 0,
"internalQueryMaxAddToSetBytes" : 104857600,
"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
},
"command" : {
"find" : "test",
"filter" : {
"username" : "user9851"
},
"lsid" : {
"id" : UUID("0cfa7055-cc02-4b84-b8d0-c6288c29cac9")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1655637531, 97),
"signature" : {
"hash" : BinData(0,"SUDWaCT/o/FNAS+KkrAevS7dosI="),
"keyId" : NumberLong("7110901718166011919")
}
},
"$db" : "miny"
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1655637532, 85),
"signature" : {
"hash" : BinData(0,"Z70Dtg6rAkZhlOM0ykjg1R6hUlM="),
"keyId" : NumberLong("7110901718166011919")
}
},
"operationTime" : Timestamp(1655637532, 85)
}
mongos>
mongos>
mongos>
mongos> db.test.find().explain()
{
"queryPlanner" : {
"mongosPlannerVersion" : 1,
"winningPlan" : {
"stage" : "SINGLE_SHARD",
"shards" : [
{
"shardName" : "rs1",
"connectionString" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017",
"serverInfo" : {
"host" : "miny-db-rs1-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"namespace" : "miny.test",
"indexFilterSet" : false,
"parsedQuery" : {
},
"queryHash" : "8B3D4AB8",
"planCacheKey" : "D542626C",
"maxIndexedOrSolutionsReached" : false,
"maxIndexedAndSolutionsReached" : false,
"maxScansToExplodeReached" : false,
"winningPlan" : {
"stage" : "SHARDING_FILTER",
"inputStage" : {
"stage" : "COLLSCAN",
"direction" : "forward"
}
},
"rejectedPlans" : [ ]
}
]
}
},
"serverInfo" : {
"host" : "miny-db-mongos-0",
"port" : 27017,
"version" : "5.0.7-6",
"gitVersion" : "5215aa3f853ea97640cdabf0b48861b0d53bfac3"
},
"serverParameters" : {
"internalQueryFacetBufferSizeBytes" : 104857600,
"internalQueryFacetMaxOutputDocSizeBytes" : 104857600,
"internalLookupStageIntermediateDocumentMaxSizeBytes" : 104857600,
"internalDocumentSourceGroupMaxMemoryBytes" : 104857600,
"internalQueryMaxBlockingSortMemoryUsageBytes" : 104857600,
"internalQueryProhibitBlockingMergeOnMongoS" : 0,
"internalQueryMaxAddToSetBytes" : 104857600,
"internalDocumentSourceSetWindowFieldsMaxMemoryBytes" : 104857600
},
"command" : {
"find" : "test",
"filter" : {
},
"lsid" : {
"id" : UUID("0cfa7055-cc02-4b84-b8d0-c6288c29cac9")
},
"$clusterTime" : {
"clusterTime" : Timestamp(1655637544, 73),
"signature" : {
"hash" : BinData(0,"kr5X6ehe5R+HYkQurVYUNazLpzM="),
"keyId" : NumberLong("7110901718166011919")
}
},
"$db" : "miny"
},
"ok" : 1,
"$clusterTime" : {
"clusterTime" : Timestamp(1655637545, 25),
"signature" : {
"hash" : BinData(0,"xiO9RwpmXoPnf2ThxbS8C1YdhKM="),
"keyId" : NumberLong("7110901718166011919")
}
},
"operationTime" : Timestamp(1655637545, 25)
}
▶ [터미널2] 클러스터 접속(CLUSTER_USER) : 클러스터 내 모든 샤드정보 출력
mongos> db.shards.find()
{ "_id" : "rs0", "host" : "rs0/miny-db-rs0-0.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-1.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-2.miny-db-rs0.psmdb.svc.cluster.local:27017", "state" : 1, "topologyTime" : Timestamp(1655635914, 2) }
{ "_id" : "rs1", "host" : "rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017", "state" : 1, "topologyTime" : Timestamp(1655635917, 2) }
▶ 클러스터가 알고 있는 모든 샤딩 데이터베이스 출력 : enableSharding 실행된 데이터베이스이며, partitioned 가 true
mongos> db.databases.find()
{ "_id" : "miny", "primary" : "rs1", "partitioned" : true, "version" : { "uuid" : UUID("19512d28-7dff-4546-ba4e-4bbe326de163"), "timestamp" : Timestamp(1655637008, 3), "lastMod" : 1 } }
▶ 샤딩된 컬렉션 출력
mongos> db.collections.find().pretty()
{
"_id" : "config.system.sessions",
"lastmodEpoch" : ObjectId("62af00757528961fdb9a7bbb"),
"lastmod" : ISODate("2022-06-19T10:54:45.361Z"),
"timestamp" : Timestamp(1655636085, 4),
"uuid" : UUID("38908292-3367-441f-b4a1-d046eb08154e"),
"key" : {
"_id" : 1
},
"unique" : false,
"noBalance" : false
}
{
"_id" : "miny.test",
"lastmodEpoch" : ObjectId("62af0551a67700e48f89a99c"),
"lastmod" : ISODate("2022-06-19T11:15:29.461Z"),
"timestamp" : Timestamp(1655637329, 12),
"uuid" : UUID("98747d3a-4fd0-4aa9-8e1c-912191cc5db5"),
"key" : {
"username" : "hashed"
},
"unique" : false,
"noBalance" : false
}
▶ 모든 컬렉션 내의 청크 기록
mongos> db.chunks.find().skip(1).limit(3).pretty()
{
"_id" : ObjectId("62af007ee9827296b1245dcd"),
"uuid" : UUID("38908292-3367-441f-b4a1-d046eb08154e"),
"min" : {
"_id" : {
"id" : UUID("00400000-0000-0000-0000-000000000000")
}
},
"max" : {
"_id" : {
"id" : UUID("00800000-0000-0000-0000-000000000000")
}
},
"shard" : "rs1",
"lastmod" : Timestamp(3, 0),
"history" : [
{
"validAfter" : Timestamp(1655636100, 19),
"shard" : "rs1"
},
{
"validAfter" : Timestamp(1655636085, 4),
"shard" : "rs0"
}
]
}
{
"_id" : ObjectId("62af007ee9827296b1245dce"),
"uuid" : UUID("38908292-3367-441f-b4a1-d046eb08154e"),
"min" : {
"_id" : {
"id" : UUID("00800000-0000-0000-0000-000000000000")
}
},
"max" : {
"_id" : {
"id" : UUID("00c00000-0000-0000-0000-000000000000")
}
},
"shard" : "rs1",
"lastmod" : Timestamp(4, 0),
"history" : [
{
"validAfter" : Timestamp(1655636102, 8),
"shard" : "rs1"
},
{
"validAfter" : Timestamp(1655636085, 4),
"shard" : "rs0"
}
]
}
{
"_id" : ObjectId("62af007ee9827296b1245dcf"),
"uuid" : UUID("38908292-3367-441f-b4a1-d046eb08154e"),
"min" : {
"_id" : {
"id" : UUID("00c00000-0000-0000-0000-000000000000")
}
},
"max" : {
"_id" : {
"id" : UUID("01000000-0000-0000-0000-000000000000")
}
},
"shard" : "rs1",
"lastmod" : Timestamp(5, 0),
"history" : [
{
"validAfter" : Timestamp(1655636103, 10),
"shard" : "rs1"
},
{
"validAfter" : Timestamp(1655636085, 4),
"shard" : "rs0"
}
]
}
▶ 분할과 마이그레이션 기록 확인
mongos> db.changelog.find().pretty()
mongos> db.test.getShardDistribution()
Shard rs1 at rs1/miny-db-rs1-0.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-1.miny-db-rs1.psmdb.svc.cluster.local:27017,miny-db-rs1-2.miny-db-rs1.psmdb.svc.cluster.local:27017
data : 1.91MiB docs : 30523 chunks : 1
estimated data per chunk : 1.91MiB
estimated docs per chunk : 30523
Shard rs0 at rs0/miny-db-rs0-0.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-1.miny-db-rs0.psmdb.svc.cluster.local:27017,miny-db-rs0-2.miny-db-rs0.psmdb.svc.cluster.local:27017
data : 1.19MiB docs : 19050 chunks : 1
estimated data per chunk : 1.19MiB
estimated docs per chunk : 19050
Totals
data : 3.1MiB docs : 49573 chunks : 2
Shard rs1 contains 61.54% data, 61.57% docs in cluster, avg obj size on shard : 65B
Shard rs0 contains 38.45% data, 38.42% docs in cluster, avg obj size on shard : 65B
'K8S' 카테고리의 다른 글
MySQL Operator based on Percona (0) | 2022.06.22 |
---|---|
Cloud Native PostgreSQL 오퍼레이터 (0) | 2022.06.22 |
Percona Distribution for MongoDB 오퍼레이터 - 복제 (2/3) (0) | 2022.06.19 |
Percona Distribution for MongoDB 오퍼레이터 - 기본설치 (1/3) (0) | 2022.06.19 |
Helm을 이용해 K8S에 MariaDB Galera 설치하기 (0) | 2022.05.29 |