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

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

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

Redis主从架构

单机的Redis,能够承载的QPS大概就在上万到几万不等。对于缓存来说,一般都是用来支撑读高并发的。因此架构做成主从(master-slave)架构,一主多从,主负责写,并且将数据复制到其它的slave节点,从节点负责读。所有的读请求全部走从节点。这样也可以很轻松实现水平扩容,支撑读高并发
在这里插入图片描述
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部分缺少的数据。

在这里插入图片描述
主从复制的断点续传
从 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 如何才能做到高可用
一个salve 挂掉了,会不会影响可用性,还有其它slave 在提供相同数据下的相同的对外查询服务。但是如果master 死掉了,会怎么样?没法写数据了,写缓存的时候都失效了。slave 节点还有什么用呢,没有master给它们复制数据了,系统相当于不可用了。
Reids 的高可用架构,叫做failover 故障转移,也可叫做主备切换。
master node 故障是,自动检测,并且将某 slave node 自动切换到 master node 的过程,叫做主备切换。这个过程,实现了Redis 的主从架构下的高可用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Nginx和Redis都是在并发场景下常用的工具。Nginx是一个性能的Web服务器和反向代理服务器,而Redis是一个性能的键值存储数据库。 当涉及到并发时,Nginx可以用作负载均衡器,将请求分发给多个后端服务器,从而提系统的吞吐量和性能。Nginx使用事件驱动的异步架构,可以处理大量并发连接,同时具有较低的资源消耗。 Redis作为一个内存数据库,具有快速读写的能力,适合处理大量的并发请求。它支持多种数据结构和丰富的功能,例如缓存、消息队列和分布式锁等,可以帮助应对并发场景下的数据存储和处理需求。 在并发环境中,可以通过以下几点来优化Nginx和Redis的性能: 1. Nginx: - 合理配置Nginx的工作进程数和连接数,使其适应并发请求的压力。 - 使用Nginx的缓存功能,减轻后端服务器的压力。 - 配置合适的超时时间,避免请求长时间占用连接资源。 - 使用Nginx的Gzip压缩功能,减小传输数据量,提响应速度。 - 使用Nginx的Keepalive机制,减少TCP连接的建立和关闭开销。 2. Redis: - 合理设计数据模型,减少数据存储和检索的复杂度。 - 使用Redis集群或主从复制,提读写性能和数据的可用性。 - 配置适当的内存策略,例如使用LRU算法来淘汰冷数据。 - 使用Redis的Pipeline和批量操作来减少网络延迟和降低通信开销。 - 避免频繁的大批量写入操作,可以通过异步或者缓存策略来优化性能。 综上所述,Nginx和Redis并发场景下可以发挥其优势,通过合理的配置和优化可以提系统的性能和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值