nosql数据库 tiger

时间:2023-07-02 08:00:46 其他范文 收藏本文 下载本文

nosql数据库 tiger(整理9篇)由网友“OnyourApril”投稿提供,以下是小编精心整理的nosql数据库 tiger,仅供参考,希望能够帮助到大家。

nosql数据库 tiger

篇1:nosql数据库 tiger

erlang开发的开源高可靠性nosql数据库tiger介绍

可靠性:

写:对于n=2f+1 机器集群,在f台机器宕机的情况下可写

读:只要是没有宕机的机器都是可读的

一致性:

强一致性

扩展性:

读的能力可以线性扩展

功能:

目前实现了key/value的get set 和delete功能:

基于memcached协议和leveldb的持久数据库

基于redis协议和redis存储引擎的内存数据库,宕机后数据重放到内存

性能:

单机跑3个实例:

双核,Pentium(R) Dual-Core CPU     E6600 @ 3.06GHz

centos 5.6 erlang R15b 2G 内存

基于memcached协议的接口:

set接口:

91.49% <= 12 milliseconds,5387.93 requests per second

get 接口:

100.00% <= 13 milliseconds 18177.54 requests per second

基于redis协议的接口:

set接口:

100.00% <= 60 milliseconds 3954.13 requests per second

get 接口:

13477.09 requests per second

测试程序使用:mc-benchmark,redis-benchmark,因为3个实例在一个机器上,所以写的性能影响比较大,  部署的时候建议分开到不同物理机部署,

nosql数据库 tiger

主要技术:

erlang:用于socket和通讯层

Zab(ZookeeperAtomic Broadcast):实现消息的原子广播

存储引擎:leveldb,redis存储引擎

架构实现:

zab_engine介绍:

将zab协议实现为erlang的api,如果使用erlang开发项目,可以嵌入zab_engine,实现多master的架构变得非常简单

引擎实现功能:

1:2阶段提交

2:恢复

a.follow恢复

b.leader恢复

c.在线加入和恢复

架构:

使用说明:

1.实现gen_zab_server 回调函数

2.对于须同步数据,实现handle_commit

3.对于只读数据,实现handle_call

项目主页:www.open-open.com/lib/view/home/1341822841072

篇2:NoSQL反模式 文档数据库篇

我们设计关系数据库Schema的都有一套完整的方案,而NoSQL却没有这些,半年前笔者读了本《SQL反模式》的书,觉得非常好。就开始留意,对于NoSQL是否也有反模式?好的反模式可以在我们设计Schema告诉哪里是陷阱和悬崖。

我们设计关系数据库Schema的都有一套完整的方案,而NoSQL却没有这些。半年前笔者读了本《SQL反模式》的书,觉得非常好。就开始留意,对于NoSQL是否也有反模式?好的反模式可以在我们设计Schema告诉哪里是陷阱和悬崖。NoSQL宣传的时候往往宣称是SchemaLess的,这会让人误解其不需要设计Schema。但如果不意识到设计Schema的必要,陷阱就在一直在黑暗中等着我们。这篇文章就总结一些别人的,也有自己犯过的深痛的设计Schema错误。

NoSQL数据库最主流的有文档数据库,列存数据库,键值数据库。三者分别有代表作MongoDB,HBase和Redis。如果将NoSQL比作兵器的话,可以这样(MySQL是典型的关系型数据库,一样参与比较):“>

MySQL产生年代较早,而且随着LAMP大潮得以成熟。尽管其没有什么大的改进,但是新兴的互联网使用的最多的数据库。就像传统的菜刀,结构简单,几百年没有改进。但是不妨碍产生各式各样的刀法,只要有一把,就能胜任厨房里的大部分事务。MySQL也是一样,核心已经稳定。但是切库,分表,备份,监控,等等手段一应俱全。MongoDB是个新生事物,提供更灵活的Schema,Capped Collection,异步提交,地理位置索引等五花十色的功能。就像瑞士军刀,不但可以当刀用,还可以开瓶盖,剪指甲。但是他也不比MySQL强,因为还缺乏时间的磨砺。一是系统本身的稳定性,二是开发,运维需要更多经验才能流行。HBase是个仗势欺人的大象兵。依仗着Hadoop的生态环境,可以有很好的扩展性。但是就像象兵一样,使用者需要养一头大象(Hadoop),才能驱使他。Redis是键值存储的代表,功能最简单。提供随机数据存储。就像一根棒子一样,没有多余的构造。但是也正是因此,他的伸缩性特别好。就像悟空手里的金箍棒,大可捅破天,小能成缩成针。文档数据库的得失

关系模型试图将数据库模型和数据库实现分开,让开发者可以脱离底层很好的操作数据。但笔者以为关系模型在一些应用场景下有弱点,现在已经不得不面对。

SQL弱点一:必须支持Join。因为数据不能够有重复。所以使用范式的关系模型会不可避免的大量Join。如果参与Join的是一张比内存小的表还好。但是如果大表Join或者表分布在多台机器上的话,Join就是性能的噩梦。SQL弱点二:计算和存储耦合。关系模型作为统一的数据模型既可以用于数据分析,也可以用于在线业务。但这两者一个强调高吞吐,一个强调低延时,已经演化出完全不同的架构。用同一套模型来抽象显然是不合适的。Hadoop针对的就是计算的部分。MongoDB,Redis等针对在线业务。两者都抛弃了关系模型。

