reds主从复制笔记

关于redis的风险问题讨论

  • 机器出现故障

如果机器产生故障,数据丢失会对业务项目造成灾难性后果

  • 容量产生瓶颈

机器的内存,硬盘是有限的,如果一直采用单机,那么内存就要一直升级。

  • I/O开销

如果对单一服务器总是进行读写操作,开销是非常大的。需要缓解压力。

**由此,要避免服务器产生故障,我们要准备多台服务器,用来组成集群,互相连通,读写分离,将数据复制成多个副本,并保存在不同的节点上,而且保证数据都是同步的,当一台机器出现宕机的情况,其他的服务器不会受到影响,继续提供服务。**因而我们需要提供一些高可用方案来实现这些功能。

redis主从复制,也就是将master中的数据即时有效的复制到slave中。例如:

集群的方案:

  • 提供数据:master,主节点,负责写数据,做操作时会将变化的数据自动同步到slave

  • 接收数据:slave,从节点,负责读数据,禁止写数据

主从复制作用

  • 读写分离:master写,slave读,提高服务器读写负载能力
  • 负载均衡:基于主从结构,配合读写分离,由slave分担master负载,并根据需求,改变slave的数量,通过多个从节点分担数据读取负载,大大提高Redis服务器并发量与数据吞吐量
  • 故障恢复:当master出现问题,由slave提供服务,实现快速的故障恢复
  • 数据冗余:实现数据热备份,是持久化之外的一种数据冗余方式

主从复制

1.主从连接

首先slave会发送命令slaveof ip port,master接收到命令开始响应,slave保存master的ip和端口,根据保存的信息创建连接master的socket,为了保证连接正常,slave会周期发送ping命令,master再响应pong,有密码的话,slave会发送auth password,master验证授权,最后slave发送端口信息,master保存slave端口号。(步骤都会在启动日志中有显示)

三种方式:

①.使用客户端命令: slaveof

②.启动服务器时加参数:redis-server -slaveof

③.修改配置文件:在slave节点的conf文件中添加:slaveof

如果设置了密码,那么slave的conf文件中还要加入masterauth ,要不然无法授权

这里选择用第三种方式来连接。

master节点

slave节点

然后向master中写一个数据,成功在slave中读取到

如果想断开连接的话,我们在slave节点客户端使用命令:slaveof no one即可。


2.数据同步

slave初次连接master之后,master会将所有数据复制到slave中,将slave的状态更新成master的当前状态。数据同步的阶段主要是两步,第一步做全量复制,第二步做部分复制。

全量复制:slave请求同步数据,然后master创建rdb同步数据,通过socket发送给slave,slave接收rdb并清空数据,执行rdb恢复,并发送命令告诉master,rdb恢复完成。

但是有一点,在执行全量复制过程中,master复制缓冲区中还是会有一条条的指令过来,这时候的状态并不在全量复制的快照中,所以,需要再进行第二步,部分复制。

部分复制:slave请求部分同步数据,然后master复制缓冲区的信息给slave,slave接收信息并执行,恢复数据。

如果复制缓冲区的大小设置不合理,会导致数据溢出,比如说,全量复制的周期长了,由于缓冲区是一个FIFO队列,满了的情况下,再进来命令,那么前面的命令就会丢失,所以进行部分复制的时候会有数据丢失,那么又要进行第二次全量复制,导致slave陷入死循环。

所以我们可以自行在配置文件中配置合适的repl-backlog-size的大小