[互联网]MongoDB详解.ppt

上传人:音乐台 文档编号:1998403 上传时间:2019-01-29 格式:PPT 页数:49 大小:515.38KB
返回 下载 相关 举报
[互联网]MongoDB详解.ppt_第1页
第1页 / 共49页
[互联网]MongoDB详解.ppt_第2页
第2页 / 共49页
[互联网]MongoDB详解.ppt_第3页
第3页 / 共49页
亲,该文档总共49页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《[互联网]MongoDB详解.ppt》由会员分享,可在线阅读,更多相关《[互联网]MongoDB详解.ppt(49页珍藏版)》请在三一文库上搜索。

1、NoSql非关系数据库 NoSQL,意即反SQL运动,是一项全新的数据库革命性运动,早期就有人提出,发 展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对 于目前铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。 李清华 Email: 随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关 系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0网站,特别是超大规模和 高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题, 例如: 1、High performance - 对数据库

2、高并发读写的需求 web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使 用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关 系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已 经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如像 JavaEye网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是 一个相当普遍的需求。 2、Huge Storage - 对海量数据的高效率存储和访问的需求 类似Facebook,twitter,Friendfeed这样的

3、SNS网站,每天用户产生海量的用户动态,以 Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张2.5亿条 记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户 登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。 3、High Scalability $gte : = ; $lt : 20 Mongo: db.user.distinct(name, age: $lt : 20) Dynamic querys Advanced MySQL: SELECT name, sum(marks) FROM user GR

4、OUP BY name Mongo: db.user.group( key : name : true, cond: name : foo, reduce: function(obj,prev) prev.msum += obj.marks; , initial: msum : 0 ); MySQL: SELECT name FROM user WHERE age mongo.tgz 如果没有安装curl 先安装apt-get install curl 添加用户 $ adduser mongodb $ passwd mongodb 解压到mongdb用户server目录下 $ tar xzf

5、mongo.tgz 步骤二:创建数据文件夹 默认情况下,MongoDB会在/data/db/这个文件夹存放数据,这个文件夹需要自己手动创建。 通过如下方式创建: su mongodb 进入mongodb解压目录 $ sudo mkdir -p data/db/ $sudo mkdir p data/log/ 当然 可以 通过-dbpath 命令 指定MongoDB将数据存储到另外的目录中去。 步骤三:启动数据库 ./bin/mongod fork port 10000 dbpath data/db logpath data/log/mdb.log 步骤四:进入数据库 ./bin/mongo p

6、ort 10000 db.foo.save( a : 1 ) 结果是: “_id“ : ObjectId(“4cd181a31415ffb41a094f43“), “a“ : 1 OK,搞定! Windows安装 步骤一:下载文件 对于32位的windows http:/downloads.mongodb.org/win32/mongodb-win32-i386-1.8.0.zip 解压到e:/mongodb 步骤二:创建数据文件夹 进入mongodb解压目录 创建目录data/db/ 创建目录data/log/ 步骤三:启动数据库 ./bin/mongod fork port 10000 d

7、bpath data/db logpath data/log/mdb.log 步骤四:进入数据库 ./bin/mongo port 10000 db.foo.save( a : 1 ) 结果是: “_id“ : ObjectId(“4cd181a31415ffb41a094f43“), “a“ : 1 OK,搞定! MongoDB JAVA简单操 作 MongoDB提供JAVA连接操作接口。 下载地址: http:/ API地址: http:/api.mongodb.org/java/2.6-pre-/index.html 1 、建立连接 要建立MongoDB的连接,你只要指定要连接到的数据库

8、就可以。这个数据库不一定存在,如 果不存在,MongoDB会先为你建立这个库。同时,在连接时你也可以具体指定要连接到的网 络地址和端口。下面的是连接本机数据库的一些例子: import com.mongodb.Mongo; import com.mongodb.DBCollection; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; import com.mongodb.DBCursor; import com.mongodb.MongoAdmin; Mongo db = new Mongo(“mydb“); Mo

9、ngo db = new Mongo(“localhost“, “mydb“); Mongo db = new Mongo(“localhost“, 10000, “mydb“); 2 安全验证(非必选) MongoDB服务可以在安全模式运行,此时任何客户端要连接数据库时需使用用户名和密码。 在JAVA中可使用如下方法连接: boolean auth = db.authenticate(userName, password); 如果用户名密码验证通过,返回值为true,否则为false。 3 获取集合列表 每个数据库都存在零个或多个集合,需要时你可以获得他们的列表: Set colls = d

10、b.getCollectionNames(); for(String s : colls) System.out.println(s); 4 获得一个集合 要获得某个特定集合,你可以指定集合的名字,并使用getCollection()方法: DBCollection coll = db.getCollection(“testCollection“); 当你获取了这个集合对象,你就可以对数据进行增删查改之类的操作。 5 插入文档 当你获得了一个集合对象,你就可以把文档插入到这个对象中。例如,存在一个JSON式的小 文档: “name“ : “MongoDB“, “type“ : “databas

