IT修真院·小课堂丨互联网职业小课堂在线学习平台
什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?    

辅导师兄 [真传弟子]JAVA-李绍博


【修真院java小课堂】什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?


  大家好,我是IT修真院成都分院第16期的学员何佳欢,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java(职业)任务六,深度思考中的知识点——什么叫集群?缓存应该在什么情况下使用集群?有哪些实现集群的方案?


1.背景介绍

单机Redis在普通的服务器上通常ops上限在5w左右,开启pipeline的情况下在20-30w左右。对于大多数中小公司来说,通常单机的Redis已经足够,最多根据不同业务分散到多台Redis。

NoSQL+MySQL

开始比较流行的是通过文件缓存(MongoDB)来缓解数据库的压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带来了比较高的IO压力。

redis:Remote Dictionary Service

性能和并发:我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。

因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

Redis还可以支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。

2.知识剖析

集群是是指将多台服务器集中在一起,每台服务器都实现相同的业务,做相同的事情。但是每台服务器并不是缺一不可,存在的作用主要是缓解并发压力和单点故障转移问题。可以利用一些廉价的符合工业标准的硬件构造高性能的系统。实现:高扩展、高性能、低成本、高可用!

Twemproxy

Twemproxy是一种代理分片机制,由Twitter开源。Twemproxy作为代理,可接受来自多个程序的访问,按照路由规则,转发给后台的各个Redis服务器,再原路返回。该方案很好的解决了单个Redis实例承载能力的问题。

Twemproxy本身也是单点,需要用Keepalived做高可用方案。通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免单点故障问题。虽然使用Twemproxy需要更多的硬件资源和在redis性能有一定的损失(twitter测试约20%)

代理分发请求到节点,中间多了层通信.

Codis是Redis集群方案之一,它是中国人开发并开源的。Codis使用Go语言开发,是一个代理中间件,当客户向Codis发送指令时,Codis负责将指令转发到后面的Redis实例来执行,并将返回结果再转发回客户端。

缺点

Codis中所有的key分布在不同的Redis实例中,所以就不能再支持事务,事务只能在单个实例中完成。为了支持扩容,单个key的value不宜过大,官方推荐单个集合总字节量不要超过1MB。Codis因为增加Proxy作为中转层,所以在网络开销上比单个Redis大。

优点

Codis在设计上比Redis官方的Cluster方案简单很多,它将分布式的问题交给了第三方去负责,这样就省去了复杂的分布式一致性代码的编写和维护工作。

Redis Cluster 是Redis提供的集群方案,和Codis不同,它是去中心化的,客户端随机的请求任意一个Redis节点,然后由这个Redis节点将请求转发给正确的redis节点。

Redis Cluster将数据划分为16384个slot。按照槽存储分布在多个Redis节点中,可以平滑进行增删节点,因为Redis Cluster是在Redis的主从模式和哨兵模式的基础上实现的,支持高可用和自动故障转移。

3.常见问题

(一)缓存和数据库双写一致性问题

(二)缓存雪崩问题

(三)缓存击穿问题

4.解决方案

(一)利用互斥锁,缓存失效的时候,先去获得锁,得到锁了,再去请求数据库。没得到锁,则休眠一段时间重试

(二)采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存如果过期,异步起一个线程去读数据库,更新缓存。需要做缓存预热(项目启动前,先加载缓存)操作。

(三)提供一个能迅速判断请求是否有效的拦截机制,比如,利用布隆过滤器,内部维护一系列合法有效的key。迅速判断出,请求所携带的Key是否合法有效。如果不合法,则直接返回。

缓存雪崩,即缓存同一时间大面积的失效,这个时候又来了一波请求,结果请求都怼到数据库上,从而导致数据库连接异常。

5.编码实战

6.扩展思考

7.参考文献

https://www.cnblogs.com/hjwublog/p/5681700.html

https://blog.csdn.net/hyl999/article/details/79552348


评论

请您登录 后进行评论

loading