一主二仆

接主从案例,参考:Redisv6主从

停止一台从服务器(如6381)

如上,我们在停止6381服务器后,继续在主服务器上添加key,我们在6380服务器上能够正常看到在主服务器上添加的key。

再次启动6381服务器,观察会有什么样的效果

[root@iZ2ze2rikqlh3ql1n2cw61Z~]/usr/local/bin/:6381inforeplication再次启动,这里显示是主服务器,这是其中一个特点,并不会自动变成从服务器connected_slaves:0master_failover_state:no-failovermaster_replid:68d55763c83f89a955286d7ce21d06123e42a2d3master_replid2:0000000000000000000000000000000000000000master_repl_offset:0second_repl_offset:-1repl_backlog_active:0repl_backlog_size:1048576repl_backlog_first_byte_offset:0repl_backlog_histlen:0

通过这一步,我们知道了从服务器关闭后再次启动是一个独立的服务器,是一个主服务器,不会自动变成从服务器,如果要变成从服务器,我们需要继续下一步操作,也就是执行之前的slaveof操作。

将刚才重新启动的6381服务器变成从服务器

127.0.0.1:6381:6381inforeplication在6381上执行命令:6381:6381inforeplication还是从服务器master_host:127.0.0.1master_port:6380Replicationrole:masterconnected_slaves:1Replicationrole:master#之前是从服务器,现在变成了主服务器,小弟还是那个小弟6381connected_slaves:1slave0:ip=127.0.0.1,port=6381,state=online,offset=3371,lag=1master_failover_state:no-failovermaster_replid:fa8ff532f1d371ffc8618eb6edbd784f384d01c0master_replid2:7d5e934367c47fa167eb3d6642a85948c396cfddmaster_repl_offset:3371second_repl_offset:3358repl_backlog_active:1repl_backlog_size:1048576repl_backlog_first_byte_offset:1repl_backlog_histlen:3371

注意:以上这个反客为主的操作是需要手动操作的,但是工作中运维人员这样操作的可能不大,因为比较耗费时间,如果能变成全自动的就好了。我们的办法就是用下面学习的哨兵模式。

主从复制原理(必须记住)

Slave启动成功连接到master后会给主服务器发送一个sync(同步)命令(这一步是从服务器主动做的)

主服务器接到从服务器发送过来的同步消息,把主服务器数据进行持久化到rdb文件了,把rdb文件发送给从服务器,从服务器拿到rdb进行获取(这一步是主服务器主动做的)

每次主服务器进行写操作之后,和从服务器会进行数据同步(这一步是主服务器主动做的)

全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。

增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。

但是只要是重新连接master,一次完全同步(全量复制)将被自动执行)