通过命令slaveof命令加ip 设定注定复制的主服务器
旧版复制只要是由两个部分组成的
- 同步:让从服务器的数据库状态更新至主服务器数据库状态
- 命令传播:将对主服务器的写改操作,传送给从服务器,使得主从服务器状态重写一致
同步:
- 从服务器向主服务器发送SYNC命令
- 主服务器创建子进程进行RDB文件创建与写入,与此同时将该时刻接收的写改操作压入到缓冲区中,RDB文件完成后。发送RDB文件给从服务器,从服务器加载完后,主服务器发送缓冲区数据(主服务器会有一段时间的阻塞时间)。
旧版复制的缺点:如果从服务器链接上主服务器后,并进行了同步,但是过了一段时间后断线了,重新链接后只能执行同步(损耗很大)
- RDB文件的创建以及写入 IO CPU 磁盘
- 发送RDB 网络资源
- 载入RDB 阻塞,从服务器无法访问
新版本的复制、
新版本的复制 最主要包含两个操作:完整同步 部分同步
完整同步的实现与初次同步实现相同
部分同步的实现:最主要引入 复制偏移量 Redis_id 主服务器中的命令积压缓冲区(大小要适当)
Redis_id:当从服务器对主服务器进行初次复制,主服务器就会将运行id发给从服务器并保存,当从服务器重新链接上主一个服务器时候,从服务器发送保留的id与主服务器id对比。
相同就尝试 部分同步
不相同就完成同步
就是当从服务器的复制偏移值+1仍然在命令积累缓冲区中,就执行部分复制。
-1是代表使用完整复制
-2代表redis使用的是2.8版本前
其他就是意味可以使用部分同步。
心路检测
在命令传播阶段从服务器默认会以每隔一秒的频率发送replconf ACK<replication_offset>、
检测主从服务器网络连接状态
辅助实现min_slaves
检测命令丢失