More Related Content Similar to Mongo db技术分享 (20) Mongo db技术分享2. 分享目录
1.MongoDB 简介
2.MongoDB 版本对比
3.MongoDB 性能测试
4.MongoDB 特点
5.MongoDB 命令行与 C# 驱动操作对照
6.MongoDB 的架构
--1.Master-Slave Replication
--2.Replica Sets 集群方案
7. 部署方法
8. 设置集群查看状态命令
9.MongoDB 适用场合
10.MongoDB 不适用场合
11. linux 下 mongodb 的安装
12.MongoDB 技巧汇总
4. MongoDB 版本对比
Mongo 当前稳定版是 1.8.2( 见附件 mongodb.rar)
比前一版本 1.4 做了很多改进 ( 使用 C# 驱动
MongoDB.Driver.dll 和 MongoDB.Bson.dll( 见附件
C# 驱动类库 .rar)):
# 改进和提高了并发性能。
# Mongodb 存储文件申请磁盘空间的方式做了改进。
# 增加了 $or 等查询操作符。
# Replication 的同步方面做了改进。
select 方面 , 性能提升显著,合计有 83% 性能提高
update 方面有 75% 的性能提高
5. MongoDB 性能测试
Mongo 测试数据
( suse11-64bit 、 xeon3.6*2 、 4G DDR333 、 scsi73G*2 无 raid 的机器)
1 、 insert 九百万条简单数据( 3 个字段):平均值大约在
24000/s (最高 2.8W ,最低 2.1W );同时,插入第一个一百万和
第九个一百万效率没有明显差异,数据文件体积大概在 3.8G ,比较
大;
2 、 select 一万条数据(有索引): 57~61ms ,一千条大概在 6ms
左右,非常稳定;
数据量约 2 千万,数据库 300G 的情况下,读写 2000rps , CPU 等
系统消耗是相当的低
6. MongoDB 特点
高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
* 面向集合存储,易存储对象类型的数据。
* 模式自由 ( 没有行,列,关系等概念 ) 。
* 支持动态查询 , 拥有与 sqlserver 相似的查询功能 。
* 支持完全索引,包含内部对象。
* 支持查询。
* 支持复制和故障恢复。
* 使用高效的二进制数据存储,包括大型对象(如视频等)。
* 自动处理碎片,以支持云计算层次的扩展性
* 支持 C# , Python , PHP , Ruby , Java , C , Javascript , Perl 及
C++ 语言的驱动程序,社区中也提供了对 Erlang 及 .NET 等平台的驱动程
序。
* 文件存储格式为 BSON (一种 JSON 的扩展)
* 可通过网络访问
8. 内存映射存储引擎
MongoDB 目前支持的存储引擎为内存映射引擎。当 MongoDB 启动的时
候,会将所有的数据文件映射到内存中,然后操作系统会托管所有的
磁盘操作。这种存储引擎有以下几种特点:
* MongoDB 中关于内存管理的代码非常精简,毕竟相关的工作已经有操
作系统进行托管。
* MongoDB 服务器使用的虚拟内存将非常巨大,并将超过整个数据文件
的大小 ( 数据文件如果超过内存大小,搜索性能将会大大降低 ) 。不
用担心,操作系统会去处理这一切。
* MongoDB 无法控制数据写入磁盘的顺序,这样将导致 MongoDB 无法
实现 writeahead 日志的特性。所以,如果 MongoDB 希望提供一种
durability 的特性(这一特性可以参考关于 Cassandra 文章:
http://www.cnblogs.com/gpcuster/tag/Cassandra/ ),需要实现另外
一种存储引擎。
* 32 位系统的 MongoDB 服务器每一个 Mongod 实例只能使用 2G 的数
据文件。这是由于地址指针只能支持 32 位。
9. MongoDB 安装
mongod --logpath D:webrootmongodblogMongoDB.log --logappend
--dbpath D:webrootmongodbdata --directoryperdb --serviceName
MongoDB1 --port 25436 --install
注:此处是将 mongod.exe 注册为 windows 服务 ,必须先在相应目录下
建立 data 与 log 目录,否则安装时提示错误 ( 附件 mongodb.rar 为 mongodb 安装
文件 )
10. MongoDB 命令行操作
普通操作
1 、新建集合集:
> db.createCollection("user");
2 、插入数据:
> db.user.insert({uid:1,username:"Falcon.C",age:25});
> j = { name: "mongo"};
> db.things.save(j);
> for( var i = 1; i < 10; i++ ) db.tables.save( { x:4, j:i } );
3 、更新数据:
> db.user.update({uid:1},{$set:{age:26}}) #age=26
> db.user.update({uid:1},{$inc:{age:-1}})#age=age-1
11. C# 驱动操作 ( 对照命令行 )
1 、支持单条数据插入
tables.Insert(info);
tables.Save(info); (区别:先根据 BsonId 判断集合
中是否存在记录,存在就更新,否则就插入)
BsonId= 时间戳 (4b)+ 机器 (3b)+PID(2b)+ 计数器
(3b)
(BsonId 为 12 字节字符串,是文档的唯一标识,可
以自定义 )
2 、支持批量数据插入
tables2.InsertBatch(infos);
12. C# 驱动操作 ( 对照命令行 )
3 、支持更新数据
var query = Query.And(Query.EQ("Number", gcommentInfo.Number),
Query.EQ("IsHotting", 1));
var update = Update.Set("Id", gcommentInfo.Id)
.Set("NewsId", gcommentInfo.NewsId)
.Set("ChnId", gcommentInfo.ChnId);
var info = mongoGCommentInfos.FindOne(query);
if (info != null)
mongoGCommentInfos.Update(query, update);
13. MongoDB 命令行操作
普通操作
4 、查询:
4.1 遍历集
> var cursor = db.things.find();
> while (cursor.hasNext()) { print(tojson(cursor.next())); }
4.2 方法 2
> db.things.find().forEach( function(x){print(tojson(x));});
4.3 、获取结果集
> var cursor = db.things.find();
> print (tojson(cursor[4]));
> var arr = db.things.find().toArray();
> arr[5];
14. C# 驱动操作 ( 对照命令行 )
FindAll 用法 :
MongoDB.Driver.MongoCursor<HeadLineInfo>
mongoHeadLineInfos = new MongoHelper().GetCollection<HeadLineInfo>();
var mongoHeadLineInfoList = mongoHeadLineInfos.FindAll();
15. MongoDB 命令行操作
普通操作
5 、条件查询:
> db.things.find({name:"mongo"}).forEach(function(x) { print(tojson(x));});
等价于:
SQL : SELECT * FROM things WHERE name="mongo"
>db.things.find({x:4}, {j:true}).forEach(function(x) { print(tojson(x));});
等价于:
SQL : SELECT j FROM things WHERE x=4
16. C# 驱动操作 ( 对照命令行 )
4 、支持条件查询
( 查询操作可以用文档与企业管理器 MongodbVUE 配套使用
)
a. 日期查询:
Query.GT("SubmitTime",MongoDB.Bson.BsonDateTime.Create(DateTime.Now.AddD
ays(-25)));
对应文档查询大于某日期: { SubmitTime : { $gt : new Date(2011,5,28) } }
Query.GT() :大于某日期; Query.LT() :小于某日期; Query.ET() :等某日期;
b. 支持模糊搜索:
Query.Matches("Title", "/" + key + "/i");
对应文档: {"Title" : { "$regex" : " 基尼系数 ", "$options" : "i" }}
c. 支持 and 条件
Query.And(Query.EQ("Channel._id", BsonInt32.Create((int)type)), Query.Matches("Title",
"/" + key + "/i"));
对应文档: { "Channel._id" : 18,"Title" : { "$regex" : " 抵制 ", "$options" : "i" } }
17. 企业管理器 MongodbVUE 监控
(安装附件 MongoDB 企业管理器 Installer-0.9.7.2.zip )
system.profile 中记录下一条耗时过长的操作。
模糊查询性能测试: query news2.Jiubang.NewsClient2.Models.Entities.NewsInfo ntoreturn:50 reslen:313
nscanned:42841
query: { $query: { Title: { $regex: " 基尼系数 ", $options: "i" } }, $explain: true } nreturned:1 215ms
Or 条件与模糊查询性能测试: query news2.Jiubang.NewsClient2.Models.Entities.NewsInfo scanAndOrder
reslen:192393 nscanned:42810 query: { $query: { $or: [ { Title: / 百度 /i }, { Keywords: / 百度 /i } ] }, $orderby:
{ UpdateTime: -1 } } nreturned:27 255ms
In 条件性能测试: query news2.$cmd ntoreturn:1 command: { count:
"Jiubang.NewsClient2.Models.Entities.HeadLineInfo", query: { ChannelType: { $in: [ 10, 74, 21 ] }, SType: 0 } }
reslen:64 139ms
ts: 操作执行时间。
info: 操作详细信息。
info.query: 查询目标 ( 数据库 . 集合 ) 。
info.ntoreturn: 客户端期望返回的文档数量。
info.nscanned: 服务器实际扫描的文档数量。
info.reslen: 查询结果字节长度。
info.nreturnned: 查询返回文档数。
millis: 操作耗时 ( 毫秒 ) 。
18. C# 驱动操作 ( 对照命令行 )
d. 支持对象或数组字段搜索
Query.EQ("Channel._id", MongoDB.Bson.BsonInt32.Create((int)type));
e. 支持 or 条件: Query.Or(Query.Matches("Title", "/" + key + "/i"), Query.Matches("KeyWords", "/" +
key + "/i"));
对应文档: { "$or" : [{ "Title" : { "$regex" : " 杀 ", "$options" : "i" } }, { "Keywords" : { "$regex" : " 杀 ",
"$options" : "i" } }] }
f. 支持 In 用法
Query.In("ChannelType", MongoDB.Bson.BsonArray.Create(new[] { 10, 74, 21 }));
f. 支持模糊搜索区分大小写 和 以某个字符开头匹配
^ 符号表示以 lvl 开头, I 表示区分大小写, i 表示不区分大小写
Query.And(Query.EQ("ChnId", MongoDB.Bson.BsonInt32.Create(ChnId)), Query.Matches("Lvl", new
MongoDB.Bson.BsonRegularExpression("^" + lvl, "I")));
19. MongoDB 操作
普通操作
6 、 sort 用法
>db.things.find({tags :'economy'}).sort({ts:-1}).limit(10);
等价于:
SQL: select * from things where 'economy' in tags order by ts DESC limit 10
7 、 findOne 用法
> var mongo = db.things.findOne({name:"mongo"});
> print(tojson(mongo));
8 、 limit 用法
db.things.find().limit(3);
20. C# 驱动操作 ( 对照命令行 )
g. sort 用法
query = Query.In("ChannelType", MongoDB.Bson.BsonArray.Create(new[] { 10,
74, 21 }));
var sort = SortBy.Descending(new string[] { "Number", "SubmitTime" });
HeadLineTable = HeadLineTb.Find(query).SetSortOrder(sort);
h. findOne 用法
var query = Query.EQ("_id", MongoDB.Bson.BsonString.Create(KeyId));
var info = newsinfos.FindOne(query);
22. C# 驱动操作 ( 对照命令行 )
g. 索引
添加索引:
var headLineInfos = new
MongoHelper().GetCollection<HeadLineInfo>();
headLineInfos.EnsureIndex(IndexKeys.Descending("NewsId"));
headLineInfos.EnsureIndex(IndexKeys.Descending(“ChannelType”,
“SubmitTime”));( 支持复合索引 )
移除索引:
headLineInfos.DropIndex(IndexKeys.Descending("IsVertical"));
h. findOne 用法
var query = Query.EQ("_id", MongoDB.Bson.BsonString.Create(KeyId));
var info = newsinfos.FindOne(query);
25. Replica Set 模式
含一个 primary ,一个 secondary ,和一
个 arbiter ( arbiter 的唯一作用是在
primary 宕机后选举新的 primary 时拥有投
票权,用以使存活节点数大于 50% ,不包
括 50% ,否则系统将整个 down 掉,以及
在票数相同的情况下用以打破选举 的平衡
,并不存储和读取数据)。
26. Master-Slave Replication 与 Replica Sets 集群方案比较
优点:主数据服务器或从数据服务器挂掉后,
会自动切换主数据库,不用人工干预,
稳定性比 Master-Slave Replication 高。
缺点 : 需要客户端的驱动支持,
因为客户端在与主服务器连接失败后,
会向集群的其他服务器发一条特殊的指令询问,
谁是新的主数据服务器。
集群的服务器在不做分区的前提下,分成三种,
主数据服务器,从数据服务器,选举服务器(只做投票不存储数据),
若做数据分
区还有配置服务器。
27. 部署方法
步骤一:在三台服务器启动 mongodb 服务, Windows 和 Linux 都类似,
只是文件路径有部分差别。
指令如下: mongod --replSet car( 集群名称 ) --port 25017( 端口 ) --dbpath
E:mongodb-testdata1( 数据文件路径 )
步骤二:用 mongo 命令行工具连接 mongo 服务器,并配置集群服务,指令如下
:
config = {_id: 'car',
members: [
{_id: 0, host: '192.168.56.71:25017'},
{_id: 1, host: 192.168.56.72:25017', initialSync : {state : 1}},
{_id: 2, host: '192.168.56.73:25017', arbiterOnly : true}
28. 设置集群查看状态命令
可以通过命令行查看集群状态,也可以通过
C# 驱动检查集群状态 ( 见附件:检查单台
服务器或主服务器 .rar)
d:webroot>e:
E:>cdToolsmongodbbin
E:Toolsmongodbbin>mongo 192.168.56.71:25017
MongoDB shell version: 1.8.2
connecting to: 192.168.56.71:25017/test
car:PRIMARY> rs.status()
{
"set" : "car",
"date" : ISODate("2011-07-11T03:48:37Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
29. MongoDB 功能
1. 面向集合的存储:适合存储对象及 JSON 形式的数据。
2. 动态查询: Mongo 支持丰富的查询表达式。查询指令使用 JSON 形式的标记
,可轻易查询文档中内嵌的对象及数组。
3. 完整的索引支持:包括文档内嵌对象及数组。 Mongo 的查询优化器会分析查
询表达式,并生成一个高效的查询计划。
4. 查询监视: Mongo 包含一个监视工具用于分析数据库操作的性能。
5. 复制及自动故障转移: Mongo 数据库支持服务器之间的数据复制,支持主 -
从模式及服务器之间的相互复制。复制的主要目标是提供冗余及自动故障转
移。
6. 高效的传统存储方式:支持二进制数据及大型对象(如照片或视频)
7. 自动分片以支持云级别的伸缩性:自动分片功能支持水平的数据库集群,可
动态添加额外的机器。
30. MongoDB 适用场合
1. 网站数据: Mongo 非常适合实时的插入,更新与查询,并具备网站实
时数据存储所需的复制及高度伸缩性。
2. 缓存:由于性能很高, Mongo 也适合作为信息基础设施的缓存层。在
系统重启之后,由 Mongo 搭建的持久化缓存层可以避免下层的数据源
过载。
3. 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可
能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进
行存储。
4. 高伸缩性的场景: Mongo 非常适合由数十或数百台服务器组成的数据
库。某公司经典案例: MongoDB 存储的数据量已超过 50
亿, >1.5TB
5. 用于对象及 JSON 数据的存储: Mongo 的 BSON 数据格式非常适合
34. MongoDB 操作
同步复制
1 、 Master 对 Slave
[Master]
bin/mongod --dbpath=/data/db/m_data --logpath=/data/db/m_log
--logappend --port=27017 --master --auth &
[Slave]
bin/mongod --dbpath=/data/db/m_data --logpath=/data/db/m_log
--logappend --port=27017 --slave --source=192.168.100.202:27017
--auth &
36. MongoDB 技巧汇总
备份
./mongodump -u admin -p 123456 -d user -o user -d db -o path
还原
./mongorestore -u admin -p 123456 -d user -c user user/user/user.bson
帮助信息
db.help();
db.user.help();
37. linux 下 mongodb 的安装
mkdir -p /data/mongodb/data
mkdir -p /data/mongodb/logs
cd /usr/local
wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.0.0.tgz
tar zxvf mongodb-linux-x86_64-2.0.0.tgz
rm mongodb-linux-x86_64-2.0.0.tgz
mv mongodb-linux-x86_64-2.0.0/ mongodb
# 创建启动脚本
vi /usr/local/mongodb/startmongodb.sh
# 把以下内容复制
#! /bin/bash
if [ -f /data/db/mongod.lock ];then
/bin/rm -rf /data/db/mongod.lock
fi
/usr/local/mongodb/bin/mongod -dbpath=/data/mongodb/data
-logpath=/data/mongodb/logs/mongod.log --port 27017 --logappend&
# 主从设置
#/usr/local/mongodb/bin/mongod --master --fork --dbpath=/data/mongodb/data
--logpath=/data/mongodb/logs/mongod.log --logappend --port=27017 > /dev/null 2>&1 &
# 保存后启动 mongodb
38. 小结
1 、 Mongo 是一个高性能,开源,无模式的文档型数据库 ( 采用文件内
存映射机制 ) ;
2 、当前使用的是 1.8.2 版本(安装程序见附件 mongodb.rar ) , 既可以
通过命令行操作,
也可以通过 C# 驱动操作 ( 见附件 C# 驱动类库 .rar) ;
3 、可以搭建 mongodb 集群
4 、 C# 驱动操作可以与企业管理器 MongodbVUE 配套使用,通过
MongodbVUE 的 system.Pofile 功能来监控查询效率
5 、 C# 驱动支持增删改查, orInAnd 模糊搜索等搜索条件,但不支持
join 关联搜索
6 、支持排序 findOnelimit 用法
7 、支持 C# 驱动建立查询索引
8 、支持 Window 和 linux 系统安装