보조 확인 방법이 지금 동기화되었는지 여부
세 개의 구성원(기본, 보조, 보조)이 있는 복제본이 있습니다.보조 장치 중 하나가 하루 동안 작동을 중단하고 보조 장치를 복제본으로 돌아온 후 어떻게 찾을 수 있는지, 아직 동기화되지 않았는지 가정해 보겠습니다.
테스트 환경에서 그렇게 했지만 유용한 데이터를 찾을 수 없었습니다.rs.status()
그리고.db.printReplicationInfo()
.
다음에 "로그 길이 시작부터 끝까지"가 있습니다.db.printReplicationInfo()
하지만 기본적으로 시간이 많이 걸리고 보조 시스템이 다운되면 커집니다.
참고: 아크셀던이 제공하는 답변에서 사용자에게 친숙한 답변을 확인해야 합니다.
의 출력을 사용할 수 있습니다.rs.status()
보조 장치가 동기화되어 생성되지 않은 경우slaveDelay
그때의 선택optime
그리고.optimeDate
secondary의 값은 primary의 값과 같거나 가까워야 합니다(현재 연산이 있는 경우).그런 경우에는stateStr
다음과 같아야 합니다.SECONDARY
따라서 보조 동기화된 경우 다음과 유사한 출력이 표시됩니다(명확한 설명을 위해 한 멤버가 출력에서 제거됨).
{
"set" : "rs0",
"date" : ISODate("2013-11-08T14:58:49Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "hostname:27001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 155,
"optime" : Timestamp(1383915748, 1),
"optimeDate" : ISODate("2013-11-08T13:02:28Z"),
"self" : true
},
{
"_id" : 2,
"name" : "hostname:27003",
"health" : 0,
"state" : 8,
"stateStr" : "SECONDARY",
"uptime" : 0,
"optime" : Timestamp(1383915748, 1),
"optimeDate" : ISODate("2013-11-08T13:02:28Z"),
"lastHeartbeat" : ISODate("2013-11-08T14:58:48Z"),
"lastHeartbeatRecv" : ISODate("2013-11-08T14:58:42Z"),
"pingMs" : 0,
"syncingTo" : "hostname:27001"
}
],
"ok" : 1
}
여기에 의 출력이 있습니다.rs.status()
두 번째 복제본 중 하나가 동기화되지 않은 경우 동일한 복제본 세트에 대해 선택합니다.무엇보다도 당신은 그것을 보게 될 것입니다.optime
그리고.optimeDate
위해서hostname:27003
기본 상태와 다릅니다. stateStr은 다음과 같이 설정됩니다.RECOVERING
그리고 거기에 적절한 것이 있습니다.lastHeartbeatMessage
.
{
"set" : "rs0",
"date" : ISODate("2013-11-08T15:01:34Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "hostname:27001",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 320,
"optime" : Timestamp(1383922858, 767),
"optimeDate" : ISODate("2013-11-08T15:00:58Z"),
"self" : true
},
{
"_id" : 2,
"name" : "hostname:27003",
"health" : 1,
"state" : 3,
"stateStr" : "RECOVERING",
"uptime" : 14,
"optime" : Timestamp(1383915748, 1),
"optimeDate" : ISODate("2013-11-08T13:02:28Z"),
"lastHeartbeat" : ISODate("2013-11-08T15:01:34Z"),
"lastHeartbeatRecv" : ISODate("2013-11-08T15:01:34Z"),
"pingMs" : 0,
"lastHeartbeatMessage" : "still syncing, not yet to minValid optime 527cfc90:19c4",
"syncingTo" : "hostname:27001"
}
],
"ok" : 1
}
보조 장치가 다음을 사용하여 생성된 경우slaveDelay
그리고나서optime
그리고.optimeDate
다를 수 있지만,stateStr
그리고.lastHeartbeatMessage
약간의 지연이 있는지 표시합니다.
2017년 2월 13일 업데이트
승인된 답변에 동의합니다.rs.status()
적절한 정보를 제공하며 기억하기 쉬운 명령입니다.하지만 (개인적으로 현재 Mongo 3를 사용하고 있지만) 의 편리함과 가독성도 매우 좋아합니다.
다음과 같은 출력을 제공합니다.
rs.printSlaveReplicationInfo()
source: node-2:27017
syncedTo: Mon Feb 13 2017 06:15:17 GMT-0500 (EST)
0 secs (0 hrs) behind the primary
source: node-3:27017
syncedTo: Mon Feb 13 2017 06:15:16 GMT-0500 (EST)
1 secs (0 hrs) behind the primary
보다시피 복제본 집합의 노드 간 동기화가 정상인지 여부를 쉽게 파악할 수 있습니다.
@arcseldon은 정답을 제시했지만 rs.printSlaveReplicationInfo()는 곧 삭제됩니다.
rs0:PRIMARY> rs.printSlaveReplicationInfo() 경고: printSlaveReplication정보는 더 이상 사용되지 않으며 다음 주요 릴리스에서 제거될 수 있습니다.printSecondary 복제를 사용하십시오.대신 정보를 제공합니다.
대신 rs.printSecondaryReplicationInfo()를 사용합니다.
rs0:PRIMARY> rs.printSecondaryReplicationInfo()
source: mongo-1.mongo.ns.svc.cluster.local:27017
syncedTo: Sat Sep 26 2020 01:26:32 GMT+0000 (UTC)
10 secs (0 hrs) behind the primary
source: mongo-2.mongo.ns.svc.cluster.local:27017
syncedTo: Sat Sep 26 2020 01:26:32 GMT+0000 (UTC)
10 secs (0 hrs) behind the primary
mongoDB 쉘을 위한 작은 스크립트를 작성했습니다.optime과 optimeDate 사이의 차이를 보여줍니다.수동으로 복제 세트 구성원을 비교하는 대신 사용할 수 있습니다.
var isMaster = rs.isMaster();
var me = isMaster.me;
if(!isMaster.ismaster && isMaster.secondary)
{
var status = rs.status();
var master = isMaster.primary;
var masterOptime = 0;
var masterOptimeDate = 0;
var myOptime = 0;
var myOptimeDate = 0;
for(var i = 0 ; i < status.members.length ; i++)
{
var member = status.members[i];
if(member.name == me)
{
if(member.stateStr == "SECONDARY") {
myOptime = member.optime.getTime();
myOptimeDate = member.optimeDate.getTime();
}
else
{
print(me + ' is out of sync ' + member.stateStr);
break;
}
}
else if(member.name == master)
{
masterOptime = member.optime.getTime();
masterOptimeDate = member.optimeDate.getTime();
}
}
if(myOptime && myOptimeDate)
{
var optimeDiff = masterOptime - myOptime;
var optimeDateDiff = masterOptimeDate - myOptimeDate;
print('optime diff: ' + optimeDiff);
print('optimeDate diff: ' + optimeDateDiff);
}
}
else
{
print(me + ' is not secondary');
}
명령어rs.printSecondaryReplicationInfo()
일 때,즉 2 " 동 가 초 동 된 경 즉 우 화 기 STARTUP2
그러면 출력은 다음과 같습니다.
shard_03:PRIMARY> db.printSecondaryReplicationInfo()
source: mongo-1.mongo.ns.svc.cluster.local:27017
syncedTo: Thu Jan 01 1970 01:00:00 GMT+0100 (CET)
1623062383 secs (450850.66 hrs) behind the primary
초기 동기화가 완료될 수 있는 시점은 표시되지 않습니다.이 값을 얻으려면 기본이 아닌 보조에 연결합니다.
shard_03:STARTUP2> db.printSecondaryReplicationInfo()
source: mongo-2.mongo.ns.svc.cluster.local:27017
InitialSyncSyncSource: mongo-1.mongo.ns.svc.cluster.local:27017
InitialSyncRemainingEstimatedDuration: 1 hour(s) 11 minute(s)
그게 더 유용할 겁니다.
로컬 로그 파일에서 진행률도 확인할 수 있습니다. 다음 예를 참조하십시오.
$ tail -f /var/log/mongodb/mongod.log | grep Repl
{"t":{"$date":"2021-06-07T12:44:57.310+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplWriterWorker-15","msg":"progress meter","attr":{"name":"data.sessions.20210603 collection clone progress","done":2541288,"total":14003530,"percent":18,"units":"documents copied"}}
{"t":{"$date":"2021-06-07T12:46:02.478+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplWriterWorker-15","msg":"progress meter","attr":{"name":"data.sessions.20210603 collection clone progress","done":5703094,"total":14003530,"percent":40,"units":"documents copied"}}
{"t":{"$date":"2021-06-07T12:47:11.357+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplWriterWorker-15","msg":"progress meter","attr":{"name":"data.sessions.20210603 collection clone progress","done":9131425,"total":14003530,"percent":65,"units":"documents copied"}}
{"t":{"$date":"2021-06-07T12:48:13.295+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplWriterWorker-15","msg":"progress meter","attr":{"name":"data.sessions.20210603 collection clone progress","done":11761778,"total":14003530,"percent":83,"units":"documents copied"}}
{"t":{"$date":"2021-06-07T12:49:01.000+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":4847100,"total":14003530,"percent":34}}
{"t":{"$date":"2021-06-07T12:49:04.001+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":10169600,"total":14003530,"percent":72}}
{"t":{"$date":"2021-06-07T12:49:05.952+02:00"},"s":"I", "c":"INDEX", "id":20685, "ctx":"ReplCoordExtern-0","msg":"Index build: inserted keys from external sorter into index","attr":{"namespace":"data.sessions.20210603","index":"tsi_1_t0_1_t_1","keysInserted":14003530,"durationMillis":8000}}
{"t":{"$date":"2021-06-07T12:49:09.000+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":6208700,"total":14003530,"percent":44}}
{"t":{"$date":"2021-06-07T12:49:11.977+02:00"},"s":"I", "c":"INDEX", "id":20685, "ctx":"ReplCoordExtern-0","msg":"Index build: inserted keys from external sorter into index","attr":{"namespace":"data.sessions.20210603","index":"si_1","keysInserted":14003530,"durationMillis":5000}}
{"t":{"$date":"2021-06-07T12:49:15.001+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":4498400,"total":14003530,"percent":32}}
{"t":{"$date":"2021-06-07T12:49:18.001+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":11187800,"total":14003530,"percent":79}}
{"t":{"$date":"2021-06-07T12:49:19.557+02:00"},"s":"I", "c":"INDEX", "id":20685, "ctx":"ReplCoordExtern-0","msg":"Index build: inserted keys from external sorter into index","attr":{"namespace":"data.sessions.20210603","index":"tsi_1_si_1","keysInserted":14003530,"durationMillis":7000}}
{"t":{"$date":"2021-06-07T12:49:19.697+02:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"ReplCoordExtern-0","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"data.sessions.20210603","index":"tsi_1_t0_1_t_1","commitTimestamp":{"$timestamp":{"t":1623062959,"i":22000}}}}
{"t":{"$date":"2021-06-07T12:49:19.698+02:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"ReplCoordExtern-0","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"data.sessions.20210603","index":"si_1","commitTimestamp":{"$timestamp":{"t":1623062959,"i":22000}}}}
{"t":{"$date":"2021-06-07T12:49:19.699+02:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"ReplCoordExtern-0","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"data.sessions.20210603","index":"tsi_1_si_1","commitTimestamp":{"$timestamp":{"t":1623062959,"i":22000}}}}
{"t":{"$date":"2021-06-07T12:49:26.001+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":5717400,"total":14003530,"percent":40}}
{"t":{"$date":"2021-06-07T12:49:29.000+02:00"},"s":"I", "c":"-", "id":51773, "ctx":"ReplCoordExtern-0","msg":"progress meter","attr":{"name":"Index Build: inserting keys from external sorter into index","done":12567700,"total":14003530,"percent":89}}
{"t":{"$date":"2021-06-07T12:49:29.618+02:00"},"s":"I", "c":"INDEX", "id":20685, "ctx":"ReplCoordExtern-0","msg":"Index build: inserted keys from external sorter into index","attr":{"namespace":"data.sessions.20210603","index":"_id_","keysInserted":14003530,"durationMillis":9000}}
{"t":{"$date":"2021-06-07T12:49:29.833+02:00"},"s":"I", "c":"INDEX", "id":20345, "ctx":"ReplCoordExtern-0","msg":"Index build: done building","attr":{"buildUUID":null,"namespace":"data.sessions.20210603","index":"_id_","commitTimestamp":{"$timestamp":{"t":1623062969,"i":7002}}}}
{"t":{"$date":"2021-06-07T12:49:29.839+02:00"},"s":"I", "c":"STORAGE", "id":20320, "ctx":"ReplCoordExtern-0","msg":"createCollection","attr":{"namespace":"data.sessions.20210601","uuidDisposition":"provided","uuid":{"uuid":{"$uuid":"bddc70be-463a-472a-a1e9-bdc5162a13f0"}},"options":{"uuid":{"$uuid":"bddc70be-463a-472a-a1e9-bdc5162a13f0"}}}}
{"t":{"$date":"2021-06-07T12:49:29.846+02:00"},"s":"I", "c":"INDEX", "id":20384, "ctx":"ReplCoordExtern-0","msg":"Index build: starting","attr":{"namespace":"data.sessions.20210601","buildUUID":null,"properties":{"v":2,"key":{"tsi":1.0,"t0":1.0,"t":1.0},"name":"tsi_1_t0_1_t_1"},"method":"Hybrid","maxTemporaryMemoryUsageMB":66}}
{"t":{"$date":"2021-06-07T12:49:29.849+02:00"},"s":"I", "c":"INDEX", "id":20384, "ctx":"ReplCoordExtern-0","msg":"Index build: starting","attr":{"namespace":"data.sessions.20210601","buildUUID":null,"properties":{"v":2,"key":{"si":1.0},"name":"si_1"},"method":"Hybrid","maxTemporaryMemoryUsageMB":66}}
{"t":{"$date":"2021-06-07T12:49:29.853+02:00"},"s":"I", "c":"INDEX", "id":20384, "ctx":"ReplCoordExtern-0","msg":"Index build: starting","attr":{"namespace":"data.sessions.20210601","buildUUID":null,"properties":{"v":2,"key":{"tsi":1.0,"si":1.0},"name":"tsi_1_si_1"},"method":"Hybrid","maxTemporaryMemoryUsageMB":66}}
{"t":{"$date":"2021-06-07T12:49:29.859+02:00"},"s":"I", "c":"INDEX", "id":20384, "ctx":"ReplCoordExtern-0","msg":"Index build: starting","attr":{"namespace":"data.sessions.20210601","buildUUID":null,"properties":{"v":2,"key":{"_id":1},"name":"_id_"},"method":"Hybrid","maxTemporaryMemoryUsageMB":200}}
언급URL : https://stackoverflow.com/questions/19675117/how-to-check-secondary-is-synced-now-or-not
'programing' 카테고리의 다른 글
Angular | 데코레이터에 서비스를 주입 (0) | 2023.06.30 |
---|---|
속성 파일의 Spring boot 외부 구성 (0) | 2023.06.25 |
성능 테스트를 위해 오라클 캐시를 비활성화하는 방법 (0) | 2023.06.25 |
Oracle에서 임시 테이블로 선택 (0) | 2023.06.25 |
스프링 업로드 파일 크기 제한 오류 (0) | 2023.06.25 |