ÉèΪÊ×Ò³ ¼ÓÈëÊÕ²Ø

TOP

redisÊý¾Ý¿âÖ®Ö÷´Ó¸´ÖÆ(Ò»)
2014-11-24 07:42:00 À´Ô´: ×÷Õß: ¡¾´ó ÖРС¡¿ ä¯ÀÀ:12´Î
Tags£ºredis Êý¾Ý¿â Ö÷´Ó ¸´ÖÆ
redis³ýÁË»ù±¾¹¦ÄÜÍ⣬»¹ÌṩÁËÖ÷´Ó¸´Öƹ¦ÄÜ¡£Ò»¸öredis·þÎñ¿ÉÒÔÓжà¸öslave·þÎñ£¬¶øÕâ¸öslave·þÎñÓÖ¿ÉÒÔÓÐslave·þÎñ¡£master·þÎñ°ÑÊôÓÚ×Ô¼ºµÄslave·þÎñÓÃÁ´±í¹ÜÀíÆðÀ´£¬Ò²¾ÍÊÇstruct redisServerÖеÄslaves³ÉÔ±£¬slave·þÎñ»áͨ¹ýredisServerÖеÄmasterhostºÍmasterportÀ´±êʶËüµÄmaster·þÎñµÄipºÍport¡£
redisÓÐÁ½ÖÖ·½Ê½À´±êʶ´ÓÊôÓÚÄĸömaster·þÎñ£º
1¡¢ÔÚ ÅäÖÃÎļþÖÐÅäÖÃslaveof masterhost masterport
2¡¢·¢ËÍslaveofÃüÁî¡£
ͬÑùredisÒ²ÌṩÁËÁ½ÖÖ·½Ê½À´Í¬²½Ö÷´ÓµÄ Êý¾Ý¿âµÄ¡£
1¡¢Í¨¹ý¶¨Ê±Æ÷À´Íê³Éͬ²½
2¡¢master·þÎñÿ´ÎÖ´ÐеÄÃüÁî¶¼»á¸ù¾ÝÇé¿ö·¢ËÍÒ»·Ý¸øslave·þÎñ¡£
Ê×ÏÈÀ´½²Êö϶¨Ê±Æ÷Íê³Éͬ²½µÄʵÏÖ£º
redis·þÎñµÄ¶¨Ê±¹¦Äܶ¼ÊÇͨ¹ýserverCronÍê³É£¬¶øÔÚserverCronÖлáµ÷ÓÃreplicationCron£¬Õâ¸öº¯Êý¾ÍÍê³ÉÁ˲»Í¬µÄ¹¦ÄÜ¡£
[cpp]
void replicationCron(void)
{
.......
if (server.repl_state == REDIS_REPL_CONNECT) {
redisLog(REDIS_NOTICE,"Connecting to MASTER...");
if (connectWithMaster() == REDIS_OK) {
redisLog(REDIS_NOTICE,"MASTER <-> SLAVE sync started");
}
}
.......
}
replicationCron¼ì²éһЩ³¬Ê±Çé¿ö×öһЩ³¬Ê±µÄ´¦Àí£¬È»ºó»áµ÷ÓÃconnectWithMasterÈ¥Á¬½Ómaster·þÎñ¡£
[cpp]
int connectWithMaster(void) {
fd = anetTcpNonBlockConnect(NULL,server.masterhost,server.masterport);
......
if (aeCreateFileEvent(server.el,fd,AE_READABLE|AE_WRITABLE,syncWithMaster,NULL) ==
AE_ERR)
......
}
connectWithMasterÊ×ÏÈ»áÏòmaster·þÎñ·¢ÆðÁ¬½Ó£¬È»ºó´´½¨Ò»¸ö¶Áдʼþ²¢°ÑÉèÖÃserver.repl_state = REDIS_REPL_CONNECTING;
[cpp]
void syncWithMaster(aeEventLoop *el, int fd, void *privdata, int mask) {
......
if (syncWrite(fd,"SYNC\r\n",6,server.repl_syncio_timeout*1000) == -1) {
redisLog(REDIS_WARNING,"I/O error writing to MASTER: %s",
strerror(errno));
goto error;
}
......
if (aeCreateFileEvent(server.el,fd, AE_READABLE,readSyncBulkPayload,NULL)
== AE_ERR)
......
server.repl_state = REDIS_REPL_TRANSFER;
......
}
syncWithMaster»á·¢ËÍSYNCÃüÁî¸ømaster·þÎñ£¬È»ºóÉèÖÿɶÁʼþµÄhandler£¬²¢°ÑslaveµÄ״̬ÉèÖÃΪ´«Êä״̬¡£ÏÂÃæÀ´¿´ÏÂmaster·þÎñ½ÓÊÕµ½syncÃüÁîµÄ´¦Àí£º
[cpp]
void syncCommand(redisClient *c) {
......
// ¼ì²éÊÇ·ñÒѾ­ÓÐ BGSAVE ÔÚÖ´ÐУ¬·ñÔò¾Í´´½¨Ò»¸öÐ嵀 BGSAVE ÈÎÎñ
if (server.rdb_child_pid != -1) {
/* Ok a background save is in progress. Let's check if it is a good
* one for replication, i.e. if there is another slave that is
* registering differences since the server forked to save */
// ÒÑÓÐ BGSAVE ÔÚÖ´ÐУ¬¼ì²éËüÄÜ·ñÓÃÓÚµ±Ç°¿Í»§¶ËµÄ SYNC ²Ù×÷
redisClient *slave;
listNode *ln;
listIter li;
// ¼ì²éÊÇ·ñÓÐÆäËû¿Í»§¶ËÔڵȴý SYNC ½øÐÐ
listRewind(server.slaves,&li);
while((ln = listNext(&li))) {
slave = ln->value;
if (slave->replstate == REDIS_REPL_WAIT_BGSAVE_END) break;
}
if (ln) {
/* Perfect, the server is already registering differences for
* another slave. Set the right state, and copy the buffer. */
// ÕÒµ½Ò»¸öͬÑùÔڵȵ½ SYNC µÄ¿Í»§¶Ë
// ÉèÖõ±Ç°¿Í»§¶ËµÄ״̬£¬²¢¸´ÖÆ buffer ¡£
copyClientOutputBuffer(c,slave);
c->replstate = REDIS_REPL_WAIT_BGSAVE_END;
redisLog(REDIS_NOTICE,"Waiting for end of BGSAVE for SYNC");
} else {
/* No way, we need to wait for the next BGSAVE in order to
* register differences */
// ûÓпͻ§¶ËÔڵȴý SYNC £¬µ±Ç°¿Í»§¶ËÖ»ÄܵȴýÏ´ΠBGSAVE ½øÐÐ
c->replstate = REDIS_REPL_WAIT_BGSAVE_START;
redisLog(REDIS_NOTICE,"Waiting for next BGSAVE for SYNC");
}
} else {
// ûÓÐ BGSAVE ÔÚ½øÐУ¬×Ô¼ºÆô¶¯Ò»¸ö¡£
Ê×Ò³ ÉÏÒ»Ò³ 1 2 3 ÏÂÒ»Ò³ βҳ 1/3/3
¡¾´ó ÖРС¡¿¡¾´òÓ¡¡¿ ¡¾·±Ìå¡¿¡¾Í¶¸å¡¿¡¾Êղء¿ ¡¾ÍƼö¡¿¡¾¾Ù±¨¡¿¡¾ÆÀÂÛ¡¿ ¡¾¹Ø±Õ¡¿ ¡¾·µ»Ø¶¥²¿¡¿
·ÖÏíµ½: 
ÉÏһƪ£ºSQLµãµÎ12¨DSQL Server±¸·Ý»¹Ô­Ê.. ÏÂһƪ£ºMongoDBµ¥»ú, Ö÷´Ó, ·Ö²¼Ê½²¿Êð

ÆÀÂÛ

ÕÊ¡¡¡¡ºÅ: ÃÜÂë: (ÐÂÓû§×¢²á)
Ñé Ö¤ Âë:
±í¡¡¡¡Çé:
ÄÚ¡¡¡¡ÈÝ:

¡¤About - Redis (2025-12-26 08:20:56)
¡¤Redis: A Comprehens (2025-12-26 08:20:53)
¡¤Redis - The Real-ti (2025-12-26 08:20:50)
¡¤Bash ½Å±¾½Ì³Ì¡ª¡ªLi (2025-12-26 07:53:35)
¡¤ÊµÕ½Æª£¡Linux shell (2025-12-26 07:53:32)