当前位置: 首页 > 后端技术 > Node.js

Redis主从复制

时间:2023-04-04 01:36:54 Node.js

文章最初发表于公众号:程序员周先森。本平台不定期更新,喜欢我的文章,请关注我的微信公众号。上一篇文章讲了Redis的持久化机制,包括RDB快照持久化和AOF日志持久化。Redis的持久化机制保证即使Redis服务重启,也能恢复硬盘中的持久化数据。持久化机制保证即使Redis持久化进程宕机,也最多丢失1秒内的数据。.大约80%的企业使用Redis单机服务。单机环境下的Redis在生产环境下容易出现风险。如果Redis的持久化硬盘出现故障,那么持久化备份的数据可能会丢失,所以我们需要一个方案来解决这个问题,所以我们需要将原来中心化数据库中的数据复制到不同的Redis节点上进行存储,这就是master-Redis中的从属复制。概念什么是主从复制?Redis主从复制其实就是将Redis主服务器的数据复制到其他Redis从服务器上进行存储。默认情况下,每个Redis服务器都是一个主节点。一个主节点可以有多个从节点,但是每个从节点只能设置一个主节点。数据复制是单向复制,只能从主节点复制到从节点进行存储。在master节点不需要特殊配置,只需要在slave节点添加slaveof指令:slaveof在slave节点的配置文件中,slaveof命令即可用于设置slave节点自己的master节点。启用主从复制方式在从节点配置slaveof命令有三种方式:在redis.conf配置文件中配置:在配置文件中添加:slaveof。在slave节点启动命令中添加slaveof参数:在reids启动命令后添加--slaveof。从节点Redis启动成功,执行slaveof命令:slaveof。主从复制的作用数据冗余:可以实现数据热备份,在Redis持久化的基础上进一步优化数据备份。故障恢复:当主节点的硬盘持久化出现问题时,从节点可以快速提供服务,实现数据恢复。读写分离:主节点可以负责所有的写操作,从节点可以负责所有的读操作,从而实现Redis的读写分离,提高服务器负载能力。负载均衡:主从复制配合实现读写分离,可以降低服务器负载,实现负载均衡。高可用:主从复制是集群的基础,所以高并发下的主从配置是必不可少的配置之一。主从复制的三大阶段主从复制主要分为三大阶段:准备阶段、数据同步阶段、命令传输阶段。在准备阶段,主节点服务器中有两个字段:masterhost和masterport。masterhost字段用来存放master节点的ip信息,masterport字段用来存放master节点的端口号信息,其实就是我们通过slaveof命令设置的信息。主节点与从节点建立socket连接,成功执行slaveof命令。从节点每秒钟会调用一次replicationCron()函数来判断是否可以连接到主节点。当找到新的master节点时,会通过上一步维护的ip和port尝试与master节点建立socket连接。当主节点与从节点成功建立socket连接后,从节点会建立一个ssocket套接字,负责接受主节点发送的复制数据命令。同时,主节点也会为从节点创建相应的客户端状态。通过上一步发送ping命令后,从节点成功成为主节点的客户端。可以通过发送ping请求来发出第一个请求。第一次请求的目的不是复制数据,而是检查刚刚创建的socket连接是否可用,主节点是否可以正常处理请求。从节点向主节点发送ping命令时,一般有三种响应结果:返回pong:表示socket连接可用,可以继续操作。超时无返回:表示socket不可用,slave节点断开socket连接。返回其他结果:表示主节点当前正忙,无法处理从节点的请求,从节点断开socket连接。权限验证如果master节点配置了requirepass参数,表示需要进行权限验证,slave节点必须配置masterauth参数,masterauth参数配置与master节点的requirepass参数一致才能通过验证。否则授权验证失败,从节点断开socket连接。数据同步阶段的准备工作完成后,就可以进行数据同步了。对于第一次数据拷贝,主节点会将所有数据发送给子节点,也就是全量拷贝,所以这部分是比较耗时的操作。对于不是第一次的数据同步,会根据主从节点的当前状态选择全量复制或者不考虑皮肤类型。这个阶段主节点需要主动向从节点发送请求完成复制。主节点收到全量复制请求后,fork一个后台进程从数据库快照中生成RDB文件,并将生成过程中收到的写请求暂时缓存起来,否则会影响数据的一致性。然后生成RDB文件后,将RDB文件发送给从节点。从节点先清除旧数据,然后接收RDB文件更新数据。最后,主节点将所有缓存的写命令发送给从节点,从节点执行写命令,最终保持与主节点的数据一致性。部分复制需要fork子进程进行全量复制,RDB持久化会极度消耗CPU,而且发送RDB文件给从节点也会影响网络带宽,所以全量复制的实际效率不高,所以可以使用部分复制来数据从master复制到slave。在进行部分复制时,主节点和从节点会分别维护一个偏移量变量,用于存储从主节点传递给从节点的字节数。通过偏移量可以判断主从节点的数据是否一致。然后节点数很容易找到master偏移量处丢失的数据进行部分复制。但是部分复制最关键的一点是必须是非首次复制,主从节点的首次复制必须是全量复制过程。在命令传输阶段,当主节点将当前数据同步到从节点时,复制建立过程就完成了。只要从节点不关闭主从复制,主节点就会继续向从节点发送写命令,保证主从数据的一致性。命令传输阶段是异步操作,因此可能存在一定的延迟,无法保证数据的实时一致性。欢迎关注公众号:程序员周先森。本文由博客多发平台OpenWrite发布!