??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av无码专区国产乱码在线观看,亚洲欧洲成人精品香蕉网,国产精品久久亚洲一区二区http://www.tkk7.com/xjtuwz/while(true) {System.out.println("wz.xjtu");}zh-cnSat, 10 May 2025 23:09:33 GMTSat, 10 May 2025 23:09:33 GMT60NOSQL- Questionshttp://www.tkk7.com/xjtuwz/archive/2010/02/24/313765.htmlwz.xjtuwz.xjtuWed, 24 Feb 2010 02:47:00 GMThttp://www.tkk7.com/xjtuwz/archive/2010/02/24/313765.htmlhttp://www.tkk7.com/xjtuwz/comments/313765.htmlhttp://www.tkk7.com/xjtuwz/archive/2010/02/24/313765.html#Feedback0http://www.tkk7.com/xjtuwz/comments/commentRss/313765.htmlhttp://www.tkk7.com/xjtuwz/services/trackbacks/313765.htmlq篇文章是用英文写的Q由于某U原因,q篇文章可以很直接的说是Anti-MongoDB一个和谐的DBQ一Q。写一的时候其实有很多问题Q还是不很清楚的。所以有了以下的问题Q?

I has some questions about the nosql and the document database solutions because I just touch the nosql solutions these days,
I tried to understand and find the benefit of the NOSQL solutions (performance and scalability), but I cannot convince myself for the reasons, specially for the complex business related cases,
After read a lot of the articles and find the CAP, relational and Scalability are the three points for the NOSQL solutions,
CAP : only can pickup two of the three factors, and the NOSQL solutions pickup the AP, and use the eventually consistency to handle the consistency, now, let's check the RDBMS, if we have a lot of database servers, we also cannot have a good Consistency because of the performance issues, so we can choose the Master/Slave and asynchronize copy to handle the consistency (Similar with Eventually Consistency) which is similar with the NOSQL, so what is the benefit of the NOSQL (specify document database) from the CAP theory?
No-Relational object : the NOSQL is good at the no-relationship objects, for example, log. but log also can save to the RDBMS without relationship, so for the no-relationship objects, I think the mongo solution and the RDBMS solutions should be have the same performance and scalability. right?
Relational : in the mongodb.org there is a good example as following,

the address is embedded into the student which is reasonable and will make the performance better if we need load the address from the student in the UI, but the RDBMS also can do it for the 1-1 relationship, and the scores need ref to the another collection and which is also similar with the RDBMS and also need touch database two times when we load the course which also similar with RDBMS. so what is the benefit.
Partition and Sharding : RDBMS also provide the solutions (although need change some codes), and RDBMS also can handle them.

wz.xjtu 2010-02-24 10:47 发表评论
]]>
MongoDB之一NOSQLhttp://www.tkk7.com/xjtuwz/archive/2010/02/24/313764.htmlwz.xjtuwz.xjtuWed, 24 Feb 2010 02:46:00 GMThttp://www.tkk7.com/xjtuwz/archive/2010/02/24/313764.htmlhttp://www.tkk7.com/xjtuwz/comments/313764.htmlhttp://www.tkk7.com/xjtuwz/archive/2010/02/24/313764.html#Feedback0http://www.tkk7.com/xjtuwz/comments/commentRss/313764.htmlhttp://www.tkk7.com/xjtuwz/services/trackbacks/313764.htmlNOSQL数据库经q了风风火火的一q_各个解决Ҏ做的一个比一个有个性,q且大部分都有了商业应用QM来说自己创造出来ƈ且可以进行自行优化的东东q是l得起历l的?

MongoDB在过ȝ一q中Q变化非怹大,刚开始关注它的时候,它只是一个没?.0版本的东东,但是现在已经加上太多太多的功能了Q其中包?MapReduceQAuto ShardingQ等?

l过了比较深入的研究Q还会l研IӞQ发现这个最像关pd数据库的数据实做的很强大。有很多东西q是非常值得探讨的。我们先从以下方面进行研I关pd数据库和非关pd数据库的区别Q以及ؓ什么要在某U条件下摈弃关系型数据库?

1. 关系型数据库的生就是ؓ关系所生,如果一条条的都不是关系型的数据Q需要进行关pd数据库吗Q?{案很简单:不需?

l典应用QLog的存?Q存储到关系型数据库的话Q耽误了我们可怜的不好扩张的数据库呀Q如果存储在文g里面Q那又不好进行管理,所以非关系型数据库是一个很好的解决ҎQ?

2. 关系型数据库q多的强调了关系Q关pd数据库的目标是把我们的数据库打造成一个第三范式遍布的数据l构Q无传递函C赖和部分函数依赖Q。但是这U拆解变相的多了一ơ数据库操作Q也是一ơIOQ性能也就会下降了?例子如下Q当我们x开一个帖子的时候,我们肯定q是x下面的Comments都拿到的Q如果我们直接能把Comments存在q个帖子之下很容解决了吧?

3. 关系型数据库q的xconsistencyQ其实我们很多的pȝ中ƈ不需要这么好的consistencyQv码很多的Web2.0或者是普通的|站来说Q只要把SupportQ维护,alert机制做好Q不需要太多的consistency一样可以做出很好的pȝ。当然我们也可以通过一些机制实?eventually consistency Q没有很深入的研I过Q。太多的consistency的关注必然导致最后的available不会做到很好。进而关pd数据库很难scaling out。ؓ了scaling out readQ我们只能去做partitionQ但是partition很难做呀Q一半都会牵扯到很多代码的改动。这些代码的改动会严重媄响项目的E_性而且风险性很大。而ؓ了scaling out write 只能dmaster-slave的解x案(async和sync每种都有自己的问题)。很多NOSQL都解决了q个问题Q无论是auto- shardingQ因为是key做主的东西,可以很好的拆分)q是replication。(q一块要q一步研IӞ

4. Schema问题。关pd数据的schema都是一定的Q如果增加或减少一个column那可是一个大动呀。但是NOSQL却是能很Ҏ的解册个问题,因ؓ他们是key-value而已?

NOSQL的提出是一个思想的进步,是一U编E理늚q步Q数据库只是一个存储的库而已Q他不应该过多的x于其他的business相关的东ѝ将来发展的前景是我们所有的business的逻辑都应该在Domain里面体现Q我们不用关注下面到底存储到那里?/p>

wz.xjtu 2010-02-24 10:46 发表评论
]]>
LinkInZDynamo设计的系l?[ZZ]http://www.tkk7.com/xjtuwz/archive/2010/01/18/310013.htmlwz.xjtuwz.xjtuMon, 18 Jan 2010 14:45:00 GMThttp://www.tkk7.com/xjtuwz/archive/2010/01/18/310013.htmlhttp://www.tkk7.com/xjtuwz/comments/310013.htmlhttp://www.tkk7.com/xjtuwz/archive/2010/01/18/310013.html#Feedback0http://www.tkk7.com/xjtuwz/comments/commentRss/310013.htmlhttp://www.tkk7.com/xjtuwz/services/trackbacks/310013.htmlKey-Value存储

Z实现高性能和高可用性,我们只允讔R常简单的键值数据存取。key和value可以是list和map的复杂类型,但美中不的是只有以下的查询是有效的Q?/p>

value = store.get(key)
store.put(key, value)
store.delete(key)

q可不是解决了所有的问题Q其实做了许多的取舍Q?/p>

~点

没有复杂的查询过滤器

所有的联合查询必须在代码实?/p>

没有外键的结?/p>

没有触发器和视图

优点

只有高效的查询可用,性能是可惛_?/p>

Ҏ分布到集?/p>

不管怎样Q面向服务常怸允许外键的结构,q且强制在代码中实现联合Q因为和数据相关的keyq个关系 在另一个服务中l护着Q?/p>

使用关系型数据库你必要有一个缓存层用来扩展L作,不过q个~存层很典型地强制你使用了key-value的存储系l?/p>

Z性能Q最后不得不使用xml或者是其他不够正规的一砣文?/p>

佉K辑和存储分L晎ͼZ性能原因QSQL鼓励商业逻辑和存储操作؜在一P

没有对象-关系数据的丢失匹配问?/p>

数据模型的详l的讨论在下面l出?/p>

pȝ架构

代码中的每层实现了简单的put get和delete操作的接口。每一层都会负责一个方法,诸如tcp/ip|络通信、序列化、版本冲H解冟뀁内部结点\q{。例如\由层负责发v一个操作,比方说是PutQƈ且分发给N个存储ƈ行执行复Ӟ同是要捕h有的p|?/p>

?

保持每一层独立意味着可以混合和匹配用以满q行中不同的需求。例如,我们可以增加一个压~层Q将字节值的压羃水^降低到序列化之下。同P在将 数据路由到分区的时候我们可以做灉|的智能\由。硬件负载均衡的http客户端(用ruby写的Q这工作可以在客户端做Qsmart的客LQ,也可? 在服务端做成ȝ式的使用。要把网l层攑֜路由层的上面q是下面Q我们需要做的是一件简单的事情?/p>

?

在上图中“Load Bal.”是指负蝲均衡的硬件或者是轮@软g负蝲均衡器,“Partition-aware routing”是存储的内部路由。从传gq角度来看,少的蟩是g好事Q因为,嗯,q样p得少了)Q从吞吐量的角度来说也是件好事(因ؓ可预见的瓉 更少了)Q但是需要把路由信息攑ֈ栈顶Q例如,客户端必Ljava的而且q要使用我们的库Q。最后,最右的图中Qhttp-rpc发送到服务的请求被? 由到了包含正数据的机器Q如果有的话Q,因此Q在一个单独的复制ȝ单的情况下,机器必须能够直接从本地bdbU程内部获取数据?/p>

q一灉|性得高性能的配|成为可能。在存储中,盘的访问是一个独立的最大的性能冲击Q第二个是网l的x。靠分区数据和尽可能~存数据Q可以避 免磁盘访问。网l蟩数需要架构的灉|性来消除。请注意在上图中Q我们可以用不同的配|文件来执行3?跛_1跳的q程服务。要获得非常高的性能Q就必须? 由服务直接找到正的服务器?/p>

数据分区和复?/h3>

数据必须分区C个集的所有服务器上,使没有Q何一台单一的服务器需要保存所有的数据集。即便数据可以在一个单独的盘上存下,盘讉K值数? 的时候是受寻找时候所控制Q因此分区有改善~存性能的作用,它依靠把热的数据集分成更的块,能够Q希望能够)整个地放到那个存有整个分区的服务器内? 里。这意味着Q在集群里的机器是不可以互换的,h必须被\由到保存有所h的数据的机器Q而不只是随便地到某一台可用的机器上?/p>

同样Q因载过重或者是l护原因的停机,服务器经怼不可用。如果有S台机器ƈ且每台机器一天有p的概率会独自挂掉Q因此一天里一台机器丢失数据的概率? - (1 - p)sQ显Ӟ鉴于q一事实Q我们不能将数据只保存在一台机器上Q或者说Q数据丢q概率与群集中的数量成反比?/p>

最单的方式来完成这件事是,数据分成S个分区(每个机器一个)Qƈ且在R台机器上面保存键为K的值的拯。用Kq个键来兌R台机器的一U方? 是,设a=K%SQ然后将q个g存在机器aQa+1Qa+2Q?#8230;a+r。因此,对于M的概率pQ你都可以选择一个合适的复制因子RQ来辑ֈ一个可接受 的够低的数据丢失的概率?/p>

q个pȝ有个非常漂亮的特性,那就是Q何h只要知道数据的key可以计到数据所处的位置Q系l允许我们以peer-to-peer的方式做数据LQ而不需要联pM个装有所有的key到服务器的映信息的中央元数据服务器?/p>

当从集群中添加、删除机器时Q这栯是因为我们购买新的硬件或服务器时关闭)Q上q方法会D~点。在q种情况下,d会被改变Q数据会在机器之间迁UR假如d不变Q那负蝲不会q_C原来删除的或者是坏了的机器分布到集群中剩余的部分?/p>

一致性哈希是一U避免这U问题的技术,我们用它来计每个key在集中所处的位置。用这U技术,伏地有了这LҎ,当一台机器挂了的时候,负蝲可以q_地分布到集群中剩余的机器。同P当增加一台机器给一个有S台机器的集群Ӟ只有1/(S+1)的机器上的值需要迁Ud新机器?/p>

Z形象化一致性哈希方法,我们可以看到Q用可能出现的整数哈希|q样Q环׃0开始,着环旋转到2^31-1。这个环被^均分成Q个分 区,Q>>SQ这样S个机器中的每个,都能分到Q/S个分区。一个key用Q何一U哈希算法映到环上Q然后我们顺旉看分区找到第一个唯一 的R节点Q计出一个负责这个key的R个所有机器的列表。下面这个图d了ABCD四个机器的一个哈希环。箭头表Ckey映射到哈希环Q结果给出当R? 3时对应的保存了那个key的值的所有机器的列表?/p>

?

数据格式化和查询

在关pL据库中的数据被分成二l表。在q里它的{h物是“存储”Q如果数据不是必L表,我们不用字表结构(一个值可以包括列表,以及不需要考虑严格的关pd的映)。每个key都有一个唯一的存储,q且每个key都最多只能有一个倹{?/p>

查询

伏地系l支持哈希表的语义,因此一个单独的值可以一ơ进行修改,同时可以按照主键查询。因为可以通过主键来切分,q得通过机器做分布式非常单?/p>

h意,虽然我们不支持一对多的关p,但我们支持把列表做ؓ|q样也就完成了同L事情Q因此存储一个合理数量的有关联的值成为可能。这相当于一 个java.util.Map的值是一个java.util.List。在大多数情况下Q这样不规范来做是一个巨大的性能改善Q因为只需要一个单独的盘 dq程。但对于非常大的一个一对多关系Q例如,而一个key映射到数千万的valueQ,必须保存在机器上Q再通过游标慢吞吞地q一遍,q样子是不实? 的。这Q很见Q,必须他们分成子查询或以其他方式在应用层处理?/p>

查询单可能是一U优势,因ؓ每个查询都有非常可预的性能Q很Ҏ服务的性能拆分成存储操作的数量份,它执行ƈq速估计负载。相反,SQL查询 往往不透明Q而且执行计划是数据依赖的Q因此很难估计一条给定的SQL在实际负载下的数据中q能很好地执行(特别是对于一Ҏ的功能,既没有数据也没有? 载的情况下)?/p>

此外Q有三个操作接口Q得在整个存储层之上的透明层成为可能,q且在单元测试中使用模拟存储Q它的实Cq是一个HashMap的模拟。这样可使得单元试在特D的容器或者是环境之外Q会更加实用?/p>

数据模型和序列化

在伏地魔pȝ中,序列化是可插拔的Q因此你可以使用一个弄好的序列化方法同时也可以单也写自q。在伏地系l的最底层Q数据格式是只包括key 和value的字节数l。高层次的数据格式化是每个存储都讄的配|选项Q处理字节到对象的{变时Q依靠实现序列化c,所有格式的数据都可支持。这样做? 保客户端的字节序列正确?/p>

通过输入在存储上的配|文Ӟ我们可以q泛地支持以下各U类?

json–二进Ӟcd的JSON数据模型Q支持列表,地图Q日期,布尔值和各种_ֺ数字。这是唯一的一U可以从字节<->对象和字W? ?lt;->对象映射的序列化的类型。这意味着Q它可以和SQL怺作用Q例如通过命o行客LQ。我们当前的产品设计中用了一U有cd的? 压羃的、结构检查的cJson格式Q但qƈ没有Ҏ的状态,对于其他的应用Y件来_其他的序列化机制可能会更好?/p>

字符?#8211;只保存原生的字条串类型。对xml数据块比较有用?/p>

java序列?#8211;我们的老朋友java序列化。当你保存许多的java对象之前Q请认了解java序列化所提供的兼Ҏ保证?/p>

protobuf–Protocol buffers是来自google的代码生成的序列化格式,q可能是条不错的道,如果你不需要命令行讉K的话?/p>

identity–q个cd有效地禁止了序列化,返回给你确切的byte[]

字符串和identity的序列化都是相当的不a自明。Protocol Buffers最好的说明应该是google来说。因此本节的剩余部分讲述json背后的机制?/p>

json序列化类型详?/h3>

可能会有三种状态的数据会驻留,我们希望能够在它们之间进行{换:

在内存中的数据结构,例如一个User对象Q?/p>

持久性和|络传输的字节;

文本表示QDBA在检查特定的值和在线升时不需要写新的代码是非帔R要的?/p>

SQL基本上就通过文本查询格式化来辑ֈ标准化,E序来处理这些字W串和程序所使用的内部数据结构的映射关系。这是传l的对象关系映射的问题?/p>

对于存储来说Qjson是一个优U的数据模型,因ؓ它支持了所有编E语a中的数据cdQ字W串Q数字,列表/数组Q以及对?哈希表)。问题在于, 它是本质上是结构的。对于Q何存储问题最常见的情况,是有使用完全相同的格式保存的N行数据(包括有相同的列)Q在q种情况下,用json是一U浪费, 因ؓ它每一行都带有数据的格式。同P我们希望能够数据的表单声明,避免错拼了列保存了脏数据。ؓ了避免这U情况,我们要给每个存储上的key? value都分配一个结构,q个l构要能描述什么允怿存,以及怎么栯{成字节和从字节{成数据。用如下的cdQjson本n可以指定结构:

int8, int16, int32, int64, float32, float64,string, date, object, bytes, boolean, object, array
例如Q如果我希望一个存储包含字W串Q我指定那个表的cd为:
"string"
h意,此类型的定义本n是有效的JSON?br /> JAVA代码取到数据的时候就是字W串cd的?br /> 如果我期望存储包含一个整数列表,例如Q会员IDQ我可以指定cdQ?br /> ["int32"]
JAVA代码会q回List<Integer>?br /> 如果我期望存储包含一个简单的用户对象Q可以定义的cdQ?br /> {"fname":"string", "lname":"string", "id":"int32", "emails":["string"]}
q里JAVA代码返?Map<String,Object> Q包含了每个l出的keyQ以及对应的倹{?br /> 下面是所有允许的cdQ?/pre>
type storable substyles bytes used Java type example JSON example type definition
number int8, int16, int32, int64, float32, float64, date 8, 16, 32, 64, 32, 64, 32 Byte, Short, Integer, Long Float, Double, Date 1 “int32″
string string, bytes 2 + length of string or bytes String, byte[] “hello” “string”
boolean boolean 1 Boolean true “boolean”
object object 1 + size of contents Map<String,Object> {”key1″: 1, “key2″:”2″, “key3″:false} {”name”:”string”, “height”:”int16″}
array array size * sizeof(type) List<?> [1, 2, 3] ["int32"]

从这个意义上来说Q类型定义是一套在标准json上的限制集,q样能序列化高效执行(通过分段重复的字D,q且压羃数字Q,q且允许基础数据正确性检?/p>

h意,即一个值可能有不同的字D,但只支持依赖存储时定义的key来查询?/p>

Z帮助l构的发展,qJSON实现了版本,允许数据的逐步q移的结构。数据L以最新的l构来写Q但是,ȝ时候要可以用Q何一U写的时候用的结构。这样做可以在结构迁Uȝ时候不需要停下服务来取数据?/p>

一致性和版本?/h3>

当多个同步的写到多个分布的机器(甚至是多个数据中心)Q数据的一致性成了一个难题。传l的解决q个问题是分布式事务Q但q些都是~慢Q由于很? 跻I和脆qQ因Z们要求所有服务器可用于处理。如果应用程序运行在多个数据中心Q而跨数据中心操作的gq将会非常地高,特别圎ͼM一个算法要提及 大于癑ֈ之五十的机器都能保证一致性将会非常困难?/p>

其他的解军_法是容忍不一致的可能性,q在d时解决不一致。这是q里所探讨的?/p>

应用E序通常只读、修攏V更新序列时Q修Ҏ据。例如,一个用户往他的账号里增加一个emailQ我们必d搞到用户对象Q增加emailQ然后把 新的值写回到db。数据库的事务是q个问题的解x案,但当事务跨越多个面的加载时Q有可能加蝲完也可能没完Qƈ且可能在指定的时间片里完成)Q这q不 是一个真正的选项?/p>

当所有的update不存在时Q给定的key的值是一致的Q所有的L作都会q回一个相同的倹{在只读世界中,数据被以一致性的Ҏ创徏q且怸 改变。当我们增加了写操作、复Ӟ会遇到问题:现在我们需要更新在多个机器上的多䆾数据Qƈ且要让所有的东东都保持一致。在机器故障面前Q这样做很困难, 在网l分区的面前Q这样做被证明是不可能的Q例如分区的情况QA和B可以互通,C和D可以互通,但是A、B与C、Dq不能互?Q?/p>

下面有些ҎQ靠不同的保证和折衷性能来达C致性:

两步提交–q是一个锁协议Q包括在机器之间两轮的协作。它是完全一致的Q但不能兼容出错Q而且很慢?/p>

Paxos式的p–q是一个在一个g达成p的协议,能够更多地兼容出错?/p>

M?#8211;前两U方法防止永久不一致。这U方法在写的时候写入所有的不一致版本,在读的时候检所有的冲突q且解决问题。这不涉及协调工作,是完全兼容出错的Q但可能需要额外的应用E序逻辑来解军_H?/p>

我们使用版本和读修复。这有一个最好的可用性保证,和最高的性能QNơ复制只需要Wơ的|络往q写QW可以配置成小于N的|。两步提交需?Nơ的d|络往q。Paxos变化有很大不同,但相比两步提交也差不多?/p>

许多的细节,以下文g借自亚马?/p>

q里有一些很好的写关于这个问题的东东Q?/p>

分布式系l中的版?/h3>

一个简单的版本控制pȝ只是乐观锁定–我们保存一个唯一的计数器或者是旉值在每一片数据上Qƈ且只允许更新数据的时候才能更新这个倹{?/p>

在集中式的数据库中这q行良好Q但在一个机器时好时坏、复刉要时间的分布式系l中Q它挂了。对于这U用法,一个单一的g能保存够的写入历史Q以便我们丢弃老的版本。考虑下面的一pd指oQ?/p>

#两个机器同时取一个相同的?br />
[client 1] get(1234) => {"name":"jay", "email":"jay.kreps@linkedin.com"}
[client 2] get(1234) => {"name":"jay", "email":"jay.kreps@linkedin.com"}

#1客户端作了一ơ对name的修改ƈ且put了一?br /> [client 1] put(1234, {"name":"jay kreps", "email":"jay.kreps@linkedin.com"})
#2客户端作了一ơ对email的修改也put了一?br /> [client 2] put(1234, {"name":"jay", "email":"jay.kreps@yahoo.com"})

#现在我们有了以下的冲H版?br /> {"name":"jay", "email":"jay.kreps@linkedin.com"}
{"name":"jay kreps", "email":"jay.kreps@linkedin.com"}
{"name":"jay", "email":"jay.kreps@yahoo.com"}

在这个模型中Q后面两ơ的写入使原g再可用(因ؓ是基于原值的修改Q。尽如此,我们没有规则来告诉服务器是要抛弃对name的修改,q是对email的修攏V因此我们需要一个版本系l来允许我们重写和抛弃老版本内容,同时也要能检冲Hƈ且让客户去解冟?/p>

解决q个问题的一个答案是靠传说中的向量时钟版本。一个向量时钟在每次写机器的时候都保持一个计数器Q在两个版本冲突和一个版本成功或者是比另一个新的时候,我们能计它?/p>

向量旉是一个服务器和版本对的列表:

 [1:45,2:3,5:55]

从这个版本能够看出对那个写的数字来说q是一C服务器?/p>

对i来说v1l承自v2Q?em>v1i > v2i。如?v1 > v2?em>v1 < v2都不满Q那么v1和v2同现Q也是冲突了。下面是两个冲突的版本的例子Q?/p>

	[1:2,2:1]
[1:1,2:2]

我们的版本结构定义了一个偏序,而简单的乐观锁是一个全序?/p>

路由参数

M持久存储的系l都需要回{的一个问题就?#8220;我的东西存在哪里”。如果我们有一个集中的数据库,q是一个简单的问题Q因为答案L“它们在数据库 里的某个地方”。在一个键分离的系l中Q可能在在多台机器有所需要的数据。当我们执行L作的时候,我们臛_需要从一台机器去取数据,当我们写的时候,? 们需要写到N个复制去?/p>

因此Q有三个参数的问题:

  • N - 复制的次?/li>
  • R - L据的节点?/li>
  • W -写成功的分区?/li>

h意,如果R + W > N能够保证我们“L们所?#8221;。如果w=0Q那么写? 作是不阻塞的Q写成功是没有保障的。取操作和删除操作既不是立即一致的Q也不是孤立的。这意思是_如果一个put/delete操作要成功,需要W个节 炚wq行了同L操作Q然而,如果写失败了Q这栯是因为极数的节点能够马上完成操作)Q那状态就是不定的了。如果一个put/delete操作成功 了,那最后这个值都会变成最l的|但如果没有成功的q个值将会失效。如果客L要确保这个状态,必须在一ơ写操作p|后再发v一ơ写操作?/p>

持久?/h3>

持久存储我们默认使用JAVA版的BDB。MYSQL和内存存储也同样支持。要d一个新的持久化实现Q你需要实现put\get\deleteQƈ且要提供一个本地存储的值的q代E序?/p>

扚w计算数据支持

数据最密集的存储需求之一是在我们的系l批量计关于成员和内容的数据。这份工作常常涉及到实体之间的关p(比如说有关系的用戗相关的新闻文章{)Q那q样N个实体就会增长出N2? 关系来。在LinkIn的一个实例是用户|络Q如果要为所有用户准保存会?2TB的范围。批量数据处理通常比随问更有效率,也就意味着扚w处理? 数据可以被实际系l简单地讉K。Hadoop极大地扩充了q一炏V我们正在开源伏地魔的后端持久化的东东,它支持非帔R效的只读访,q能解徏立、发布以? 理大量的、只d指计数据集{许多痛苦的事情?/p>

处理扚w计算的大多数痛苦来自于从数据仓库或者是hadoop传输数据到线上系l的“推?#8221;的过E。在传统DBq意味着在线上机器重建新数据的烦 引。做C百万计的insert和update操作一般不会所有都很高效地执行Q通常在一个sql数据库里数据需要被布到一个新的表中,当新表徏立完毕, 再交换回来替换当前数据。比数百万计的单独的update操作来说q样做更好,但是Q当同时服务于真实环境时Q这仍然意味着U上pȝ现正为新的数据集Q或 者是performaQ兴多GB的烦引。仅此一点可能需要数时或数天,q可能会毁了实时查询的性能。有人想搞定q个问题Q通过数据库U别? swap换出Q比如说Q有一个在U的DB和一个离U的DBQ进行交换)Q但q要求做许多事ƈ且意味着你将只有一半的g正在使用。伏地魔依靠可能的ȝ 重徏自n的烦引(在hadoop之上或者其他)Q然后简单地推送给U上机器q且透明地进行交换?/p>

参考文?/h2>

wz.xjtu 2010-01-18 22:45 发表评论
]]>Selenium &ndash; Acceptance Testing Toolhttp://www.tkk7.com/xjtuwz/archive/2010/01/11/308962.htmlwz.xjtuwz.xjtuSun, 10 Jan 2010 16:02:00 GMThttp://www.tkk7.com/xjtuwz/archive/2010/01/11/308962.htmlhttp://www.tkk7.com/xjtuwz/comments/308962.htmlhttp://www.tkk7.com/xjtuwz/archive/2010/01/11/308962.html#Feedback0http://www.tkk7.com/xjtuwz/comments/commentRss/308962.htmlhttp://www.tkk7.com/xjtuwz/services/trackbacks/308962.html  周末Q由于项目需要,作ؓ一个开发者,我决定研I一下自动化试Q因为最q,我们要统计User Story所带来的Defect的个敎ͼ所以Dev要在开始的时候就要准备自己在自己的开攄境上多测试几遍?/p>

公司一直在用QTP试Q用VBd脚本Q额的神呀Q那语言我玩不{Q所以还是选择了SeleniumQ因为它提供了Java的driverQ还是不错的。先装了一个Firefox插gQ录制了一些脚本,拯到JUnit里面Q竟然不可以q行。网上Google了很久没有找到好的方法,一斚w是由于我们的q个frame写的不是怎么标准Q另外一个方面估计是|络太慢了。所以我加上了一个waitForPageLoadQ竟然神奇的可以通过了。不知道Z么,但是q样的脚本的东西Q我也懒得去理解Z么?/p>

  一直想怎么把东西做到超U的自动化,自动化达到在一个地方输入,另一个地方就可以验证了,最后决定,把输入数据写到Excel里面Q中间的数据存储到数据库中(必须的,其实q是可以在Excel里面存着Q不q懒得这样存Q访问Excel不是俺的强项Q。最后去Ҏq些中间的结果去验证最后的输出是不是正?/p>

  x很好Q开始做了,遇到了第一个问题,输出是简单的<tr><td>test</td></tr>, 怎么去验证这个test是不是正呢Q?ȝ上l搜索,发现用xpath能解册个问题,最后用以下的path解决了这个东东,如下Qxpath=//div[@id='reponseFormHeader']/div/table/tbody/tr[1]/td[1]Q?可以用一个firefox差hxpatherd现这个东东,q且写上去,也解决了l这些没有必要的text写上一个Identifier的问?QQA一直强调要l这些Text都加上一个ID方便自动化测试)?/p>

  最后选择把中间结果写在MongoDB里面Q原因很单,Schemaless和Map driven的DBQ我仅仅需要把Map往里面一扔,后面的就不用了。简单粗_但是又是很实用?自动化测试不是很难,但是要用心去做,QA也不是很ҎQ很多东西,资料不多Q写h也很奇怪?/p>

  最后说说敏捯Y件开发,什么时候写自动化测试呢Q?看网上有QQA试?0%的要手工试Q我比较不同意,我认?0%都可以进行自动化试。自动化试是QA可以在很早就可以开始的QMockup出来后就可以开始了。只要我们把自动化测试当成一回事dQ可以省d多很多的effortQ不׃ؓ一U敏L快捷之\?/p>

wz.xjtu 2010-01-11 00:02 发表评论
]]>
NoSQL &amp; MongoDBhttp://www.tkk7.com/xjtuwz/archive/2009/12/20/306711.htmlwz.xjtuwz.xjtuSat, 19 Dec 2009 17:31:00 GMThttp://www.tkk7.com/xjtuwz/archive/2009/12/20/306711.htmlhttp://www.tkk7.com/xjtuwz/comments/306711.htmlhttp://www.tkk7.com/xjtuwz/archive/2009/12/20/306711.html#Feedback0http://www.tkk7.com/xjtuwz/comments/commentRss/306711.htmlhttp://www.tkk7.com/xjtuwz/services/trackbacks/306711.html最q在准备一个小的讨ZQ题目可以自定,我感觉这个MongoDBq是蛮有意义的,值得讨论一下。做了一些slidesQ节选如下,

  1. What is NOSQL

    1. NOSQL != NO SQL

    2. NOSQL = Not Only SQL

  2. What do we want?

    1. Performance

    2. Scalability

    3. Flexibility

  3. Two important theories

    1. CAP (Every system only can match 2 of them, NoSQL supports to match A and P)

      1. Consistency

      2. Availability

      3. Tolerance to network Partitions

    2. ACID & BASE(Anti-ACID)

      1. ACID – RDBMS use this theory

      2. BASE – Anti-ACID and NoSQL use it.

  4. Compare with current RDBMS with NoSQL solutions

    1. RDBMS are working w/ relationship, and the relationship are not easy to extend (scalability)

    2. RDBMS software are implemented as a big system with additional function which make the database slow

    3. ACID can make the data perfect, but it does not care about the performance.

    4. Most of NoSQL solutions are schemaless

    5. Make the simple things simple (for example: log)

  5. Upcoming solutions of the software.

    1. NoSQL is nibbling up the SQL solutions.

    2. NoSQL + SQL = Data solution

  6. What is the issues we are meeting now?

    1. Performance

    2. Document generation (PDF/Email)

    3. Image solutions

  7. Compare with MySQL

    1. Performance is better

    2. Scalability is excellent

  8. MongoDB vs CouchDB

    1. Similar solutions.

    2. Performance of MongoDB is better than CouchDB

    3. MongoDB is better at web solutions.

  9. Three words about the MongoDB

    1. NOSQL –> RDBMS

    2. BSON

    3. GridFS

  10. How to use it?

    1. 1 Click install

    2. 2 clicks helloworld using java client

    3. types which mongo supports now

    4. Collection oriented database.

    5. index using with MongoDB

    6. GridFS for the big file

  11. Sharding with Mongodb

    1. How to shard?

    2. Scalability is excellent.

  12. Upcoming solutions for Mongodb

    1. ORM with MongoDB java client

    2. Performance tuning with java client

  13. What can Mongodb  do? cannot do?

    1. Document

    2. Image store

    3. Real-time Analysis

    4. Caching

  14. Upcoming simple desgin with Mongodb.

image



wz.xjtu 2009-12-20 01:31 发表评论
]]>
Cache之我?/title><link>http://www.tkk7.com/xjtuwz/archive/2009/12/09/305256.html</link><dc:creator>wz.xjtu</dc:creator><author>wz.xjtu</author><pubDate>Wed, 09 Dec 2009 03:44:00 GMT</pubDate><guid>http://www.tkk7.com/xjtuwz/archive/2009/12/09/305256.html</guid><wfw:comment>http://www.tkk7.com/xjtuwz/comments/305256.html</wfw:comment><comments>http://www.tkk7.com/xjtuwz/archive/2009/12/09/305256.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.tkk7.com/xjtuwz/comments/commentRss/305256.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/xjtuwz/services/trackbacks/305256.html</trackback:ping><description><![CDATA[q两日对Cache研究了一点,M一些源代码Q自׃写了点codeQ借此假期也算是休闲加学习了?br /> <br /> <strong>什么时候用CacheQ?br /> </strong><br /> 在系l中Q如果要考虑pȝ的性能Q我们最好都使用CacheQ在各个层次上都用上CacheQ这L话可以尽最大程度的减少数据库的压力。估计现在的pȝ都在分层QvoQpoQdoQdomain objectQ;我们可以把这些东西能~存的都~存hQ当然要Ҏ具体pȝ具体分析QCache多长旉QCache多少东西Q?br /> <em>TipQ公司的pȝ中,׃用一台数据库Q数据库的压力一直都是一个很大的问题QtimeoutQtoo many connectionQ等问题应接不暇?br /> </em><br /> <strong>怎么用CacheQ?/strong><br /> <br /> 估计每个公司都有自己的Cache frameworkQ简单的是几个c,ȝ的可以做个小的frameworkd装已有的opensource的cache provider。很多opensource的cache providerQ例如:oscaheQehcacheQ都Ҏ能q行了优化,所以肯定性能比Map好很多,但是肯定不能拿过来就用,那样的话每次调用的时候太q于ȝQ写很多的类Q很多的Ҏ。所以说包装是很重要的,包装成一个Bus一L东西QCacheBusQ叫做CacheManager比较好)Q这L话就可以在各个层ơ都向上面写和读了?br /> <em><br /> TipQ?Cache是key valueQ我们只要能写好key-value怎么写都可以的。这样也让系l变得简单实用(更能体现OOQ?br /> </em><br /> <strong>Cache Provider</strong><br /> <br /> OhQ这斚w太多东西了,oscacheQ貌似停止开发了Q,ehcacheQ被terracotta收购了,前途不错)QtreecacheQjbosstreecache大而全Q,memecachedQ很火了很久Q,nosql相关的东西(couchdbQmongodbQ。Oh...不能忘记Map<br /> <br /> 其实用什么都可以Q关键是用好Q一般的解决Ҏ很简单,既然你要在系l中用Cacheq且想风风火火的用一下,那就来个二CacheQ第一U用本地CacheQ速度快,但是东西不能太多Q,W二U,用memcached Q能存放大的东东Q便宜)。第一UCache?分钟Q自p调试定旉Q,自动收割到第二Cache中?br /> <br /> 什么在W一UCache中永q存z? 的Q永q都要用的,例如用户信息QSite信息Q一些template{?br /> <br /> 特别一?u><em>nosql</em></u> q方面mongodb和couchdb做的很好Q在document相关的东西,可以~存到这里面Q例如:pȝ要在半天后发一邮Ӟq封邮g所有的数据现在内存中都有,比较大的东东。到时候再d复杂Q太费内存了。怎么办呢Q?攑֜一U缓存肯定不合适,攑֜二~存Q要存活半天呀Q太费旉了,存在数据库里面,增加压力Q也不是很好QNOSQL的mongodb和couchdb可以解册个问题,q个schemaless的数据库Q可以让你轻杄存Q何的东西Q性能不错Q。(自己要优化一下代码)<br /> <br /> <br /> 举例Q?br /> <br /> Annotation<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">@Documented<br /> @java.lang.annotation.Target(value</span><span style="color: #000000;">=</span><span style="color: #000000;">{java.lang.annotation.ElementType.TYPE})<br /> @java.lang.annotation.Retention(value</span><span style="color: #000000;">=</span><span style="color: #000000;">java.lang.annotation.RetentionPolicy.RUNTIME)<br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> @</span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> CacheIt {<br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">Provide the cacheProvider which will be use to cache the object which is just used to replace the xml configuration.</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String cacheProvider();<br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">Used to define how long the cache need to be provide</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">long</span><span style="color: #000000;"> cacheDuration();<br />     </span><span style="color: #008000;">//</span><span style="color: #008000;">The level of the cache, define, level1, level2 (If there is level2 defination in the annotation, the cache will be kick to level2 after the timeout in the level1)</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">    </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> cacheLevel();<br /> <br /> }<br /> </span></div> <br /> 一个VO的configuration<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">@CacheIt(cacheProvider</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">com.javaeye.wmwm.cache.impl.HashMapCacheProvider</span><span style="color: #000000;">"</span><span style="color: #000000;">, cacheDuration</span><span style="color: #000000;">=</span><span style="color: #000000;">10000</span><span style="color: #000000;">, cacheLevel</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> TestVo {<br />     <br />     @Identifier<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String key;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String test;<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getKey() {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> key;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setKey(String key) {<br />         </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.key </span><span style="color: #000000;">=</span><span style="color: #000000;"> key;<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String getTest() {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> test;<br />     }<br /> </span></div> <br /> <br /> 之后写一个CacheManager<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> CommonCacheManager </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> CacheManager {<br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * Cache the object into the cache.<br />      * <p> the provider is defined in the annotation in the related Vo/PO/DO<br />      * <p> the key is annotated by the <code>Identifier</code>.<br />      * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> object represents the input objects which needs to be cached.<br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> cache(Object object) {<br />         Cache cache </span><span style="color: #000000;">=</span><span style="color: #000000;"> CachePool.getInstance().loadCache(object.getClass());<br />         Object key </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> CacheKeyFinder().find(object);<br />         cache.put(key, object);<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Object load(Class</span><span style="color: #000000;"><?></span><span style="color: #000000;"> clazz, Object key) {<br />         Cache cache </span><span style="color: #000000;">=</span><span style="color: #000000;"> CachePool.getInstance().loadCache(clazz);<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> cache.get(key);<br />     }<br /> }<br /> </span></div> <br /> <br /> <br /> <em></em><br /> <br /> <br /> <img src ="http://www.tkk7.com/xjtuwz/aggbug/305256.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/xjtuwz/" target="_blank">wz.xjtu</a> 2009-12-09 11:44 <a href="http://www.tkk7.com/xjtuwz/archive/2009/12/09/305256.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://qiwangxuan.com" target="_blank">˳վþ99ȹ</a>| <a href="http://eldadhagar.com" target="_blank">Ƭѹۿ</a>| <a href="http://786087.com" target="_blank">AV˵߹ۿ</a>| <a href="http://9522952.com" target="_blank">ձ˳ƵѲ</a>| <a href="http://vvv75.com" target="_blank">vƬƵ߹ۿƵ</a>| <a href="http://haiholr.com" target="_blank">Ļav</a>| <a href="http://zaidongmaixi.com" target="_blank">һѹۿ </a>| <a href="http://mangshigas.com" target="_blank">þĻƵ</a>| <a href="http://002309.com" target="_blank">ĻƵ</a>| <a href="http://jgxsdst.com" target="_blank">˾žŴɫ㽶վ</a>| <a href="http://8dfk.com" target="_blank">߹ۿƬAVվ</a>| <a href="http://cmanpower.com" target="_blank">ĻmvֻѸ</a>| <a href="http://hezuoedu.com" target="_blank">޹ۺ91Ʒ鶹</a>| <a href="http://caopropp.com" target="_blank">˿wwwƵ</a>| <a href="http://gdporun.com" target="_blank">һĻ</a>| <a href="http://wenbye.com" target="_blank">avƷר߹ۿ</a>| <a href="http://cn-taoqigui.com" target="_blank">ձɫͼ߹ۿ</a>| <a href="http://5gi555.com" target="_blank">þþþþAŷAV</a>| <a href="http://556228.com" target="_blank">eeussӰԺ92242</a>| <a href="http://www026qqcom.com" target="_blank">޾Ʒ456</a>| <a href="http://7t53.com" target="_blank">߹ۿ</a>| <a href="http://ryhjled.com" target="_blank">޳AƬ777777</a>| <a href="http://chinahongfeng.com" target="_blank">ɫɫۺվ</a>| <a href="http://laosanqq.com" target="_blank">޵һվ</a>| <a href="http://517qq.com" target="_blank">**ëƬѹۿþþƷ</a>| <a href="http://wwwaa875.com" target="_blank">91޹߲ҹ </a>| <a href="http://cz655.com" target="_blank">ȫëƬ߲</a>| <a href="http://zjlxblog.com" target="_blank">޹˾þۺһ</a>| <a href="http://www-006688.com" target="_blank">պƷһ</a>| <a href="http://www97544.com" target="_blank">޸Ƶ</a>| <a href="http://gdporun.com" target="_blank">Ƶ</a>| <a href="http://ivr69.com" target="_blank">˳ŷĻ</a>| <a href="http://hwafarda.com" target="_blank">߲Ѳ</a>| <a href="http://u6u6u6.com" target="_blank">ӰҹƬ</a>| <a href="http://horticartf.com" target="_blank">AVֻ߹ۿ</a>| <a href="http://15nw.com" target="_blank">¾þþþa</a>| <a href="http://ddm88888.com" target="_blank">޹˾Ʒԭ</a>| <a href="http://wanguoshan.com" target="_blank">Ƶ߹ۿ </a>| <a href="http://2886868.com" target="_blank">ۺɫͼƬ</a>| <a href="http://8mav1000.com" target="_blank">ˬAëƬѿ</a>| <a href="http://www48646.com" target="_blank">avƬ߹ۿ16Ů </a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>