针对这两个梦魇。文档数据库如MongoDB的的主要目的是 提供更丰富的数据结构来抛弃Join来适应在线业务。当然也不是MongoDB完全不能用Join,不能拿来做数据分析,讨论这个只是见仁见智的问题。所以文档数据库并不比关系数据库强大,由于对Join的弱支持,功能会弱许多。设计关系模型的时候,通常只需要考虑好数据直接的关系,定义数据模型。而设计文档数据库模型的时候,还需要考虑应用如何使用。因此设计好一个的文档数据库Schema比设计关系模型更加的困难。除此之外,由于文档数据库事务的支持也是比较弱,一般NoSQL只会提供一个行锁。这也给设计Schema更加增加了难度。对于文档数据库的使用有很多需要注意的地方,本文只关注模型设计的部分。

反模式一:惯性思维/沿用关系模型

关系模型是数据存储的经典模型,使用数据模型范式的好处非常的明显。但是由于文档数据库不支持Join(包括和外键息息相关的外键约束)等特性,习惯性的沿用关系模型有的时候会出现问题。需要利用起文档数据库提供的丰富的数据模型来应对。

值得一提的是文档数据库的设计和关系模型不同,是灵活多样的。对于同一个情形,可以设计出有多种能够工作的模型,没有绝对意义上最好的模型。

下图是关系模型和文档模型的对比。

关系模型 VS 文档模型

这个一个博客的数据模型,有Blog,User等表。左侧是关系模型,右侧是文档模型。这个文档模型并不是完全合理,可以作为“正反两面教材”在下文不断阐述。

问题一:存在描述多对多的关系表症状:文档数据库中存储在有纯粹的关系表,例如:

iduser_idblog_id000101这样的表就算在关系模型中也是不妥的,因为这个ID非常的多余,可以用联合主键来解决。但是在文档数据库中,由于必须强制单主键,不得不采取这样的设计。

坏处:

破坏数据完备性。由于ID是主键,在数据模型上没有约束来保证不出现重复的user_id,blog_id对。一旦数据出现重复,更新删除都是问题。索引过多。由于是关系表,必须在user_id和blog_id上面分别建一个索引。影响性能。

解决方案:使用文档数据库典型的处理多对多的办法。不是建立一张关系表,而是在其中一个文档(如User)中,加入一个List字段。

user_iduser_nameblog_id[]……0Jake0,1……1Rose1,2……

问题二:没有区分”一对多关系“和“多对一关系”症状:关系模型不区分“一对多”和“多对一”,对于文档数据库来讲,关系模型只有“多对一”。就像这张Comment表:

comment_iduser_idcontent……00“NoSQL反模式是好文章”……10“是啊”……

如果整个模型都是这样的“多对一”关系就需要反思了。

坏处:

额外索引。如果客户端已知user_id,需要获得User信息和Comment信息,需要执行两次查询。其中一次查询需要使用索引。并且要在客户端自己Join。这样可能有潜在性能问题。

解决方案:问题的核心在于是已知user_id查询两张表,还是已知comment_id查询两张表。如果是已知comment_id这样的设计就是合理的,但是如果是已知user_id来查询,把关系放在user表里的设计更合理一些。

user_iduser_namecomment_id[]……0Jake0,1……1Rose1,2……

这样的设计,就可以避免一个索引。同理,对于多对多也是一样的,通过合理的安排字段的位置可以避免索引。

正确使用的场合:

关系型模型是非常成功的数据模型,合理的沿用是非常好的。但是由于文档数据库的特点,需要适当的调整,这样得出的数据模型,尽管性能不是最优,但是有最好的灵活性。并且也有利于和关系数据库转换。

反模式二:处处引用客户端Join

症状:数据库设计中充满了xx_id的字端,在查询的时候需要大量的手动Join操作。就涉及到了这个反模式。正如上面提到的博客的关系模型,如果已知blog_id查询comments,需要至少执行3次查询,并且手动Join。

坏处:

手动Join,麻烦且易出错。文档数据库不支持Join且没有外键保证。因此需要在客户端Join,这样的操作对于软件开发来讲是比较繁琐的。由于没有外键保证,因此不能保证取得的ID在数据库里面是有数据的。在处理的时候需要不断判断,容易出错。多次查询。如果引用过多,查询的时候需要多次查询才能查到足够的数据。本来文档数据库是很快的,但是由于多次查询,给数据库增加了压力,获取全部数据的时间也会增加。事务处理繁琐。文档数据库一般不支持一般意义上事务,只支持行锁。如果文档数据库有给多个连接。在插入的时候,事务的处理就是噩梦。在文档数据库中使用事务,需要使用行锁,在进行大量的处理。太过繁琐,感兴趣的读者可以搜一下。

解决方案:适当使用内联数据结构。由于文档数据库支持更复杂的数据结构可以将引用转换为内联的数据,而不用新建一张表。这样做可以解决上面的一些问题,是一个推荐的方案。就像上面博客的例子一样。将五张表简化成了两张表。那什么时候使用内联呢?一般认为

使用内联可以解决读性能问题,明显减少Query的次数的时候。可以简化数据模型,化简表之间的关系,而同时不会影响灵活性的时候。事务可以得到简化为单行事务的时候正确使用的场合:

