为什么引入主从
单机的 redis,能够承载的QPS大概就在上万到几万不等。对于緩存来说,一般都是用来支撑读高并发的。因此架构做成主从 (master- slave}架构,一主多从,主负责写,并且将数据复制到其它的 slave节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发。
redis replication->主从架构->读写分离->水平扩容支撑读高并发
redis replication的核心机制
- redis采用异步方式复制数据到 slave节点,不过reds2.8开始,slave node会周期性地确认自己每次复制的数据量;
- 一个 master node是可以配置多个 slave node的;
- slave node也可以连接其他的 slave node;
- slave node做复制的时候,不会 block master node的正常工作
- slave node在做复制的时候,也不会 block对自己的查询操作,它会用旧的数据集来提供服务;
- 但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了;
- slave node主要用来进行横向容,做读写分离,扩睿的 slave node可以提高读的吞吐量。
注意,如果采用了主从架构,那么建议必须开启 master node的持久化,不建议用 slave node作为 master node的数据热备,因为那样的话,如果你关掉master的持久化,可能在 master宕机重启的时候数据是空的,然后可能一经过复制slave node的数据也丢了。
另外, master的各种备份方案,也需要做。万一本地的所有文件丢失了,从备份中挑选一份rdb去恢复 master,这样才能确保启动的时候,是有数据的,即使采用了后续讲解的高可用机制, slave node可以自动接管 master node,但也可能 sentinel还没检测到 master failure, master node就自动重启了,还是可能导致上面所有的 slave node数据被清空。
redis 主从复制核心原理
- 当启动一个 slave node的时候,它会发送一个PSYNC命令给 master node
- 如果这是 slave node初次连接到 master node,那么会触发一次fullresynchronization全量复制。
- 此时 master会启动一个后台线程,开始生成一份RDB快照文件
- 同时还会将从客户端 client新收到的所有写命令缓存在內存中。
- RDB文件生成完毕后, master会将这个RDB发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中。
- 接着 master会将内存中緩存的写命令发送到 slave, slave也会同步这些数据。
- slave node如果跟 master node有网络故障,断开了连接,会自动重连,连接之后 master node仅会复制给 slave部分缺少的数据