Mongodb使用
来源:互联网 发布:ios软件下载 编辑:程序博客网 时间:2024/06/10 20:01
一、注意事项
1、mongodb的32位版本仅支持存储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.roles的collection中,但不直接访问,而是通过命令访问。
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(继承userAdmin和dbAdmin)
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({“要建立索引字段”:0或1},{“unique”:true}):索引字段对应1为升序,0为降序。unique表示唯一索引,可用于唯一性约束。
db.collection.ensureIndex({“要建立索引字段1”:0或1,“要建立索引字段2”:0或1}):建立联合索引
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记录中的name和address字段
五、数据存储(需要下载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():释放锁
七、集群配置
1、Replica Sets
1、MongoDB通过一组mongod进程,称为副本集,来提供数据的冗余和高可用性。副本集包括一个主节点、多个副节点和仲裁者。增加了故障自动切换和自动修复成员节点,各个 DB 之间数据完全一致,当主节点出现故障后,通过内部的投票,从副节点中选出新的主节点,保证了数据的正常读写。
主节点:提供所有写操作
副节点:与主节点保持相同的数据,
仲裁者:不存储数据,只可以在故障的时候参与主节点投票
一套副本可以有多达12个成员。然而,只有 7成员可以投票一次。
一套副本的最低要求是:主节点,一个副节点和一个仲裁者。
2、replSet配置:
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,所有表示开启了认证,可以先注释replSet和keyFile参数,先启动服务并连接创建用户,以便后面的操作可以继续。
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)
2、Sharding
1)这是一种将海量的数据水平扩展的数据库集群系统,数据分表存储在 sharding 的各个节点上,使用者通过简单的配置就可以很方便地构建一个分布式 MongoDB 集群。
MongoDB 的数据分块称为 chunk。每个 chunk 都是 Collection 中一段连续的数据记录,默认最大尺寸是200MB,超出则生成新的数据块。
要构建一个 MongoDB Sharding Cluster,需要三种角色: l
Shard Server
即存储实际数据的分片,每个 Shard 可以是一个 mongod 实例,也可以是一组 mongod 实例 构成的 Replica Set。为了实现每个 Shard 内部的 auto-failover,MongoDB 官方建议每个 Shard 为一组 Replica Set。 l
Config Server
为了将一个特定的 collection 存储在多个 shard 中,需要为该 collection 指定一个 shard key, 例如{age: 1} ,shard key 可以决定该条记录属于哪个 chunk。Config 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片键只支持单键,最有利于打散数据。在设置片键前,要先确保有这样组合的一个索引,否则会报错。
3、ReplSet+Sharding
通常集群部署采用replSet+sharding,有利于容错,又有利于水平扩展,安装上面的两种配置顺序搭建。sharding的shardsvr角色有一组replSet担任,在同一组replSet各添加replSet参数即可。
- Mongodb--Python使用mongodb
- Mongodb使用
- MongoDB使用
- MongoDB使用
- Mongodb使用
- mongoDB使用
- MongoDb使用
- MongoDB使用
- MongoDB使用
- mongodb使用
- mongodb使用
- MongoDB使用
- 使用 MongoDB
- Mongodb使用
- 安装mongodb和使用mongodb
- mongodb 使用 - basic
- mongodb 使用- capped
- MONGODB内存使用分析
- SharePoint中开发自定义Timer Job
- hdu1004
- POJ2431 Expedition
- 无指定协议名时,浏览器对URL的解析
- nodejs学习笔记
- Mongodb使用
- SUSE 11中安装gcc开发环境
- 算法导论21(用于不相交集合的数据结构)
- 还是畅通工程(并查集+最小生成树)
- 数据结构 第四章 字符串和多维数组
- 引导滤波
- NYoj-16-矩形嵌套-dp
- 博弈(各类取石子)
- 使用JVM TI技术插装字节码,实现Java代码执行控监Agent