如何保证redis高并发、高可用

如何保证redis高并发、高可用

redis实现高并发主要依靠主从架构,一主多从,一般来说,很多项目其实就足够了,单主用来写入数据,单机几万QPS,多从用来查询数据,多个从实例可以提供每秒10w的QPS。
如果想要在实现高并发的同时,容纳大量的数据,那么就需要redis集群,使用redis集群之后,可以提供每秒几十万的读写并发。redis 高可用,如果是做主从架构部署,那么加上哨兵就可以了,就可以实现,任何一个实例宕机,可以进行主备切换。

Redis主从架构

单机的Redis,能够承载的QPS大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的slave节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发
如何保证redis高并发、高可用_第1张图片
Redis replication->主从架构->读写分离->水平扩容支撑读高并发

Redis replication的核心机制

  • Redis采用异步方式复制数据到slave节点,不过Redis2.8开始,slave node会周期性地确认自己每次复制的数据量;
  • 一个master node是可以配置多个slave node的;
  • slave node 也可以连接其他的 slave node;
  • slave node 做复制的时候,不会block master noce的正常工作;
    -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,那么会触发一次 full resynchronization 全量复制。此时master会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client新收到的所有写命令缓存在内存中。RDB 文件生成完毕后,master会将这个RDB 发送给slave,slave会先写入本地磁盘,然后再从本地磁盘加载到内存中,接着master会将内存中缓存的写命令发送到slave,slave也会同步这些数据。slave node如果跟master node有网络故障,断开了连接,会自动重连,连接之后master node仅会复制给 slave部分缺少的数据。

如何保证redis高并发、高可用_第2张图片
主从复制的断点续传
从 Redis2.8开始,就支持主从复制断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是重头开始复制一份。
master node 会在内存中维护一个backlog,master 和 slave 都会保存一个 replica offset 还有一个master run id,offset 就是保存在backlog中的。如果master 和 slave 网络断掉了,slave 会让 master 从上次 replica offset 开始继续复制,如果没有offset 那么就resynchronization 全量复制。
无磁盘化复制
master 在内存中直接创建RDB,然后发送给slave,不会在自己本地落地磁盘了。只需要在配置文件中开启repl-diskless-sync yes 即可。

repl-diskless-sync yes
repl-diskless-sync-delay 5

过期KEY处理
slave 不会过期KEY,只会等待master 过期key,如果master过期了key或者LRU淘汰了一个key 那么会模拟一条del命令发送给salve。
复制的完整流程
slave node 启动时,会在自己本地保存master node的信息,包括master node的 host 和 ip,但是复制流程没开始。
slave node 内部有个定时任务,每秒检查有没有新的master node 要连接和复制,如果发现,就跟master node 建立 socket 网络连接。然后slave node 发送ping 命令给master node。如果master node 设置了 requirepass 那么slave node 必须发送masterauth 的口令过去进行认证。master node 第一次执行全量复制,将所有数据发送给salve node。master node 后续将写命令持续发送给slave node。如何保证redis高并发、高可用_第3张图片
Redis 如何才能做到高可用
一个salve 挂掉了,会不会影响可用性,还有其它slave 在提供相同数据下的相同的对外查询服务。但是如果master 死掉了,会怎么样?没法写数据了,写缓存的时候都失效了。slave 节点还有什么用呢,没有master给它们复制数据了,系统相当于不可用了。
Reids 的高可用架构,叫做failover 故障转移,也可叫做主备切换。
master node 故障是,自动检测,并且将某 slave node 自动切换到 master node 的过程,叫做主备切换。这个过程,实现了Redis 的主从架构下的高可用。

你可能感兴趣的:(redis,数据库,缓存)