Hash环
LightCloud使用一致性Hash算法(Consistent Hashing),好处就是当添加新节点的时候不用移动大量数据了。还不知道为什么?Consistent Hashing介绍。
一致性Hash算法也不算什么新鲜玩意儿了,凡是分布式系统都不免能见到它的身影,那LightCloud特别之处在哪里呢?好,我们广告之后告诉你……
(可恶的广告)
好,广告之后精彩继续
为了提高可用性,LightCloud使用了数据复制,在正角上场之前,先上一个暖场的,这个暖场的来头还挺大Amazon's Dynamo,先看大屏幕,
图上说了,Key A对应的值会复制三份,分布放在A,B,C节点上(原因不用说了吧),这样做的后果就是系统比较复杂,特别是加入新节点之后,由于Amazon's Dynamo系统本身就设计的比较复杂,这里就不细展开了,有兴趣的同学可以参考链接地址中的论文。
主角上场,主角本身设计的比较简单,还是先看大屏幕
怎么样,有没有看出什么道道来,节点本身复制了,这里是复制了两份,当然你也可以复制三份,第三份甚至可以放在另外的数据中心以提供更高的可靠性。LightCloud的复制用得是底层TokyoTyrant的复制功能,很环保。
解决了复制的问题,还有一个问题就是加入新节点是数据转移的问题,这张图困扰了我很久,大家先仔细品味一下
本来挺简单的一个环,现在变成了两个,上面那个环呢只保存地址,下面那个环才是保存了真正的数据,这样做有什么好处呢?文档也比较简略,没有说清楚,我和作者amix沟通之后,他答应在后续的文档中详细加以说明,留待以后再来分析吧。
和TokyoTyrant通讯
可以通过两种方式和TokyoTyrant通讯:
-
- 使用Tyrant的二进制协议
- 使用Memcached的协议
默认使用前者,因为是二进制的,而且支持调用Lua扩展,当然如果你愿意,也可以使用Memcached的协议。
posted @ 2009-03-08 20:32 tmfc 阅读(589) 评论(0)
编辑
去年由于工作关系,需要给Memcached选择一种数据压缩算法,参考了2008版的MONSTER OF COMPRESSION,现在2009年度的又新鲜出炉了,有需要的朋友可以去下面看看
MONSTER OF COMPRESSION 2009
由于用于压缩缓存数据,所以重要指标是压缩速度和解压速度,直接参考Ranked on Time of Compression表和Ranked on Time of Decompression 表
可以发现排在前列的算法就这么几个,而且基本上都是LZ帮派的,其中又以LZ77分舵的气焰最盛,那个速度叫一个块,比7Zip要快15倍,比压缩比最高的NANOZIP要快70多倍。由于MONSTER OF COMPRESSION的压缩测试数据包括非压缩的图片,二进制文件(包括exe和dll),压缩音频,视频等等,LZ帮派基本上压缩率是比较惨的(1G的数据压缩到700多M),但是Memcached缓存的都是什么,都是序列化后的对象,那不就是XML文件吗(当然也可以使用二进制序列化,不在讨论之列)。于是本着认真负责的态度,本人决定测试一下LZ帮的文本压缩能力。
找来找去,去年排名前几的算法,只有QuickLZ(07年还是排名第五的大怪兽今年不知道由于什么原因,没有测试数据)提供了可执行程序(最重要是还有C#版本的库),那就用QuickLZ粗略测试了一下,测试使用了对象序列化后产生的XML文件,具体的成绩已经有些模糊,压缩比应该是在50%左右,这个成绩还真不错,完全可以满足要求。不过最后由于种种原因,没能应用到项目中,所以没法提供更多资料了,大家有兴趣可以自己测试一下实际效果到底如何。
posted @ 2009-03-08 18:52 tmfc 阅读(1551) 评论(3)
编辑
摘要: LightCloud是一个性能堪比Memcached的分布式的键-值数据库,但相对于易失的Memcached,它是持久化存储的,在传统的关系数据库之外提供了另一种选择。
阅读全文
posted @ 2009-03-07 21:45 tmfc 阅读(2979) 评论(8)
编辑
摘要: 翻译自Maoni's WebLog 文章Using GC Efficiently – Part 1,Maoni是微软CLR Performance组的成员
本文的目标是解释一些东西的代价好让你可以更好使用托管内存-而不是解释GC本身-只是解释如何使用它而已。我假设绝大多数人对于使用垃圾收集感兴趣,而不想自己实现一个。本文假设读者对GC有基础的了解,如果你需要一些关于GC的背景知识,Jeff Richter写了两篇非常好的MSDN文章,1和2。
首先我会关注工作站级类型的GC(Wks GC),然后我会解释服务器类型的GC(Svr GC)与前者的区别和你该用哪个(但是通常情况下你不需要选择,而我也会解释为什么你不需要)。
阅读全文
posted @ 2008-07-29 13:53 tmfc 阅读(1222) 评论(5)
编辑
摘要: Web展现
最近几年企业应用中最大的改变无疑是基于Web浏览器的用户界面的崛起。优势在于:不需要部署任何客户端软件,一致的UI使用方法,便利的全球访问。
通常Web服务器上有着各种各样的配置文件来确定哪些URL该由那个程序处理,一个Web服务器可以支持多种程序。它的工作只是解释请求(request)的URL并把控制交给服务器端程序。
服务器端程序基本上可以分为两种基本的类型:script和server page
阅读全文
posted @ 2006-12-25 20:55 tmfc 阅读(2289) 评论(3)
编辑
摘要: 结构映射模式
当人们谈论对象-关系映射时,大部分的人都是在讨论结构映射模式,大部分模式都和Table Data Gateway无关,某些可以用在Row Data Gateway或Active Record上,大部分都需要用在Data Mapper上。
映射关系
关键点是联系对象和关系的不同的方法,这会引出两个问题。第一个问题在表现(representation)上,对象保持引用而关系数据库保持的是键的关联。第二个问题是,对象可以很容易的使用集合来保持多个与它有关的其他对象的引用,但是关系数据库却正好相反,相关对象会有一个到主对象的反向的引用。比如一个部门有多个员工,部门对象持有多个员工的引用,但是再关系数据库中,每个员工的数据行中会有一个到部门表的外键连接,而不是在部门表中引用多个员工(因为关系数据库不支持这样做)。
解决表现问题的方法是在对象中保持一个Identity Field,使用它来作为关系数据库的键。当你访问数据库中的外键时,你使用的是Foreign Key Mapping来连接适当的对象间的连接。如果你没有在Identit
阅读全文
posted @ 2006-12-19 19:54 tmfc 阅读(2147) 评论(4)
编辑
摘要: 架构模式
架构模式的选择对后续的程序开发有着深远的影响并且难以切换(难以从一种模式重构到另一种),所以必须仔细的选择架构模式。
将SQL语句嵌在逻辑代码中会显得非常的丑陋,DBA也希望能够通过了解SQL语句来决定怎样对数据库进行索引,所有这一切的原因让我们倾向于将访问数据库的SQL语句从领域逻辑中分离出来。
以数据表结构来组织类的结构是一个好主意,这样类和数据表可以一一对应。这些类组成了一个数据表的Gateway,Gateway主要分为两种,Row Data Gateway和Table Data Gateway。
Row Data Gateway中,数据表中的每一行对应于一个对象实例,比较自然的符合了面向对象的思想。
Table Data Gateway中,整个数据表只需要一个对应的对象实例。而用来储存数据的则是Record Set,一个通用的数据结构,适合于任何一张表。
阅读全文
posted @ 2006-12-18 20:29 tmfc 阅读(3133) 评论(7)
编辑
摘要: 三个主要的模式:Transaction Script,Domain Model,Table Model
最简单的方法是使用Transaction Script,Transaction Script本质上就是从表现层接受输入,进行验证和计算,保存进数据库,调用其他外部操作并且返回更多的信息,帮助计算并组织数据给表现层的过程。基本上就是将用户可能做的事情组织成一个个的函数,所以可以将其想象成动作的脚本,或者一个个事务。
Transaction Script的优势:
是几乎每个开发者都了解的简单的过程模式
配合使用简单的数据库层模式,如Row Data Gateway,Table Data Gateway时工作的很好
非常明显的边界:以打开事务开始,关闭事务结束。
但是,在领域逻辑变得越来越复杂时,Transaction Script也会有很多劣势,会出现很多难以消除的重复代码,子方法越来越多后,缺乏清晰的结构。
这个时候,就该以面向对象方式处理逻辑的Domain Model模式登场了。我们主
阅读全文
posted @ 2006-10-10 17:09 tmfc 阅读(2779) 评论(1)
编辑
摘要: 分层是用来分割复杂软件系统的最常用手段之一。如:操作系统建立在设备驱动和CPU指令上;FTP建立在TCP层之上,TCP建立在IP层上,IP建立在以太网上。
把分层结构想像成蛋糕,每一层都建立在它下一层上。意味着上层使用下层的服务,但是对更底层的服务一无所知。如,第四层使用第三层定义的服务,第三层使用第二层的服务,但是第四层并不了解第二层的服务。
分层的优势:
可以单独了解一层的东西,而不用管其他层
可以替换某一层的实现
最小化层之间的依赖
为建立标准做好准备
一个低层可以被很多高层使用(提高复用率)
分层的劣势:
分层对部分东西,而不是全部东西,有一个良好的封装。有时会引起连锁的更改,如,为了在用户界面上多显示一个属性,必须更改从数据库到UI之间的所有层。
额外的层会降低性能
阅读全文
posted @ 2006-09-26 21:33 tmfc 阅读(4310) 评论(6)
编辑
摘要: 我的前两篇blog原意是想通过一个故事说明委托的来龙去脉,但是后来的主题却变成了解耦的一些方法介绍,对于委托本身的关注反而少了,加上编故事的水平不高,有点虎头蛇尾的感觉,大家见谅,以后有机会再来好好整理以下。 在网上找几篇好文来补充一下委托的内容: 台湾msdn的大内高手专栏,蔡学镛先生的好文(繁体+台湾术语,希望大家看得懂): 函数指针进化论(上) 函数指针进化论(下)
阅读全文
posted @ 2006-09-18 11:45 tmfc 阅读(774) 评论(0)
编辑