范式化的使用场景,文档数据库会被多个应用使用。由于数据库设计无法估计多个应用现在及将来的查询情况,需要极大的灵活性。在这个时候,使用引用比内联靠谱。

反模式三 滥用内联后患无穷

问题一 妨碍到查询的内联症状:频繁查询一些内联字段,丢弃其他字段。

坏处:

无ID约束:使用内联字段和引用不同,是没有ID约束的。因此不能通过ID(主键)来管理,如果经常需要单独操作内联对象会非常不便。索引泛滥:如果以内联字段为条件进行查询,需要建立索引。有可能造成索引泛滥。性能浪费:大部分文档数据库的实现是按行存储的,也就意味着,尽管只查询一个字段,但是DB需要将整行从磁盘中取出。如果字段够小,文档够大,是很不合算的。

解决方案:如果出现以上的症结,就可以考虑使用引用代替内联了。内联特性主要的用途在于提高性能,如果出现性能不升反降,那就没有意义了。如果对性能有很强烈的要求,可以考虑使用重复数据,同样的数据即在内联字段中也在引用的表里面。这样可以结合内联和引用的性能优势。缺点是数据出现重复,维护会比较麻烦。

问题二 无限膨胀的内联症状:List,Map类型的内联字段不断膨胀,而且没有限制。就像前面提到的Blog的内联字段Comment。如果对每一篇Blog的Comment数量没有限制的话,Comment会无限膨胀。轻则影响性能,重则插入失败。

Blog_idcontentComment[]……0“…”“NoSQL反模式是好文章”, “是啊”,”无限增长中”………坏处:

插入失败。文档数据库的每条记录都有最大大小,并且也有推荐最佳的大小。一般不会超过4M。就像刚刚提到的例子,如果是篇热门的博文的话,评论的大小很容易就超过4M。届时文档将无法更新,新的评论无法插入。性能拖油瓶。由于内联字段膨胀,其大小将远远超过其他部分,影响其他部分的性能表现。并且因此导致该记录大小频繁变化,对档数据库的数据文件内部可能因此产生很多碎片,

解决方案:设定最大数目或者使用引用。还是Blog和Comment的例子,可以将Comment从Blog中剥离出成一张表。如果考虑到性能,可以在Blog表中新建一个字段如最近的评论。这样既保证了性能,又能够预防膨胀。

Blog_idcontentlast_five_comment[]……0“…”“NoSQL反模式是好文章”, “是啊”,”最多5条”………问题三 无法维护的内联症状:DBA想单独维护内联字段,但无法做到。

坏处:

权限管理难。数据库的权限管理的最小粒度是表。如果使用内联技术,就意味着内联部分必须和其他字段用同一个权限来管理。没有办法在DB级别隐藏。切表难。如果发现一张表的庞大需要切表。这个时候就比较纠结了。如果一刀切,partion Key的选择;索引的失效都会成为问题。如果觉得拆为两张表,就会很好操作的话,就是内联的过度使用了 。备份难。关系数据库中每张表可以有不同的备份策略。但是如果内联起来,这样的备份就做不到了。解决办法:设计数据库模型的时候需要考量之后的维护操作,尤其是内联的字段需不需要单独的维护。需要和运维商量。如果对内联的字段有单独维护的要求,可以拆分出来作为引用。

问题四 盯死应用的内联症状:应用可以非常好的运行在数据库上。但是当新的应用接入的时候会很麻烦。因为设计数据模型的时候考虑到了查询。所以当有新应用,新查询接入的时候,就会难于使用原有的模型。

坏处:

新应用接入难。当新的应用试图使用同一个数据库的时候,接入比较困难。因为查询时不同的,需要调整数据模型才能适应。但是调整模型又会影响原有应用。集成难。不同的关系型数据库可以集成在一起,共同使用。但是对于文档数据库,虽然功能上可以互补,但是由于内联数据结构的差异,也比较难于集成。ETL难。现在大部分的数据分析系统使用的是关系模型,就连Hadoop虽然不用关系模型,但是其上的Hive的常用工具也是按关系模型设计的。

解决方案:

使用范式设计数据库,即用引用代替内联。或者在使用内联的时候,给每个内联对象一个全局唯一的Key,保证其和关系模型直接可以存在映射关系,这样可以提高数据模型的灵活性。如Blog表:

Blog_idcontentComment[]……0“…”[{”id“=1,”content“=“NoSQL反模式是好文章”}, {”id“=2,”content“=“是啊”}…]……

这样的设计既可以利用到内联的好处,又能将其和关系模型映射起来。确定是需要手动维护comment_id,保证其全局唯一性。

反模式四:在线计算

症状:有一些运行时间很长的Query,由于有聚合计算,索引也不能解决。随着数据量的增长,逐渐成为性能瓶颈。

坏处:

影响用户体验。在线业务中,如果一个查询大于4s,用户体验会急剧下降。按主键和按索引的查询都能满足要求。但是聚合操作往往需要扫描全表或者大量的数据,随着数据量的增加,查询时间会变长,用户不可容忍。影响数据库性能。长查询的坏处数不清。在线上应用中,如果出现长查询,可能会霸占数据的大部分资源,包括IO,连接,CPU等等。导致其他很好的查询,轻则性能也下降,重者无法使用数据库。长查询可以称之为DB杀手。

