reids复制的原理和优化
原理
主库通过RDB文件传给从库,从而进行复制
复制的原则
- 一个master可以有多个slave;
- 一个slave只能又一个master;
- 数据流向是单向的,master到slave;
主从复制的作用
- 数据副本
- 扩展读性能
方式
命令行
slaveof 127.0.0.1 6379
#直接指向需要复制的master服务器
取消复制
slaveof no one
注意:取消复制时,master不会对slave的数据进行清零,当slave重新对新的master进行判定时,新的master会对slave清零
配置文件
slaveof ip port
slave-read-only yes
因为我是在同一台服务器上去测试,端口6001的redis服务器是slave服务器,且只有以上配置,开启复制之后,会发现已经默认地作为端口为6000的从库了
两种方式的比较
方式 | 命令 | 配置 |
---|---|---|
优点 | 无需重启 | 统一配置 |
缺点 | 不便于管理 | 需要重启 |
全量复制和部分复制
runid
redis-cli -p 6379 info server| grep run
由上述命令可以知道该 redis服务器的runid是多少,但服务器被重启或者是网络的原因,runid会发生变化,而从库探测到主库的runid发生了变化,会认为进行了很大的改动,则会进行一次全量复制。
偏移量
偏移量是用来检测从库和主库数据是否一致
redis-cli -p 6379 info replication
全量复制
- psync是从库内部自己调用的,在第一次的复制的时候,很明显从库是不知道主库的runid和偏移量,所以需要做一个全量的复制。
- 主库检测出了从库是第一次复制,因为从库不知道主库的runid和偏移量,所以主库把自己的runid和偏移量传给了从库
- 从库保存了主库的runid和偏移量
- 主库开始创建快照(bgsave),与其同时主库也会把在创建快照的时间间期中产生的数据传到了自身的复制缓冲区
- 主库向从库发送RDB文件
- 主库向从库发送复制缓冲区的数据,并添加到了从库接受到的RDB文件中
- 从库清除自身原本有的数据
- 从库执行RDB文件,从而达到复制
全量复制开销
- bgsave的时间
- RDB文件网络传输时间
- 从节点清空数据的时间
- 从节点加载RDB的时间
- 可能的AOF重写的时间
部分复制
因为如果全部都是全量复制,这无疑给服务器带来了很大的开销,所以出现了部分复制
- 有时候因为网络的抖动或者其他原因,导致从库对主库失去连接。
- 主库会把这个时间段新增的数据写入复制缓冲区。
- 当从库再次连接之后
- 从库会告诉主库说,主库对应的runid以及最新的偏移量值
- 主库会判断从库是否需要部分复制,并判断偏移量是否是在复制缓冲区的偏移量范围内,如果不在证明从过错过的数据已经很多了。
- 如果是在范围内的话,主库会把剩下从库没有的数据传给从库,从而达到部分复制,减少开销
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。