目录
1、真实企业配置
2、什么是主从复制
2.1、Redis为什么需要主从复制?
2.2、主从复制的好处
2.3、主从复制的缺点
3、主从复制几种方式及流程
3.1、全量复制的流程
3.2、增量复制流程
3.3、断点续传流程
3.4、无磁盘化复制流程
4、主从复制会出现的问题及解决方案
4.1、怎么减少save基于旧的数据版本对外提供服务
下一篇:redis哨兵模式
1、真实企业配置
常见的做法是将Redis集群与主从复制结合使用,同时使用哨兵模式(监控和故障转移),这种组合可以实现数据分片、数据复制、读写分离以及自动故障转移的功能。
(1)小规模应用。
不使用集群、主从、哨兵:使用单个Redis实例,不进行分片和复制。
(2)中等规模应用
使用主从+哨兵:使用Redis主从复制来实现数据的复制和读写分离,一主多从,同时使用Redis哨兵监控主从复制架构中的节点,并实现自动故障转移。
(3)大规模应用
使用集群+主从+哨兵:
--使用Redis集群来实现数据的分片和自动故障转移。将数据分布到多个节点上,可以提高存储容量和吞吐量;
--使用Redis主从复制来实现数据的复制和读写分离;
--使用Redis哨兵监控集群中的节点,并实现自动故障转移。
总结:从上面配置可以知道,主从模式---数据的复制和读写分离、哨兵模式--自动故障转移、集群模式--数据的分片、自动故障转移,提高存储和吞吐量。
2、什么是主从复制
实现数据的复制和读写分离。配置一主(master)多从(slave),主节点负责接收写操作,并将写操作的日志(AOF或RDB文件)发送给从节点,并将数据复制到从节点上;从节点通过执行这些日志来复制主节点的数据,从节点处理读操作。
当主从服务器刚建立连接的时候,进行全量同步;全量复制结束后,进行增量复制。
2.1、Redis为什么需要主从复制?
单台Redis节点存在以下的局限性:
- 单节点的Redis能够支撑QPS大概在5w左右,千万级并发会成为了高并发的瓶颈;
- 单节点的Redis不能保证高可用;
- CPU的利用率上,单台Redis实例只能利用单个核心。
2.2、主从复制的好处
- 数据冗余:主从复制实现了数据的热备份;
- 故障恢复:如果master宕掉了,使用哨兵模式,提升一个 slave 作为新的 master,实现故障转移、高可用;
- 负载均衡:可以轻易地实现横向扩展,实现读写分离,一个 master 用于写,多个 slave 用于分摊读的压力,从而实现高并发。
2.3、主从复制的缺点
所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave服务器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
怎么解决?
- 增加Master服务器的硬件资源;
- 增加Slave服务器数量,可以将负载分散到多个Slave上,减少单个Slave的压力,从而减少延迟
3、主从复制几种方式及流程
3.1、全量复制的流程
Redis全量复制一般发生在Slave初始化阶段,这时Slave需要将Master上的所有数据都复制一份。
- save服务器连接到master服务器,便开始进行数据同步,发送psync命令;
- master服务器收到psync命令之后,开始执行bgsave命令生成RDB快照文件并使用缓存区记录此后执行的所有写命令;
- master服务器bgsave执行完之后,就会向所有Slava服务器发送快照文件,并在发送期间继续在缓冲区内记录被执行的写命令;
- slave服务器收到RDB快照文件后,会将接收到的数据写入磁盘,然后清空所有旧数据,在从本地磁盘载入收到的快照到内存中,同时基于旧的数据版本对外提供服务;
- master服务器发送完RDB快照文件之后,便开始向slave服务器发送缓冲区中的写命令;
- slave服务器完成对RDB快照的载入,开始接收命令请求,并执行来自主服务器缓冲区写命令
- 如果slave node开启了AOF,那么会立即写AOF。
3.2、增量复制流程
在初始化的全量复制并开始正常工作之后,master服务器将发生的写操作同步到slave服务器过程
3.3、断点续传流程
slave与master能够在网络连接断开重连后,只从中断处继续进行复制,而不必重新同步
3.4、无磁盘化复制流程
由master直接开启一个socket,在内存中创建RDB文件,再将rdb文件发送给slave服务器,不使用磁盘作为中间存储。
- repl-diskless-sync :是否开启无磁盘复制
4、主从复制会出现的问题及解决方案
4.1、怎么减少save基于旧的数据版本对外提供服务
只能减少不能避免,需要结合监控和故障回复机制。
- 使用非阻塞模式(异步模式);
- slave服务器的配置文件中设置`repl-diskless-sync`参数为`yes`,表示Slave服务器在初始同步时不会将数据写入磁盘,而是直接从Master服务器内存中读取数据。