./mongod --args --auth
添加用户(表级) use admin db.addUser('sa', 'root' false); // 超级管理员 use test db.addUser('web', 'web123', true); // 添加表的账号 修改密码 db.changeUserPassword('web','web321'); 删除用户 db.removeUser('web'); 认证 db.auth('sa','passwd'); 用户角色(略) 详细请查看
导出与导入(备份与恢复) 导出 mongoexport-h host
-port 端口
-u 用户名
-p 密码
-d 库名
-c 表名 collection
-f 列名
-o 导出的文件名
-q 查询条件
--csv 导出csv格式文件 (便于和传统数据库交换数据)
./bin/mongoexport -d test -c stu -f sn,name -q'{sn:{$lte:1000}}' -o ./test.stu.json 导入 mongoimport -d 待导入的数据库 -c 待带入的表 --type 导入格式 --file 带入的文件 ./bin/mongoimport -d test -c animal --type json --file ./test.stu.json ./bin/mongoimport -d test -c bird --type csv -f sn,name --headerline --file ./test.stu.csv 二进制导入导出 mongodump 导出二进制bson结构的数据及其索引文件,默认放在mongo 的dump目录下面 导出文件为 a.bson(数据文件) a.metadata.json(描述文件) -d 库名 -c 表名 -f field1,field2...列名 不声明表名会导出所有的库和表 mongorestore数据与索引全回复
./bin/mongorestore -d test --directoryperdb dump/test replication set 复制集 replication set 多台服务器维护相同的数据副本,提高服务器的高可用性 原理类似mysql的读写分离
启动 --replSet rs2 // 建立复制集 ./bin/mongod --dbpath /home/m17 --logpath /home/mlog/m17.log --fork --port 27017 --replSet rs2 (--smallfiles) ./bin/mongod --dbpath /home/m18 --logpath /home/mlog/m18.log --fork --port 27018 --replSet rs2 (--smallfiles) ./bin/mongod --dbpath /home/m19 --logpath /home/mlog/m19.log --fork --port 27019 --replSet rs2 (--smallfiles)三个实例都属于相同的复制集
配置 use admin var rsconf = { _id:'rs2', // 复制集名称 //复制集成员 members:[ { _id:0, // id 为 0 的默认为primary host:'192.168.1.202:27017' }, { _id:1, host:'192.168.1.202:27018' }, { _id:2, host:'192.168.1.202:27019' } ] } // 初始化 rs.initiate(rsconf) rs.status(); rs.conf();添加,删除节点:
rs.remove('192.168.1.202.27019') rs.reconfig(rsconf) // reconf 包含需要加上的实例 主从一致从服务器默认不允许读写
在从服务器中执行 rs.slaveOk(); 即可读取数据
primary 服务器挂掉之后,MongoDb 会将从服务器中的一个设置为 primary 服务器
shard 分片将数据分到不同的服务器上面
mongos 路由器
configsvr 不存储真正的数据,只存储meta信息,及"某条数据在那个分片上"的信息 mongos查询某条数据时,先从configsvr查找数据在那个分片上面,再从shard上面取出.
分片有如下要素 要有大于二的mongod服务做片节点 要有 configsvr 维护 meta 信息 要启动 mongos 做路由器 要设定好数据的分片规则 (configsvr 才能维护) 启动 configsvr启动时加上参数 --configsvr
启动 mongos 路由器 ./bin/mongos --logpath /home/mlog/m30.log --fork --port 30000 --configdb 192.168.1.202.27020 // 设置 configsvr 服务器 ./bin/mongo --port 30000 // 连接到 mongos 路由器 sh.addShard('192.168.1.202:27017'); // 增加片节点 sh.addShard('192.168.1.202:27018'); // 增加片节点 sh.status() // 查看节点信息 数据分片规则 sh.enableSharding('shop'); // 启用分片的库 sh.shardCollection('shop.goods', {field :1}); // 启用分片的表 field 为 shard key 一般为主键mongodb 不是从单篇文档的级别,绝对平均的散落在各个片上.
而是N篇文档,形成一个块"chunk",优先放在某个片上 当这个片上的chunk,比另一个片的chunk,区别比较大时,(>=3),会把本片上的chunk,移到另一个片上,以chunk为单位,维护片之间的数据平衡;
chunk的默认大小为64M
// 修改chunk的默认大小 use config db.setting.save({_id:'chunksize'},{$set:{value:4}}) 一个片chunk过多,就会将chunk移动到另外一个片上面.频繁的chunk移动,会带来较大的服务器IO负担解决方法:手动预先分片
手动预先分片 monngos> sh.shardCollection('shop.user, {userid:1}'); // 启用分片的集合,用 userid 做 shard key for (var i = 1; i <= 40000; i++) { sh.splitAt('shop.user',{userid:i*1000}); // 分了40个块 } 预先分块, 插入数据的时候自动用 userid 生成chunk(全是空的),已经分好的块,不会来回移动.但是不能修改 分片与 replication set 结合将每个 replication 都当做是一个片就ok
mongos> sh.addShard('rs3/192.168.1.203:27017'); sh.addShard('repName/IP:PORT');
Example { name:'wukong', jingu:true, sex:'m', age:500 } { $set:{name:'dzsf(斗战圣佛)'}, $unset:{jingu:1}, $rename:{sex:'gender'}, $inc:{age:1} } # 取出不属于3和11的栏目 $and 实现 db.goods.find( { $and: [ { cat_id{$ne:3} }, { cat_id{$ne:11} } ] } ); $nin 实现 db.goods.find( { cat_id{$nin:[3,11]} }, { cat_id:1, goods_name:1, _id:0 } ); $nor 实现 db.goods.find( { $nor: [ {cat_id:3}, {cat_id:11} ] }, { cat_id:1, goods_name:1, _id:0 } ); // 子文档索引 db.shop.insert( { name:'Nokia', spc:{ weight:120, area:'taiwan' } } ); db.shop.find( {'spc.area':'taiwan'} ); db.shop.ensureIndex('spc.area':1);