当前位置: 首页 > 后端技术 > PHP

Redis主从复制和主从复制原理

时间:2023-03-30 00:40:27 PHP

Redis是一个开源的、日志型的、用ANSIC语言编写的Key-Value数据库,支持网络,可以是基于内存的,也可以是持久化的,并提供API多种语言。自2010年3月15日起,Redis的开发由VMware托管。自2013年5月起,Redis的开发由Pivotal赞助。概述现有企业中,80%的企业大多使用redis单机服务。实际场景中,单节点redis容易出现风险。面对问题机器故障。我们部署到Redis服务器。当一台机器出现故障时,我们需要迁移到另一台服务器上,并保证数据同步。而且数据是最重要的,如果不在意,基本上不会用Redis。容量瓶颈。当我们有扩展Redis内存的需求时,从16G扩展到64G,单机肯定满足不了。当然你可以买一台新的128G的机器。解决方案为了实现分布式数据库更大的存储容量和承受高并发访问,我们将原来的集中式数据库的数据存储在多个其他网络节点上。为了解决这个单节点问题,Redis也会部署多份数据复制到其他节点进行复制,实现Redis的高可用和数据的冗余备份,从而保证数据和服务的高可用。什么是主从复制?主从复制是指将一台Redis服务器的数据复制到其他Redis服务器。前者称为主节点(master),后者称为从节点(slave)。数据复制是单向的,只能从主节点到从节点。默认情况下,每个Redis服务器都是一个主节点;一个主节点可以有多个从节点(或者没有从节点),但是一个从节点只能有一个主节点。主从复制的作用数据冗余:主从复制实现数据的热备份,是一种不同于持久化的数据冗余方式。故障恢复:当主节点出现问题时,从节点可以提供服务,实现快速故障恢复;它实际上是一种服务冗余。负载均衡:在主从复制的基础上,结合读写分离,主节点可以提供写服务,从节点可以提供读服务(即应用在写入Redis数据时连接到主节点,应用在读取Redis数据时连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发度。读写分离:可用于实现读写分离,主库写,从库读,读写分离不仅可以提高服务器的负载能力,还可以根据变化改变从库的数量要求;高可用基石:除了上面的作用之外,主从复制也是实现哨兵和集群的基础,所以主从复制是Redis实现高可用的基础。主从复制启用从节点开启主从复制,有3种方式:配置文件:在从服务器的配置文件中添加:slaveof启动命令:在redis后添加--slaveof客户端命令:Redis服务器启动后,直接通过客户端执行命令:slaveof,则Redis实例成为slave节点。通过inforeplication命令可以看到一些复制的信息。主从复制的原理大致可以分为三个阶段:连接建立阶段(即准备阶段)、数据同步阶段、命令传播阶段。从节点执行slaveof命令后,复制进程开始运行,如下图所示。从图中可以看出,复制过程大致分为6个过程。主从配置后的日志记录也可以看到这个过程1)保存主节点(master)信息。执行slaveof后,Redis会打印如下日志:2)从节点(slave)通过每秒运行的定时任务来维护复制相关逻辑。当定时任务发现有新的主节点时,会尝试与从节点建立网络连接与主节点建立网络连接。从节点会建立一个socket套接字,从节点会建立一个端口为51234的套接字,专门用来接受主节点发来的复制命令。从节点连接成功后,打印如下日志:如果从节点无法建立连接,定时任务会无限重试,直到连接成功或者执行slaveofnoone取消复制。关于连接失败,可以在从节点执行inforeplication查看master_link_down_since_seconds指标,它会记录主节点连接失败时的系统时间。当slave节点连接不上master节点失败时,会每秒打印如下日志,方便问题检测:#ErrorconditiononsocketforSYNC:{socket_error_reason}3)发送ping命令。连接建立成功后,从节点发送ping请求进行第一次通信。ping请求的主要目的如下:检测master和slave之间的网络socket是否可用。·检查主节点当前是否正在接受处理命令。如果从节点发送ping命令后,没有收到主节点的pong回复或者超时,比如网络超时或者主节点被阻塞无法响应命令,从节点将断开复制连接,下一个定时任务会发起重连。节点发送的ping命令成功返回,Redis打印如下日志,继续后续的复制过程:4)权限验证。如果主节点设置了requirepass参数,则需要进行密码验证,从节点必须配置masterauth参数,保证与主节点的密码相同才能通过验证;如果验证失败,复制将被终止,从节点将重新开始复制??过程。5)同步数据集。主从复制连接正常通信后,对于第一个复制场景,主节点会将其持有的所有数据发送给从节点。这部分操作是最长的一步。6)命令继续复制。当主节点将当前数据同步到从节点时,复制的建立过程就完成了。接下来主节点会继续向从节点发送写命令,保证主从数据的一致性。