解决方案:首先要权衡,这个聚合操作是不是必要的,必须实时完成。如果没有必要实时完成的话,可以采取离线操作的方案。在夜深人静的时候,跑一个长查询,将结果缓存起来,给第二天使用。如果必须实时完成,则可以新建一个字段,用“incr”这样的操作,在运行的时候,实时聚合结果。而不是查询的时候执行一次长查询。如果逻辑比较复杂,或者觉得大量“incr”操作给数据库系统带来了压力,可以使用Storm之类的实时数据处理框架。总之,要慎用长查询。

反模式五:把内联Map对象的Key当作ID用

症状:文档数据库支持内联Map类型。将其中Map的Key当作数据库的主键来用。

Blog_idcontentComment{}……0“…”{”1“=“NoSQL反模式是好文章”, ”2“=“是啊”}……这个反模式很容易犯,因为在编程语言中Map数据结构就是这么用的。但是对于数据库模型来说,这是不折不扣的反模式。

坏处:

无法通过数据库做各种(><=)查询。对于关系型数据库来说,虽然数据结构可以很灵活,但查询的时候都是按层次的。比如comment.id,comment.content。也就是说其Map类型中的Key可以理解为属性名的,而不是用作ID。因此一旦这样使用,就脱离的数据库管制,无法使用各种查询功能。无法通过索引查询。文档数据可建立索引是需要列名的。比如comment.id。而这样的数据结构没有固定的列名,因此无法建立索引。

解决方案:使用数组+Map来解决。如:

Blog_idcontentComment[]……0“…”[{”id“=1,”content“=“NoSQL反模式是好文章”}, {”id“=2,”content“=“是啊”}…]……这样,就可以使用comment.id作为索引,也可以使用数据库的查询功能。简单有效。Map类型中的Key是属性名,Value是属性值。这样的用法是文档数据库数据模型的本意,因此其提供的各种功能才能利用上。否则就无法使用。

反模式六:不合理的ID

症状:使用String甚至更复杂数据结构作为的ID,或者全部使用数据库提供的自生成ID。如:

id(该ID系系统自生成)Blog_idcontent……00...……坏处:

ID混乱。如果使用数据库提供的自生成ID,同时表中还有一个类似有主键含义的Blog_id,这样很不好,容易造成逻辑混乱。由于文档数据库不支持ID的重命名,习惯关系数据库做法的人可能会再建立一个自己的逻辑ID字段。这是没有必要的。索引庞大,性能低下。ID是数据库的非常重要的部分。ID的长度将决定索引(包括主键的索引)的大小,直接影响到数据库性能。如果索引比内存小,性能会很好。但一旦索引大小超过内存,出现数据交换,性能会急剧下降。一个Long占8字节,一个20个字符的UTF8 String占用约60个字节。相差10倍之巨,不能不考虑。

解决方案:尽量使用有一定意义的字段做ID,并且不在其他字段中重复出现。不使用复杂的数据类型做ID,只使用int,long或者系统提供的主键类型做ID。

文档数据库的反模式总结

阐述了这么多的反模式,下面有个一览表,涵盖了上面所有的反模式。这个一览表,是按照文档数据库模型建立的。是个文档数据库模型的例子。

ID反模式名问题0存在描述多对多的关系表[{ID:00

症状:文档数据库中存储在有纯粹的关系表

坏处:[破坏数据完备性,索引过多]

解决方案:加入一个List字段

},{

ID:01

症状:关系模型不区分“一对多”和“多对一”

坏处:额外索引

解决方案:合理的安排字段的位置

}]1处处引用客户端Join[{

ID:10

症状:查询的时候需要大量的手动Join操作

坏处:[手动Join,多次查询, 事务处理繁琐]

解决方案:适当使用内联数据结构。

}]2滥用内联后患无穷[{

ID:20

症状:频繁查询一些内联字段,丢弃其他字段

坏处:[无ID约束,索引泛滥, 性能浪费]

解决方案:使用引用代替内联了,允许重复数据

},{

ID:21

症状:List,Map类型的内联字段不断膨胀,而且没有限制

坏处:[插入失败, 性能拖油瓶]

解决方案:设定最大数目或者使用引用。

},{

ID:22

症状:DBA想单独维护内联字段,但无法做到

坏处:[权限管理难, 切表难, 备份难]

解决方案:设计数据库模型的时候需要考量之后的维护操作

},{

ID:23

症状:应用可以非常好的运行在数据库上。但是当新的应用接入的时候会很麻烦。内联盯死了应用

坏处:[新应用接入难, 集成难, ETL难]

解决方案:使用范式设计数据库,即用引用代替内联。保证其和关系模型直接可以存在映射关系

}]3在线计算[{

ID:30

症状:有一些运行时间很长的Query, 逐渐成为性能瓶颈。

坏处:[影响用户体验,影响数据库性能]

解决方案:取消不必要的聚合操作. 运行的时候,实时聚合结果.使用第三方实时或非实时工具。如Hadoop,Storm.

}]4把内联Map对象的Key当作ID用[{

ID:40

症状:文档数据库支持内联Map类型。将其中Map的Key当作数据库的主键来用。

坏处:[无法通过数据库做各种(><”“” =)查询,无法通过索引查询]

解决方案:使用数组+Map来解决。

}]5不合理的ID[{

ID:50

症状:用String甚至更复杂数据结构作为的ID,或者全部使用数据库提供的自生成ID。

坏处:[ID混乱,索引庞大]

解决方案:尽量使用有一定意义的字段做ID。不使用复杂的数据类型做ID。

}]

