首页 > 代码库 > Redis之主从同步
Redis之主从同步
同步
Redis为什么要实现主从同步?
主从同步,有以下好处:
- 实现数据的备份,减少单点故障带来的损失;
- 有利于实现负载均衡。本来一台服务器负责所有数据的读写,而通过主从同步,可以让多个从服务器负责数据的读,而主服务器主要负责数据的写,减轻了单点压力。
部分重同步
Redis从2.8开始,引入了PSYNC,支持部分重同步:主服务器和从服务器断开连接这段时间,主服务器的数据可能只是发生了少量的变化,那么当从服务器重新连上主服务器时,就没有必要把主服务器里面的数据全部发给从服务器进行数据覆盖,只需要把不一致的数据发给从服务器,这样避免了主服务器进行数据备份、数据的网络传输。
同步的过程
下面使用两台机器,A(10.15.62.11 :6379)作为从服务器,B(10.15.62.12 :6380)作为主服务器,介绍一下A和B进行初次完全同步和部分重同步的过程。
- 通过客户端向A发送slaveof 10.15.62.12 6380的命令, A收到命令之后,会向客户端返回+OK;
- A和B之间建立套接字;
- A向B发送PING命令,有两个目的:1)验证AB之间的套接字有没有问题;2)B服务器能够处理命令,对外服务。
- B向A返回PONG;
- 如果A设置了masterauth,表示需要身份验证。那么A会向B发送AUTH命令,命令参数是masterauth的值。
- 如果A发送的值和B的requirepass值相同,则通过验证。
- A向B发送REPLCONF listening-port 6379,B会把A的端口保存起来,唯一的用途是:用户使用客户端向B发送INFO replication命令时,显示从服务器的端口。
- A向B发送PSYNC ? -1;
- B接受PSYNC命令后,把自己的run-id和自己的复制偏移量发给A,A会把B的运行id保存起来,并且把B的复制偏移量作为自己的复制偏移量;B然后执行BGSAVE操作,通过子进程生成一份RDB数据,同时把执行BGSAVE命令期间接收到的写命令保存起来。
- B把RDB数据发给A,A把自己的数据库清空,把B的RDB数据加载到内存里面;B把复制的写命令发给A。
- 同步完成;
- 然后向B写数据时,B会向A传递命令。
- A和B突然断开;
- A和B重新连接;
- A向B发送PSYNC <run-id> <offset>……run-id是自己保存的主服务器的运行id,offset是自己的复制偏移量。
- B接收到PSYNC及其参数,发现运行id和自己的运行id相同;发现offset之后的数据在自己的复制积压缓冲区里面,只需要部分重同步,向A返回+CONTINUE。
- B把积压缓冲区里面的数据发给A。
- 再次同步。
代码实现:
未完待续。
参考资料:
《Redis设计与实现》第15章
Redis主从同步源码浅析-Slave端
Redis之主从同步
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。