Memcached集群
MemCache是什么?
MemCache是一种分布式缓存系统。同样,分布式缓存系统也是为了解决并发量逐日增加的现状的,当大量读写请求涌向数据库,而数据库的文件大都放在磁盘上,速度太慢,难以应对。所以一般而言都是在数据库之间加一层缓存,而且为了分担压力,同样使用多台服务器的内存进行分担,也就出现了分布式缓存集群。
MemCache就是一种分布式内存缓存系统,它用两种手段提升数据的访问速度:
- 它使用k-v键值对的形式存储数据,可以通过键值直接查找到数据,不需要遍历。
- 在内存中维护一种HashTable
MemCache实现分布式缓存
MemCached在每个服务器都有一个daemon守护进程,监听客户端的连接,
建立连接之后,可以通过key来进行数据存取,因为数据放在内存中,所以速度非常快。但也正因为此,一旦服务停止,数据将丢失。而且服务器之间是不会通信的,只是对自己的数据进行管理。
那MemCache怎么实现分布式的呢?是由客户端来决定存储的数据放在哪个地方的。客户端可以根据key值进行hash,然后将前端请求负载均衡到后端的缓存服务器上。
下图中应用程序将value和key交给memCached的客户端,由客户端进行hash得到一台服务器,然后将数据转发给它。
上
这种方法看似很美好,实际上会存在一种隐患。当某台主机宕机了或者重新增加了服务器,大部分key会重新分布,那么所有的请求会涌向数据库服务器,有可能让数据库服务器直接崩溃。
一致性Hash算法
因为MemCache分布式缓存的每台服务器各自处理自己的数据,所以缓存集群的负载均衡与应用服务器的负载均衡有所不同。
当新增一台服务器以后,大部分key会重新分布,缓存命中率大大降低,所以可以改进hash算法,使得新加入的服务器不影响大部分缓存数据,所以引入了一致性Hash算法
一致性Hash算法流程
引入一致性Hash算法的目的是使得新加入一台服务器不会对现有的映射关系影响太大,也就是说尽可能只影响一部分服务器。
之前的算法是将key进行hash再对N取余,也就是hash(key)%N
,得到的值就是服务器的编号。如果要让增加和删除服务器的影响范围更小,我们希望用一个范围来指代某个服务器。也就是Hash出来的值,如果落在某个范围内,我们则认为它是属于某台服务器管的。
就好比分配应届生到全国各地,之前是全国随机分配的,那么一个广东人可能就分到了内蒙古去,完全没有规律。如果加一个,大家由要重新分配,那个广东人又被分配到海南岛,影响就太大了。
现在,是就近迁移,按照大家的籍贯来分配,都就近迁移到所在省份的省会里面。所以增一个潮州人一个东莞人,就把他放到广州去,之后不管怎么改变他都还在广州。
具体做法是可以构造一个虚拟环
结构,其上的节点为服务器的名字Hash以后的结果,比如图中环上的大节点。
- 那要缓存的数据怎么存放了,依然是由客户端对key值进行hash以后得到一个值。
- 在之前构造的Hash环上顺时针查找离key的Hash值上最近的节点,就由它管了。
那么好处显而易见
如果添加一个Node5,只会影响右边三个Key/Value对数据,范围非常小。