Redis主从架构(replication)
一. Redis如何支持超过10w+的并发量
-
单机
单机Redis能够承载的QPS大概在上万到几万之间,取决于机器性能、业务操作复杂性等。理论上说,单机Redis无法支撑超过10w的并发量。
-
读写分离
对于大部分缓存系统来说,请求都是读多写少的,因此采用读写分离架构能够有效提升整体性能。
读写分离采用一主多从架构,所有写请求都由Master处理,同时Master负责将数据同步到每个Slave上。Slave负责处理所有的读请求。在这种架构上,水平扩容也十分方便,直接增加Slave节点即可。
二. replication的基本流程
- master采用异步复制的方式,将数据同步给slave。但是从redis 2.8版本开始,slave也会周期性地与master通信,确认自己同步的数据量。
- 一个master可以配置多个slave。
- slave也可以连接其他的slave。
- master进行数据同步时,是不会block正常服务的。
- slave在进行数据复制时,也不会block自己的查询操作,它会用旧的数据提供查询服务。但是当复制完成后,需要删除旧的数据并加载新的,这时就会阻塞查询操作。
- slave可以十分方便地进行水平扩展,提高读的吞吐量。
三. master持久化对于主从架构的意义
采用主从架构时,建议必须开启master的持久化。
不建议将slave作为master的数据热备份。因为一旦关闭master的持久化,master故障重启时,数据可能是空的,而一经复制,所有slave的数据也都丢失了。因此master一定要有持久化机制,而且要有数据备份。
尽管通过某些高可用机制(如Redis提供的sentinal)支持slave自动接管master,但是一旦没有检查到master宕机,而master又自动重启了,就可能导致上面所说的所有的slave数据都被清空,导致数据丢失。
四. 主从复制基本流程
- slave启动时,发送PSYNC命令给master
- 如果slave是重连到master,则master仅仅复制slave丢失的那部分数据。否则,如果slave是第一次连接到master,则master会触发一次full resynchronization
- master执行full resynchronization时,会创建一个后台线程,生成一个RDB快照文件,同时将接受到的客户端的写命令缓存在内存中。RDB文件生成完毕后,master会将RDB文件通过网络发送给slave。slave会先将RDB文件写入磁盘,然后再从本地磁盘加载到内存中。之后,master会将内存中缓存的客户端写命令也发给slave,slave也会同步这些数据。
- 如果由于网络故障,slave和master断开了连接,则会自动发起重连。master如果发现有多个slave重连,仅仅会启动一个rdb save操作,用一份数据服务所有的slave。
五. 主从复制的一些feature
-
断点续传:
从redis 2.8开始,就支持主从复制的断点续传。如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。
master 会在内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制。但是如果没有找到对应的offset,那么就会执行一次full resynchronization。
-
无磁盘化复制:
master在内存中直接创建rdb文件,然后通过网络发送给slave,不会在自己本地落地磁盘了。
配置:
#开启无磁盘化复制,适用于磁盘性能较差但是网络性能好的场景 repl-diskless-sync yes #master延迟一定时间再开始复制RDB文件,目的是等待更多slave重新连接过来,便于并行复制 repl-diskless-sync-delay 5
-
过期key处理
slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。
六. 主从架构下的高可用性
-
高可用的概念
如果在一年之内,99.99%的时间系统都是可以正常提供服务的,则称系统是高可用的。
-
主从架构下的不可用
- 如果是一主多从的架构,一台slave故障,其他slave仍然可以提供读服务。
- 如果master故障,则Redis无法提供写服务,整个集群就不可用了。
-
如何保证高可用性
- master下挂多个slave,保证读服务的高可用。
- 通过Redis提供的sentinel或其他方式,对master进行监控,一旦master故障,则开启failover,实现主备自动切换。