初学Mongodb

1. 关系型数据库
1) ACID,是指在数据库管理系统(DBMS)中事务所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
在数据库系统中,一个事务是指由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。
原子性
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性
在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。
隔离性
两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。
持久性
在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
由于一项操作通常会包含许多子操作,而这些子操作可能会因为硬件的损坏或其他因素产生问题,要正确实现ACID并不容易。ACID建议数据库将所有需要更新以及修改的资料一次操作完毕,但实际上并不可行。

目前主要有两种方式实现ACID:第一种是Write ahead logging,也就是日志式的方式。第二种是Shadow paging。
2) 范式
http://www.cnblogs.com/zhhh/archive/2011/04/21/2023355.html

2. 非关系型数据库
CAP法则
http://www.searchdatabase.com.cn/showcontent_44918.htm
http://sebug.net/paper/databases/nosql/Nosql.html
3. MongoDB
最终一致性(弱一致性)
高可用性
分区容忍性

提高一致性的办法:
在Mongodb中如果客服端想写数据到Mongodb集群中为了确保我们能把数据写到大部分服务器上我们必须做一下设置:
在Mongodb客服端命令行下运行:db.runCommand( { getlasterror : 1 , w : 2 } ),该命令表示我们在写数据到mongodb中时必须把数据复制到2台服务器上才会返回结果,getlasterror表示当在进行数据写入时返回的错误。db.runCommand( { getlasterror : 1 , w : "majority" } )majority用来表示数据要被写入到一半以上的服务器上才会返回结果.在java驱动api中我们使用下面的代码来设定和上面一样的操作:

Mongo mongo = new Mongo(address);
mongo.setWriteConcern(WriteConcern.REPLICAS_SAFE);//表示写入数据到一半以上的服务器上
在java驱动的api中的WriteConcern里还有很多的参数可以设置比如(写入数据超时时间等)


Mongo的查询环境是个类似node.js 或者 chrome V8的javascript 解析引擎,因此基本的javascript语句、语法都可以使用。

CRUD:

insert ssss ()values()
db.表名.insert({
name:"张三"
, age:20
});

批量增:
for(var i=0; i<10; i++){
db.p2.insert({
name:("张" + i)
, age:(i + 7)
, hobby:[1,2,3]
});
}


db.表名.remove() 删整张表
db.表名.remove({name:"张三"}) 删指定记录


整体改
var where = {name:"zhang2"};
var zhang3 = db.person.find(where );
zhang3.age=125;
db.person.update(where , zhang3);

指定字段改
var where = {name:"张三"};
var setData = {$set:{age:77}}; // 指定age为77 其他字段不动
db.表名.update(where , setData );

指定字段并自增
var where = {name:"张三"};
var setData = {$inc:{age:10}}; // 指定age在原有基础上增加10 其他字段不动
db.表名.update(where , setData );

upsert操作 mongodb特有操作
如果查询的对象存在,那么update,否则进行insert
var where = {name:"张5"};
var setData = {$inc:{age:32},$set:{name:"张武"}}; // 注意!更新数据中不能包含where条件的字段,否则不会insert,如果包含的话,字段必须是$set修饰
db.person.update(where , setData , true);

// 或者这样
var where = {name:"张5"};
var setData = {$inc:{age:32}};
db.person.update(where , setData , true);

批量更新
mongodb默认更新第一条,如果需要全表更新,那么update第四个参数设为true


db.表名.find(查询条件);
查询比较符:
SQL
MONGODB
EG
REMARK
=

{name:"张三"}

>
$gt
{age:{$gt:10}}

>=
$gte
{age:{$gte:10}}

<
$lt
{age:{$lt:10}}

<=
$lte
{age:{$lte:10}}

and



or
$or
{$or:[{age:{$lt:10}}, {age:{$gt:20}}]}
查询10岁以下或20岁以上
in
$in
{age:{$in:[10, 20, 31, 45]}}

not in
$nin
{age:{$nin:[10, 20, 31, 45]}}


如果需要再数组列上排序,需要给列加索引
如果排序是 {非数组列:1, 数组列:1} 这样那么要加联合索引

-------------------------------------------------------------------------------------

MongoDB 集群涉及的知识及实践

理论

1. 副本集(replSet),解决ha,可读写分离,单点当掉可自动切换到未当掉的节点(对应用来说是透明的),实现原理是paxos,可动态添加
2. 主从复制,解决ha,通过主库日志进行数据同步(官方已不推荐)
3. 数据分片,类似rdbms的分库分表策略,但对应用是透明的,需要设置合适的片键(分片依据),可解决大并发写操作
4. 部署策略可 replSet + sharding 水平扩展,大数据很给力


实践


建立集群:

1.创建configs服务器
mongod --dbpath "f:\mongodb\data\configs" --port 23017

2)创建mongos服务器 并指定依赖的配置服务器 (mongos依赖于配置服务器,mongos查询的分片信息都存储在configs中)
mongos --port 25017 --configdb 127.0.0.1:23017

3)创建多个分片服务器 (负责数据存储)(这里创建了两个服务器)
mongod --port 27017 --dbpath "f:\mongodb\data\dbs\shard27017"
mongod --port 27018 --dbpath "f:\mongodb\data\dbs\shard27018"

连接mongos 服务器 添加shard27017分片服务器到configs服务器中
>use admin
>db.runCommand({addshard:"127.0.0.1:27017",allowLocal:true}) //添加分片服务器,allowLocal 充许本地部署 默认情况不充许本地部署多个分片的

下面为分片服务器的test库foo集合设置分片以及分片shard key。
>db.runCommand({"enablesharding":"test"}) //对test库启用分片功能
注意:需要分片的集合 的shard key必须是索引键, (我们也可以在mongos为分片foo集合创建索引)
>db.runCommand({"shardcollection":"test.foo","key":{"name":1}}) //数字代表排序
至此自动分片就创建完成了,可以在mongos或configs服务器查询分片信息


查询分片信息:
1.在mongos中 use config
2.show collections
3.db.shards.find() 分片服务器信息
4.db.chunks.find() 分片信息


当需要移除分片时运行下面的命令,同时mongos路由会将此分片服务器上的信息移到其它分片上。
>db.runCommand({"removeshard":"127.0.0.1:27017"}


---------------------------------------------------------------------------------------
运维
官方的监控工具 MongoMMS
http://blog.nosqlfan.com/html/3171.html


---------------------------------------------------------------------------------------------
其他
两端提交模拟事务
http://cnodejs.org/topic/5070492b01d0b80148dc45f8

基于MongoDB的大规模高频金融交易数据处理
http://www.csdn.net/article/a/2011-11-26/308132
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值