分布式缓存架构设计和一致性 HASH
缓存
缓存的定义是在两个有读取信息差的系统中或者组件中的一个中间件,缓存通常是在内存中,存放的常读数据,目的是为了解决常读数据的读取问题,提高了读取速度节约系统IO资源,提高系统响应。
缓存分类
1,代理缓存:
代理服务器是部署在用户端的会缓存一些网页内容,当缓存没有命中的时候,在请求服务器。这部分我们一般不考虑,我们通常所说的缓存是指的带向代理,代理的是数据中心。是我们系统架构中的重要的组成部分
多层反向代理:
2,内容分发网络cdn:(网络运营商提供的 里用户最近的)
分发静态请求
也可以同时分发动态和静态请求
3,对象缓存
浏览器对象缓存
本地对象缓存
本地对象缓存构建分布式缓存(节点之间更新同步)-缺点:
同步问题 有限的内存缓存相同的数据造成资源浪费
远程分布式对象缓存(主流):
旁路缓存和通读缓存
通读缓存:
代理 反向代理 cdn都是通读缓存
通读缓存给客户端返回缓存资源,并且在没有命中的时候访问正真的服务器
客户端连接的是通读缓存而不是真正的服务器
旁路缓存:
对象缓存是一种旁路缓存,旁路缓存通常是一个独立的键值对存储,应用代码通常会询问缓存对象是否存在,存在则使用,不存在或者已经过期则访问数据源并且建立(客户端自己写入缓存)缓存
通读缓存和旁路缓存最大的却别就是通读缓存客户端不直接连接数据源旁路缓存要连接数据源
Redis vs Memcachd
在了解了缓存的分类之后我们聊一聊我们现在通常使用的redis缓存中间件和已经被时代抛弃的memcached.
redis支持复杂的数据结构
redis支持多路复用异步io高性能
redis支持主从复制高可用
redis原生集群与share nothing集群模式
简单的来说,最大的区别其实还是在数据结构和集群架构上,redis丰富的数据结构决定了对宝贵的内存资源可以有更好的利用率,而memcachd的share nothing集群架构决定了它过于依赖路由算法,由客户端决定服务节点访问方式。
Memcached分布式对象缓存:
shareNothing架构 彼此之间不互相通信(增减服务器要修改客户端)
路由列表
路由算法
最终计算出访问的服务器位置
路由算法-普通取余-哈希-一致性哈希
在分布式系统中,路由算法是极其重要的,我们可以通过各种各样的路算法实现客户端和集群中各个节点的信息同步,或者集群中节点之间信息同步。
普通取余:
根据节点数量对key进行按照一定规则取余
这种方法的弊端就是当节点数量增加或者减少的时候,会导致整个或者绝大部分节点上数据位置需要重新计算,这个显然是不能接受的对于互联网应用来讲。
一致性哈希:
关键点在闭环上,让所有缓存节点形成闭环,落在使用hash算法对key进行hash运算之后根据落在环上的位置顺时针向前选择落在的节点。
评论