同步期间发送的命令:
1.从服务器向主服务器发送1种命令:REPLCONF ACK offset
这个命令是主从完成同步后,从服务器定期向主服务器发送的命令。
作用有2个:1. if offet > c->repl_ack_off : c->repl_ack_off = offset
2. c->repl_ack_time = server.unixtime
2.主服务器向从服务器发送2种命令:a."\n" b.PING
a."\n"是主服务器向等待 bgsave的从服务器发送的命令
作用:if (buf[0] == '\0') server.repl_transfer_lastio = server.unixtime
b.PING是主服务器向server.slaves中的从服务器发送的命令。在server.slaves中的从服务器状态处于: START或END。
作用:1. c->lastinteraction = server.unixtime;
2. if (c->flags & REDIS_MASTER) c->reploff += nread;
同步期间各种超时判断:
1.从服务器会进行3种超时判断:
- if (server.masterhost
- && (server.repl_state == REDIS_REPL_CONNECTING
- || server.repl_state == REDIS_REPL_RECEIVE_PONG)
- && (time(NULL) - server.repl_transfer_lastio)
- > server.repl_timeout) {
- undoConnectWithMaster();
- }
- /* Bulk transfer I/O timeout*/
- if (server.masterhost && server.repl_state == REDIS_REPL_TRANSFER
- && (time(NULL) - server.repl_transfer_lastio)
- > server.repl_timeout) {
- replicationAbortSyncTransfer();
- }
- /* Timed out master when we are an already connected slave?*/
- if (server.masterhost && server.repl_state == REDIS_REPL_CONNECTED
- && (time(NULL) - server.master->lastinteraction)
- > server.repl_timeout) {
- freeClient(server.master);
- }
2.主服务器会进行1种超时判断:
- if ((server.unixtime - slave->repl_ack_time)
- > server.repl_timeout) {
- char ip[REDIS_IP_STR_LEN];
- int port;
-
- if (anetPeerToString(slave->fd, ip, sizeof(ip), &port) != -1) {
- //redisLog(REDIS_WARNING,
- // "Disconnecting timedout slave: %s:%d",
- // ip, slave->slave_listening_port);
-
- }
-
- // 释放
- freeClient(slave);
- }
|