11、e“, “count“ : 1, “info“ : x : 203, 请注意,这个文档包含一个内部文档。我们可以使用BasicDBObject类来创建这个文档,并且 使用insert()方法方便地将它插入到集合中。 BasicDBObject doc = new BasicDBObject(); doc.put(“name“, “MongoDB“); doc.put(“type“, “database“); doc.put(“count“, 1); BasicDBObject info = new BasicDBObject(); info.put(“x“, 203); info.put(“y

12、“, 102); doc.put(“info“, info); coll.insert(doc); 6 使用findOne()查找集合中第一个文档 要查找我们上一步插入的那个文档,可以简单地使用findOne()操作来获取集合中第一个文档。 这个方法返回一个单一文档(这是相对于使用DBCursor的find()操作的返回),这对于只有一 个文档或我们刚插入第一个文档时很有用,因为此时并不需要使用光标。 DBObject myDoc = coll.findOne(); System.out.println(myDoc); 返回类似: “_id“ : “ac907a1f5b9d5e4a233ed3

13、00“ , “name“ : “MongoDB“ , “type“ : 1 , “info“ : “x“ : 203 , 注意_id和_ns元素是由MongoDB自动加入你的文档。记住:MongoDB内部存储使用的元素名 是以“_”做为开始。 7 加入多种文档 为了做更多有趣的查询试验,让我们向集合中加入多种文档类型,像: “i” : value 可以通过循环来实现。 8 统计文档数量 使用getCount()方法 System.out.println(coll.getCount(); 9 使用光标(cursor)来获取全部文档 为了获取集合中的所有文档,我们可以使用find()方法。这个方法

14、返回一上DBCursor对象,来 允许我们将符合查询条件的文档迭代出来。 DBCursor cur = coll.find(); while(cur.hasNext() System.out.println(cur.next(); 10 在查询中获取单一文档 我们可以创建一个查询,并传递给find()方法来获取集合中所有文档的一个子集。例如,我们想 要查询域名为“i“,并且值为71的文档: BasicDBObject query = new BasicDBObject(); query.put(“i“, 71); cur = coll.find(query); while(cur.hasNex

15、t() System.out.println(cur.next(); 11 使用条件查询获取集合 例如,我们想要查询所有i50的文档: BasicDBObject query = new BasicDBObject(); query.put(“i“, new BasicDBObject(“$gt“, 50); cur = coll.find(query); while(cur.hasNext() System.out.println(cur.next(); 当然,我们也可以做20 指定主服务器及端口 -only arg arg specifies a single database to re

16、plicate指定复制的库名字 -slavedelay arg arg specifies delay (in seconds) to be used 丛库检测主库的时间 when applying master ops to slave -autoresync automatically resync if slave data is stale 打印从状态:db.printSlaveReplicationInfo() Replica Sets Replica sets 在主从复制上做的扩展,增加了故障自动切换和自动修复成员节点。保障整个系统的高可用,当primary down掉的时候,se

17、condary可以迎难而上。 主服务器:192.168.78.128:10000 从服务器:192.168.78.129:10000 配置: 192.168.78.128 ./bin/mongod -fork -replSet set1-port=10000 -logpath=data/log/mongodb.log -dbpath=data/db 192.168.78.129 ./bin/mongod -fork -replSet set1 -port=10000 -logpath=data/log/mongodb.log -dbpath=data/db 详细参数见 http:/www.mo

18、ngodb.org/display/DOCS/Replica+Set+Configuration 这里以192.168.78.128作为主服务器 ./bin/mongo -port 10000 config = _id: set1, members: _id: 0, host: 192.168.78.128:10000, _id: 1, host: 192.168.78.129:10000 ; rs.initiate(config); 查看状态 rs.status(); Sharding MongoDB的auto-sharding功能是指mongodb通过mongos 自动建立一个水平扩展的数

19、据库集群系统,将数据库分表 存储在sharding的各个节点上。一个mongodb集群包括一 些shards(包括一些mongod进程),mongos路由进程, 一个或多个config服务器。 一个典型的集群结构如下: Shards 每一个shard包括一个或多个服务和存储数据的mongod进程(mongod是MongoDB 数据的核心进程),典型的每个shard开启多个服务来提高服务的可用性。这些服务 /mongod进程在shard中组成一个复制集。 shard key 为了分割数据集,需要制定分片key的格式,类似于用于索引的key格式,通常由一个或多个字段 组成以分发数据,比如: nam

20、e : 1 _id : 1 lastname : 1, firstname : 1 mongoDB的分片为有序存储,shard key相邻的数据通常会存在同一台服务器(数据块)上。 config server的db中存储的信息如下: Chunks Chunk是MongoDB中一段连续的数据块,是一个来自特殊集合中的一个数据范围,(collection, minKey,maxKey)描叙一个chunk,它介于minKey和maxKey范围之间,默认大小是200M 。 例如chunks 的maxsize大小是100M,如果一个文件达到或超过这个范围时,会被切分到2个新的 chunks中。当一个sh

21、ard的数据过量时,chunks将会被迁移到其他的shards上。同样,chunks也可 以迁移到其他的shards上。 Config Servers Config服务器存储着集群的metadata信息,包括每个服务器,每个shard的基本信息和chunk信息 ,Config服务器主要存储的是chunk信息。每一个config服务器都复制了完整的chunk信息。 Mongos Server 用于提供路由服务,由Client连接,使整个Cluster看起来像单个DB服务器。 例1:搭建一个Cluster,它由4台服务器组成,包括2个Shard,1个Config,1个Route。 其中每个Shar

22、d由一个Mongod组成。 Mongod128:10000Mongod129:10000 Mongos131:30000 Mongod130:20000 Config Servers Mongos Servers Client 注:这个设计有一个缺陷,就是任意一个Mongod挂了,那么Mongos服务器将 错误,整个服务架构将挂掉。 1、mongod 192.168.78.128 ./bin/mongod -fork -shardsvr -port 10000 -dbpath data/db -logpath data/log/mdb.log 192.168.78.129 ./bin/mong

23、od -fork -shardsvr -port 10000 -dbpath data/db -logpath data/log/mdb.log 2、config server 192.168.78.130 ./bin/mongod -configsvr -fork -logpath data/log/config.log -dbpath data/config -port 20000 3、mongos 192.168.78.131 ./bin/mongos -fork -port 30000 -chunkSize 1 -configdb “192.168.78.130:20000“ -log

24、path data/log/mongos.log 4.配置2组Shard: 连接到192.168.78.131 Route Server进程,并切换到admin数据库做以下配置 mongo -port 30000 use admin db.runCommand(addshard:192.168.78.128:10000) db.runCommand(addshard:192.168.78.129:10000) db.runCommand(enablesharding:jjyy) db.runCommand(listshards:1) printShardingStatus() db.runCo

25、mmand(shardcollection:jjyy.cc, key:id:1, unique : true); 例2:搭建一个Cluster,它由4台服务器组成,包括2个Shard,3个Config,1个Route。 其中每个Shard由一个Replica Set组成,每个Replica Set由2个Mongod节点组成。( Sharding+Replica Set) Mongod128:10000 Replica Set1 Mongod129:10000 Mongod130:10000 Replica Set2 Mongod131:10000 Mongos131:30000 Mongod1

26、29:20000 Mongod130:20000 Config Servers Mongos Servers Mongod128:20000 Client 注:这个设计有一个好处,就是任意一个Mongod服务器都有一个备用服务器。 1、四台服务器分别启动相应的Mongod进程: 192.168.78.128 ./bin/mongod -fork -shardsvr -port 10000 -replSet set1 -dbpath data/db -logpath data/log/mdb.log 192.168.78.129 ./bin/mongod -fork -shardsvr -por

27、t 10000 -replSet set1 -dbpath data/db -logpath data/log/mdb.log 192.168.78.130 ./bin/mongod -fork -shardsvr -port 10000 -replSet set2 -dbpath data/db -logpath data/log/mdb.log 192.168.78.131 ./bin/mongod -fork -shardsvr -port 10000 -replSet set2 -dbpath data/db -logpath data/log/mdb.log 服务启动好了之后,可使用

28、 ps -ef|grep mongo查看运行情况,开始使用mongodb了。 2、分别配置2组Replica Sets: 192.168.78.128 ./bin/mongo -port 10000 config = _id: set1, members: _id: 0, host: 192.168.78.128:10000, _id: 1, host: 192.168.78.129:10000 ; rs.initiate(config); rs.status(); 192.168.78.130 ./bin/mongo -port 10000 config = _id: set2, membe

29、rs: _id: 0, host: 192.168.78.130:10000, _id: 1, host: 192.168.78.131:10000 ; rs.initiate(config); rs.status(); 3.配置config Servers: 192.168.78.128 192.168.78.129 192.168.78.130 ./bin/mongod -configsvr -fork -logpath data/log/config.log -dbpath data/config -port 20000 注:config server可以配置多台,mongos启动时指定

30、config server,多个config server之间用英 文逗号隔开,中间注意不要有空格,而且你会发现config server的台数只能为单数不能是双 数。 4.配置1台Route Server: 192.168.78.131 ./bin/mongos -fork -port 30000 -chunkSize 1 -configdb “192.168.78.128:20000,192.168.78.129:20000,192.168.78.130:20000“ -logpath data/log/mongos.log 5.配置2组Shard: 连接到192.168.78.131 R

31、oute Server进程,并切换到admin数据库做以下配置 mongo -port 30000 use admin db.runCommand(addshard:set2/192.168.78.130:10000,192.168.78.131:10000) db.runCommand(addshard:set1/192.168.78.128:10000,192.168.78.129:10000) db.runCommand(enablesharding:jjyy) db.runCommand(listshards:1) printShardingStatus() db.runCommand(shardcollection:jjyy.cc, key:id:1, unique : true); db.jjyy.stats()

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1