本文试图总结了笔者知道的重要的文档数据库的反模式。现在关于NoSQL数据模型设计模式的讨论才刚刚起步,将来也许会逐渐自成体系。对于列数据库和Key-Value的反模式,笔者等到有了足够积累的时候,再和大家分享。

篇3:NoSQL数据库综逑论文

NoSQL数据库综逑论文

1引语

回顾数据库的发展历程,数据库技术从上世纪60年代末开始,经历了层次数据库、网状数据库和关系数据库而进入数据库管理系统(DBMS)阶段至今,数据库技术的研究也不断取得进展。传统的关系型数据库已在数据存储方面占据了不可动摇的地位。近年来,随着互联网Web2.0技术的发展,网络数据库应用出现了一些新的变化,对与此相关的数据模型、分布式架构、数据存储等数据库相关的技术指标也提出了新的要求。但由于关系型数据库本身的一些不足,已经越来越无法满足互联网对数据扩展、读写速度、支撑容量以及建设和运营成本的要求。NoSQL是在这种新变化、新要求之下产出的一种非关系型数据库产品的总称。

2NoSOL数据库概述

NoSQL(NotOnlySQL的缩写)数据库是目前比较流行的',不同于传统的关系型数据库的数据库管理系统的统称。某网定义:NoSQL是一种打破了关系型数据库长久以来占主导地位的,快速成长起来的非关系松散数据库存储类型,这种数据存储不需要事先设计好的表结构,它也不会出现表之间的连接操作和水平分割,学术界称这种数据库为非结构化存储[2]。

作为新型的下一代数据库,NoSQL数据库系统主要解决以下要点:非关系型,分布式的,开源代码和水平可扩展等。NoSQL数据库往往具有无架构、易于复制、简单的API、最终一致、大数据量等特点。目前有25种以上的NoSQL数据库,各有各自的特点,是基于不同应用场景而开发的,其中MongoDB和Redis最受欢迎。

3NoSOL数据库优势

NoSQL数据库相比其他模型的数据库而言,具有以下优点:

(1)模式自由:目前NoSQL数据库有列存储、文档存储、键值对存储、图存储、对象存储、XML存储等数据存储模式,并且不需要事先为存储的数据建立字段,不需要固定的表结构,可以随时存储自定义的数据格式。

(2)水平扩展:传统的关系型数据库采用向上扩展方式提高性能,而NoSQL数据库则采用水平扩展的方式提高性能,即负载平均地分配到各个主机上。

(3)低廉的成本:NoSQL数据库可以运行在廉价的PC服务器集群上。PC集群扩充起来便宜且成本低;此外轻松地添加新的节点来扩展集群。而且大部分NoSQL数据库都是开源软件,没有昂贵的许可成本。

4NoSOL数据库的缺陷

与传统的关系型数据库相比,NoSQL数据库虽然有很多优势,但也存在着一些缺陷,主要是:

(1)复杂性:因为在NoSQL数据库中不使用SQL查询语言,所以它需要用户自主编写程序来实现查询功能,这种编程查询的方式在完成简单任务时会很快,但对使用者来说会耗费大量的时间。此外,想要通过编写程序来实现复杂的数据库查询也是很困难的。

(2)可靠性:NoSQL数据库本身是不支持ACID事务,因此NoSQL数据库也不具有ACID所提供的可靠性。如果用户想要在NoSQL的一个数据集里应用ACID事务,那么他们必须得通过额外的编程来实现。

(3)-致性:因为NoSQL数据库本身是不支持ACID事务的,除非通过额外的编程才能实现,所以NoSQL的一致性可能会受到威胁。NoSQL不提供一致性,这让它拥有更好的性能和可扩展性,但这使某些应用程序和交易系统存在隐患,比如银行。

(1)成熟度低:大多数企业不熟悉NoSQL数据库,因此没有足够的知识去做NoSQL是最好的数据库的选择。

5NoSOL数据库应用现状

虽然NoSQL数据库一词早出现于,其真正的发展是开始于,先后出现了十多种NoSQL产品,例如:HBase、Cassandra、Hypertable、SimpleDB、MongoDB、CouchDB、DynamoDB、Redis、Neo4J等。从开始国内也陆续有公司或团队进行NoSQL数据库的开发,例如:豆瓣开源的BeansDB、新浪的MemcacheDB,淘宝网自主开发的Tair数据库,人人网的Nucbar以及盛大创新院的TCDatabase纷纷发布。NoSQL数据库在短短十几年内得到如此快的发展是因为Web2.0与云计算技术的广泛应用。

表1NoSQL数据库之间的比较

2NoSOL数据库产品

目前市场上出现的NoSQL有二十多种,而它们之间也有一定的关联与继承,同时每个NoSQL数据库有它独到之处。表1是NoSQL数据库产品之间的比较。

7结束语

随着现在网络数据的爆炸式增长,NoSQL数据库得到了广泛的使用,它具有海量数据存储,高性价比,灵活的扩展性等特点,一定程度上是传统数据库的代替品。目前,在某些场景下,可以将NoSQL数据库与关系型数据库结合使用,互相弥补各自的缺陷,这种数据库组合对解决Web2.0所遇到的性能、扩展性等问题具有指导意义。

