缓存(cache)大小是CPU的重要指标之一,其结构与大小对CPU速度的影响非常大。简单地讲,缓存就是用来存储一些常用或即将用到的数据或指令,当需要这些数据或指令的时候直接从缓存中读取,这样比到内存甚至硬盘中读取要快得多,能够大幅度提升cpu的处理速度。
CPU与cache之间的数据交换是以"字"为单位,而cache与主存之间的数据交换是以"块"为单位,一个块由若干字组成,是定长的,以体现"保存下级存储器刚才被存取过的数据及其邻近小范围的数据"这一概念。
CPU进行存储器读操作时,根据主存地址可分成命中和未命中两种情况。对于前者,从Cache中可直接读到所需的数据;对于后者,需访问主存,并将访问单元所在的整个块从内存中全部调入Cache,接着要修改Cache标记。若Cache已满,需按一定的替换算法,替换掉一个旧块。
一级缓存中还分数据缓存(datacache,d-cache)和指令缓存(instructioncache,i-cache)。二者分别用来存放数据和执行这些数据的指令,而且两者可以同时被cpu访问,减少了争用cache所造成的冲突,提高了处理器效能。
采用分立Cache技术,也就是将指令和数据分开,分别存放在指令Cache和数据Cache中。这种分立Cache技术有利于CPU采用流水线方式执行指令。在流水线中,往往会发生在同一个操作周期同时需要预取一条指令和执行另一条指令的取数据操作的情况。若采用指令和数据统一的Cache,则这种情况会造成取指令和取数据的访存冲突,冲突的结果就是使得流水线产生断流的情况发生,从而严重影响流水线的效率。采用分立Cache技术,因为取指令和取数据分别在不同的Cache中同时进行,因而不会产生冲突,有利于流水线的实现
二级缓存(L2CACHE)出现是为了协调一级缓存与内存之间的速度。最初缓存只有一级,后来处理器速度又提升了,一级缓存不够用了,于是就添加了二级缓存。二级缓存是比一级缓存速度更慢,容量更大的内存,主要就是做一级缓存和内存之间数据临时交换的地方用。“L1级Cache-L2级Cache-主存”这种层次从工作原理上讲与前述的Cache工作原理是完全相同的,即CPU首先访L1级Cache,若不命中,再访问L2级Cache和主存。
Cache/主存系统的读操作原理:
当CPU试图读取主存一个字时,发出此字内存地址同时到达cache和主存,此时cache控制逻辑依据地址的标记部分进行判断此字当前是否在cache中。若是(命中),此字立即递交给CPU,若否(未命中),则要用主存读取周期把这个字从主存读出送到CPU,与此同时把含有这个字的整个数据块从主存读出送到cache中。由于程序的存储器访问具有局部性,当为满足一次访问需求而取来一个数据块时,下面的多次访问很可能是读取此块中的其它字。
图1Cache/主存系统的读操作原理
Cache读操作流程示意图
上文是对Cache介绍及Cache/主存系统的读操作原理进行了一次系统讲解,下文继续介绍Couchbase-更好的Cache系统!
在移动互联网时代,我们面对的是更多的客户端,更低的请求延迟,这当然需要对数据做大量的 Cache 以提高读写速度。
术语
节点:指集群里的一台服务器。
现有Cache系统的特点
目前业界使用得最多的Cache系统主要是memcached和Redis。这两个Cache系统都有都有很大的用户群,可以说是比较成熟的解决方案,也是很多系统当然的选择。不过,在使用memcached和redis过程中,还是碰到了不少的问题和局限:
①Cluster支持不够。在扩容、负载均衡、高可用等方面存在明显不足。
②持久化支持不好,出现问题后恢复的代价大。memcached完全不支持持久化,redis的持久化会造成系统间歇性的负载很高。
期待的理想Cache系统
良好的cluster支持
①Key可以动态分散(AutoSharding)在不同的服务器上,可以通过动态添加服务器节点增加系统容量。
②没有单点失效,任何一个单点都不会造成数据不可访问。
③读写负载可以均匀分布在系统的不同节点上。
支持异步持久化支持
①方便快速恢复,甚至可以直接用作key/value数据库。经常在跟业界朋友交流时,会提到用key分段的方法来做容量扩展以及负载均衡。但是用静态的key分段会有不少问题:
②Cache系统本身及使用cache的客户端都需要预设一个分段逻辑,这个逻辑后期如果需要调整将会非常困难。不能解决单点失效的问题,还需要额外的手段。运维需要更多的人为参与,避免key超出现有分区,一旦出现key找不到对应服务器,访问直接失败。
最接近需求的系统:Couchbase
基于这些想法,我花了几天时间在google,stackoverflow,quora上看了很多大家关于cachecluster的讨论,找到一个比较新系统Couchbase。
Couchbase的集群设计对等网
Couchbase群集所有点都是对等的,只是在创建群或者加入集群时需要指定一个主节点,一旦结点成功加入集群,所有的结点对等。
对等网的优点是,集群中的任何节点失效,集群对外提供服务完全不会中断,只是集群的容量受影响。SmartClient
由于couchbase是对等网集群,所有的节点都可以同时对客户端提供服务,这就需要有方法把集群的节点信息暴露给客户端,couchbase提供了一套机制,客户端可以获取所有节点的状态以及节点的变动,由客户端根据集群的当前状态计算key所在的位置。vBucket
vBucket概念的引入,是couchbase实现autosharding,在线动态增减节点的重要基础。
简单的解释vBucket可以从静态分片开始说起,静态分片的做法一般是用key算出一个hash,得到对应的服务器,这个算法很简单,也容易理解。如以下代码所示:
但也有几个问题:
①如果一台服务器失效,会造成该分片的所有key失效。
②如果服务器容量不同,管理非常麻烦。
③前面提到过,运维、配置非常不方便。
为了把key跟服务器解耦合,couchbase引入了vBucket。可以说vBucket代表一个cache子集,主要特点:
①keyhash对应一个vBucket,不再直接对应服务器。
②集群维护一个全局的vBucket与服务器对应表。
③前面提到的smartclient重要的功能就是同步vBucket表。
如以下代码所示:
由于vBucket把key跟服务器的静态对应关系解耦合,基于vBucket可以实现一些非常强大有趣的功能,例如:
①Replica,以vBucket为单位的主从备份。如果某个节点失效,只需要更新vBucket映射表,马上启用备份数据。
②动态扩容。新增加一个节点后,可以把部分vBucket转移到新节点上,并更新vBucket映射表。
vBucket非常重要,以后可以单独写一篇文章分享。
总结:
①Couchbase的对等网设计,smartclient直接获取整的集群的信息,在客户端实现负载均衡,整个集群没有单点失效,并且完全支持平行扩展。
②vBucket的引入,完全实现了autosharding,可以方便灵活的把数据的子集在不同节点上移动,以实现集群动态管理。
③Couchbase有一个非常专业的web管理界面,并且支持通过RESTfulAPI管理,这也是memcached,redis不能企及的。
④如果只是做key/value的cache,Couchbase可以完全取代memcached。
⑤Couchbase已经被我们在生产环境中大量采用。
小编结语:
更多内容尽在课课家教育!
¥798.00
¥199.00
¥29.90
¥199.00
¥48.00¥180.00
¥48.00¥180.00