2010年03月12日 09:29 "banq"的内容
架构设计需要从事物外部(通过与其他同类事物比较)和深入事物内部两种方式来进行,实际就是“做什么”和“怎么做”分离,我们经常在不自觉中混淆两者界限,但是如果我们按照这两个步骤去做,事情就变得简单和有条理。

非常认同banq老师。what和how分离是非常重要。只有搞清楚了what,模块和模块之间才能更加程度的松耦合,目前我现在的项目,通过DDD进行建模,模型和底层hbase的存储可以说是完全不匹配的。举个例子,如何使用hbase来设计类似jdon顶的功能。如果要实现记录哪些人顶了某个帖子的话,就需要记录每一次每个人的顶操作,这样某个帖子被顶的次数就可以后台查询来完成。而查询的时候,我们还可以设置缓存。

目前我自己的项目采用了DDD和CQRS架构,同时我还结合了EDA架构,因此我觉得领域模型都是只写的,每一次写操作都会触发一个事件,这个事件根据系统启动的时候注册的事件处理来处理,运行的时候,我们还可以手动替换某一个事件处理器为null even processor,这样就会在运行时停止某一项功能来对某个功能进行升级和维护而不会影响到其它的功能。因此我觉得把不同的事件分开出来,不同的一组事件代表不同的功能,而事件处理器都是有针对性的,这就使得功能和功能之间松耦合,不会因为某个功能的压力过大,而导致整个系统都受到影响。并且目前我不会因为界面上显示一些内容,就将这些内容放入实体中,相反的界面上面显示的东西都是通过查询获取的,而查询的时候,我们可以定制化的来设置缓存。

目前我在使用HBASE的过程中,发现基于列存储的好处,以前基于RDBMS,一个实体的属性往往是很多的,而界面上往往不可能一次都显示所有的属性,因此采用RDBMS查询的时候,就会遇到一些不用到的属性都被查询出来的情况,而且因为是所有的属性都是在一行中,这样当有并发更新的时候就会用锁来实现共享数据的一致性。而目前列存储系统,一个具有丰富行为的实体,它的属性可以被保存到hbase的一张表,或者多张表中,况且根据属性之间关联程度,将关联程度高的属性统一到同一个cloumn family中,这样查询的时候就可以将关联度高的属性一次性查询出来。

同样我也发现了另外一个问题,为什么说hbase的并发读写效率非常高,是因为他们是弱事务的,如果用同样的row key并发更新一行,那么写入的效率也是很低的,之所以能并发写入,是因为并发写入到不同的行,不同的column family,这样因为不同的column family是单独存储的,这样也就不会因为锁而牺牲了并发性。

ps:最近我在寻找一个高性能的MQ来做异步事件处理的时候,发现了kestrel,此MQ是用Scala实现的,twitter就用了它,目前我也正在考虑将其纳入自己的项目中来,不知道其它兄弟是否有使用经验。

2010年03月12日 11:44 "arden"的内容
terrastore是基于terracotta的一个分布式文档数据库~~

哦,回头研究下,第一眼看过去以为是terracotta呢,不过目前公司的项目用terrcotta集群是active/passive模式,不知道terractta是否能支持active/active集群?

2010年03月12日 12:42 "cmzx3444"的内容
那要是现有的系统用了这些nosql数据库,系统的对象模型是不是都要变了啊?

这其实就是what和how,对象模型是用来表达what的,而存储仅仅是一种实现what的手段而已。你可以将你得实体保存到多个表,一个表,XML等等地方,这都不会影响到上层的领域模型。这其实是底层以来上层,存储永远属于最底层,上层的业务定义好了以后,至于怎么存储,仅仅是实现接口而已。

学习了,但是正如楼主说的其有优缺点的,如果针对其的缺点用RMDBS来进行与之的mappin以达到更好的解决方案,不知是否可行?

2010年03月16日 15:34 "banq"的内容
刚刚看到收购Spring的VMware公司已经雇佣了Redis主要开发者,VMware相信Redis能为帮助他们提升其云计算和虚拟化技术:
http://architects.dzone.com/articles/vmware-hires-key-nosql

呵呵,多谢banq推荐,Redis比较耗费内存,它是将数据装载在内存中进行并发处理的。

