`
lvjun106
  • 浏览: 437934 次
  • 性别: Icon_minigender_1
  • 来自: 芜湖
社区版块
存档分类
最新评论

实现memcached分布式

 
阅读更多

转:https://blog.csdn.net/cutesource/article/details/5848253 

 

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的源码如下:

 

	public MemcachedNode getPrimary(String k) {
		return nodes[getServerForKey(k)];
	}
	private int getServerForKey(String key) {
		int rv=(int)(hashAlg.hash(key) % nodes.length);
		assert rv >= 0 : "Returned negative key for key " + key;
		assert rv < nodes.length
			: "Invalid server number " + rv + " for key " + key;
		return rv;
	}

 

 

 

 

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

 

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

 

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

 

 

	public MemcachedNode getPrimary(final String k) {
		MemcachedNode rv=getNodeForKey(hashAlg.hash(k));
		assert rv != null : "Found no node for key " + k;
		return rv;
	}
	MemcachedNode getNodeForKey(long hash) {
		final MemcachedNode rv;
		if(!ketamaNodes.containsKey(hash)) {
			// Java 1.6 adds a ceilingKey method, but I'm still stuck in 1.5
			// in a lot of places, so I'm doing this myself.
			SortedMap<Long, MemcachedNode> tailMap=ketamaNodes.tailMap(hash);
			if(tailMap.isEmpty()) {
				hash=ketamaNodes.firstKey();
			} else {
				hash=tailMap.firstKey();
			}
		}
		rv=ketamaNodes.get(hash);
		return rv;
	}

 

 

 

这段代码非常清晰,就是通过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

    3. 实现分布式缓存: Memcached 可以实现分布式缓存,缓存大量数据,提高网站的性能。 Memcached 的缺点: 1. 数据丢失: Memcached 服务器重启后,数据将丢失。 2. 客户端需要实现分布式算法:客户端需要实现...

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

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

    Memcached分布式缓存入门

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

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

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

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

    在.NET环境中,开发人员可以借助特定的类库来集成Memcached,实现.NET应用的分布式缓存功能。本文将深入探讨"dot net memcached 分布式缓存应用类库"的相关知识点。 首先,我们来看标题中的"dot net memcached",这...

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

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

    Memcached分布式缓存简介

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

    memcached 分布式缓存服务器

    3. **分布式**:通过哈希算法将键分发到集群中的不同节点,实现数据的分布式存储,提供扩展性和高可用性。 4. **LRU(Least Recently Used)策略**:当内存满时,memcached 采用 LRU 策略淘汰最近最少使用的数据。 ...

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

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

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

    9. **源码分析**:如果包含源码,可能涉及具体实现细节,如自定义缓存策略、扩展Memcached客户端等。 10. **最佳实践**:从项目实施经验中提炼出的部署、监控、维护等方面的建议。 以上知识点的深入理解和实践,将...

    _net memcached 分布式缓存应用类库

    标题"_net memcached 分布式缓存应用类库"表明这是一个针对.NET平台的Memcached分布式缓存的实现,适用于C#编程语言和ASP.NET框架。分布式缓存是提高Web应用程序性能的关键技术,它通过在多台服务器间共享数据来减轻...

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

    4. **分布式机制**:尽管各个memcached实例之间并不直接通信,但它们可以通过客户端的哈希算法实现数据的分布式存储。 分布式原理: Memcached 的分布式实现主要依赖于客户端的哈希策略。当客户端需要存储或检索...

    Memcached分布式缓存

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

    memcached 分布式内存

    - **分布式**: 通过哈希算法,Memcached 可以将数据分发到多台服务器上,实现数据的分布式存储,提高了服务的可扩展性。 2. **优势** - **高性能**: 由于数据存储在内存中,读取速度极快,极大地提升了服务响应...

    基于Memcached的分布式Session共享插件设计源码

    该插件是一款基于Memcached的分布式Session共享解决方案源码,由21个文件组成,涵盖Java源代码、XML配置、项目结构等。支持Tomcat6及以上版本,旨在实现应用服务器集群间的Session共享,提高系统在分布式环境下的...

    MemCached跨平台分布式缓存

    MemCached通过将数据分散存储在多台服务器上,实现了数据的分布式管理,从而提高了系统的可扩展性和可用性。这种架构允许通过添加更多的硬件节点来线性提升整个缓存系统的处理能力,而不必将所有数据都集中在单一...

    memcached实现session远程分布式存储

    为了使web应用能使用saas模式的大规模访问,必须实现应用的集群部署.要实现集群部署主要需要实现session共享机制,使得多台应用服务器之间会话统一, tomcat等多数服务都采用了session复制技术实现session的共享

Global site tag (gtag.js) - Google Analytics