【Redis】Redis复制原理及相关优化
Redis单机问题
说主从复制之前先看看单机有什么问题
1. 机器故障,包含软硬件问题。这个就牵涉到高可用问题。
2. 容量瓶颈,比如一台机器16G内存,Redis要使用20G内存,那么这台单机是满足不了的。这个就牵涉到分布式问题。
3. qps瓶颈 ,Redis官方号称支撑10w QPS,但是目前的业务需要能支撑100w QPS,那么单机该怎么做。这个就牵涉到分布式问题。
Redis主从复制介绍
Redis 支持简单且易用的主从复制(master-slave replication)功能, 该功能可以让从服务器(slave server)成为主服务器(master server)的一个副本,从服务器数据和主服务器数据保持一致。
Redis提供两种主从模式
1. 一主一从。包含一个主服务器和一个从服务器。
2. 一主多从。一个主服务器可以有多个从服务器。主服务器数据有多个备份,同时还可以做到Redis数据读写分离,将流量分流,就是主服务器负责写数据,从服务器负责读取数据并且还可以做负载均衡来提升整体Redis性能。
Redis主从复制作用
1. 提供多份数据副本,数据副本可以成为高可用及分布式的基础。
2. 扩展了Redis读数据的性能(读写分离)。
Redis复制功能的几个特点
1. 一个主服务器可以有多个从服务器。
2. 一个从服务器只能有一个主服务器。
3. 数据的流动方向是单向的,从主服务器到从服务器。
Redis主从复制配置的两种方式
1. slaveof命令。
slaveof命令可以将当前服务器转变为指定服务器的从服务器(slave server)。
如果当前服务器已经是某个主服务器(master server)的从属服务器,那么执行 SLAVEOF host port
将使当前服务器停止对旧主服务器的同步,丢弃旧数据集,转而开始对新主服务器进行同步。另外,对一个从属服务器执行命令 SLAVEOF NO ONE 将使得这个从属服务器关闭复制功能,并从从属服务器转变回主服务器,原来同步所得的数据集不会被丢弃。利用『 SLAVEOF NO ONE 不会丢弃同步所得数据集』这个特性,可以在主服务器失败的时候,将从属服务器用作新的主服务器,从而实现无间断运行。
语法
redis Slaveof 命令基本语法:SLAVEOF host port
使用
有两台Redis服务器,一台是主服务器,IP和端口是127.0.0.1 :6379
,另一台Redis服务器Ip和端口是127.0.0.1 :6378,如果想要端口为6378这台Redis服务器成为主服务器的从服务器,可以在端口为6378这台Redis服务器执行命令: slaveof 127.0.0.1:6379
。注意下slaveof命令是一个异步命令,执行完会立马返回,但实际上复制命令很多工作要做的。
如果要取消复制,也可以用slaveof命令,可以这么执行,在端口为6378机器上执行slaveof no one
,意思就是不成为任何一个主服务器的从节点。
需要注意的是取消之后不会把6379
同步给他的数据给清空掉。如果6378
这时候去slaveof一个新的主服务器,新的主服务在同步给 数据时候会先清空
6378
的数据。
2. 修改配置文件。
配置一个从服务器非常简单, 在Redis启动之前,例如当前配置文件所属的节点希望成为某个主服务器的从节点,只要在配置文件中增加以下的这一行就可以了slaveof 127.0.0.1:6379
。
如果希望从节点只负责读取,就是只读模式,可以配置参数
slave-read-only
选项控制 。如果为 yes 代表为只读状态,但并不表示客户端用集群方式以从节点为入口连入集群时,不可以进行 set 操作,且 set 操作的数据不会被放在从节点的槽上,会被放到某主节点的槽上。
两种方式的对比
方式 | slaveof命令 | 配置文件 |
优点 | 无需重启Redis | 统一配置 |
缺点 | 不便于管理 | 需要重启Redis |
Redis主从复制类型
1. 全量复制。
全量复制就是用于初次复制或其它无法进行部分复制的情况,主服务器将它当前所有数据并且在复制期间所写的数据都发送给从服务器的一个过程。
全量复制过程:
1)当Redis从服务器连接主服务器时候,发送SYNC命令去通知Redis主服务已经连接并且可以进行复制。2)主机会向从机发送run_id和offset,因为slave并没有对应的 offset,所以是全量复制。
3)从机slave会保存主机master的基本信息。
4)主节点收到全量复制的命令后,执行bgsave(异步执行),在后台生成RDB文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令。
5)主机发送RDB文件给从服务器。
6)发送缓冲区数据。
7)刷新旧的数据。从节点在载入主节点的数据之前要先将老数据清除。
8)加载RDB文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据的加载。
全量复制总结:
全量复制是一个非常重型的操作,当数据量较大时,会对主从节点和网络造成很大的开销。
2. 增量复制(部分复制)
参考来源及其他资料
http://doc.redisfans.com/topic/replication.html
https://www.runoob.com/redis/server-bgrewriteaof.html