本文共 1457 字,大约阅读时间需要 4 分钟。
你未必出类拔萃,但一定与众不同
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命令具有完整重同步和部分重同步两种模式
PSYNC命令的部分重同步解决了旧版复制功能在处理断线后重复制出现的低效问题(为了让从服务器补足一小部分缺失的数据,需要让主从服务器重新执行一次SYNC命令)
以下就是使用PSYNC命令来进行断线后重复制
左边是主服务器,右边是从服务器
部分重同步功能由以下三部分组成
执行复制的双方 -----主服务器和从服务器会分别维护一个复制偏移量
通过对比主从服务器的复制偏移量就知道是否处于一致性的状态
如果由于断线后,主从服务器重新进行连接时,发现复制偏移量不一致了,这时就需要用到复制积压缓冲区了。
复制积压缓冲区是由主服务器维护的一个固定长度、先进先出的队列,默认大小是 1MB。当主服务器进行命令传播时,它不仅会将写命令发送给所有从服务器,还会将写命令写入复制积压缓冲区里面。这样主服务器的复制积压缓冲区就会保存着最近传播的写命令,并且记录着相应的复制偏移量。
当从服务器重新连接上主服务器时,如果发现复制偏移量不一致,就会在复制积压缓冲区中寻找对应偏移量之后的数据。
如果该偏移量也不存在复制积压缓冲区中,那么只能进行完整重同步操作了。
该ID在复制的时候,用于识别主服务器是否已经更改:如果主服务器的ID跟之前复制的不一致,则说明主服务器已经发生变更。这时需要进行完整重同步。
转载地址:http://fftzi.baihongyu.com/