noSQL数据库
MongoDB 存取读写速度快,甚至可以用来当作缓存数据库。但是在使用过程中会发现 MongoDB
服务非常占内存,几乎是服务器有多少内存就会占用多少内存。为什么会出现这种情况呢?我们要
从 MongoDB 的读写工作流程和对内存的使用方式说起
MongoDB 在存取工作流程上有一个设计决策,MongoDB 的所有数据实际上是存放在硬盘的,然后把部分或者全部要操作的数据通过内存映射存储引擎映射到内存中。 即是:虚拟内存+持久化的存储方式
如果是读操作,直接从内存中取数据,如果是写操作,就会修改内存中对应的数据,然后就不
需要管了。操作系统的虚拟内存管理器会定时把数据刷新保存到硬盘中。 内存中的数据什么时候写
到硬盘中,则是操作系统的事情了。
MongoDB 的存取工作流程区别于一般硬盘数据库在于两点:
mongoDB的设计思路有两个好处:
当然也有坏处
针对这样的问题, MongoDB 设计了 Journal 模式, Journal 是服务器意外岩机的情况下,将数据库操作进行重演的日志(类似redolog)。如果打开 Journal ,默认情况下 MongoDB 100 毫秒(这是在数据文件和 Journal 文件处于同磁盘卷上的情况,而如果数据文件和 Journal 文件不在同磁盘卷上时,默认刷新输出时间是 30 毫秒)往 Journal 文件中 flush 次数据,那么即使断电也只会丢失 100ms 的数据,这对大多数应用来说都可以容忍了。从版 1.9.2+, MongoDB 默认打开 Journal 功能,以确保数据安全。而且 Journal 的刷新时间是可以改变的,使用–journalCommitInterval 命令修改,范围是2~300ms 值越低,刷新输出频率越高,数据安全度也就越高,但磁盘性能上的开销也更高。MongoDB 存取工作流程的实现关键在于通过内存映射存储引擎把数据映射到内存中。
MongoDB 目前支持的 MMAP,MMAPV1,WiredTiger 以及 In-Memory 存储引擎。目前主要流行 WiredTiger
引擎。官方讲解:wireTiger存储引擎
docker pull mongo:latest
docker run -itd --name mongo -p 27017:27017 mongo --auth
# --auth 需要认证才能访问
docker exec -it mongo mongo admin
docker exec -it mongo mongosh admin (5.0版本以上连接mongo使用命令mongosh)
创建一个名为 admin,密码为 test123456的用户
db.createUser({ user:'admin',pwd:'test123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
尝试使用上面创建的用户信息进行连接
db.auth('admin', 'test123456');
talenty@k8smaster:~$ docker exec -it mongo mongo admin
MongoDB shell version v5.0.5
connecting to: mongodb://127.0.0.1:27017/admin?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("23af949c-008d-4963-9136-7240ad487a9d") }
MongoDB server version: 5.0.5
================
Warning: the "mongo" shell has been superseded by "mongosh",
which delivers improved usability and compatibility.The "mongo" shell has been deprecated and will be removed in
an upcoming release.
For installation instructions, see
https://docs.mongodb.com/mongodb-shell/install/
================
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
https://docs.mongodb.com/
Questions? Try the MongoDB Developer Community Forums
https://community.mongodb.com
>
> db.createUser({ user:'admin',pwd:'test123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
},
"readWriteAnyDatabase"
]
}
>
> db.auth('admin','test123456')
1
> exit
bye
权限 说明
read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用。超级账号,超级权限