Mongodb使用

来源:互联网 发布:ios软件下载 编辑:程序博客网 时间:2024/06/10 20:01


一、注意事项

1、mongodb32位版本仅支持存储2gb的数据(包括索引等所有数据),而64位则无限制。

2、Mongodb使用内存映射数据,存储需要消耗大量的RAM,至少需要满足足够存储所有索引和热数据的物理内存,否则会大大影响性能。

3、在内存足够的情况下,mongodb的访问、存储性能好。

4、每个数据库的名称空间数量有限(默认每个数据库中使用集合限定在24000),每个collection以及索引都算作namespace。当collection和索引数量过多时,会报错“too many namespaces/collections”。解决方案:通过修改启动参数--nssize,用于指定.ns文件(存储名称空间)大小(默认16Mb),并重启服务,使用客户端输入命令:db.repairDatabase(),进行自动修复即可

二、安装

1、下载官方压缩包,解压,如到D:/Program Files/mongodb下。

 

2、进入D:/Program Files/mongodb,创建相关文件夹及文件

数据文件夹:data

日志文件夹:log

日志文件:mongod.log

mongodb启动配置文件:mongodb.cnf

写入配置:

bind_ip=127.0.0.1#服务器ip

port=27017#服务器端口

dbpath=D:/Program Files/MongoDB/data#数据库存储路径

logpath=D:/Program Files/MongoDB/log/mongo.log#日志文件

logappend=true#日志追加模式

journal=true#开启日志

auth=true#开启用户验证

directoryperdb=true#开启分库文件夹

nssize=16#修改存储名称空间文件(.ns)大小(默认16MB

httpinterface=true#开启自带的web监控界面 ,默认端口:28017

(更多参数,可在mongod.exe--help了解,修改配置后要重启服务)

 

3、打开cmd命令窗口,进入D:/Program Files/mongodb/bin,安装服务,输入命令:

 mongod -f "D:\Program Files\MongoDB\mongodb.cnf" --service 

 

4、进入服务,修改mongodb开机启动服务。

三、用户和角色

1、角色

角色可以继承,继承的角色拥有被继承角色的所有权限。

角色可以继承同一个数据库中的角色,而在admin数据库中创建的角色可以继承任何其他数据库创建的角色。

角色存储与admin数据库中system.rolescollection中,但不直接访问,而是通过命令访问。

a、创建角色:

db.runCommand({ 

createRole: "<new role>",  privileges: [    { resource: { <resource> }, actions: [ "<action>", ... ] },    ...  ],  roles: [    { role: "<role>", db: "<database>" } | "<role>",    ...  ],  writeConcern: <write concern document>}

})

详细参数见:http://docs.mongodb.org/master/reference/command/createRole/#dbcmd.createRole

 

b、删除角色:

db.runCommand({  dropRole: "<role>",  writeConcern: { <write concern> }

})

详细参数见:http://docs.mongodb.org/master/reference/command/dropRole/#dbcmd.dropRole

 

 

<role name>:角色名。

<database>:数据库名。

<resource>:{ db: <database>, collection: <collection> }

或者{ cluster : true }(代表使用集群)。

<collection>:指定操作的collection,若不指定,则用””。

<action>:操作动作。

<write concern document>:

w参数:

1:(默认)

0

<大于1>

"majority"

j参数:

wtimeout参数(仅对w值大于1有效):

 

c、系统角色

1)、数据库用户角色:

read 

readWrite

数据库管理角色:

userAdmin

dbAdmin

dbOwner(继承userAdmindbAdmin

2)、集群管理角色:

clusterAdmin

clusterManager

clusterMonitor

hostManger

3)、备份和恢复角色:

back

restore

4)、所有数据库角色:

readAnyDatabase

readWriteAndDatabase

userAdminAnyDatabase

dbAdminAnyDatabase

5)、超级用户角色:

root

2、用户

a、创建用户

db.runCommand({ createUser: "<name>",  pwd: "<cleartext password>",  customData: { <any information> },  roles: [    { role: "<role>", db: "<database>" } | "<role>",    ...  ],  writeConcern: { <write concern> }

})

或者

db.createUser({

user:”<name>”,

pwd: "<cleartext password>",   customData: { <any information> },   roles: [    { role: "<role>", db: "<database>" } | "<role>",    ...   ],   writeConcern: { <write concern> }

 

})

b、验证权限

db.runCommand({

usersInfo:”<username>”,

showPrivileages:true

})

 

