主页 > 新闻资讯 > 大数据开发:Redis分布式主从复制

大数据开发:Redis分布式主从复制

作者:覃老师 浏览次数: 2021-01-29 17:07


一.什么是主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由主节点到从节点。
默认情况下,每台Redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

二.主从复制的作用

1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2.故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。
3.负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4.读写分离:可以用于实现读写分离,主库写、从库读,读写分离不仅可以提高服务器的负载能力,同时可根据需求的变化,改变从库的数量;
高可用基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复制是Redis高可用的基础。

 

三.主从复制原理

本身就是Master发送数据给slave,只是第一次连接是Slave向Master发送同步请求,其它的都是Master主动向Slave发送数据。可以分为3个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。在从节点执行 slaveof 命令后,复制过程便开始运作,下面图示大概可以看到

四.如何使用主从复制

在Redis中,可以通过SLAVEOF命令或者设置slaveof选项,可以让一个服务器去复制另一个服务器。被复制的服务器称为主服务器(master),进行复制的服务器称为从服务器。
旧版复制功能实现
在2.8版本之前,Redis的复制主要分为**同步(sync)命令传播(command propagate)**两个操作:
1.同步:将从服务器的数据库状态更新成主服务器的数据库状态。
2.命令传播:将作用于主服务器的写命令,传播给从服务器进行执行,从而保证主从数据库状态一致。
同步
当从服务器刚执行SLAVEOF命令时,首先做的就是同步操作,将从服务器的数据库状态更新成主服务器的数据库状态。
从服务器通过向主服务器发送SYNC命令来完成同步操作,SYNC命令的执行步骤如下:
1.从服务器向主服务器发送SYNC命令。
2.主服务器收到SYNC命令之后,开始执行BGSAVE命令生成RDB文件。在生成RDB文件期间,将写命令记录在一个缓冲区中。
3.主服务器发送RDB文件文件给从服务器,从服务器载入该RDB文件。
4.主服务器发送生成RDB文件期间的写命令给从服务器,从服务器重放这些命令。此时从服务器状态和主服务器状态一致,同步操作完成。
命令传播
在同步操作完成之后,后续主服务器执行的写命令会以命令传播的方式发送给从服务器,从而保证主从数据库状态一致。

五.主从复制过程

1、完整复制过程
在 redis2.8 版本之前主从复制过程如下图:

复制过程说明:
slave 服务启动,slave 会建立和 master 的连接,发送 sync 命令。
master 启动一个后台进程将数据库快照保存到 RDB 文件中
注意:此时如果生成 RDB 文件过程中存在写数据操作会导致 RDB 文件和当前主 redis 数据不一致,所以此时 master 主进程会开始收集写命令并缓存起来。master 就发送 RDB 文件给 slave。slave 将文件保存到磁盘上,然后加载到内存恢复,master 把缓存的命令转发给 slave。
注意:后续 master 收到的写命令都会通过开始建立的连接发送给 slave。当 master 和 slave 的连接断开时 slave 可以自动重新建立连接。如果 master 同时收到多个 slave 发来的同步连接命令,只会启动一个进程来写数据库镜像,然后发送给所有 slave。
 
完整复制的问题:
在 redis2.8 之前从 redis 每次同步都会从主 redis 中复制全部的数据,如果从 redis 是新创建的从主 redis 中复制全部的数据这是没有问题的,但是,如果当从 redis 停止运行,再启动时可能只有少部分数据和主 redis 不同步,此时启动 redis 仍然会从主 redis 复制全部数据,这样的性能肯定没有只复制那一小部分不同步的数据高。
 
2、部分复制

部分复制说明:
从机连接主机后,会主动发起 PSYNC 命令,从机会提供 master 的 runid(机器标识,随机生成的一个串) 和 offset(数据偏移量,如果offset主从不一致则说明数据不同步),主机验证 runid 和 offset 是否有效,runid 相当于主机身份验证码,用来验证从机上一次连接的主机,如果 runid 验证未通过则,则进行全同步,如果验证通过则说明曾经同步过,根据 offset 同步部分数据。
热点排行
推荐文章
立即申请>>