[Memcached]Memcached 的分布式算法

        本文部分内容转载自 memcached的分布式算法 ,仅供学习使用。

Memcached 的分布式

        正如之前介绍的那样,Memcached 虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能。服务器端仅包括内存存储功能,其实现非常简单。至于 Memcached 的分布式,则是完全由客户端程序库实现的。这种分布式是 Memcached 的最大特点。

        这里多次使用了“分布式”这个词,但并未做详细解释。现在开始简单地介绍一下其原理,各个客户端的实现基本相同。下面假设 Memcached 服务器有 node1~node3 三台,应用程序要保存键名为 "tokyo"、"kanagawa"、"chiba"、"saitama"、"gunma" 的数据。

[Memcached]Memcached 的分布式算法_第1张图片

分布式简介:准备

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

[Memcached]Memcached 的分布式算法_第2张图片

分布式简介:添加时

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

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

[Memcached]Memcached 的分布式算法_第3张图片

分布式简介:获取时

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

Consistent Hashing

        Consistent Hashing 如下所示:首先求出 Memcached 服务器(节点)的哈希值,并将其配置到 0~2^32 的圆(continuum)上。然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。如果超过 2^32 仍然找不到服务器,就会保存到第一台 Memcached 服务器上。

[Memcached]Memcached 的分布式算法_第4张图片

Consistent Hashing:基本原理

        从上图的状态中添加一台 Memcached 服务器。余数分布式算法由于保存键的服务器会发生巨大变化而影响缓存的命中率,但 Consistent Hashing 中,只有在 continuum 上增加服务器的地点逆时针方向的第一台服务器上的键会受到影响。

[Memcached]Memcached 的分布式算法_第5张图片

Consistent Hashing:添加服务器

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

        通过下文中介绍的使用 Consistent Hashing 算法的 Memcached 客户端函数库进行测试的结果是,由服务器台数(n)和增加的服务器台数(m)计算增加服务器后的命中率计算公式为 (1 - n/(n+m)) * 100。



你可能感兴趣的:(Memcached)