首页 > SQL学习 > Redis的主从复制
2019
09-03

Redis的主从复制

Redis支持简单且易用的主从复制功能,可以让从服务器(slaveserver)成为主服务器(masterserver)的精确复制品

以下是关于Redis复制功能的几个重要方面:

    1、Redis使用异步复制。从服务器会以每秒一次的频率向主服务器报告复制流的处理进度。
    2、一个主服务器可以有多个从服务器。
    3、不仅主服务器可以有从服务器,从服务器也可以有自己的从服务器。
    4、复制功能不会阻塞主服务器。
    5、复制功能不会阻塞从服务器(需要在配置文件中slave-serve-stale-data设置,从服务器正在同步时使用旧的数据集来处理命令查询),但是在从服务器删除旧版本数据集并载入新版本数据集的短暂时间内,连接请求会被阻塞。
    6、可以配置从服务器,让它在与主服务器之间的连接断开时,向客户端发送一个错误(用于监控主服务器)。
    7、复制功能可以单纯地用于数据冗余,也可以通过让多个从服务器处理只读命令请求来提升扩展性。
    8、可以让主服务器免于执行持久化操作,由从服务器去执行持久化操作。

复制功能的运作原理

1、无论是初次连接还是重新连接,当建立一个从服务器时,从服务器都将向主服务器发送一个sync(或psync)命令。

2、接到sync(或psync)命令的主服务器将开始执行bgsave(在bgsave执行期间,所有新执行的写入命令都保存到一个写命令缓冲区里)。

3、当bgsave执行完毕后,主服务器将执行保存操作所得的.rdb文件发送给从服务器。

4、从服务器接收这个.rdb文件,并将文件中的数据载入到内存中。

5、之后主服务器会以Redis命令协议的格式,将写命令缓冲区中积累的所有内容都发送给从服务器。

部分重同步(redis2.8版本开始支持)

在网络连接短暂性失效之后,主从服务器可以尝试继续执行原有的复制进程,而不一定要执行完整重同步操作。

这个特性需要主服务器为被发送的复制流创建一个内存缓冲区,并且主服务器和所有从服务器之间都记录一个复制偏移量和一个主服务器ID,当出现网络连接断开时,从服务器会重新连接,并且向主服务器请求继续执行原来的复制进程:

    如果从服务器记录的主服务器ID和当前要连接的主服务器的ID相同,并且从服务器记录的偏移量所指定的数据仍然保存在主服务器的复制流缓冲区里面,那么主服务器会向从服务器发送断线时缺失的那部分数据,然后复制工作可以继续执行。
    否则的话,从服务器就要执行完整重同步操作。

这个部分重同步特性会用到一个psync内部命令(2.8版本新增),从服务器是Redis2.8或以上版本,它就会根据主服务器的版本来决定到底是使用psync还是sync:

    如果主服务器是Redis2.8或以上版本,那么从服务器使用psync命令来进行同步
    如果主服务器是Redis2.8之前的版本,那么从服务器使用sync命令来进行同步

配置从服务器

方法1、在配置文件中增加:slaveof host port

方法2、使用slaveof host port命令

    在Redis运行时动态地修改复制功能的行为,将当前服务器转变为指定服务器的从属服务器(slave server)
    如果当前服务器已经是某个主服务器的从属服务器,将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步
    对一个从属服务器执行命令slaveof no one将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃
    利用slaveof no one不会丢弃同步所得数据集这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行
    总是返回OK

只读从服务器

从Redis2.6开始,从服务器支持只读模式,并且该模式为从服务器的默认模式(配置文件中slave-read-only选项)。

即使从服务器是只读的,debug和config等管理式命令仍然是可以使用的,可以使用配置文件中的命令改名选项rename-command来提升只读从服务器的安全性

主服务器数据安全:

从Redis2.8开始,为了保证数据的安全性,可以通过配置,让主服务器只在有至少N个当前已连接从服务器的情况下,才执行写命令。

不过,因为Redis使用异步复制,所以主服务器发送的写数据并不一定会被从服务器接收到,因此,数据丢失的可能性仍然是存在的。

这个特性的运作原理:

1、从服务器以每秒一次的频率PING主服务器一次,并报告复制流的处理情况。

2、主服务器会记录各个从服务器最后一次向它发送PING的时间。

3、用户通过配置,指定网络延迟的最大值min-slaves-max-lag,以及执行写操作所需的至少从服务器数量min-slaves-to-write。

4、如果至少有min-slaves-to-write个从服务器,并且这些服务器的延迟值都少于min-slaves-max-lag秒,那么主服务器就会执行客户端请求的写操作。

5、如果条件达不到min-slaves-to-write和min-slaves-max-lag所指定的条件,那么写操作就不会被执行,主服务器会向请求执行写操作的客户端返回一个错误。


 
 										                        
                        						                        
最后编辑:
作者:qingheluo
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。