Redis主从复制
前言:先了解一下互联网“三高架构”:
1、高并发
2、高性能
3、高可用
我们知道,服务器是很容易出现一些事故导致宕机的,如果是单台服务器,那么会极大影响用户体验,所以我们需要多台服务器协作,进而追求更高的可用性,如下:
多台服务器连接方案:
其中,主服务器(主库)用于客户端写数据,从库用于客户端读数据。
主从复制的核心:
解决主库和从库数据同步问题,将主库数据及时有效传递给从库!!
主从复制作用:
1、读写分离:主库负责写,从库负责读,提高服务器负载能力
2、负载均衡:基于主从结构,由从库分担主库的负载,并根据需求的变化,改变从库的数量,通过多个从节点分担数据读取负载,大大提高数据库并发量与数据吞吐量
3、故障恢复:当主服务器损坏,可以选择一个从服务器替代主服务器的地位,继续提供服务,实现故障的快速恢复
4、数据冗余:实现数据的热备份,是持久化之外的一种备份数据方式
5、高可用基石:基于主从复制,可以构建哨兵模式与集群,实现Redis高可用方案
主从复制的工作流程:
阶段一:建立主从连接
建立slave(从库)到master(主库)的连接,使master能够识别slave,并且保存slave端口号。
建立主从连接的方式:
1、方式一:从服务器对应的客户端发送命令
slaveof 主服务器ip 主服务器端口号
2、方式二:启动slave服务器时就选择连接master
redis-server redis.conf --主服务器ip 主服务器端口号
3、方式三:直接在slave的conf文件中添加配置信息
slaveof 主服务器ip 主服务器端口号
断开主从复制连接的方式:
从客户端执行指令:
slaveof no one
阶段二:数据同步
数据同步共分两步:
1、全量复制:
即master通过bgsave生成RDB文件然后通过socket发送给slave,而后slave通过该文件恢复数据。
2、部分复制(增量复制):
在全量复制过程中,master仍然会继续产生数据变化,于是master会将后续的指令保存在一个缓冲区,当slave完成RDB恢复后,master将缓冲区指令发送给slave,slave先进行重写,再执行重写后的指令恢复数据。
注意:缓冲区容量大小一定要合理设置,同时数据同步应该避开流量高峰期,防止master阻塞
对master的说明:
对slave的说明:
阶段三:命令传播
命令传播概念:
master数据库中数据变化之后,导致主从数据库不一致,此时需要让主从数据同步,同步的动作称为命令传播。
命令传播动作:
master将接收到的数据变化变更成一条命令(AOF形式的字节数据)发送给slave,slave接收后执行此命令,用以同步数据。
复制积压缓冲区:
为了防止短时间断网导致命令传播的出错,master服务器创建了一个队列,这个先进先出的队列就是复制积压缓冲区(默认大小为1M),所有需要传播给slave的命令都要先进入此队列,再传送给slave.
缓冲区的组成:
1、偏移量
2、字节值
缓冲区中每一个字节都对应一个偏移量,master通过缓冲区将aof字节信息传递给slave,在这个过程中,不论是master还是slave都要记录发送完或者接受完的信息的偏移值,发收过程结束后进行比较,如果双方偏移量相同,即说明信息无误,如果发生一方网络故障,通过比较偏移量,可以发现不对劲,就能马上重新发送!
runid概念了解下: