`
flynewton
  • 浏览: 62475 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

让memcached分布式

阅读更多

转自:http://my.oschina.net/flynewton/blog/10626

 

memcached是应用最广的开源cache产品,它本身不提供分布式的解决方案,我猜想一方面它想尽量保持产品简单高效,另一方面cache的key-value的特性使得让memcached分布式起来比较简单。memcached的分布式主要在于客户端,通过客户端的路由处理来搭建memcached集群环境,因此在服务端,memcached集群环境实际上就是一个个memcached服务器的堆积品,环境的搭建比较简单。下面从客户端做路由和服务端集群环境搭建两方面来谈如何让memcached分布式

客户端做路由

客户端做路由的原理非常简单,应用服务器在每次存取某key的value时,通过某种算法把key映射到某台memcached服务器nodeA上,因此这个key所有操作都在nodeA上,结构图如下所示:

存储某个key-value

取某个key-value

因此关键在于算法的选择,最基本的要求就是能让数据平均到所有服务器上。这自然而然让我想到了hash算法,spymemcached是一个用得比较广的java客户端,它就提供了一种简单的hash算法,实现类为ArrayModNodeLocator,从key映射到node的源码如下:

 

  1. public MemcachedNode getPrimary(String k) {  
  2.     return nodes[getServerForKey(k)];  
  3. }  
  4. private int getServerForKey(String key) {  
  5.     int rv=(int)(hashAlg.hash(key) % nodes.length);  
  6.     assert rv >= 0 : "Returned negative key for key " + key;  
  7.     assert rv < nodes.length  
  8.         : "Invalid server number " + rv + " for key " + key;  
  9.     return rv;  
  10. }  

 

从上面可知它是把所有node放在数组里,通过hash算法把key映射到某index,然后通过这个index在数组里取node

再则需要考虑如何容错,比如当某个node当掉了,如何自动地转到其他node上,上面的简单hash路由策略采用的方法是在数据组里顺序向下轮询node,找第一个工作正常的node即可。

最后要考虑当需要移除node或添加node的时候,如何有效地调整映射关系,这自然又让我们想到一致性hash算法,关于一致性hash算法就不多说,博文分布式设计与开发(二)------几种必须了解的分布式算法 有所涉及,这里可以看看spymemcached是如何利用这个算法来做路由的,实现类为KetamaNodeLocator,从key映射到node的源码如下:

 

  1. public MemcachedNode getPrimary(final String k) {  
  2.     MemcachedNode rv=getNodeForKey(hashAlg.hash(k));  
  3.     assert rv != null : "Found no node for key " + k;  
  4.     return rv;  
  5. }  
  6. MemcachedNode getNodeForKey(long hash) {  
  7.     final MemcachedNode rv;  
  8.     if(!ketamaNodes.containsKey(hash)) {  
  9.         // Java 1.6 adds a ceilingKey method, but I'm still stuck in 1.5  
  10.         // in a lot of places, so I'm doing this myself.  
  11.         SortedMap<Long, MemcachedNode> tailMap=ketamaNodes.tailMap(hash);  
  12.         if(tailMap.isEmpty()) {  
  13.             hash=ketamaNodes.firstKey();  
  14.         } else {  
  15.             hash=tailMap.firstKey();  
  16.         }  
  17.     }  
  18.     rv=ketamaNodes.get(hash);  
  19.     return rv;  
  20. }  

 

这段代码非常清晰,就是通过ketamaNodes这个数据结构按照一致性hash算法把node分区,每次都把映射到一个分区的key对于到负责这个分区的node上。

从上面几段代码和图示,我们大致能弄明白在客户端如何做路由来让memcached分布式,其实在大多数的项目中,以上这些简单的处理办法就足够了

memcached服务端集群

由上面可知一般的应用中memcached服务端集群不用做太多工作,部署一堆memcached服务器就可以了,大不了就是要做好监控的工作,但像facebook这样的大型互联网应用,并且又是那么依赖memcached,集群的工作就很有学问了。今年Qcom的会议上facebook就介绍了是如何通过扩展memcached来应付这么多数据量的,ppt可见Facebook的扩展Memcached实战。这个PPT比较抽象,我没看得太懂,并且facebook也只是蜻蜓点水,没透露太多的细节,但公司的资深架构师陈大峰同学做了些解析,才多多少少有点眉目。facebook所有数据的存取都基本上是在memcached上完成,后端的数据库mysql仅仅只是做持久化的作用,由于数据量巨大,做了类似与mysql的读写分离的结构,结构图如下所示:

其中非常重要的一点,当West的memcached要向East同步数据的时候,它没有采取memcached之间的同步,而是走MySQL replication,如下图所示:

这么做的原因我没法搞得太清楚,大概是比较信赖MySQL replication的简单稳定吧,并且像sns这种应用本身就不需要即时一致性,只要最终一致就行了。

另外在数据分布上是很有讲究的,facebook上面有很多很热的数据,比如LadyGaGa发布一条消息,将会有千万的人收到这个消息,如何把LadyGaGa和普通的用户同等对待就很可能会把这个memcached节点搞垮,甚至访问冲向后面的数据库后会把数据搞垮,如下图所示:

因此就需要一些策略来控制这些热点数据和热点访问,这些策略细节是什么facebook没说太清楚,一般说来可以把热点数据分布到其他节点,另外对于数据库可以加锁控制流量,只有拿到锁的访问才能直接访问数据库,没拿到的需要等候和竞争。

另外一个数据分布的难题是每个用户可能会有成百上千的好友,而这些好友的数据分布在成百上千台的memcached的节点,这样一个客户端就需要连接成千上万的memcached的节点,如下图所示:

这种问题一般说来可以采取数据重组,把有关联的数据重组在一起,而不是分布在n台机器上。

以上的这些facebook的实践只能说是走马观花地看看了,从我们可以看到一个简简单单memcached也能完成这么多玩样来,可以猜想到facebook的那些天才工程师们在亿万数据压力下被逼出了多少创新的设计,这些设计不一定适用于我们,不了解情景也没办法深究里面的细节,我们要做的是围绕我们自己的应用,让memcached玩出点味道来。


 

分享到:
评论

相关推荐

    memcached分布式缓存数据库部署.doc

    《深入理解memcached分布式缓存数据库部署》 memcached,作为一款高性能的分布式缓存服务器,它的主要任务是缓存数据库查询结果,从而减少对数据库的访问,进而提升动态Web应用的响应速度。这一技术的广泛应用,...

    memcached分布式工具

    总的来说,memcached分布式工具是应对大数据量和高并发场景的有效手段,通过合理的集群部署和管理,能够提升系统响应速度,降低数据库压力,从而提高整体应用性能。在实际应用中,我们需要充分理解其工作原理,结合...

    Memcached分布式缓存学习.doc

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

    Memcached分布式缓存入门

    **Memcached分布式缓存入门** Memcached是一款高性能、分布式内存对象缓存系统,它被广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。这个“Memcached分布式缓存入门”资料将引导初学者深入理解...

    JAVA 客户端调用 memcached分布式的高速缓存系统

    JAVA 客户端调用 memcached分布式的高速缓存系统

    dot net memcached 分布式缓存应用类库

    Memcached是一款广泛使用的开源高性能分布式内存对象缓存系统,它能够减轻数据库的负载,提高应用程序的响应速度。在.NET环境中,开发人员可以借助特定的类库来集成Memcached,实现.NET应用的分布式缓存功能。本文将...

    Memcached分布式缓存简介

    Memcached是一种高性能的分布式内存对象缓存系统,主要用于动态Web应用程序,以缓解数据库负载。它通过将数据和对象存储在内存中,减少对数据库的直接访问,从而提高动态、数据库驱动网站的速度。对于.NET开发者来说...

    .net memcached 分布式缓存应用类库

    .NET Memcached 分布式缓存应用类库是用于在.NET环境...通过正确使用.NET Memcached分布式缓存应用类库,开发者能够构建出高效、可扩展的应用,显著提升服务响应速度,降低数据库压力,提高整体系统的性能和用户体验。

    Memcached 分布式缓存实现原理简介

    分布式缓存是现代高并发应用中缓解数据库压力的关键技术,Memcached作为一款广泛使用的分布式内存缓存系统,其设计和实现原理对于理解分布式系统至关重要。本文主要探讨了Memcached的分布式实现,以及它如何通过简单...

    memcached 分布式缓存服务器

    **memcached 分布式缓存服务器** `memcached` 是一款高效、轻量级的分布式内存对象缓存系统,主要用于缓解数据库的负载压力,通过在内存中存储数据,提高网络应用的数据读取速度。它广泛应用于网站开发、API服务、...

    Memcached分布式缓存系统的应用.pdf

    ### Memcached分布式缓存技术特点 Memcached作为一个开源的高性能内存对象缓存系统,具有以下特点: 1. **协议简单**:Memcached服务器与客户端之间采用基于文本行的协议进行通信,支持多种方式获取数据。协议的...

    20120102 net下memcached 分布式缓存系统应用

    7. **故障转移与分布式一致性**:如何处理节点故障,以及Memcached的分布式一致性哈希算法。 8. **性能优化**:缓存命中率提升技巧,避免缓存击穿、雪崩等问题的方法。 9. **源码分析**:如果包含源码,可能涉及具体...

    _net memcached 分布式缓存应用类库

    综上所述,这个类库提供了从C#和ASP.NET应用中集成Memcached分布式缓存的完整解决方案,可以帮助开发者构建高效、可扩展的Web应用。通过深入研究源码和相关文档,开发者可以提升在分布式系统和数据库优化方面的技能...

    Memcached分布式缓存

    ### Memcached分布式缓存 #### 一、Memcached的基础 **1.1 Memcached是什么?** Memcached是一款高性能、分布式内存对象缓存系统,旨在通过减轻数据库负担来加速动态网络应用的速度。它通过在内存中缓存数据和...

    Memcached 分布式缓存实现原理 – 码农网1

    Memcached 是一款高性能的分布式内存缓存系统,常用于缓解数据库负载,提高Web应用的响应速度和可扩展性。它的设计目标是简单且高效,通过将数据存储在内存中,避免了磁盘I/O带来的延迟,从而实现了快速的数据访问。...

    memcached 分布式缓存服务

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

    memcached 分布式内存

    **Memcached 分布式内存详解** Memcached 是一套由 danga.com 开发的高效、分布式的内存对象缓存系统,其主要目标是在高流量的动态应用程序中减轻数据库的负载,从而提升整体系统的性能。这套系统的工作原理是将...

    memcached (分布式存储)

    memcached 大家相互学习, ---

    memcached全面剖析–4. memcached的分布式算法.txt

    memcached全面剖析–4. memcached的分布式算法.txt

    采用Memcached实现分布式Session所需的jar包

    4. **实现Memcached分布式Session的关键jar包** 在Java环境下,使用Memcached作为Session存储,通常会依赖以下关键库: - **spymemcached**:这是一个Java客户端库,用于与Memcached服务器通信。它提供了丰富的API...

Global site tag (gtag.js) - Google Analytics