MongoDB基础3

MongoDB基础3

 

 

 

 

 

监控应用状态

查看正在运行的操作

系统分析器system.profile

计算空间消耗

使用mongotop和mongostat

用户身份验证

简介

配置身份验证

备份和恢复

文件系统快照

复制文件系统

冷备份

热备份

使用mongodump来备份

对副本集进行备份

对分片集群进行备份

数据导入导出

导入数据

导出数据

Java操作MongoDB

获取驱动、连接

CRUD

缺点

MongoDB和Spring集成开发

MongoDB应用建议及最佳实践

实践1

实践2

实践3

关于数据集合之间的关系

实践4

实践5

应用MongoDB

 

 

 

监控应用状态

 

查看正在运行的操作

 

 

 

 

系统分析器system.profile

 

 

 

计算空间消耗

 

 

 

 

使用mongotop和mongostat

 

 

[liuwei@localhost mongodb]$ ./bin/mongotop --port 27001
[liuwei@localhost mongodb]$ ./bin/mongostat --port 27001

 

 

 

 

 

用户身份验证

 

简介

MongoDB默认是没有开启身份验证的。admin和local是两个特殊的数据库,其中的用户可对任何数据库进行操作,相当于超级用户。

 

配置身份验证

# 1、首先切换到admin数据库,添加管理员用户信息
db.addUser("root","cc")
# 2、然后切换到要控制的数据库,比如mydb,然后添加用户信息
db.addUser("u1","u1"); # 可读写的
db.addUser("u2","u2",true); # 只读的
# 3、然后重启mongod服务器,加上--auth参数,以启用安全检查
# 4、然后就可以测试了,验证用户使用示例:
db.auth("root","cc");

 

备份和恢复

 

文件系统快照

生成文件系统快照这个方法需要满足两个条件:

 文件系统本身支持快照计数

 运行mongod时必须开启日志系统

其恢复就是快照的恢复,当然,恢复的时候,确保mongod没有开启

 

复制文件系统

 

冷备份

就是把mongod停了,然后拷贝响应的数据文件,最好是把一个数据库相应的数据文件夹完整的拷出,然后恢复的时候完整的拷入。

热备份

就是mongod在运行中,可以使用db.fsyncLock(),来锁定数据库,然后进行数据文件的拷贝,拷贝完成后,使用db,fsyncUnLock(),接触锁定。恢复的时候,需要把mongod停了,然后把文件拷入。

 

使用mongodump来备份

这个方式有些缺点,比如速度慢,处理副本集的时候也容易出问题。但对于单独的数据库和集合还是一个好的选择。

备份

 如果mongod在运行,只要指定mongod的端口即可:./bin/mongodump --port 20001,会在当前路径下创建dump文件夹,里面存放dump的数据库,真正的数据在.bson文件里。

 也可以-h指定主机和端口,-d指定数据库名字,-o指定输出的路径

 如果mongod没有运行,使用--dbpath指定数据目录也可以

 

 

使用mongorestore来恢复

./bin/mongorestore --port 20001 --drop dump/
# -h 指定主机和端口,-d指定数据库名字,
# -directoryperdb指定备份文件所在的位置,也可不写,直接写路径

 

对副本集进行备份

建议对备份节点进行备份,最好是采用复制文件系统的方式。

 

对分片集群进行备份

由于不肯对集群在某一时间点的完整状态备份,因此不太可能对正在运行的分片集群进行“完美的”备份。

因此对于分片集群进行备份恢复,更关注单个分片或者副本集的备份。

注意:要进行分片集备份,需要先关闭均衡器。

 

 

数据导入导出

 

导入数据

./bin/mongoexport --port 27001 -d mydb -c users -o ../databak/mydb.bak

# -d:指定要导出的数据库
# -c:指定要导出的集合
# -o:指定输出的数据文件

# 还可以指定导出成csv格式的,比如:
./bin/mongoexport --port 27001 -d mydb -c users -csv -f userId,name -o ../databak/mydb.csv
# -csv:指定要导出成csv格式
# -f:指定要导出的列

 

导出数据

./bin/mongoimport --port 27001 -d mydb -c users --file ../databak/mydb.bak
# --file:用来指定导入的备份文件

# 如果要导入csv格式的话,如下:
./bin/mongoimport -d mydb -c users --type csv --headerline -- file ../databak/mydb.csv

 

Java操作MongoDB

 

获取驱动、连接

 

 

 

在应用运行时无需调用close,只有当整个应用服务退出关闭时才需调用close。

 

# 使用连接池时设置连接池参数
MongoClientOptions mcs = MongoClientOptions.builder().connectionsPerHost(6).connectionTimeout(1000).build();
MongoClient mongo = new MongoClient("192.168.1.106:27001", mcs);
System.out.println("connectionPerHost==="+mongo.getMongoClientOptions().getConnectionPerHost());

 

CRUD

 

 

 

 

 

 

 

 

 

 

缺点

无法使用面向对象的方式去操作对象,只能将对象属性拆分封装成DBObject方式,较为麻烦。在下面一节中MongoDB集成Spring后,我们可以直接使用mongoTemplate增删一个对象,操作方便很多。

 

 

MongoDB和Spring集成开发

 

 

 

具体使用参见SpringBoot Mongo笔记。

 

 

MongoDB应用建议及最佳实践

 

实践1

 尽量在64为机器上使用MongoDB,当然32位机器也能用,但由于MongoDB使用内存映射文件,32位版本只支持2G数据的存储。

 避免存储过大文件,MongoDB限制单个文档是16M

 弱化数据结构模型并不等于没有数据结构模型,同样要合理设计

 MongoDB没有Join语句,因此要合理的设计数据结构

 复制集成员使用奇数个,如果是偶数个,可以用仲裁者凑数

 最好启动Journal

MongoDb使用内存映射文件并且每60s向磁盘输出一次通知,这就意味着最大程度上你可能丢失60s加上向影片输出通知这段时间内的所有数据。

为了避免数据丢失,MongoDB从2.0版本起就添加了Journaling(默认情况下开启)。Journaling把时间从60s更改为100ms。如果数据库意外的停机,在启动之前它将会被重启用以确保数据库处于一致状态。当然Journaling会轻微的影响到性能,大约5%。

 单机使用MongoDB,应启用日志,就是journal,而多机使用就做副本集

 

实践2

关于范式化设计和反范式化设计

 范式化设计通常是通过设计多个集合,然后用字段的值来关联数据的方式;而反范式化设计通常是把相关数据做成内嵌文档,嵌入到文档数据中

 通常范式化设计能提高数据的写入速度,而反范式化设计能提高查询速度

 通常认为适合使用内嵌数据的地方:

 子文档较小

 数据不会经常变化

 最终数据一致即可,对中间数据是否一致不要求

 需要快速读取的地方

 通常认为适合使用引用数据的:

 子文档较大

 数据经常改变

 数据一致性要求高,包括中间数据都要一致

 需要快速写入的地方

 适应未来的数据

 可以混合使用引用数据和内嵌数据的方式

 

 

实践3

 

关于数据集合之间的关系

 集合之间的常见关系包括:一对一、一对多和多对多。

 MongoDB中,又把多按照数据量的大小,分成了“多”和“少”,通常少的关系使用内嵌的方式较好,多的关系使用引用的方式较好。

 对于多对多的处理,通常还是会引入一个关系集合,从而拆分成两个一对多。

 

优化文档增长

 如果文档中有需要不断增长的字段,那么建议把这个字段放在最后。

 如果能够预估这个字段最大的长度,还可以采用手动分配的方式,在创建文档的时候就预留足够的空间,从而避免后面移动文档,方式如下:

 创建文档的时候,在这个字段后面,任意添加一个字段,比如:needDelete,然后给needDelete字段赋值,值任意,主要是长度要为增长的字段的最大长度

 在后面更新文档的时候,就可以使用$unset来移出needDelete字段,如果字段存在就移出,不存在就什么都不做

 

用数组存放要匿名访问的内嵌数据

如果确切的知道存放数据的含义,并要根据含义进行查找,用文档,否则用数组

 

 

 

实践4

 

 

 

 

 

实践5

 

 

应用MongoDB

由于MongoDB左右NOSQL数据库,它有它自身的一些特点,因此并不适合说把所有的数据都用MongoDB来存储。也就是说mysql我们需要,mysql它有它自己的适应场景,但mongodb我们也要,但是只是把一些适合放在mongodb的数据放入其中,大家各有个的优点,各自的适用场景不一样。

 

posted @ 2020-08-10 09:41  刘呆哗  阅读(135)  评论(0编辑  收藏  举报