ps:这两天不知道为什么,上不了jdon,老是打不开网页。

参考文章:
HBase vs Cassandra: 我们迁移系统的原因(http://wangxu.me/blog/ 译文)
原文:hbase vs cassandra why we moved:
这些不同的历史也导致Hbase更加适合于数据仓库、大型数据的处理和分析(如进行Web页面的索引等),而 Cassandra 则更适合于实时事务处理和提供交互型数据。

CAP理论:HBase 社区解释他们选择了 CP,而 Cassandra 选择了 AP


HBase vs Cassandra: NoSQL Battle:
HBase采取 Google大表风格, 而是“BigTable/Dynamo hybrid”混合体。
这两种风格见NoSQL总结分类

如何学习NoSQL?
[该贴被banq于2011-08-19 08:52修改过]

怎么个起头啊

数据仓库类的应用, 可以考虑Hbase+Hadoop..

或者考虑类似于Greenplum或者Vertical一类的列存储解决方案.

说白了,NoSQL数据库就是SQL的垂直拆分,拆分成每张表都是一个主键,一个字段,就变成了key-value形式。而key-value在硬盘或则内存中当然是列式存储更加方便。不过这样也会失去数据的完整性,一致性,安全性。

目前看到些得很完整的文章
企业中的nosql

采用某种技术要平衡很多东西的。

摘录

“非关系型数据库” 为提升应用的性能带来了极大的机会。分布式数据的核心概念是保证磁盘I/O(寻道速率)绝不能成为应用性能的瓶颈。尽管性能更多的是由传输速率来决定。在此之上,绝大部分解决方案支持各种不同的新一代的高速计算的范式,比如MapReduce,排序列,Bloom Filter,仅可追加的B树,Memtable等。

现今用户满意度的另一个重要的方面就是可靠性。终端用户希望在想要访问应用时就能访问到,并且至少是在当他们分配到时间的时候能随时执行他们的任务。所以不可用的应用需要不惜代价的避免。许多现代的“非关系型数据库”都能适应并支持这一类有着严格和最终一致性的可用性的需求。
更低的所有者总成本

水平伸缩性的基本前提保证了它们可以运行于廉价机器之上。这不仅削减了硬件资本的成本,同时还削减了诸如电力,维护等运维成本。同时这还进一步的为利用诸如云、虚拟数据中心等下一代低成本的基础设施打下了基础。

从长期来看,更少的维护能带来更多的运维成本优势。对于关系型数据库,这绝对是一个需要存储大容量数据的场景。为大容量的数据调优数据库需要高超的技艺,也就意味着更高的成本。相较之下,“非关系型数据库”始终提供快速和响应的特点,就算是在数据大幅上升的情况下。索引和缓存也以同样的方式工作。开发者不必过多担心硬件、磁盘、重新索引及文件布局等,而是把更多的精力投入了应用程序的开发上。

Hbase的缺点:

1 不能支持条件查询,只支持按照Row key来查询.

2 暂时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.

这些功能在MongoDB中都有。

在InfoQ对淘宝网采访文章中:林昊谈HBase技术在淘宝中的应用
第一:误解Cassandra只有弱一致性,其实也可以设置为高一致性,Cassandra可以灵活设置CAP中的CP或AP。

第二:“主要是HBase对于很多Online的场景支持的不够”,如果此前他们好好做一下抛开自己屁股对脑袋影响,对架构进行一个好的比较,就会发现 HBase只适合数据挖掘和分析场合,隐含意思是实时性差,不适合做Online项目,而Cassandra优点是支持实时,当然Brisk更是用 Cassandra既做数据仓库又做实时支持。

koven2049.iteye.com是他们记录HBase运维日志,我个人从这些现象来判断:已经显示HBase运维的复杂性(Cassandra采取P2P Gossip相对简单);误用HBase,把非实时的产品用在实时性上,并发问题会很突出。

也就是说,架构上往往屁股决定脑袋,DBA如同恋母情结一样有高一致性情结。

相关讨论:http://www.jdon.com/jivejdon/thread/41928/25
[该贴被banq于2011-08-19 09:56修改过]
[该贴被admin于2011-08-19 10:48修改过]