customData:可选项,用于存储任何数据 管理员希望与这个特定的用户。 例如这可能是用户的全名或雇员id

详细参数见:http://docs.mongodb.org/master/reference/command/createUser/#dbcmd.createUser

 

 

四、mongodb客户端

开启mongodb服务后,打开D:/Program Files/mongodb/bin,双击mongod.exe,运行或者在命令窗口切换到该路径下,输入mongo命令。

常用命令:(collection应替换为具体的collection名称)

db:查看当前数据库

show collections:查看当前db所有collection

show db:查看所有db

db.auth(“用户名”,”密码”):登录验证用户 

db.collection.find():查看collection

db.collection.ensureIndex({“要建立索引字段”:01},{“unique”:true}):索引字段对应1为升序,0为降序。unique表示唯一索引,可用于唯一性约束。

db.collection.ensureIndex({“要建立索引字段1”:01,“要建立索引字段2”:01}):建立联合索引

db.collection.reIndex():重新建立索引

db.collection.dropIndex(“索引名”):删除索引

db.collection.totalIndexSize():当前collection索引数量

查找命令:

db.users.find({age:{$gt:18},name:{$exists:true}},{name:1,address:1}).limit(5):查出符合存在name字段且age大于18记录中的nameaddress字段

 

 

五、数据存储(需要下载java驱动jar)

1、用户验证并获取数据库对象

ServerAddress sa = new ServerAddress("localhost", 27017);

MongoCredential mc = MongoCredential.createMongoCRCredential("test", "test", "test".toCharArray());

Mongo mongo = new MongoClient(sa, Arrays.asList(mc));

DB db = mongo.getDB("test");

 

2、非二进制数据存储

Mongdb使用collection存储数据,类似关系数据库的表。使用DBObject存储键值对的数据(包括嵌套数据),会自动创建对应的

DBCollection collection = db.getCollection("default");

DBObject cat = new BasicDBObject();

cat.put("color", "white");

DBObject animal = new BasicDBObject();

animal.put("cat", cat);

collection.insert(animal);

//查询

DBObject query = new BasicDBObject("cat", cat);

DBCursor cursor = collection.find(query);

while(cursor.hasNext()){

DBObject obj = cursor.next();

//TODO

}

//更新

DBObject updateCondition=new BasicDBObject();

updateCondition.put("name", "animal");

DBObject updatedValue=new BasicDBObject();

updatedValue.put("headers", 3);

updatedValue.put("legs", 4);

DBObject updateSetValue=new BasicDBObject("$set",updatedValue);

/**

 * update insert_test set headers=3 and legs=4 where name='fox'

 * updateCondition:更新条件

 * updateSetValue:设置的新值

 */

collection.update(updateCondition, updateSetValue);

//删除

collection.remove(animal);

 

 

4、二进制数据存储

Mongodb对于大文件存储,使用GridFS

InputStream ips = new FileInputStream(“d:/a.png”);

GridFS fs = new GridFS(db);

GridFSInputFile gif = fs.createFile(ips, “picture”);

gif.save();

 

使用mongouve查看

 

六、数据备份和恢复

1、Mongodb 支持热备份,使用mongodump.exe进行备份。

命令:mongodump -d 备份数据库名 -o 备份数据位置(相对路径位于mongodb/bin下)

 

2、Mongorestore.exe进行恢复

命令:mongorestore -d 恢复数据库名 --drop 备份位置/备份数据库名

参数drop表示恢复前删除集合(若存在)

 

3、上面的方式不能保证数据的实时性,不能保证内存或缓存的数据全部写入磁盘中,使用fsync+lock的方式,强制将全部数据写入磁盘并上锁(用于admin数据库),后面所有读写操作均为阻塞状态直到释放锁。

命令:

db.runCommand({“fsync”:1,”lock”:1}):上锁并全部数据写出到磁盘

db.currentOp():查看当前锁状态

db.$cmd.sys.unlock.findOne():释放锁

 

七、集群配置

1Replica Sets

1MongoDB通过一组mongod进程,称为副本集,来提供数据的冗余和高可用性。副本集包括一个主节点、多个副节点和仲裁者。增加了故障自动切换和自动修复成员节点,各个 DB 之间数据完全一致,当主节点出现故障后,通过内部的投票,从副节点中选出新的主节点,保证了数据的正常读写。

主节点:提供所有写操作

副节点:与主节点保持相同的数据,

