保证Redis高并发的方式
读写分离
Redis架构做为主从架构,一主多从,主负责写,从负责读,所有的读请求都走从节点,这种方式还有个好处就是支持水平扩容
Redis Replication的核心机制
- Redis采用异步方式复制数据到Slave节点,不过Redis2.8开始,slave node会周期性的确认自己每次复制的数据量
- 一个Master node是可以配置多个slave node的
- slave node也可以连接其他的slave node
- slave node做复制的时候,是不会block master node 的正常工作的
- slave node做复制的时候,也不会block 对自己的查询操作,他会用旧的数据集来提供服务,但是复制完成的时候,需要删除旧数据集,加载新数据集,这个时候就会暂停对外服务了
- slave node主要用来进行横向扩容,做读写分离,扩容的slave node可以提高读的吞吐量
Master 持久化对住从架构的安全保障的意义
如果采用了主从架构,那么建议必须开启master node的持久化
不建议用slave node作为master node的数据热备,因为那样的话,如果你关掉Master的持久化,可能再master宕机的时候数据是空的,然后可能一经过复制,salve node数据也丢失了,几十采用后续讲解的高可用机制,slave node可以自动接管Master node,但是也可能sentinal还没检测到master failure ,master node 就重新启动了,还是可能导致上面的所有slave node数据清空故障
主动架构的核心原理
主从架构的和核心原理
当启动一个slave node的时候,它会发送一个PSYNC命令给master node
如果这事slave node重新链接master node,那么master node仅仅恢复至给slave部分缺少的数据,否则如果是slave node第一次链接master node,那么会触发一次Full resynchronization, 开始full resynchronization 的时候,master会启动一个后台线程,开始生成一份RDB快照文件,同时还会从客户端收到所有写命令缓存到内存中,RDB文件生成完毕之后,master会将这个RDB发送给Slave,Slave会先写入本地磁盘,然后再从本地磁盘加载到内存中,然后master会将内存中缓存的写命令发送给slave,slave也会同步这些数据
slave node如果跟master node有网络故障,断开了链接,会自动重连,master如果发现有多个slave node都来重新连接,仅仅会启动一个rdb save操作,用一份数据服务所有的slave node
主从复制的断点续传
从Redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份
master node会在内存中创建一个basklog, master和slave都会保存一个replica offset 还有一个master,id,offset就是保存在backlog中的,如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制
但是如果没有找到对应的offset,那么就会执行一次resynchronization
无磁盘化复制
master再内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了
需要通过下面两个参数进行配置
repl-diskless-sync:是否开启无磁盘化复制
repl-diskless-sync-delay:等待一定时长在开始复制,因为要等更多slave重新链接过来
过期key处理
slave不会过期key,只会等待master过期key,如果master过期了一个Key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave