常用命令
db 查看当前路径use 切换库,没有库的时候自动创建show tables; 查看当前库的表db.stats() 查看库的状态--命令种类数据库对象(库(database),表(collection),行(document))db.help(); 查询db下的所有命令帮助--表的操作(集合)> db.createCollection('1')> db.createCollection('2')> show collections> db.getCollectionNames()--行的操作#插入> db.stu.insert({id:101,name:"zhangsan",age:20,gender:"n"})> db.stu.insert({a:"b",c:"d"})> db.stu.insert({a:1,c:2})#查询> db.stu.find().pretty()> db.stu.findOne() #查询第一条> db.stu.count() #查询总行数> db.stu.remove({}) #删除记录中所有的记录,也可以按条件删> db.stu.distinct("name") #查询去掉当前集合中某列的重复数据#删除> use app> db.log.drop()#重命名> db.test.renameCollection("test1")#for循环批量插入for(i=1;i<10001;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"data":new Date()})}#查看集合存储信息> db.log.stats()> db.log.totalSize() #集合中索引+数据压缩存储之后的大小> db.log.dataSize() #集合中数据的原始大小> db.log.totalIndexSize() #集合中索引数据的原始大小> db.log.storageSize() #集合中数据压缩存储的大小
复制集(relication set)
rs.help()
至少三个节点,1主两从,主宕机后会内部自动投票选取新的主节点,并自动切换从库默认是不让读写的,需要rs.slaveOk()


搭建测试环境
#多实例目录配置mkdir -p /mongodb/280{17,18,19,20}/conf /mongodb/280{17,18,19,20}/data /mongodb/280{17,18,19,20}/log#多实例配置文件模板(四台机器都配置,注意路径和端口)cat > /mongodb/28017/conf/mongod.conf << EOFsystemLog:destination: filepath: /mongodb/28017/log/mongodb.loglogAppend: truestorage:journal:enabled: truedbPath: /mongodb/28017/datadirectoryPerDB: true#engine: wiredTigerwiredTiger: #具备事务的引擎engineConfig:cacheSizeGB: 1 #缓冲区大小directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: trueprocessManagement:fork: truenet:bindIp: 127.0.0.1port: 28017replication: #日志oplogSizeMB: 2048 #日志表大小replSetName: my_repl #复制集名EOF#启动mongod -f /mongodb/28017/config/mongo.confmongod -f /mongodb/28018/config/mongo.confmongod -f /mongodb/28019/config/mongo.confmongod -f /mongodb/28020/config/mongo.conf
配置普通复制集
rs必须要三个节点才能建立,因为要投票选举主节点
一主两从的方式比较耗资源,所以一般都是一主一从一arbiter来搭建(arbiter只用来选举)
#一主两从,从库普通从库mogo --port 28017 admin#设置rs配置参数config = {_id:"my_repl",members:[{_id:0,host:"127.0.0.1:28017"},{_id:1,host:"127.0.0.1:28018"},{_id:2,host:"127.0.0.1:28019"}]}#构建rs.initiate(config)#查询复制集状态rs.status()#一主一从一arbiter配置参数config = {_id:"my_repl",members:[{_id:0,host:"127.0.0.1:28017"},{_id:1,host:"127.0.0.1:28018"},{_id:2,host:"127.0.0.1:28019","arbiterOnly":true}]}
管理复制集
#查询rs.status() //查看整体复制集状态rs.isMster() //查看谁是master主节点rs.conf() //查看复制集配置信息#添加删除rs.remove("127.0.0.1:28017") #删除一个节点rs.add("127.0.0.1:28017") #添加一个节点rs.addArb(“127.0.0.1:28017”) #添加一个arbiter节点
分片集群(sharding cluster)
sh.help()
10个实例:398017-38027需要两组shard节点,一组config节点(不能有arbiter)和一个mongos节点