篇4:关系型数据库管理系统 NoSQL

NoSQL是一种快速、便携的关系型数据库管理系统,除内存和处理器速度外不受任意限制,

关系型数据库管理系统 NoSQL

NoSQL符合关系模型。

项目主页:www.open-open.com/lib/view/home/1322721362577

篇5:Tiger(老虎)

Tiger

A tiger is a kind of catamount animal. It looks like a cat, but much bigger than a cat. A tiger is very ferocious and it eats mainly meat.  It has yellow and black streaks all over its body and it looks very beautiful. Its tail is long and strong and it can hit its quarry dying.

Tigers live in the thick forests and small animals in the forests are tigers' food.

During the past years, many forests have been cut down and the living conditions of the tigers are becoming worse and worse. There are fewer tigers left in the world now. Tigers are the animals of the world, and they should have their own living spaces. We must do our best to protect the tigers and their living environment.

篇6:Lua脚本中的一个NoSQL数据库:Tarantool

介绍

Tarantool是一个NoSQL数据库,运行在Lua编程语言中, 它利用了Node.JS强大的网络编程功能,数据存储利用了Redis持久化功能。

特性

a drop-in replacement for Lua 5.1, based on LuaJIT 2.0; simply use#!/usr/bin/tarantoolinstead of#!/usr/bin/luain your script,

Lua packages for non-blocking I/O, fibers and HTTP,

MsgPack data format and MsgPack based client-server protocol,

two data engines: 100% in-memory with optional persistence and a 2-level disk-based B-tree, to use with large data sets,

secondary keyand index iterators support,

asynchronous master-master replication,

authentication and access control.

示例代码:

#!/usr/bin/env tarantoolbox.cfg{}hosts = box.space.hostsif not hosts then hosts = box.schema.create_space('hosts') hosts:create_index('primary', { parts = {1, 'STR'} })endlocal function handler(self) local host = self.req.peer.host local response = { host = host; counter = hosts:inc(host); } self:render({ json = response })endhttpd = require('http.server')server = httpd.new('127.0.0.1', 8080)server:route({ path = '/' }, handler)server:start

项目主页:www.open-open.com/lib/view/home/1406259221585

篇7:NoSQL架构实践

不改变原有的以MySQL作为存储的架构,使用NoSQL作为辅助镜像存储,用NoSQL的优势辅助提升性能。

图 1 -NoSQL为镜像(代码完成模式 )

//写入数据的示例伪代码 //data为我们要存储的数据对象 data.title=”title”; data.name=”name”; data.time=”-12-01 10:10:01”; data.from=”1”; id=DB.Insert(data);//写入MySQL数据库 NoSQL.Add(id,data);//以写入MySQL产生的自增id为主键写入NoSQL数据库

如果有数据一致性要求,可以像如下的方式使用

//写入数据的示例伪代码 //data为我们要存储的数据对象 bool status=false; DB.startTransaction();//开始事务 id=DB.Insert(data);//写入MySQL数据库 if(id>0){ status=NoSQL.Add(id,data);//以写入MySQL产生的自增id为主键写入NoSQL数据库 } if(id>0 && status==true){ DB.commit();//提交事务 }else{ DB.rollback();//不成功,进行回滚 }

上面的代码看起来可能觉得有点麻烦,但是只需要在DB类或者ORM层做一个统一的封装,就能实现重用了,其他代码都不用做任何的修改。

这种架构在原有基于MySQL数据库的架构上增加了一层辅助的NoSQL存储,代码量不大,技术难度小,却在可扩展性和性能上起到了非常大的作用。只需要程序在写入MySQL数据库后,同时写入到NoSQL数据库,让MySQL和NoSQL拥有相同的镜像数据,在某些可以根据主键查询的地方,使用高效的 NoSQL数据库查询,这样就节省了MySQL的查询,用NoSQL的高性能来抵挡这些查询。

图 2 -NoSQL为镜像(同步模式)

这种不通过程序代码,而是通过MySQL把数据同步到NoSQL中,这种模式是上面一种的变体,是一种对写入透明但是具有更高技术难度一种模式。这种模式适用于现有的比较复杂的老系统,通过修改代码不易实现,可能引起新的问题。同时也适用于需要把数据同步到多种类型的存储中。

MySQL到NoSQL同步的实现可以使用MySQL UDF函数,MySQL binlog的解析来实现。可以利用现有的开源项目来实现,比如:

MySQL memcached UDFs:从通过UDF操作Memcached协议。

国内张宴开源的mysql-udf-http:通过UDF操作http协议。

有了这两个MySQL UDF函数库,我们就能通过MySQL透明的处理Memcached或者Http协议,这样只要有兼容Memcached或者Http协议的NoSQL数据库,那么我们就能通过MySQL去操作以进行同步数据。再结合lib_mysqludf_json,通过UDF和MySQL触发器功能的结合,就可以实现数据的自动同步。

篇8:NoSQL架构实践

MySQL中只存储需要查询的小字段,NoSQL存储所有数据。

图 3 -MySQL和NoSQL组合

