Redis主从架构(replication)

Redis主从架构(replication)

一. Redis如何支持超过10w+的并发量

  1. 单机

    单机Redis能够承载的QPS大概在上万到几万之间,取决于机器性能、业务操作复杂性等。理论上说,单机Redis无法支撑超过10w的并发量。

  2. 读写分离

    对于大部分缓存系统来说,请求都是读多写少的,因此采用读写分离架构能够有效提升整体性能。

    读写分离采用一主多从架构,所有写请求都由Master处理,同时Master负责将数据同步到每个Slave上。Slave负责处理所有的读请求。在这种架构上,水平扩容也十分方便,直接增加Slave节点即可。

二. replication的基本流程

  1. master采用异步复制的方式,将数据同步给slave。但是从redis 2.8版本开始,slave也会周期性地与master通信,确认自己同步的数据量。
  2. 一个master可以配置多个slave。
  3. slave也可以连接其他的slave。
  4. master进行数据同步时,是不会block正常服务的。
  5. slave在进行数据复制时,也不会block自己的查询操作,它会用旧的数据提供查询服务。但是当复制完成后,需要删除旧的数据并加载新的,这时就会阻塞查询操作。
  6. slave可以十分方便地进行水平扩展,提高读的吞吐量。

三. master持久化对于主从架构的意义

采用主从架构时,建议必须开启master的持久化。

不建议将slave作为master的数据热备份。因为一旦关闭master的持久化,master故障重启时,数据可能是空的,而一经复制,所有slave的数据也都丢失了。因此master一定要有持久化机制,而且要有数据备份。

尽管通过某些高可用机制(如Redis提供的sentinal)支持slave自动接管master,但是一旦没有检查到master宕机,而master又自动重启了,就可能导致上面所说的所有的slave数据都被清空,导致数据丢失。

四. 主从复制基本流程

  1. slave启动时,发送PSYNC命令给master
  2. 如果slave是重连到master,则master仅仅复制slave丢失的那部分数据。否则,如果slave是第一次连接到master,则master会触发一次full resynchronization
  3. master执行full resynchronization时,会创建一个后台线程,生成一个RDB快照文件,同时将接受到的客户端的写命令缓存在内存中。RDB文件生成完毕后,master会将RDB文件通过网络发送给slave。slave会先将RDB文件写入磁盘,然后再从本地磁盘加载到内存中。之后,master会将内存中缓存的客户端写命令也发给slave,slave也会同步这些数据。
  4. 如果由于网络故障,slave和master断开了连接,则会自动发起重连。master如果发现有多个slave重连,仅仅会启动一个rdb save操作,用一份数据服务所有的slave。

五. 主从复制的一些feature

  1. 断点续传:

    从redis 2.8开始,就支持主从复制的断点续传。如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份。

    master 会在内存中创建一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制。但是如果没有找到对应的offset,那么就会执行一次full resynchronization。

  2. 无磁盘化复制:

    master在内存中直接创建rdb文件,然后通过网络发送给slave,不会在自己本地落地磁盘了。

    配置:

    #开启无磁盘化复制,适用于磁盘性能较差但是网络性能好的场景
    repl-diskless-sync yes
    
    #master延迟一定时间再开始复制RDB文件,目的是等待更多slave重新连接过来,便于并行复制
    repl-diskless-sync-delay 5
    
  3. 过期key处理

    slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。

六. 主从架构下的高可用性

  1. 高可用的概念

    如果在一年之内,99.99%的时间系统都是可以正常提供服务的,则称系统是高可用的。

  2. 主从架构下的不可用

    1. 如果是一主多从的架构,一台slave故障,其他slave仍然可以提供读服务。
    2. 如果master故障,则Redis无法提供写服务,整个集群就不可用了。
  3. 如何保证高可用性

    1. master下挂多个slave,保证读服务的高可用。
    2. 通过Redis提供的sentinel或其他方式,对master进行监控,一旦master故障,则开启failover,实现主备自动切换。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张申傲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值