Category Archives: NoSQL

MongoDB Shard

分片(Sharding)是一种将海量的数据水平扩展的数据库集群系统。而在MongoDB提供了auto-sharding的功能,通过简单的配置就可以构建一个分布式 MongoDB 分片集群。MongoDB 的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,通常最大尺寸是 200MB,超出则生成新的数据块。对于数据的分片基于chunk来实现。
一个分片集群包含下面组成(搭建高可用MongoDB集群(四):分片这位大牛已经把高可用shard集群(mongos with replica set)的原理和搭建过程写的很清楚,这里我很无耻的拿来直接实战搞起:),架构上略有不同。
shard

一共使用4台主机,配置了三个configdb。数据三个shard,每个shard为一个3节点的replica set都作为复制节点。如上图所示。这个架构从实际上来说还是有很多问题,这里就不在深究了。 Continue reading

Posted in Database, NoSQL.

MongoDB Two-phase Commit

先恶补一下分布式事务中事务的各类提交机制:(关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究)
NoSQL并没有关系数据库那么严格的事务机制,所以在NoSQL中能否很好的实现事务功能体现了开发人员的功力。两段式提交保证了分布式XA规范的分布式事务的原子性。两段指prepare阶段和commit阶段:

Continue reading

Posted in Database, JavaScript, NoSQL.

MongoDB Replica Set

一个replica set可以看作一个带故障转移的Master-Slave复制集群,它在primary节点失效后(或者secondaries不能访问primary时)会自动选举secondary节点成为master。replica set需要保证实例之间相互了解生存状态,所以需要n*(n-1)*2条心跳检测链路。在集群有一定规模时增加了网络的负担。如果使用开发语言的Driver指定了replica set中的一些server,那么driver会自动引入replica set中所有的server并自动在primary失效后故障转移到其他节点。

Replica Set Members

Replica set最多可以有12个成员,但是只有7个成员能同时投票。成员的角色分为:
Primary 同master节点,可以执行write操作。
Secondary 同Slave节点,接收并复制Primary节点的操作。可以进行一些其他配置:如设置为Non-Voting或优先级
Arbiter 不进行数据复制,只在primary失效后参与投票。
Continue reading

Posted in Database, JavaScript, NoSQL.

MongoDB Master/Slave复制

Master-Slave replication主从复制是最常用的一种高可用模式,常用于备份、故障转移(failover)、读扩展等模式,同样被MongoDB支持,但大多数情况已经被Replica Sets取代。 MongoDB的主从复制配置起来非常简单:
在Master节点,以--master命令行选项或在参数上加上master,并指定日志大小(64MB)。

Continue reading

Posted in Database, NoSQL.

MongoDB Aggregation

《Seven Database in Seven Weeks》提供了一个较好的数据实例:

那么最终生成的文档如下:

下面使用上面的文档来测试

统计得到的结果的数量

Continue reading

Posted in Database, JavaScript, NoSQL.

MongoDB Cursor

在Oracle这样的关系数据库中,游标是SQL的一个内存工作区,其作用就是用于临时存储从数据库中提取的结果数据块。Oracle的游标在PL/SQL编写存储过程时会经常用到,可以用于一些特殊的控制和曹走。而MongoDB也提供了游标这个定义—当然MongoDB的”存储过程”就是一段javascript的代码块。
Continue reading

Posted in Database, JavaScript, NoSQL.

MongoDB的DML

MongoDB的DML同样包括插入(insert), 修改(update)和删除(remove)的功能,但MongoDB并不具备关系数据库中的事务性操作,这也导致了MongoDB在很多时候不能使用像关系数据库那样的事务场景。但MongoDB中的update,findAndModify等操作都是原子操作,一定程度上弥补了这方面的不足。 Continue reading

Posted in Database, NoSQL.

MongoDB的DDL

MongoDB是文档数据库,每一个记录是一个独立的文档(Document),而文档是由多个field-value pairs所组成,这决定了MongoDB的逻辑对象与关系数据库有很大的区别。官方文档中的SQL to MongoDB Mapping Chart 中有对逻辑对象的信息的描述:

RDBMS MongoDB
database database
table collection
row document or BSON document
column field
index index
table joins embedded documents and linking
primary key(Specify any unique column
or column combination as primary key.
primary key
In MongoDB, the primary key
is automatically set to the _id field.
aggregation (e.g. group by) aggregation pipeline
See the SQL to Aggregation Mapping Chart.

Continue reading

Posted in Database, NoSQL.

使用Scala Casbah连接MongoDB

Casbah是Scala的MongoDB toolkit,它对java Driver进行了封装并提供了scala风格的接口。Casbah使用了隐式的“PIMP My Library”代码来增强Java代码的功能。PIMP My Library模式是使用额外的方法和属性来装饰类的一种方法,一般使用隐式函数定义的方式来让Scala转换一个对象为一个新的对象,参考PIMP My Library,下面是一个简单的PIMP My Library用例:

Continue reading

Posted in Database, Dev, Java|Scala, NoSQL.

MongoDB Casbah运算符

Casbah通过运算符提供了非常灵活的语法,用于构建DBObject文档对象。
Continue reading

Posted in Database, JavaScript, NoSQL.