缓存是最重要的一个方面,以提高应用程序性能的存储对象的缓存 (内存)减少数据库负载。
缓存在群集环境中,需要分布式缓存 解决方案,可以支持故障切换情景和数据的可靠性。 在这个后我想探索的能力, Memcached和terracotta兵马俑的分布式缓存 解决方案。
Memcached是一个高性能的分布式对象缓存 系统, 客户端的API为的Perl , PHP中,巨蟒, Ruby和Java语言。 以下是一些其能力和局限性(使用Java客户端API ) :
要求对象是可序列化
对象标识是不保留
支持高速缓存 到期
不处理故障情景
对于一个特定对象选择一个服务器从池缓存 服务器基于Hash的关键
容易配置(通过SockIOPool级)
terracotta秦始皇是一个开源基于Java的JVM集群解决方案。 分布式缓存 可以实现使用兵马俑terracotta使用java.util.HashMap或开放源码的缓存 解决方案,如EHCache , OSCache和JBoss TreeCache 。
保护对象的身份
通过有效地管理虚拟内存堆
声明要求锁定支持
简单的配置文件与Eclipse工具支持
良好的文件,支持和积极发展
由于性质及其执行某些类别不是便携式,因此无法使用
很难确定第三方班便携式
不需要类是可序列化
容易配置并开始!
有 一个老外网友使用terracotta后,发现CPU是相当高负荷下和GC时间以来被杀的应用响应时间是关键的Web应用程序。于是认为使用 Memcached好,而兵马俑公司首席技术官阿里Zilka 认为:Memcached是因为使用非Java编写,所以没有GC,但他认为Memcached存在下面问题:
1 。 memcache分区是非常静态的(除非你改变它,或自定义) 。 这可能是一个大问题,因为您的网站成长 、
2 。 memcache分区会丢失数据。 如果您重新启动memcache服务器,数据丢失 。
有人说:如果你想使用mamcache有一个以上的服务器,你是到一些重型编码和算法思想。 有些人已经做了一些,但就我可以告诉不是类型的精度要求或映射。
http://translate.google.cn/translate?prev=hp&hl=zh-CN&js=n&u=http://hankliblog.blogspot.com/2008/01/bye-bye-terracotta-other-java-caches.html&sl=en&tl=zh-CN&history_state0=
memcached是一个非常简单的解决方案,分布式数据缓存 。它提供了一个地图一样的API ,而不是基于Java (尽管它有一个的Java API ) 。 因此,它会永远需要您的Java代码能够与一个单独的进程( memcached守护程序) 。
GigaSpaces和兵马俑都是纯Java的解决方案,提供的,远远不止缓存 ,虽然采取了不同的办法了。
Terracotta 是在JVM级别集群 你的应用,可以只花一点点代码变化就能将应用运行在多个JVM上。这样你能得到分布式缓存 (Terracotta guys call it Network Attached Memory) 和分布式进程. 这种方式很干净。
GigaSpaces产品为您提供全面的运行平台,实施高度可扩展的分布式应用。这样的做法是制定您的应用程序上的一个可扩展的平台从第1天,而不是集群 它特设更多的可扩展性。
该产品集成了非常丰富的分布式缓存 执行,信息功能和独特的SLA驱动,自我愈合的部署平台,让您的企业应用都需要加以电网启用。
http://www.gigaspaces.com/os_downloads.html.
有人做过测试,如果目标是20K tps, TC兵马俑之需要32 服务器而竞争对手的缓存 需要160台服务器. (This is my recollection, at least)
http://forum.springsource.org/showpost.php?s=4473cedb3ff6bb0ac39b624b04ac5922&p=168447&postcount=10
Voldemort is a distributed key-value storage system,开源的。
已 经在著名网站LinkedIn中使用,他们几位工程师写的构建 TB 级的 key-value 系统的经验:Building a terabyte-scale data cycle at LinkedIn with Hadoop and Project Voldemort:
http://project-voldemort.com/blog/2009/06/building-a-1-tb-data-cycle-at-linkedin-with-hadoop-and-project-voldemort/
Voldemort开源:
http://project-voldemort.com/
使用terracott作为Hibernate二级缓存 后的测试结果,非常让人惊喜。
http://tech.puredanger.com/2009/07/22/terracotta-hibernate-cache-tooling/
Memcached属于一种集中式的分布式结构,当某一台服务器宕掉以后,宕掉的这台服务器缓存 内容就丢失。Terractto不知道是怎么做的?缓存内容在多个JVM中重复保存?还是配对复制,还是其它的?
terracotta采取的是内存矩阵,通过对JVM的Heap进行复制实现共享,可以认为是一种分布式JVM,不存在单点风险,是真正的集群 式的分布式缓存 ,常用于云计算 之中。
唯一所谓缺点就是用Java编制,但这也不是缺点,你做一个Java接口就可以,因为memcached面向应用也是一个接口。
昨天一篇文章:FACEBOOK'S MEMCACHED MULTIGET HOLE: MORE MACHINES != MORE CAPACITY
提出:Facebook在2008年已经有超过800台memcached服务器,他们已经发现了memcached存在的一些问题,他们称为Multiget Hole。
出乎意料之外的是,增加memcached服务器并不能增加处理容量。这就象在一个洞里,通过简单增加服务器并不能把你挖出来。
解决multiget hole一个方式就是复制,因为本质是缺少CPU处理能力,需要更多CPU来处理,创造两组服务器,每组有两个memcached,前面再加一个负载平衡器,每个服务器只能得到一半的请求,这样就只做一半工作。
CTO Ari Zilka Says Terracotta is Fast
Ari Zilka, the CTO of Terracotta, 自己宣布在和市场上 Memcache, JBoss cache, 和来自大型公司比如 Oracle 和 IBM比较和,Terracotta的性能是最好的。他说:比他们每一个都提高3到10倍速度,如果使用3.2版本则大概比当前Terracotta要快 4倍。
这个测试是基于Spring PetClinic 应用做出的,但是好像没有看到准确测试报告,Java领域最好单机缓存 EHCache被Terracotta收购后,将于1.7版本推出整合了Terracotta的分布式缓存 。
采取CQRS命令和查询分离策略 ,Memcached和terracotta在读query架构中,当有命令command进来改变模型状态时,发出事件通过事件总线更新读架构中缓存 。
如果你无法进行清晰的读写分离,直接使用Key-value存储,因为象Tokyo Cabinet 和Tyrant 这些产品,内部已经考虑了如何进行分布式环境一致性更新的问题,不用应用者考虑,很方便。
是的,保存的是聚合根,根据ID找那个聚合根实体对象即可。
因 为是聚合根,必然聚合了很多其他子对象,不能将整个聚合对象群都在分布式服务器之间拷贝,这和关系数据库带有关系数据复制就类似了,效率 差,terracotta的更新策略就比较智能,而memcache则没有提供智能更新策略,它的使用策略是,将数据库数据都装进来,反正没有资源限制。
Memcached使用上主要考虑如下问题:
1、脏数据更新,几乎所有应用了缓存 的场合都需要考虑这个问题
2、down掉一台机后,命中率问题
1的话各有各的解决办法,2尽量采用圆周算法
最近总结:
比较这两个缓存 ,还是要从CAP定律 角度来考虑。
MC就只是一个缓存 ,可以把MC和Java中的Ehcache比较,MC之间没有数据复制替换,对付负载平衡的方式就是用HASH圆圈,减少影响面,粗一看,似乎很粗糙,但是有大道至朴的因素在里面,这样我们可以基于CAP定律来自己设计适合我们应用的缓存 架构。比如你可以实现BASE架构。降低一致性要求,提高性能可用性。
而兵马俑设计则比MC要进一步,它是由兵马俑自己来实现CAP定律,比如实现状态在所有机器中复制,一致性很好,低延迟,这个方向其实是数据库或内存数据库的方向,但是如果你需要复制的状态数据很多,可用性就不是很好。这是一种非透明化的方案。
这两个方案可以综合使用在CQRD架构 中,使用MC或Ehcache来实现分布式查询;而使用兵马俑来实现状态分布式,但是机器不宜多。
最新消息,Terracotta和Eucalyptus整合,提供基于兵马俑的应用程序可以无缝运行在云环境中:
Terracotta and Eucalyptus Integration Provides Data Management and Elastic Provisioning in the Cloud
最新消息:Ehcache和MemCache性能比较测试 :memcache在存取数据上慢于ehcache一点,而查询获取上快了那么一点点。无论如何Memcache是C语言,而Ehcache是Java。
Memcache and SpyMemcache Client
10000 sets: 3396ms
10000 gets: 3551ms
10000 getMulti: 2132ms
10000 deletes: 2065ms
Ehcache 0.9 with Ehcache 2.0.0
10000 puts: 2961ms
10000 gets: 3841ms
10000 deletes: 2685ms