先牢骚一下,批判一下自己先,很多时候做东东,只是听老大说这样去做,然而并没有去深究其背后的意义,很多时候解决了问题,然后并没有去深入挖掘问题发生的原因。而后面的过程,是更可贵的,往往收获也更大。
这段时间做的模块,是系统内部中间的中间存储层,是cache的角色。从分布式存储系统上来说,应该是属于,业务数据累的cache存储。
最近都争取工作在工作时间完成,然后回来总结。
好了废话多了,开始正题了。
一般的存储系统层次,按照众所周知的层次划分可以分为以下几层:
级别 存储名称 访问开销
L0 cpu --------------------------- 几个cpu周期内
L1 内存----------------------------几十个到几百个cpu周期
L2 磁盘----------------------------磁盘平均寻道时间+磁盘旋转平均时间 约是12ms,约是内存访问耗时的10万倍
L3 网络存储-----------------------看具体带宽和网络拓扑结构 + 远程机器访问开销(L0 ~L3的一种)
这里 L3 还可以细分为
L3.1 同一IDC内核心内的网络存储
L3.2 内网(跨IDC)的网络存储
L3.3 外网的网络存储
显而易见地,越上层的访问开销越低,容量也越少,越下层的开销越大,容量也越少,层与层之间的开销。
知道了上面的一些基本数据,如何规划,设计存储模型,按照啥原则涅?(傻瓜也知道把东西往上提),但现实不是这么理想的啊。
有个很好的原则叫“locality” 局部性。可以从《深入理解计算机系统》第六章找到相关的内容。
局部性有 时间局部性 和 空间局部性。这两个原则在现成的许多系统中都可见一斑。
如时间局部性,指的是一个数据被引用过,那么在一定的时间范围内,能被多次引用。memcached等n多cache都是这么整的,glibc的内存块cache啊,包括linux的inode-cache等。
又说空间局部性,指的是一个数据被引用过,那么一定相邻范围内的数据,能在未来被引用。文件预读等就是这个思想。
这两种局部性又是相辅相成的。
按照这个局部性原则,规划好数据和存储模型,让大部分的请求落在层级高的存储级别上,就是 最高的指导思想。
我又务虚了T_T