博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Redis学习----复制(上)
阅读量:3956 次
发布时间:2019-05-24

本文共 1457 字,大约阅读时间需要 4 分钟。

你未必出类拔萃,但一定与众不同

Redis 复制

简介以及旧版SYNC

redis中用户通过SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另外一个服务器

我们称被复制的为主服务器master,而对主服务器复制的服务器被称为从服务器slave。

Redis2.8以前用SYNC命令执行复制的同步操作,2.8以后采用了PSYNC

先了解一下SYNC

SYNC命令是一个非常耗费资源的操作

每次执行SYNC命令,主从服务器需要执行以下动作:

1)主服务器需要执行BGSAVE命令来生成RDB文件,这个生成操作会耗费主服务器大量的CPU,内存和磁盘I/O资源

2)主服务器需要将自己生成的RDB文件发送给从服务器,这个发送操作会耗费主从服务器大量的网络资源(带宽和流量),并对主服务器相应命令请求的时间产生影响

3)接收到RDB文件的从服务器需要载入主服务器发来的RDB文件,并且在载入期间,从服务器会因为阻塞而没办法处理命令请求

因此用PSYNC代替SYNC迫在眉睫

新版复制功能的实现

PSYNC命令具有完整重同步和部分重同步两种模式

  • 其中完整重同步用于处理初次复制情况:完整重同步的执行步骤和SYNC命令的执行步骤基本一样,它们都是通过让主服务器创建并且发送RDB文件,以及向从服务器发送保存在缓冲区里面的写命令来进行同步
  • 而部分重同步则用于处理线后重复制情况:当从服务器在断线后重新连接主服务器时,如果条件允许,主服务器可以将主从服务器连接断开期间执行的写命令发送给从服务器,从服务器主要接受并执行这些写命令,就可以将数据库更新至主服务器当前所在的状态。

PSYNC命令的部分重同步解决了旧版复制功能在处理断线后重复制出现的低效问题(为了让从服务器补足一小部分缺失的数据,需要让主从服务器重新执行一次SYNC命令)

以下就是使用PSYNC命令来进行断线后重复制

左边是主服务器,右边是从服务器

在这里插入图片描述

部分重同步的实现

部分重同步功能由以下三部分组成

  • 主服务器的复制偏移量和从服务器的复制偏移量
  • 主服务器的复制积压缓冲区
  • 服务器的运行ID

复制偏移量

执行复制的双方 -----主服务器和从服务器会分别维护一个复制偏移量

  • 主服务器每次向从服务器传播N个字节的数据时,就将自己的复制偏移量的值加上N
  • 从服务器每次收到主服务器传播来的N个字节的数据时,就将自己的复制偏移量的值加上N

在这里插入图片描述

通过对比主从服务器的复制偏移量就知道是否处于一致性的状态

复制积压缓冲区

如果由于断线后,主从服务器重新进行连接时,发现复制偏移量不一致了,这时就需要用到复制积压缓冲区了。

复制积压缓冲区是由主服务器维护的一个固定长度、先进先出的队列,默认大小是 1MB。当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令写入复制积压缓冲区里面。这样主服务器的复制积压缓冲区就会保存着最近传播的写命令,并且记录着相应的复制偏移量。

当从服务器重新连接上主服务器时,如果发现复制偏移量不一致,就会在复制积压缓冲区中寻找对应偏移量之后的数据。

如果该偏移量也不存在复制积压缓冲区中,那么只能进行完整重同步操作了。

在这里插入图片描述

服务器运行ID

  • 每一个Redis服务器,无论主从,都有一个由40个随机的十六进制的字符组成的运行ID。
  • 运行ID在服务器启动时生成,由40个随机二等十六进制字符组成

该ID在复制的时候,用于识别主服务器是否已经更改:如果主服务器的ID跟之前复制的不一致,则说明主服务器已经发生变更。这时需要进行完整重同步。

转载地址:http://fftzi.baihongyu.com/

你可能感兴趣的文章
杭电ACM——1789,Doing Homework Again(贪心)
查看>>
北大ACM——2782,Bin Packing(贪心)
查看>>
北大ACM——4014,Dice(贪心)
查看>>
杭电ACM——4864,Task(贪心)
查看>>
北大ACM——3176,Cow Bowling(动态规划)
查看>>
北大ACM——2229,Sumsets(DP或思维)
查看>>
北大ACM——3186,Treats For The Cows(DP)
查看>>
杭电ACM——蝎子搬新家(贪心)
查看>>
杭电ACM——处理木棍(贪心)
查看>>
杭电ACM——broomstick训练营(贪心)
查看>>
杭电ACM——1018,Big Number(思维)
查看>>
杭电ACM——6463(思维)
查看>>
杭电AC——6561(思维)
查看>>
杭电ACM——1034,Candy Sharing Game
查看>>
杭电ACM——建房子(贪心)
查看>>
杭电ACM——1297,Children’s Queue(递推)
查看>>
杭电ACM——1003,Max Sum(DP)
查看>>
杭电ACM——1042,N!(思维)
查看>>
杭电ACM——1060,Leftmost Digit(思维)
查看>>
杭电ACM——1061,Rightmost Digit(思维)
查看>>