Redis之主从同步

2015-01-26 10:51:11 · 作者: · 浏览: 12

同步

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是自己保存的主服务器的运行id,offset是自己的复制偏移量。B接收到PSYNC及其参数,发现运行id和自己的运行id相同;发现offset之后的数据在自己的复制积压缓冲区里面,只需要部分重同步,向A返回+CONTINUE。B把积压缓冲区里面的数据发给A。再次同步。

?