//写入数据的示例伪代码 //data为我们要存储的数据对象 data.title=”title”; data.name=”name”; data.time=”2009-12-01 10:10:01”;data.from=”1”;bool status=false; DB.startTransaction;//开始事务 id=DB.Insert(“INSERT INTO table (from) VALUES(data.from)”);//写入MySQL数据库,只写from需要where查询的字段 if(id>0){ status=NoSQL.Add(id,data);//以写入MySQL产生的自增id为主键写入NoSQL数据库 } if(id>0 && status==true){ DB.commit();//提交事务 }else{ DB.rollback();//不成功,进行回滚 }

把需要查询的字段,一般都是数字,时间等类型的小字段存储于MySQL中,根据查询建立相应的索引,其他不需要的字段,包括大文本字段都存储在NoSQL中。在查询的时候,我们先从MySQL中查询出数据的主键,然后从NoSQL中直接取出对应的数据即可。

这种架构模式把MySQL和NoSQL的作用进行了融合,各司其职,让MySQL专门负责处理擅长的关系存储,NoSQL作为数据的存储。它有以下优点:

节省MySQL的IO开销。由于MySQL只存储需要查询的小字段,不再负责存储大文本字段,这样就可以节省MySQL存储的空间开销,从而节省MySQL的磁盘IO。我们曾经通过这种优化,把MySQL一个40G的表缩减到几百M。

提高MySQl Query Cache缓存命中率。我们知道query cache缓存失效是表级的,在MySQL表一旦被更新就会失效,经过这种字段的分离,更新的字段如果不是存储在MySQL中,那么对query cache就没有任何影响。而NoSQL的Cache往往都是行级别的,只对更新的记录的缓存失效。

提升MySQL主从同步效率。由于MySQL存储空间的减小,同步的数据记录也减小了,而部分数据的更新落在NoSQL而不是MySQL,这样也减少了MySQL数据需要同步的次数。

提高MySQL数据备份和恢复的速度。由于MySQL数据库存储的数据的减小,很容易看到数据备份和恢复的速度也将极大的提高。

比以前更容易扩展。NoSQL天生就容易扩展。经过这种优化,MySQL性能也得到提高。

比如手机凤凰网就是这种架构 www.cnblogs.com/sunli/archive//12/20/imcp.html

篇9:NoSQL架构实践

(三)纯NoSQL架构

只使用NoSQL作为数据存储。

图 4-纯NoSQL架构

在一些数据结构、查询关系非常简单的系统中,我们可以只使用NoSQL即可以解决存储问题。这样不但可以提高性能,还非常易于扩展。手机凤凰网的前端展示系统就使用了这种方案。

在一些数据库结构经常变化,数据结构不定的系统中,就非常适合使用NoSQL来存储。比如监控系统中的监控信息的存储,可能每种类型的监控信息都不太一样。这样可以避免经常对MySQL进行表结构调整,增加字段带来的性能问题。

这种架构的缺点就是数据直接存储在NoSQL中,不能做关系数据库的复杂查询,如果由于需求变更,需要进行某些查询,可能无法满足,所以采用这种架构的时候需要确认未来是否会进行复杂关系查询以及如何应对。

非常幸运的是,有些NoSQL数据库已经具有部分关系数据库的关系查询特性,他们的功能介于key-value和关系数据库之间,却具有key-value数据库的性能,基本能满足绝大部分web 2.0网站的查询需求。比如:

MongoDB就带有关系查询的功能,能解决常用的关系查询,所以也是一种非常不错的选择。下面是一些MongoDB的资料:

《视觉中国的NoSQL之路:从MySQL到MongoDB》

《Choosing a non-relational database; why we migrated from MySQL to MongoDB》

最近的一次Mongo Beijing 开发者聚会也有一部分资料。

虽然Foursquare使用MongoDB的宕机事件的出现使人对MongoDB的自动Shard提出了质疑,但是毫无疑问,MongoDB在NoSQL中,是一个优秀的数据库,其单机性能和功能确实是非常吸引人的。由于上面的例子有详细的介绍,本文就不做MongoDB的使用介绍。

Tokyo Tyrant数据库带有一个名为table的存储类型,可以对存储的数据进行关系查询和检索。一个table库类似于MySQL中的一个表。下面我们看一个小演示:

我们要存储一批用户信息,用户信息包含用户名(name),年龄(age),email,最后访问时间(lastvisit),地区(area)。下面为写入的演示代码:

<?php$tt=newTokyoTyrantTable (“127.0.0.1”,1978);$tt->vanish ();//清空$id=$tt->genUid ();//获取一个自增id//put方法提供数据写入。 put ( string $key , array $columns );$tt->put ($id,array(“id”=>$id,“name”=>“zhangsan”,“age”=>27,“email”=>“zhangsan@gmail.com”,“lastvisit”=>strtotime(“2011-3-5 12:30:00”),“area”=>“北京”) );$id=$tt->genUid ();$tt->put ($id,array(“id”=>$id,“name”=>“lisi”,“age”=>25,“email”=>“lisi@126.com”,“lastvisit”=>strtotime(“2011-3-3 14:40:44”),“area”=>“北京”) );$id=$tt->genUid ();$tt->put ($id,array(“id”=>$id,“name”=>“laowang”,“age”=>37,“email”=>“laowang@yahoo.com”,“lastvisit”=>strtotime(“2011-3-5 08:30:12”),“area”=>“成都”) );$id=$tt->genUid ();$tt->put ($id,array(“id”=>$id,“name”=>“tom”,“age”=>21,“email”=>“tom@hotmail.com”,“lastvisit”=>strtotime(“2010-12-10 13:12:13”),“area”=>“天津”) );$id=$tt->genUid ();$tt->put ($id,array(“id”=>$id,“name”=>“jack”,“age”=>21,“email”=>“jack@gmail.com”,“lastvisit”=>strtotime(“2011-02-24 20:12:55”),“area”=>“天津”) );//循环打印数据库的所有数据库$it=$tt->getIterator ();foreach($itas$k=>$v) {print_r($v);}?>