搭建两组rs的环境
#多实例目录创建mkdir -p /mongodb/380{21,22,23,24,25,26}/conf /mongodb/380{21,22,23,24,25,26}/log /mongodb/380{21,22,23,24,25,26}/data#多实例配置文件--sh1cat > /mongodb/38021/conf/mongodb.conf <<EOFsystemLog:destination: filepath: /mongodb/38021/log/mongodb.loglogAppend: truestorage:journal:enabled: truedbPath: /mongodb/38021/datadirectoryPerDB: true#engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: truenet:bindIp: 172.16.0.7,127.0.0.1port: 38021replication:oplogSizeMB: 2048replSetName: sh1sharding:clusterRole: shardsvrprocessManagement:fork: trueEOFcp /mongodb/38021/conf/mongodb.conf /mongodb/38022/conf/cp /mongodb/38021/conf/mongodb.conf /mongodb/38023/conf/sed 's#38021#38022#g' /mongodb/38022/conf/mongodb.conf -ised 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i--sh2cat > /mongodb/38024/conf/mongodb.conf <<EOFsystemLog:destination: filepath: /mongodb/38024/log/mongodb.loglogAppend: truestorage:journal:enabled: truedbPath: /mongodb/38024/datadirectoryPerDB: truewiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: truenet:bindIp: 172.16.0.7,127.0.0.1port: 38024replication:oplogSizeMB: 2048replSetName: sh2sharding:clusterRole: shardsvrprocessManagement:fork: trueEOFcp /mongodb/38024/conf/mongodb.conf /mongodb/38025/conf/cp /mongodb/38024/conf/mongodb.conf /mongodb/38026/conf/sed 's#38024#38025#g' /mongodb/38025/conf/mongodb.conf -ised 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i#启动mongod -f /mongodb/38021/conf/mongodb.confmongod -f /mongodb/38022/conf/mongodb.confmongod -f /mongodb/38023/conf/mongodb.confmongod -f /mongodb/38024/conf/mongodb.confmongod -f /mongodb/38025/conf/mongodb.confmongod -f /mongodb/38026/conf/mongodb.conf
配置两组rs的节点
mongo --port 38021 admin#第一组rs的配置参数config = {_id: 'sh1', members: [{_id: 0, host: '172.16.0.7:38021'},{_id: 1, host: '172.16.0.7:38022'},{_id: 2, host: '172.16.0.7:38023',"arbiterOnly":true}]}#第一组启动rs.initiate(config)mongo --port 38024#第二组的rs配置参数config = {_id: 'sh2', members: [{_id: 0, host: '172.16.0.7:38024'},{_id: 1, host: '172.16.0.7:38025'},{_id: 2, host: '172.16.0.7:38026',"arbiterOnly":true}]}#第二组启动rs.initiate(config)
配置config节点
mkdir -p /mongodb/380{18,19,20}/conf /mongodb/380{18,19,20}/log /mongodb/380{18,19,20}/data#修改配置文件cat > /mongodb/38018/conf/mongodb.conf <<EOFsystemLog:destination: filepath: /mongodb/38018/log/mongodb.conflogAppend: truestorage:journal:enabled: truedbPath: /mongodb/38018/datadirectoryPerDB: true#engine: wiredTigerwiredTiger:engineConfig:cacheSizeGB: 1directoryForIndexes: truecollectionConfig:blockCompressor: zlibindexConfig:prefixCompression: truenet:bindIp: 172.16.0.7,127.0.0.1port: 38018replication:oplogSizeMB: 2048replSetName: configReplSetsharding:clusterRole: configsvrprocessManagement:fork: trueEOF#配置启动文件cp /mongodb/38018/conf/mongodb.conf /mongodb/38019/conf/cp /mongodb/38018/conf/mongodb.conf /mongodb/38020/conf/sed -i 's#38018#38019#g' /mongodb/38019/conf/mongodb.confsed -i 's#38018#38020#g' /mongodb/38020/conf/mongodb.confmongod -f /mongodb/38018/conf/mongodb.confmongod -f /mongodb/38019/conf/mongodb.confmongod -f /mongodb/38020/conf/mongodb.confmongo --port 38018 adminconfig = {_id: 'configReplSet', members: [{_id: 0, host: '172.16.0.7:38018'},{_id: 1, host: '172.16.0.7:38019'},{_id: 2, host: '172.16.0.7:38020'}]}rs.initiate(config)注:configserver 可以是一个节点,官方建议复制集。configserver不能有arbiter。新版本中,要求必须是复制集。注:mongodb 3.4之后,虽然要求config server为replica set,但是不支持arbiter
配置mongos节点
mkdir -p /mongodb/38017/conf /mongodb/38017/log#修改配置文件cat > /mongodb/38017/conf/mongos.conf <<EOFsystemLog:destination: filepath: /mongodb/38017/log/mongos.loglogAppend: truenet:bindIp: 172.16.0.7,127.0.0.1port: 38017sharding:configDB: configReplSet/172.16.0.7:38018,172.16.0.7:38019,172.16.0.7:38020processManagement:fork: trueEOF#启动mongos -f /mongodb/38017/conf/mongos.conf
分片集群配置
#连接到其中一个mongosmongo 172.16.0.7:38017/admin#添加分片db.runCommand( { addshard : "sh1/172.16.0.7:38021,172.16.0.7:38022,172.16.0.7:38023",name:"sh1"} )db.runCommand( { addshard : "sh2/172.16.0.7:38024,172.16.0.7:38025,172.16.0.7:38026",name:"sh2"} )#整体状态查看sh.status();#列出分片db.runCommand( { listshards : 1 } )
range分片
一个节点上限后才会使用下个节点
--对test库下的vast大表进行rangemongo --port 38017 admin#创建test库的range索引db.runCommand( { enablesharding : "test" } )#创建表索引use testdb.vast.ensureIndex( { id: 1 } )#开启分片use admindb.runCommand( { shardcollection : "test.vast",key : {id: 1} } )插入数据验证use testfor(i=1;i<100000;i++){db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()});}#hash分片结果测试 sh1 和 sh2 验证mongo --port 38021 testdb.vast.count();mongo --port 38024 testdb.vast.count();
hash分片
均匀分布
--对cao库下的vast大表进行hashmongo --port 38017 admin#创建cao库的哈希索引db.runCommand( { enablesharding : "cao" } )#创建表索引use caodb.vast.ensureIndex( { id: "hashed" } )#开启分片use adminsh.shardCollection( "cao.vast", { id: "hashed" } )#插入数据验证use caofor(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }#hash分片结果测试 sh1 和 sh2 验证mongo --port 38021 caodb.vast.count();mongo --port 38024 caodb.vast.count();
sharding cluster管理操作
#mongos节点下 查询节点综合信息db.vast.count()删除分片节点会立即触发blancer,所以生产不用#admin节点下,添加节点db.runCommand( { addshard : "sh2/10.0.0.51:38024,10.0.0.51:38025,10.0.0.51:38026",name:"shard2"} )
balancer操作
mongos的一个重要功能,自动巡查shard节点的chunk情况,自动做chunk迁移
什么时候工作:1、自动运行,会检测系统不繁忙的时候做迁移2、在做节点删除的时候,立即开始迁移工作3、balancer只能在预设定的时间窗口运行#备份的时候可以关闭blancer防止备份文件损坏,备份完再开启mongos> sh.stopBalancer()mongos> sh.startBalancer()#自定义进行的时间段use configsh.setBalancerState( true )db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )查看:sh.status()--以下作为了解:关闭某个集合的balancesh.disableBalancing("students.grades")打开某个集合的balancersh.enableBalancing("students.grades")确定某个集合的balance是开启或者关闭db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