仲裁者:不存储数据,只可以在故障的时候参与主节点投票

一套副本可以有多达12个成员。然而,只有 7成员可以投票一次。

一套副本的最低要求是:主节点,一个副节点和一个仲裁者。 

 

2replSet配置:

a、添加启动参数,并启动mongod(下面为参考配置文件)

#replSet

configsvr=true#replSet特有参数

port=3002

dbpath=D:/Program Files/MongoDB2.6/data/rs1/data

logpath=D:/Program Files/MongoDB2.6/log/rs1/log/rs1.log

directoryperdb=true 

logappend=true

keyFile=D:/Program Files/MongoDB2.6/mongodb.key#同一个集合使用相同的keyFile,用于内部认证

 

注意:

Linux下创建keyFile

openssl rand -base64 741 > mongo.key

chmod 0600 mongo.key#设置好访问权限

keyFile继承了auth,所有表示开启了认证,可以先注释replSetkeyFile参数,先启动服务并连接创建用户,以便后面的操作可以继续。

 

b、连接其中一个mongod,初始化配置。最外层的_id表示replica set的名字,members里包含的是所有节点的地址以及优先级。优先级最高的即成为主节点。对于仲裁节点,需要有个特别的配置——arbiterOnly:true。这个千万不能少了,不然主备模式就不能生效。

连接其中一个mongod,初始化replset

cfg={ _id:"testrs", members:[ {_id:0,host:'127.0.0.1:27020',priority:2}, {_id:1,host:'127.0.0.1:27021',priority:1}, {_id:2,host:'127.0.0.1:27022',arbiterOnly:true}] };

rs.initiate(cfg)

2Sharding

1)这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在 sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式 MongoDB 集群。  

MongoDB 的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,默认最大尺寸是200MB,超出则生成新的数据块。  

要构建一个 MongoDB Sharding Cluster,需要三种角色: l 

Shard Server 

即存储实际数据的分片,每个 Shard 可以是一个 mongod 实例,也可以是一组 mongod 实例 构成的 Replica Set。为了实现每个 Shard 内部的 auto-failoverMongoDB 官方建议每个 Shard 为一组 Replica Set。 l 

Config Server 

为了将一个特定的 collection 存储在多个 shard 中,需要为该 collection 指定一个 shard key, 例如{age: 1} shard key 可以决定该条记录属于哪个 chunkConfig Servers 就是用来存储: 所有 shard 节点的配置信息、每个 chunk 的 shard key 范围、chunk 在各 shard 的分布情况、 该集群中所有 DB 和 collection 的 sharding 配置信息。 l 

Route Process(mongos) 

这是一个前端路由,客户端由此接入,然后询问 Config Servers 需要到哪个 Shard 上查询或 保存记录,再连接相应的 Shard 进行操作,最后将结果返回给客户端。客户端只需要将原本 发给 mongod 的查询或更新请求原封不动地发给 Routing Process,而不必关心所操作的记录 存储在哪个 Shard 上。 

 

 

2)添加参数并启动:

Sharding角色(通过mongod命令启动):--shardsvr --keyFile

Config角色(通过mongod命令启动):--configsvr--keyFile

Mongos角色(通过mongos命令启动):configdb(奇数个confid地址,有多个mongos实例时,顺序要一致),--keyFile,不用配置dbpath

 

3)连接mongos验证身份后设置分片

sh.addShard("<replSet名称>/<从属地址>");地址多个用逗号隔开如:

sh.addShard(“rs1/192.168.0.23:3000,192.168.0.45:3000,192.168.0.78:3000”);

开启数据库分片

sh.enableSharding(<数据库名>);

设置collection分片,通过设置片键(类似索引)使db按照片键排序分块。片键支持升序、降序和哈希排序。

sh.shardCollection("<数据库名>.<collection>",{"_id":"hashed"});

注意:

片键的选择,既要让数据尽可能分散,有利于写操作,又要让经常读取的数据尽可能在一起,这样可以保持在ram中,有利于读操作。Hashed片键只支持单键,最有利于打散数据。在设置片键前,要先确保有这样组合的一个索引,否则会报错。

 

3ReplSet+Sharding

通常集群部署采用replSet+sharding,有利于容错,又有利于水平扩展,安装上面的两种配置顺序搭建。shardingshardsvr角色有一组replSet担任,在同一组replSet各添加replSet参数即可。

 

 

 

 

 

 

0 0
原创粉丝点击