MongoDB的特性

Download Report

Transcript MongoDB的特性

盛大网络
NOSQL七种武器之长生剑
MongoDB的使用介绍
成江东@snda DBA
http://www.goziwa.com
QQ:1913908
2010-10
一条曲线
思考
一.并发压力快速提高?
二.需求变化快?
三.数据水平拆分?
内
容
MongoDB是什么
MongoDB的特性
MongoDB的适用场景
MongoDB的与其它数据库的对比
MongoDB是什么
一.NOSQL数据库是什么?
非关系型的数据库,主要用于社区类WEB2.0网站。
主要解决:
 对数据库高并发的需求
 对海量数据的高效率存储和访问的需求
 对数据库的高可扩展性和高可用性的需求
MongoDB是什么
二.性能与一致性--鱼与熊掌可兼得?
MongoDB是什么
CAP理论-鱼与熊掌不可得兼
一致性(C) 分区容忍性(P)
一个分布式系统最多只能同时满足两个。
CA:传统关系数据库
AP:key-value数据库
可用性(A)
MongoDB是什么
所以,MongoDB不能解决:
 数据库事务一致性需求
 数据库的写实时性和读实时性需求
 对复杂的SQL查询,特别是多表关联查询的需求
MongoDB是什么
三.MongoDB数据库是什么?
取自“humongous”(海量的),是由10gen开发并维护的一种开源,高性
能,可扩展,无模式,面向文档(document-oriented)的数据库,其内存储
的是一种 JSON-like结构化数据。
它介于关系数据库和非关系数据库之间,是非关系数据库中最像关系数
据库的。
官网:http://www.mongodb.org/
下载:http://www.mongodb.org/downloads
最新版本:1.6.3(2010-09-23)
支持操作系统:Os X Linux Windows Solaris
MongoDB的特性
一.JSON格式文档数据库
MongoDB的特性
document!=row 文档
{
"_id" : ObjectId("4caeb59438336e36fcdb2b59"),
"uid" : 11909,
"uname " : " bird007 " ,
"address" : {
"province" : "湖北",
"city" : "武汉“,
…
},
…
}
{
"_id" : ObjectId("4caeb59438336e36fc9306f4"),
"uid" : 11910,
"uname " : " magicman " ,
“sex " : 0
…
}
MongoDB的特性
二.自由数据模式


支持在对象和数组内嵌入其它的对象和数组
Mongo模式设计中的一个关键问题就是“是值得为这个对象新建一个集合呢,还是把这个对象嵌入
到其它的集合中”。
MongoDB的特性
三.全面索引支持
 基本索引:db.t_user.ensureIndex({uname:1})
 唯一索引:db.t_user.ensureIndex({uname:1},{unique:true})
 内嵌文档中的key:db.t_user.ensureIndex({"address.city":1})
 文档本身:db.t_user.ensureIndex({"address":1})
 复合索引:
db.t_user.ensureIndex({"address.province":1,"address.city":1,"address.postcode":1,"address.room
":1})
 在线索引:db.t_user.ensureIndex({uname:1}, {background:true});
MongoDB的特性
四.复制和自动分片带来的高可用性
MongoDB的特性




MongoDB 分片集群由2个以上的shards, 1个以上的config servers, 和任意数量的 mongos servers组成
,应用程序连接mongos servers
mongod数据库服务器进程,类似于mysqld
replica set 是N个一组的 mongod 节点,协同工作可提供自动失效转移,是replica pairs的升级版
MongoDB v1.6 开始可以使用于生产环境
MongoDB的特性
测试:
Auto sharding: http://www.goziwa.com/?p=1015
Replica Set:http://www.goziwa.com/?p=1040
3 shards:192.168.0.15 ,192.168.0.16, 192.168.0.17
1 config:192.168.0.14
1 mongos:192.168.0.13
MongoDB的特性
安装php驱动:pecl install mongo
Php测试角本test.php
<?php
//连接localhost:27017
$conn = new Mongo();
//选择数据库test
$db = $conn->test;
//选择结果集
$collection = $db->app;
for($i=1;$i<10000000;$i++){
$data1 = mktime(0,0,0,1,1,1950);
$data2 = mktime(0,0,0,1,1,2000);
$rand_time = rand($data1,$data2);
$credate=date(“Y-m-d H:i:s”,$rand_time);
$userid= rand(100000000,900000000);
$appid= rand(1,50);
$new = array(‘appid’ => $appid, ‘userid’ => $userid, ‘credate’ => $credate);
$collection->insert($new);
}
?>
MongoDB的特性


发现在初期,分布不均匀,第一台DB上有100多万条,而第2,3台上各有30万条,20万条。
增加一台服务器测试,继续插入数据到500万条后看发现数据已经变为
test.app chunks:
{ “appid” : { $minKey : 1 } } –>> { “appid” : 1 } on : shard0003 { “t” : 34000, “i” : 0 }
{ “appid” : 1 } –>> { “appid” : 3 } on : shard0003 { “t” : 31000, “i” : 0 }
{ “appid” : 3 } –>> { “appid” : 4 } on : shard0003 { “t” : 33000, “i” : 0 }
{ “appid” : 4 } –>> { “appid” : 5 } on : shard0003 { “t” : 36000, “i” : 0 }
{ “appid” : 5 } –>> { “appid” : 6 } on : shard0003 { “t” : 39000, “i” : 0 }
{ “appid” : 6 } –>> { “appid” : 7 } on : shard0003 { “t” : 37000, “i” : 0 }
{ “appid” : 7 } –>> { “appid” : 8 } on : shard0003 { “t” : 40000, “i” : 0 }
{ “appid” : 8 } –>> { “appid” : 9 } on : shard0002 { “t” : 6000, “i” : 0 }
{ “appid” : 9 } –>> { “appid” : 10 } on : shard0002 { “t” : 7000, “i” : 0 }
{ “appid” : 10 } –>> { “appid” : 11 } on : shard0003 { “t” : 42000, “i” : 0 }
{ “appid” : 11 } –>> { “appid” : 12 } on : shard0002 { “t” : 9000, “i” : 0 }
{ “appid” : 12 } –>> { “appid” : 13 } on : shard0001 { “t” : 10000, “i” : 0 }
{ “appid” : 13 } –>> { “appid” : 14 } on : shard0002 { “t” : 11000, “i” : 0 }
{ “appid” : 14 } –>> { “appid” : 15 } on : shard0001 { “t” : 12000, “i” : 0 }
{ “appid” : 15 } –>> { “appid” : 16 } on : shard0002 { “t” : 13000, “i” : 0 }
{ “appid” : 16 } –>> { “appid” : 17 } on : shard0001 { “t” : 14000, “i” : 0 }
{ “appid” : 17 } –>> { “appid” : 18 } on : shard0002 { “t” : 15000, “i” : 0 }
{ “appid” : 18 } –>> { “appid” : 19 } on : shard0001 { “t” : 16000, “i” : 0 }
{ “appid” : 19 } –>> { “appid” : 20 } on : shard0002 { “t” : 17000, “i” : 0 }
{ “appid” : 20 } –>> { “appid” : 21 } on : shard0001 { “t” : 18000, “i” : 0 }
{ “appid” : 21 } –>> { “appid” : 22 } on : shard0002 { “t” : 19000, “i” : 0 }
{ “appid” : 22 } –>> { “appid” : 23 } on : shard0001 { “t” : 20000, “i” : 0 }
{ “appid” : 23 } –>> { “appid” : 25 } on : shard0002 { “t” : 21000, “i” : 0 }
{ “appid” : 25 } –>> { “appid” : 26 } on : shard0001 { “t” : 22000, “i” : 0 }
{ “appid” : 26 } –>> { “appid” : 27 } on : shard0002 { “t” : 23000, “i” : 0 }
{ “appid” : 27 } –>> { “appid” : 28 } on : shard0001 { “t” : 24000, “i” : 0 }
{ “appid” : 28 } –>> { “appid” : 29 } on : shard0002 { “t” : 25000, “i” : 0 }
{ “appid” : 29 } –>> { “appid” : 30 } on : shard0001 { “t” : 26000, “i” : 0 }
{ “appid” : 30 } –>> { “appid” : 31 } on : shard0002 { “t” : 27000, “i” : 0 }
{ “appid” : 31 } –>> { “appid” : 32 } on : shard0001 { “t” : 30000, “i” : 2 }
{ “appid” : 32 } –>> { “appid” : 33 } on : shard0001 { “t” : 42000, “i” : 1 }
{ “appid” : 33 } –>> { “appid” : 34 } on : shard0001 { “t” : 29000, “i” : 0 }
{ “appid” : 34 } –>> { “appid” : 35 } on : shard0002 { “t” : 40000, “i” : 1 }
{ “appid” : 35 } –>> { “appid” : 36 } on : shard0003 { “t” : 32000, “i” : 0 }
{ “appid” : 36 } –>> { “appid” : 37 } on : shard0003 { “t” : 35000, “i” : 0 }
{ “appid” : 37 } –>> { “appid” : 38 } on : shard0003 { “t” : 38000, “i” : 0 }
{ “appid” : 38 } –>> { “appid” : 39 } on : shard0003 { “t” : 41000, “i” : 0 }
{ “appid” : 39 } –>> { “appid” : 40 } on : shard0000 { “t” : 3000, “i” : 181 }
{ “appid” : 40 } –>> { “appid” : 41 } on : shard0000 { “t” : 3000, “i” : 182 }
{ “appid” : 41 } –>> { “appid” : 42 } on : shard0000 { “t” : 5000, “i” : 12 }
{ “appid” : 42 } –>> { “appid” : 43 } on : shard0000 { “t” : 6000, “i” : 1 }
{ “appid” : 43 } –>> { “appid” : 44 } on : shard0000 { “t” : 3000, “i” : 184 }
{ “appid” : 44 } –>> { “appid” : 45 } on : shard0000 { “t” : 6000, “i” : 2 }
{ “appid” : 45 } –>> { “appid” : 46 } on : shard0000 { “t” : 41000, “i” : 1 }
{ “appid” : 46 } –>> { “appid” : 47 } on : shard0000 { “t” : 4000, “i” : 108 }
{ “appid” : 47 } –>> { “appid” : 48 } on : shard0000 { “t” : 4000, “i” : 109 }
{ “appid” : 48 } –>> { “appid” : 49 } on : shard0000 { “t” : 4000, “i” : 110 }
{ “appid” : 49 } –>> { “appid” : 50 } on : shard0000 { “t” : 5000, “i” : 1 }
{ “appid” : 50 } –>> { “appid” : { $maxKey : 1 } } on : shard0000 { “t” : 3000, “i” : 1 }
test.people chunks:
MongoDB的特性
五.丰富的查询语句
In查询
排序
Exists
查询分片
Javascript shell
数组元素个数
Count
正则
类型匹配
游标
MongoDB的特性
六.Map/Reduce
是聚合和过滤数据的工具
m=function(){emit(this.sex,1);}
r=function(key,value){
var count=0;
for(i in value){
count+=value[i];
}
return count;
}
res=db.t_user.mapReduce(m,r);
db[res.result].find();
{ "_id" : 0, "value" : 134211 }
{ "_id" : 1, "value" : 323445 }
MongoDB的特性
七.性能优异
 并发写的性能有1.5万每秒
 无外键约束,无事务
 异步写磁盘
八.其它特性
 GridFS
 使用方便,MongoDB 会自动创建数据库(db)和集合(collection),无需显式执行。
MongoDB的适用场景
一.适用场景
1,结构不固定,有数据嵌套
2,要求高并发性
3,经常需要做数据水平拆分
4,内存大于数据量(推荐)
二.不足之处
1,比较占用硬盘空间,性能受内存影响
2,性能依赖内存,同时无法指定内存大小,容易被其它程序占用
3,MongonDB不支持事务,不支持join
4,每个Document的限制是最大不超过4MB
MongoDB的适用场景
三.Why MongoDB







性能优异
扩展力强
面向文档
部署简单
功能全面
易于开发
支持全面
 邮件组:http://groups.google.com/group/mongodb-user
 豆瓣小组:http://www.douban.com/group/mongodb/
MongoDB的与其它数据库的对比
一.VS
二.VS
三.VS