复制

概述:
通过持久化功能,Redis保证了即使在服务器重启的情况下也不会损失(或少量损失)数据。但是由于数据是存储在一台服务器上的,如果这台服务器的硬盘出现故障,也会导致数据丢失。为了避免单点故障,我们希望将数据库复制多个副本以部署在不同的服务器上,即使有一台服务器出现故障其他服务器依然可以继续提供服务。这就要求当一台服务器上的数据库更新后,可以自动将更新的数据同步到其他服务器上。Redis提供了复制(replication)功能可以自动实现同步的过程。

配置介绍:
同步后的数据库分为两类,一类是主数据库(master),一类是从数据库(slave)。主数据库可以进行读写操作,当发生写操作时自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。从数据库不仅可以接收主数据库的同步数据,自己也可以同时作为主数据库存在,但此时它接到的写数据只会同步给它下面的从数据库。
这里写图片描述

在Redis中使用复制功能非常容易,只需要在从数据库的配置文件中加入“slaveof主数据库IP主数据库端口”即可,主数据库无需进行任何配置。
但在默认情况下从数据库是只读的,如果直接修改从数据库的数据会出现错误:

SET foo hi
 (error) READONLY You can't write against a read only slave
可以通过设置从数据库的配置文件中的slave-read-only为no以使从数据库可写,但是对从数据库的任何更改都不会同步给任何其他数据库,并且一旦主数据库中更新了对应的数据就会覆盖从数据库中的改动。
配置多台从数据库的方法也一样,在所有的从数据库的配置文件中都加上slaveof参数指向同一个主数据库即可。
除了通过配置文件或命令行参数设置slaveof参数,还可以在运行时使用SLAVEOF命令修改:
SLAVEOF 127.0.0.1 6379
如果该数据库已经是其他主数据库的从数据库了,SLAVEOF命令会停止和原来数据库的同步转而和新数据库同步。还可以使用SLAVEOF NO ONE来使当前数据库停止接收其他数据库的同步转成主数据库。

同步过程:
这里写图片描述
从服务器在启动后和主服务器进行第一次同步时,数据库中原有的所有数据都将丢失,并被替换成主服务器发来的数据。
Redis 不支持主主复制,当一个从服务器连接一个已有的主服务器时,有时可以重用已有的快照文件,如果一个从服务器和主服务器进行连接时刚好处于上图中的第三步尚未执行,则所有从服务器都会接收到相同的快照文件和相同的缓冲区写命令

主从链:
随着负载不断上升,主服务器可能会无法快速地更新所有从服务器,或者因为重新连接和重新同步从服务器而导致系统超载。为了缓解这个问题,用户可以创建一个由Redis主从节点( master/slave node )组成的中间层来分担主服务器的复制工作。
这里写图片描述
通过同时使用复制和AOF持久化,我们可以将数据持久化到多台机器上面。为主服务器设置多个从服务器,然后对每个从服务器设置appendonly yes 选项和appendfsync everysec 选项,就可以避免因机器故障而导致的数据丢失问题。

同步原理:
当一个从数据库启动后,会向主数据库发送SYNC命令,主数据库接收到SYNC命令后会开始在后台保存快照(即RDB持久化的过程),并将保存期间接收到的命令缓存起来。当快照完成后,Redis会将快照文件和所有缓存的命令发送给从数据库。从数据库收到后,会载入快照文件并执行收到的缓存的命令。当主从数据库断开重连后会重新执行上述操作,不支持断点续传。
需要注意的是在同步的过程中从数据库并不会阻塞,而是可以继续处理客户端发来的命令。默认情况下,从数据库会用同步前的数据对命令进行响应。可以配置slave-serve-stale-data参数为no来使从数据库在同步完成前对所有命令(除了INFO和SLAVEOF)都回复错误:“SYNC with master in progress.”之后主数据库的任何数据变化都会同步给从数据库。

读写分离:
通过复制可以实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率大于写,当单机的Redis无法应付大量的读请求时可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作。

从数据库持久化:
另一个相对耗时的操作是持久化,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中使用SLAVEOF NO ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLAVEOF命令将其设置成新的主数据库的从数据库,即可将数据同步回来。

复制可靠性保证 - 检验硬盘写入:
1)用户需要在向主服务器写人真正的数据之后,再向主服务器写人一个唯一的虚构值,然后通过检查虚构值是否存在于从服务器来判断写数据是否已经到达从服务器
2)检查 INFO 命令的输出结果中aof_pending_bio_fsync 属性的值是否为0 ,如果是的话,那么就表示服务器已经将已知的所有数据都保存到硬盘里面了

Redis通信协议:
Redis通信协议是Redis客户端与Redis之间交流的语言,通信协议规定了命令和返回值的格式。Redis支持两种通信协议,一种是二进制安全的统一请求协议(unified request protocol),一种是比较直观的便于在telnet程序中输入的简单协议。这两种协议只是命令的格式有区别,命令返回值的格式是一样的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值