redis学习总结2

redis主从复制机器

 

1. 一个master支持多个slave

2. slave可以接受其他slave的连接,作为其他slave的master,从而形成一个master-slave的多级结构

3. 复制在master端是非阻塞的,也就是master在向client复制时可处理其他client的命令,而slave在第一次同步时是阻塞的

4. 复制被利用来提供可扩展性,比如可以将slave端用作数据冗余,也可以将耗时的命令(比如sort)发往某些slave从而避免master的阻塞,另外也可以用slave做持久化,这只需要将master的配置文件中的save指令注释掉。

 

client可以在一开始时作为slave连接master,也可以在运行后发布sync命令,从而跟master建立主从关系。

 

接下来我们分别从slave和master的视角概述下redis的主从复制的运行机制。

 

如果redis作为slave运行,则全局变量server.replstate的状态有REDIS_REPL_NONE(不处于复制状态)、 REDIS_REPL_CONNECT(需要跟master建立连接)、REDIS_REPL_CONNECTED(已跟master建立连接)三种。在读入slaveof配置或者发布slaveof命令后,server.replstate取值为REDIS_REPL_CONNECT,然后在syncWithMaster跟master执行第一次同步后,取值变为REDIS_REPL_CONNECTED。

 

如果redis作为master运行,则对应某个客户端连接的变量slave.replstate的状态有REDIS_REPL_WAIT_BGSAVE_START(等待bgsave运行)、REDIS_REPL_WAIT_BGSAVE_END(bgsave已dump db,该bulk传输了)、REDIS_REPL_SEND_BULK(正在bulk传输)、REDIS_REPL_ONLINE(已完成开始的bulk传输,以后只需发送更新了)。对于slave客户端(发布sync命令),一开始slave.replstate都处于REDIS_REPL_WAIT_BGSAVE_START状态(后面详解syncCommand函数),然后在后台dump db后(backgroundSaveDoneHandler函数),处于REDIS_REPL_WAIT_BGSAVE_END 状态,然后updateSlavesWaitingBgsave会将状态置为REDIS_REPL_SEND_BULK,并设置write事件的函数 sendBulkToSlave,在sendBulkToSlave运行后,状态就变为REDIS_REPL_ONLINE了,此后master会一直调用replicationFeedSlaves给处于REDIS_REPL_ONLINE状态的slave发送新命令。





1.在master机器上执行 info命令


 
这里链接的slaves是0个,
2.然后再slave机器上执行 slaveof masterid masterport ,这是master上只有12个kv值



 
3.然后再master再用info查看结果


 
已经链接了一个slave机器

4. 在master上写入一个新的值,然后查看slave机器,几乎同时在slave机器出现


 
在slave机器同时查看

posted @ 2012-05-31 13:30  MXi4oyu  阅读(228)  评论(0编辑  收藏  举报