常用命令
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 << EOF
systemLog:
destination: file
path: /mongodb/28017/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/28017/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger: #具备事务的引擎
engineConfig:
cacheSizeGB: 1 #缓冲区大小
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
net:
bindIp: 127.0.0.1
port: 28017
replication: #日志
oplogSizeMB: 2048 #日志表大小
replSetName: my_repl #复制集名
EOF
#启动
mongod -f /mongodb/28017/config/mongo.conf
mongod -f /mongodb/28018/config/mongo.conf
mongod -f /mongodb/28019/config/mongo.conf
mongod -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
#多实例配置文件
--sh1
cat > /mongodb/38021/conf/mongodb.conf <<EOF
systemLog:
destination: file
path: /mongodb/38021/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/38021/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 172.16.0.7,127.0.0.1
port: 38021
replication:
oplogSizeMB: 2048
replSetName: sh1
sharding:
clusterRole: shardsvr
processManagement:
fork: true
EOF
cp /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 -i
sed 's#38021#38023#g' /mongodb/38023/conf/mongodb.conf -i
--sh2
cat > /mongodb/38024/conf/mongodb.conf <<EOF
systemLog:
destination: file
path: /mongodb/38024/log/mongodb.log
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/38024/data
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 172.16.0.7,127.0.0.1
port: 38024
replication:
oplogSizeMB: 2048
replSetName: sh2
sharding:
clusterRole: shardsvr
processManagement:
fork: true
EOF
cp /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 -i
sed 's#38024#38026#g' /mongodb/38026/conf/mongodb.conf -i
#启动
mongod -f /mongodb/38021/conf/mongodb.conf
mongod -f /mongodb/38022/conf/mongodb.conf
mongod -f /mongodb/38023/conf/mongodb.conf
mongod -f /mongodb/38024/conf/mongodb.conf
mongod -f /mongodb/38025/conf/mongodb.conf
mongod -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 <<EOF
systemLog:
destination: file
path: /mongodb/38018/log/mongodb.conf
logAppend: true
storage:
journal:
enabled: true
dbPath: /mongodb/38018/data
directoryPerDB: true
#engine: wiredTiger
wiredTiger:
engineConfig:
cacheSizeGB: 1
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
net:
bindIp: 172.16.0.7,127.0.0.1
port: 38018
replication:
oplogSizeMB: 2048
replSetName: configReplSet
sharding:
clusterRole: configsvr
processManagement:
fork: true
EOF
#配置启动文件
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.conf
sed -i 's#38018#38020#g' /mongodb/38020/conf/mongodb.conf
mongod -f /mongodb/38018/conf/mongodb.conf
mongod -f /mongodb/38019/conf/mongodb.conf
mongod -f /mongodb/38020/conf/mongodb.conf
mongo --port 38018 admin
config = {_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 <<EOF
systemLog:
destination: file
path: /mongodb/38017/log/mongos.log
logAppend: true
net:
bindIp: 172.16.0.7,127.0.0.1
port: 38017
sharding:
configDB: configReplSet/172.16.0.7:38018,172.16.0.7:38019,172.16.0.7:38020
processManagement:
fork: true
EOF
#启动
mongos -f /mongodb/38017/conf/mongos.conf
分片集群配置
#连接到其中一个mongos
mongo 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大表进行range
mongo --port 38017 admin
#创建test库的range索引
db.runCommand( { enablesharding : "test" } )
#创建表索引
use test
db.vast.ensureIndex( { id: 1 } )
#开启分片
use admin
db.runCommand( { shardcollection : "test.vast",key : {id: 1} } )
插入数据验证
use test
for(i=1;i<100000;i++){db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()});}
#hash分片结果测试 sh1 和 sh2 验证
mongo --port 38021 test
db.vast.count();
mongo --port 38024 test
db.vast.count();
hash分片
均匀分布
--对cao库下的vast大表进行hash
mongo --port 38017 admin
#创建cao库的哈希索引
db.runCommand( { enablesharding : "cao" } )
#创建表索引
use cao
db.vast.ensureIndex( { id: "hashed" } )
#开启分片
use admin
sh.shardCollection( "cao.vast", { id: "hashed" } )
#插入数据验证
use cao
for(i=1;i<100000;i++){ db.vast.insert({"id":i,"name":"shenzheng","age":70,"date":new Date()}); }
#hash分片结果测试 sh1 和 sh2 验证
mongo --port 38021 cao
db.vast.count();
mongo --port 38024 cao
db.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 config
sh.setBalancerState( true )
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "3:00", stop : "5:00" } } }, true )
查看:
sh.status()
--以下作为了解:
关闭某个集合的balance
sh.disableBalancing("students.grades")
打开某个集合的balancer
sh.enableBalancing("students.grades")
确定某个集合的balance是开启或者关闭
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;