Memcached分布式缓存

工作中,同事提到用memcached缓存,因此特意学习了一些相关知识。

memcached简介

  Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。

  Memcached是以LiveJournal旗下Danga Interactive公司的Brad Fitzpatric为首开发的一款软件。现在已成为mixi、hatena、Facebook、Vox、LiveJournal等众多服务中提高Web应用扩展性的重要因素。

  许多Web应用都将数据保存到RDBMS中,应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中,就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。

  memcached是高性能的分布式内存缓存服务器,一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性。

memcached缓存特点

  1.协议简单

  2.基于libevent的事件处理

  3.内置内存存储方式

  4.memcached不相互通信的分布方式

 memcached分布式原理

  memcached的分布式实现主要依赖客户端的实现:

  如图:假设memcached服务器有node1~node3三台,应用程序要保存键名为“tokyo”“kanagawa”“chiba”“saitama”“gunma” 的数据。

  首先向memcached中添加“tokyo”。将“tokyo”传给客户端程序库后,客户端实现的算法就会根据“键”来决定保存数据的memcached服务器。服务器选定后,即命令它保存“tokyo”及其值。

  同样,“kanagawa”“chiba”“saitama”“gunma”都是先选择服务器再保存。

  接下来获取保存的数据。获取时也要将要获取的键“tokyo”传递给函数库。函数库通过与数据保存时相同的算法,根据“键”选择服务器。使用的算法相同,就能选中与保存时相同的服务器,然后发送get命令。只要数据没有因为某些原因被删除,就能获得保存的值。

  这样,将不同的键保存到不同的服务器上,就实现了memcached的分布式。 memcached服务器增多后,键就会分散,即使一台memcached服务器发生故障无法连接,也不会影响其他的缓存,系统依然能继续运行。

余数计算分散法——是memcached标准的memcached分布式方法

Consistent Hashing的简单说明

  Consistent Hashing算法描述如下:首先求出memcached服务器(节点)的哈希值, 并将其配置到0~232的圆(continuum)上,这个圆我们可以把它叫做值域。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。 然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。 如果超过0~232仍然找不到服务器,就会保存到第一台memcached服务器上。

  如果新添加或移除一台机器,在consistent Hashing算法下,如下图添加一个节点node5:

  node5被放在 node4 与 node2之间,本来映射到 node2 和 node4 之间的区域都会找到node4,当有node5的时候,node5 和 node4之间的还是找到node4,而node5 和 node2 之间的此时会找到node5,因此当添加一台服务器的时候受影响的仅仅是 node5 和 node2 区间。

  因此,Consistent Hashing最大限度地抑制了键的重新分布。 而且,有的Consistent Hashing的实现方法还采用了虚拟节点的思想。 使用一般的hash函数的话,服务器的映射地点的分布非常不均匀。 因此,使用虚拟节点的思想,为每个物理节点(服务器) 在continuum上分配100~200个点。这样就能抑制分布不均匀, 最大限度地减小服务器增减时的缓存重新分布。

posted @ 2017-07-14 16:30  TA写Java  阅读(202)  评论(0编辑  收藏  举报