Seconds_Behind_Master 의 곤 혹 스 러 움 과 해석
if (mi->rli->slave_running)
{
/* Check if SQL thread is at the end of relay log
Checking should be done using two conditions
condition1: compare the log positions and
condition2: compare the file names (to handle rotation case)
*/
if ((mi->get_master_log_pos() == mi->rli->get_group_master_log_pos()) &&
(!strcmp(mi->get_master_log_name(), mi->rli->get_group_master_log_name())))
{
if (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT) #IO SQL runing time_diff=0
protocol->store(0LL);
else
protocol->store_null();
}
else
{
long time_diff= ((long)(time(0) - mi->rli->last_master_timestamp) #
- mi->clock_diff_with_master);
/*
Apparently on some systems time_diff can be <0. Here are possible
reasons related to MySQL:
- the master is itself a slave of another master whose time is ahead.
- somebody used an explicit SET TIMESTAMP on the master.
Possible reason related to granularity-to-second of time functions
(nothing to do with MySQL), which can explain a value of -1:
assume the master's and slave's time are perfectly synchronized, and
that at slave's connection time, when the master's timestamp is read,
it is at the very end of second 1, and (a very short time later) when
the slave's timestamp is read it is at the very beginning of second
2. Then the recorded value for master is 1 and the recorded value for
slave is 2. At SHOW SLAVE STATUS time, assume that the difference
between timestamp of slave and rli->last_master_timestamp is 0
(i.e. they are in the same second), then we get 0-(2-1)=-1 as a result.
This confuses users, so we don't go below 0: hence the max().
last_master_timestamp == 0 (an "impossible" timestamp 1970) is a
special marker to say "consider we have caught up".
*/
protocol->store((longlong)(mi->rli->last_master_timestamp ?
max(0L, time_diff) : 0)); #diff_tiime< 0 0 。
}
}
else
{
protocol->store_null(); #IO SQL NO, NO,Seconds_Behind_Master NULL
}
요약:
1. 위의 소스 코드 부분 에서 보 듯 이 SecondsBehind_마스터 = 현재 노예 시스템 시간 빼 기 sqlthread 가 최근 에 받 은 binlog 의 timestamp 는 master 와 slave 의 시스템 시간 차 를 줄 입 니 다.당직 < 0, 0 으로 처리 되 었 습 니 다.
위 에서 도 볼 수 있 듯 이 (long) (time (0) - mi - > rli - > last master timestamp) #계산 공식
- mi->clock_diff_with_master);
지연 시간 은 master 와 slave 의 시간 대 와 무관 하 다 는 것 을 분석 할 수 있 습 니 다.M +7 S +8 M 은 10 시 에 실 행 됩 니 다. diff_time = (11 - 10) - (11 - 10) = 0, S 가 지연 되 지 않 는 한.
2. IO 또는 SQL 스 레 드 시 NO 또는 동시에 NO, SecondsBehind_Master 는 NULL 입 니 다. 이것 도 복사 가 중단 되 었 을 때 NULL 로 보 입 니 다.
음수 가 나 오 더 라 도 이미 0 으로 처 리 된 것 이 궁금 하 다.
3. * 음수 가 나타 나 는 경우:
1. 인위적인 set master 시스템 시간 은 slave 보다 작 습 니 다.
2. A--->B-->C :C 지연 binlog 를 계산 하 는 시간 은 A 의 시간 을 취하 고 주종 이외 의 노드 의 시간 값 에 계산 을 추가 하여 마이너스 가 나타 날 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
MongoDB Master, Slave, Arbiter 스 크 립 트 자동 설치최근 에 MongoDB 의 Master, Slave, Arbiter 구 조 를 사용 해 야 하 는 새로운 프로젝트 가 있 습 니 다. 홈 페이지 에 가서 문 서 를 뒤 져 서 허름 한 스 크 립 트 를 썼 습 니 다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.