架构训练营第五周作业总结

用户头像
Geek_ce484f
关注
发布于: 2020 年 10 月 25 日

缓存Cache,高速缓冲存储器,是介于中央处理器和主存储器之间的高速小容量存储器,一个硬件或软件的组件用来存储将来会请求到的数据,而且能让数据获取更快。



Cache vs Buffer,高速缓存和缓冲区,缓存Cache可以是RAM的一部分,也可以是磁盘的一部分;缓冲区buffer主要用于输入/输出(I/O)过程。



常见的缓存:CPU缓存、操作系统缓存、数据库缓存、JVM编译缓存、CDN缓存、代理与反向代理缓存、应用程序缓存、分布式对象缓存。



缓存的关键指标:命中率



影响缓存命中率的主要指标:缓存键集合大小、缓存可使用内存空间、缓存对象生存时间。



缓存应用场景:代理缓存、反向代理缓存、多层反向代理缓存、内容分发网络(CDN)、CDN同时配置静态文件和动态内容、通读缓存、旁路缓存、浏览器对象缓存、本地对象缓存。



缓存为什么能显著提升性能:内存构建比磁盘访问速度更快,缓存对象是最终结果,无需中间计算,减少CPU消耗;降低数据库、磁盘、网络压力,使这些IO设备获得更好响应。



缓存是系统性能优化的大杀器:技术简单、性能提升显著、应用场景多。但要合理使用缓存。



Redis VS Memchached



Redis和Memchached是互联网分层架构中,最常用的KV缓存。都是基于内存(in-memory)存储键值对映射的高性能缓存,彼此性能相差无几。



redis支持快照(dump)和aof两种方式持久化方式。



redis支持字符串、链表、集合、有序集合、散列表共5种数据结构,而memcached只能存储字符串。



redis支持丰富的命令,而memcached只能用APPEND命令将数据添加到已有字符串的末尾。



redis适合存储结构化的数据,memcached适合任意格式的数据,一般可用来缓存图片、视频等。



memcached的键最大长度为250字节,值默认最大1M字节。redis键长度最大512M字节。



Redis集群



redis最开始使用主从模式做集群,若master宕机需要手动配置slave转为master;后来为了高可用提出来哨兵模式,该模式下有一个哨兵监视master和slave,若master宕机可自动将slave转为master,但它也有一个问题,就是不能动态扩充;所以在3.x提出cluster集群模式。



Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。



消息队列与异步架构

同步调用VS异步调用



同步调用就是客户端等待调用执行完成并返回结果。异步调用就是客户端不等待调用执行完成返回结果,不过依然可以通过回调函数等接收到返回结果的通知。如果客户端并不关心结果,则可以变成一个单向的调用。这个过程有点类似于Java中的callable和runnable接口,我们进行异步执行的时候,如果需要知道执行的结果,就可以使用callable接口,并且可以通过Future类获取到异步执行的结果信息。如果不关心执行的结果,直接使用runnable接口就可以了,因为它不返回结果。



负载均衡算法:



1、轮询法



  将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。



2、随机法



通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,



其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。



3、源地址哈希法



源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。



4、加权轮询法



  不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。



5、加权随机法



与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。



6、最小连接数法



最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。



一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:



1、平衡性(Balance): 平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。



2、单调性(Monotonicity): 单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。



3、分散性(Spread): 在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。



4、负载(Load): 负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。



一致性hash算法的实现和平衡性测试有3个关键点:



1)哈希函数的选择: 采用MurmurHash,MurmurHash是一种非加密型哈希函数,适用于一般的哈希检索操作。 由Austin Appleby在2008年发明, 并出现了多个变种,都已经发布到了公有领域(public domain)。与其它流行的哈希函数相比,对于规律性较强的key,MurmurHash的随机分布特征表现更良好。



2)100W数据产生: 采用随机数,保证测试的真实性。



3)查找效率: 结构采用TreeMap提高查找效率,TreeMap 是一个有序的key-value集合,它是通过红黑树实现的。



用户头像

Geek_ce484f

关注

还未添加个人签名 2020.05.10 加入

还未添加个人简介

评论

发布
暂无评论
架构训练营第五周作业总结