memcached的分布式

简介:

今天写点周末在火车上看的memcached的东西:

一:memcached的分布式

         虽然memcached被称为“分布式”缓存服务器,但是服务器端并没有“分布式”的功能。而是通过客户端来实现的。

         Memcached分布式原理:    

                           假设有5台memcached服务器:node1,node2… node5。现在要保存键为key1,key2…key10的数据。首先往memcached中添加key1。将key1传给客户端程序之后,客户端实现的算法会根据这个键“key1”来决定保存数据的memcached服务器。

                   将服务器选定之后,将会用选定的服务器来保存“key1”和对应的值。

                            在获取数据的时候,通过先根据要获取的数据的key来根据客户端实现的相同的算法选择对应的数据保存的服务器,然后取出数据。

                            这样就实现了memcached的分布式。Memcached的服务器增多,则键就会更加的分散。及时一台服务器挂掉,也不会影响其他的缓存。

Memcached分布式方法:      

  1.根据余数计算

这种方法简单的说就是”根据服务器的台数的余数来进行分散“。首先求取键所对应的整数哈希值,然后根据余数来选择服务器。

这种方法简单高效,而且数据的分散性也非常的好。但是问题是当增加或者删除一台memcached服务器的时候,余数就会发生巨大的变化。这样就没有办法获取和保存时间相应的服务器。从而会极大的降低缓存的命中率。2

 

  2. 一致性哈希

 

这种方法首先求出memcached服务器的哈希值,然后将它分配到0~2^32的圆上,然后使用同样的办法求出数据的健的哈希值,将其映射到圆上。然后从数据映射的点开始顺时针的查找,将数据保存到查找到的第一台服务器上面。如果超出了2^32仍然没有找到服务器,那么就将数据保存到第一台memcached服务器上面。

 

这种方法在一定程度上决了在修改memcached服务器数据的时候对缓存命中率的影响。在一致性哈希算法中,只有在这个圆上,从增加服务器的那个点逆时针遇到的第一台服务器之间的健会受到影响。因此一致性哈希最大限度的抑制了键的重新分布。

 

另外一些一致性哈希算法也采用了虚拟节点的办法。因为使用一般的hash函数的话,服务器的映射地点会分布的可能不太均匀,因此使用虚拟节点的思想,为每一台服务器在圆上分配100~300个点。这样就能够抑制分布不均匀,最大限度的减少服务器增加或者减少的时候缓存的重新分布。

 

  参考代码:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import  java.util.Collection;
import  java.util.SortedMap;
import  java.util.TreeMap;
 
public  class  ConsistentHash<T> {
 
  private  final  HashFunction hashFunction;
  private  final  int  numberOfReplicas;
  private  final  SortedMap<Integer, T> circle =  new  TreeMap<Integer, T>();
 
  public  ConsistentHash(HashFunction hashFunction,  int  numberOfReplicas,
      Collection<T> nodes) {
    this .hashFunction = hashFunction;
    this .numberOfReplicas = numberOfReplicas;
 
    for  (T node : nodes) {
      add(node);
    }
  }
 
  public  void  add(T node) {
    for  ( int  i =  0 ; i < numberOfReplicas; i++) {
      circle.put(hashFunction.hash(node.toString() + i), node);
    }
  }
 
  public  void  remove(T node) {
    for  ( int  i =  0 ; i < numberOfReplicas; i++) {
      circle.remove(hashFunction.hash(node.toString() + i));
    }
  }
 
  public  T get(Object key) {
    if  (circle.isEmpty()) {
      return  null ;
    }
    int  hash = hashFunction.hash(key);
    if  (!circle.containsKey(hash)) {
      SortedMap<Integer, T> tailMap = circle.tailMap(hash);
      hash = tailMap.isEmpty() ? circle.firstKey() : tailMap.firstKey();
    }
    return  circle.get(hash);
  }
 
}

参考资料:

 

1.  一个java版本的一致性哈希实例:https://weblogs.java.net/blog/2007/11/27/consistent-hashing

2.  一致性哈希:http://zh.wikipedia.org/wiki/%E4%B8%80%E8%87%B4%E5%93%88%E5%B8%8C

目录
相关文章
|
存储 缓存 算法
艾伟:memcached全面剖析–4. memcached的分布式算法
本系列文章导航 memcached完全剖析–1. memcached的基础 memcached全面剖析–2.理解memcached的内存存储 memcached全面剖析–3.memcached的删除机制和发展方向 memcached全面剖析–4. memcached的分布式算法 memcached全面剖析–5. memcached的应用和兼容程序 asdfaaf asdfsaf 发表日:2008/7/23 作者:长野雅广(Masahiro Nagano) 原文链接:http://gihyo.jp/dev/feature/01/memcached/0004 我是Mixi的长野。
1101 0
|
存储 算法 数据库
缓存应用--Memcached分布式缓存简介
 一.   什么是Memcached Memcached 是一个高性能的分布式内存 对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象 来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。
1459 0
|
存储 缓存 Memcache
缓存应用--Memcached分布式缓存简介(二)
1 命令行查看状态   很多时候我们需要去查看Memcached 的使用状态,比如Memcached 的运行时间,使用状态等等。在Windows系统中我们可以使用telnet 命令来查看Memcached 的相关运行情况。
847 0
|
算法 PHP
PHP取模hash和一致性hash操作Memcached分布式集群
本篇笔记记录了PHP使用Memcached扩展,采用取模hash和一致性hash算法操作Memcached分布式集群的实现对比
1468 0
|
存储 缓存 算法
ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存
原文:ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存        ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 part 1:给我点时间,允许我感慨一下2016年   正好有时间,总结一下最近使用的一些技术,也算是为2016年画上一个完美的句号,回顾2016年,感受颇多,感恩那些帮助我的人。
1233 0