十四. GridFS文件系统(分布式)
1. GridFS是mongoDB自带的文件系统, 用二进制的形式存储大型文件系统
2. 利用工具mongofiles.exe
3. 使用GridFS
3.1 查看GridFS的所有功能
cmd->mongofiles 自带命令,cmd下可以直接访问
3.2 上传一个文件
//-d 选择数据库
//–l 选择本地地址
//put 添加上传
Mongofiles –d foobar –l“E:\a.txt” put “a.txt”
3.3 查看GridFS的文件存储状态
利用VUE查看
用集合查看
db.fs.chunks.find()
db.fs.files.find() //能查到更详细的信息
//存储了文件系统的所有文件信息
3.4 查看文件内容
C:\user\thinkpad>mongofiles–d foobar get “a.txt”
//在VUE可以查看,shell无法打开文件
3.5 查看所有文件
mongofiles –d foobarlist
3.6 删除已经存在的文件/或在VUE中操作
mongofiles –d foobardelete “a.txt”
十五. 服务器端脚本
1. Eval
服务器端运行eval,可以直接执行js代码
db.eval({“function(name){returnname}”,”uspcat”) //马上执行,传入”uspcat”作为参数
2. Javascript的存储
在服务器上保存js变量或者函数,供全局调用
2.1 把变量加载到特殊集合system.js中
db.system.js.insert({_id:name,value:”uspcat”})
//uspcat以后就是全局变量
//调用db.eval(“return name”)
2.2 调用
db.system.js.insert({_id:”showName”,value:function(){return12}})
db.eval(“showName()”) //12
//system.js相当于Oracle中的存储过程,因为value可以写变量和函数体(js代码)
十六. mongoDB 启动配置
1. 启动项mongod –help
--dbpath 指定数据库的目录,默认(在window下)是c:\data\db\
--port 指定服务器监听的端口号,默认是2701
--fork 用守护进程的方式启动mongoDB
--logpath 指定日志的输出路径,默认是控制台
--config 指定启动项用到的文件的路径
--auth 用安全认证方式启动数据库
1.1 利用config配置文件来启动数据库改变端口为8888
mongodb.conf文件///////mongod.bat
dbpath=D:\sortsare\mongod\db
port=8888
启动文件
cd C:\Users\thinkpad\Desktop\MONGODB\mongodb-win32-x86_64-2.0.6bin\mongod.exe –config ../mongodb.conf
shell文件 /////mongod8888.bat
mongo 127.0.0.1:8888
在浏览器输入: localhost:9888
2. 停止mongoDB服务
1.1 ctrl+c组合键可以关闭数据库
1.2 admin数据库命令关闭数据库
>use admin
>db.shutdownServer()
十七. 导出,导入,运行时备份
1. 导出数据(中断其他操作)
打开CMD
利用mongoexport(cmd操作)
-d 指明使用的库
-c 指明要导出的表(集合)
-o 指明要导出到哪里(路径)
-csv 制定导出的csv格式
-q 过滤导出
--type <json|csv|tsv> 导出的格式
1.1 把数据从foobar中的persons导出(cmd操作)
mongoexport –d foobar –c persons –oD:/persons.json
1.2 导出其他主机数据库的文档(cmd操作)
mongoexport –host192.168.0.16 –port 37017
2. 导入数据(中断其他操作)
API
http://cn.docs.mongodb.org/manual/reference/mongoimport/
//倒入persons文件(cmd操作)
mongoimport --dbfoobar --collection persons --file d:/persons.json
3. 运行时备份
1.1 运行时备份 mongodump
API
http://cn.docs.mongodb.org/manual/reference/mongodump
//导出127.0.0.1服务下的27017的foobar数据库
mongodump –host127.0.0.1:27017 -d foobar -o d:/foobar
1.2 运行时恢复mongorestore
API
http://cn.docs.mongodb.org/manual/reference/mongodump
//删除原本的数据库,用3.1导出的数据库恢复
db.dropDatabase() ///删除数据库
//cmd下操作
mongorestore --host127.0.0.1:27017 -d foobar -directoryperdb d:/foobar/foobar
1.3 懒人备份
mongoDB是文件数据库,可以用拷贝文件的方式进行备份
十八. Fsync锁,数据修复
1. Fsync的使用
读写操作à缓存池à数据库
//上锁可以让缓存池的数据全部进到数据库
2. 上锁和解锁
上锁:
>use admin
>db.runCommand({fsync:1,lock:1})
解锁: db.currentOp()
3. 数据修复(影响性能)
当遇到停电等不可逆灾难,mongodb由于存储结构原因会导致产生垃圾数据,在数据恢复以后依然存在,这是数据库提供的自我修复的能力,并清理垃圾
db.repairDatabase() //{“ok”:1}
4.
十九. 用户管理,安全认证
1. 添加一个用户
//为admin添加uspcat用户和foobar数据库的yfc 用户
>user admin
>db.addUser(“uspcat”,”123”)
>user foobar
>db.addUser(“yfc”,”123”)
2. 启用用户
>db.auth(“名称”,”密码”)
3. 安全检查 –auth
3.1 在启动项(mongodb.bat)追加 --auto
mongod --dbpathD:\MongodbData --auth
3.2 //非foobar是不能操作数据库的
>user foobar
>db.persons.find() ////报错
3.3 //启用自己的用户才能访问
>db.auth(“yfc”,”123”)
>db.persons.find() //正确
3.4 非admin数据库的用户不能使用数据库命令
>db.auth(“yfc”,”123”)
>show dbs ////报错
3.5 admin数据库中的数据经过认证为管理员用户
>user admin
>db.auth(“uspcat”,”123”)
>show dbs //成功访问
4. 用户删除操作
db.system.user.remove({user:”yfc”});
二十. 主从复制
1. 主从复制是数据库同步备份的集群技术
//主服务器à从服务器
//主服务器à{从服务器, 从服务器, 从服务器…} //更保险
1.1 在数据库集群中要明确的知道谁是主服务器,主服务器只有一台
1.2 从服务器要知道自己的数据源也就是相对的主服务器是谁
1.3 --master确定主服务器,--slave确定从服务器,--source指向主服务器的地址端口
2. 主从复制集群案例
2.1 主服务器(8888):8888.conf
dbpath=D:\sortware\mongod\01\8888主数据库地址
port=8888 主数据库端口号
bind_ip=127.0.0.1 主数据库所在服务器
master=true 确定我是主服务器
从服务器(7777): 7777.conf
dbpath=D:\sortware\mongod\01\7777从数据库地址
port=7777 从数据库端口号
bind_ip=127.0.0.1 从数据库所在服务器
source=127.0.0.1:8888指向主数据库(启动时可以没有从服务器, 运行时用shell添加)
slave=true 确定我是从服务器
////启动时,先启动主服务器,再启动从服务器
///主服务器建立的数据,会自动复制到从服务器
////当主服务器损坏时,可以快速把从服务器转为主服务器
2.2 主从复制的其他设置项
--only 从节点à指定复制某个数据库,默认是复制全部数据库
--slavedelay 从节点à设置主数据库同步数据的延迟(秒)
--fastsync 从节点à以主数据库的节点快照为节点启动从数据库备份
--autoresync 从节点à如果不同步则重新同步数据库
--oplogSize 从节点à设置oplog的日志大小(主节点操作记录存储到local的oplog中),空间设置越大,存储越多
2.3 利用shell动态添加和删除从节点
////操作从服务器
>use local
>show collections
>db.sources.find()
//不难看出从节点中关节主节点的信息全部存到local的sources的集合中
//我们只要对集合进行操作就可以动态操作主从关系
//挂接主节点: 操作之前在主服务器留下从数据服务
db.sources.insert({“host”:”127.0.0.1:8888”})
//删除已经挂接的主节点: 操作之前在主服务器留下从数据库服务
db.sources.remove({“host”:”127.0.0.1:8888”})
2.4
3.
二十一. 副本集(第七讲 下)
1. 概念
1.1 服务器(A活跃,B备份,C备份)
服务器(A故障,B活跃,C备份) 根据权重算法推出B为主数据库
服务器(A备份,B活跃,C备份) 当A恢复后,自动变为备份数据库
A服务器配置:
>dbpath=d:\sortware\mongod\02\A
>port=1111 #端口
>bind_ip=127.0.0.1#服务地址
>replSet=child/127.0.0.1:2222#设定同伴为B
B服务器配置
>dbpath=D:\sortware\mongod\02\B
>port=222
>bind_ip=127.0.0.1
>replSet=child/127.0.0.1:3333#设定同伴为C
C服务器配置
>dbpath=D:\sortware\mongod\02\C
>port=3333
>bind_ip=127.0.0.1
>replSet=child/127.0.0.1:1111#设定同伴为A
///同伴间形成闭环
1.2 初始化副本集
////当没有设置主服务器时,mongo会根据先后推选一个
///副本集的从节点不能执行查询任务
>use admin
>db.runCommand({“replSetInitiate”:{
“_id”:”child”,
“members”:[{
“_id”:1,
“host”:”127.0.0.1:1111”
},{
“_id”:2,
“host”:”127.0.0.1:2222”
},{
“_id”:3,
“host”:”127.0.0.1:3333”
}]
}})
>rs.status() //查看集群状态
1.3 查看副本集状态
rs.status() //用在活跃服务器
1.4
2. 节点和初始化高级参数
standard 常规节点: 参与投票有可能成为活跃节点
passive 副本节点: 参与投票,但是不能成为活跃节点
arbiter 仲裁节点: 只是参与投票,不复制节点,也不能成为活跃节点
3. 高级参数
priority 0到1000之间,0代表是副本节点,1到1000是常规节点,数值越高权重越大
arbiterOnly:true 仲裁节点
用法:
members”:[{
“id”:1,
“host”:”127.0.0.1:1111”,
arbiterOnly:true
}]”
4. 优先级相同时候仲裁组建的规则
A服:故障,B服1秒前更新,C服5秒前更新,则系统会优先选择最新的B作为主服
5. 读写分离操作à扩展读
5.1 一般情况下作为副本的节点是不能进行数据读操作的,但是在读取密集型的系统中读写分离是十分必要的 (如:A负责读,B负责取)
//在子服务器中操作
>use foobar
>db.persons.find() ///报错
5.2 设置读写分离
slaveOkay:true
//在shell中无法实现,要在java或node中完成
6. oplog 日志
被存储在本地数据库local中的,每一个文档保证这一个节点操作, 可以为oplog尽量设置大一些的空间用来保存更多的操作信息
//查找oplog(在主库设置)
>use local
>db.oplog.re.find()
//改变oplog大小
//在主库–master –oplogSize 1024
二十二. 分片
1. 插入负载技术à分片架构图
///片区:数据切割,分类分组存放
///先读取配置服务器里的配置信息,再根据信息分片
片区1 à |
片区2 à | à路由ßà用户
配置服务器 à|
2. 片键的概念和用处
////利用key为片键进行自动分片(表略)
3. 什么时候用到分片
3.1 机器的磁盘空间不足
3.2 单个的mongoDB服务器已经不能满足大量的插入操作
3.3 想通过把大数据放到内存中来提高性能
4. 分片步聚
4.1 创建一个配置服务器 (创建路由配置.bat)
>dbpath=d:\software\mongodbdata\08\config
>port=2000
>bind_ip=127.0.0.1
4.2 创建路由服务器,并且连接配置服务器,路由器要调用mongos命令
//mongos --port 1000--configdb 1270.0.0.1:2000
//port指定自身端口 -configdb 路由服务器监听配置服务器的地址端口
4.3 添加2个片区数据库 8081 和8082
4.4 利用路由为集群添加分片(允许本地访问)
//导入分片
db.runCommand({addshard:”127.0.0.1:8081”,allowLocal:true})
db.runCommand({addshard:”127.0.0.1:8082”,allowLocal:true})
//切记之前不能使用任何数据库语句
4.5 打开数据分片功能
//为数据库foobar打开分片功能
>use admin
>db.runCommand({“enablesharding”:”foobar”})
4.6 对集合进行分片(利用key分片)
>use admin
>db.runCommand({“shardcollection”:”foobar.bar”,”key”:{“_id”:1}})
4.7 利用大数据量进行测试(4000000条)
mongos >functionadd(){
var i=0;
for(;i<2000000;i++){
db.bar.insert({“age”:i+10,”name”:”Jim”})
}
}
mongos >functionadd2(){
var i=0;
for(;i<2000000;i++){
db.bar.insert({“age”:12,”name”:”Jim”+i})
}
}
mongos >usefoobar()
mongos >add()
mongos >add()
mongos > add2()
mongos >db.bar.find().count() //查询总数 发现总数只有一部份,另一部份存到了第二个片区
///到第二片区查询
5. 查看配置库对于分片服务器的配置存储
mongos>db.printShardingStatus()
6. 查看集群对bar的自动分片机制配置信息
mongos>db.shards.find()
//{“_id”:”shard0000”,”host”:”127.0.0.1:8081”}
//{“_id”:”shard0000”,”host”:”127.0.0.1:8082”}
mongos>db.mongos.find() //查询配置库
7. 为了保险起见的配置服务器集群
Shard01 --->
Shard02 --->
配置服务器 ---> --->路由 --->用户
配置服务器 --->
配置服务器 --->
8. 分片与副本集一起使用
{副本集,副本集,副本集} | --->Shard01片区 --->
| --->shard02片区 ---> 路由 <------>用户
配置服务器 --->