1、通过主从架构实现读写分离
单机redis的QPS,也就是每秒可以处理多少个请求,最多也就几万。如果你的机器配置特别高,性能特别好,并且操作处理没什么复杂性,才可能会更高一些。
那么这个时候QPS想要达到10万+,可以通过主从架构+读写分离来实现QPS的增加,redis master主机负责处理写的请求,其他主机负责读数据的请求,这样一来,一台主机可以处理5万请求,那2台主机不就可以处理10万请求了,想要20万也可以,再增加两台主机就是了。
如图:
2、Redis replication的基本原理
既然将redis分了主从架构,那么肯定要将master的数据复制进slave主机的。如果master数据被改变了,什么时候把新的数据复制到从机呢。这个操作是异步的,当master接收到写的请求时,写成功之后会直接向客户端返回成功的回执,然后会向slave主机进行数据复制和更新。
master有一个run_id参数,同一个master无论是重启还是换ip这个值都不会变,slave也会根据这个值来判断直接是否复制过这个master的数据。如果run_id变化了,那就会触发一次全量复制
并且数据复制的时候master不会将对应数据block,slave也不会block,只有复制完成,slave主机将旧数据删除时才会停止旧数据的查询
如果redis使用了主从架构,建议master主机必须开启数据持久化,因为万一master node宕机了,重启之后readis可能会认为master中的数据真的为空,在把这个空数据同步给slave的话,那数据可就100%丢失了。
master虽然说是由备份方案的,宕机之后会从salve中选择一份备份数据来恢复;还有一种是由slave接管master,但这也可能会出现slave还没来得及升级为master,原来的master已经自动重启了,又认为自己的数据是空,将空数据同步到salve,那就全完了
3、主从架构的核心原理
1.主从架构的核心原理
当启动一个slave的时候,会发送一条命令PSYNC通知master node。如果这是slave重新连接master主机,那么仅仅会复制新的数据,如果是第一次连接mater node,那么会触发一次full resynchronization。这时候master会启动一个线程生成一份全量的数据快照文件RDB,还会将接收到的命令存在缓存中。
2.主从复制断点续传
从redis2.8开始,就支持主从复制的断电续传,如果主从复制过程中网络断掉了,那重新连接的时候还是会从断电处开始传,不会从新传。
master node会在本地有一个backlog日志,master和slave复制的时候会不断的记录数据的replica offset,保存在backlog中,如果断掉了,还是会从当前记录的replica offset开始传的。
3.无磁盘化复制
master在内存中直接创建RDB,不会再落进磁盘了。
4.过期key处理
slave不会进行过期key的处理,只有等master处理了过期key之后,将消息同步给slave