比如我们需要查询年龄为21岁的所有用户:

<?php$tt=newTokyoTyrantTable (“127.0.0.1”,1978);$query=$tt->getQuery ();//查询年龄为21岁的用户$query->addCond ( “age”,TokyoTyrant::RDBQC_NUMEQ,“21” );print_r($query->search () );?>

查询所有在2011年3月5日之后登陆的用户:

<?php$tt=newTokyoTyrantTable (“127.0.0.1”,1978);$query=$tt->getQuery ();$query->addCond ( “lastvisit”,TokyoTyrant::RDBQC_NUMGE,strtotime(“2011-3-5 00:00:00”) );print_r($query->search () );?>

从上面的示例代码可以看出,使用起来是非常简单的,甚至比SQL语句还要简单,

Tokyo Tyrant的表类型存储还提供了给字段建立普通索引和倒排全文索引,大大增强了其检索功能和检索的性能。

所以,完全用NoSQL来构建部分系统,是完全可能的。配合部分带有关系查询功能的NoSQL,在开发上比MySQL数据库更加快速和高效。

(四)以NoSQL为数据源的架构

数据直接写入NoSQL,再通过NoSQL同步协议复制到其他存储。根据应用的逻辑来决定去相应的存储获取数据。

图 5 -以NoSQL为数据源

纯NoSQL的架构虽然结构简单,易于开发,但是在应付需求的变更、稳定性和可靠性上,总是给开发人员一种风险难于控制的感觉。为了降低风险,系统的功能不局限在NoSQL的简单功能上,我们可以使用以NoSQL为数据源的架构。

在这种架构中,应用程序只负责把数据直接写入到NoSQL数据库就OK,然后通过NoSQL的复制协议,把NoSQL数据的每次写入,更新,删除操作都复制到MySQL数据库中。同 时,也可以通过复制协议把数据同步复制到全文检索实现强大的检索功能。在海量数据下面,我们也可以根据不同的规则,把数据同步复制到设计好的分表分库的 MySQL中。这种架构:

非常灵活。可以非常方便的在线上系统运行过程中进行数据的调整,比如调整分库分表的规则、要添加一种新的存储类型等等。

操作简单。只需要写入NoSQL数据库源,应用程序就不用管了。需要增加存储类型或者调整存储规则的时候,只需要增加同步的数据存储,调整同步规则即可,无需更改应用程序的代码。

性能高。数据的写入和更新直接操作NoSQL,实现了写的高性能。而通过同步协议,把数据复制到各种适合查询类型的存储中(按照业务逻辑区分不同的存储),能实现查询的高性能,不像以前MySQL一种数据库就全包了。或者就一个表负责跟这个表相关的所有的查询,现在可以把一个表的数据复制到各种存储,让各种存储用自己的长处来对外服务。

易扩展。开发人员只需要关心写入NoSQL数据库。数据的扩展可以方便的在后端由复制协议根据规则来完成。

这种架构需要考虑数据复制的延迟问题,这跟使用MySQL的master-salve模式的延迟问题是一样的,解决方法也一样。

在这种以NoSQL为数据源的架构中,最核心的就是NoSQL数据库的复制功能的实现。而当前的几乎所有的NoSQL都没有提供比较易于使用的复制接口来完成这种架构,对NoSQL进行复制协议的二次开发,需要更高的技术水平,所以这种架构看起来很好,但是却不是非常容易实现的。我的开源项目PHPBuffer中有个实现TokyoTyrant复制的例子,虽然是PHP版本的,但是很容易就可以翻译成其他语言。通过这个例子的代码,可以实现从Tokyo Tyrant实时的复制数据到其他系统中。

总结

以NoSQL为主的架构应该算是对NoSQL的一种深度应用,整个系统的架构以及代码都不是很复杂,但是却需要一定的NoSQL使用经验才行。

Java架构师岗位的具体职责

一个基因序列及其注释数据库的管理系统

大数据开发工程师的主要职责精选

大数据架构师的岗位职责

NET架构师岗位的工作职责

数据挖掘工程师工作的基本职责描述

php开发主管的职责说明

PHP中级开发工程师的具体职责范围

高级Java开发工程师的基本职责概述

PHP高级开发工程师的基本职责说明

nosql数据库 tiger
《nosql数据库 tiger.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

【nosql数据库 tiger(整理9篇)】相关文章:

Java初级开发工程师的职责2022-12-20

高级Java开发工程师的职责职能2023-05-23

高级工程师的基本职责说明2023-09-24

高级运维工程师的职责2022-08-30

系统架构设计师岗位职责2024-02-01

大数据架构师岗位的具体职责表述2023-06-09

数据挖掘工程师岗位的具体职责2022-11-02

平台架构师的职责表述2023-06-20

高级实施工程师的岗位职责概述2022-09-16

高级运维工程师的工作职责描述2024-02-12

点击下载本文文档