为什么研究MongDB 6.0
今天和老大聊天 聊到了一个场景的设计,我刚开始推荐了 clickhouse ,然后老大指出 前两天 测试的结果,因为clickhouse 因为 是列式存储,导致我们要查询一行数据,需要200ms(库中有2000w条数据)
我大概能理解这个结果,但是我感觉应该可以优化,我打算再测试一下,我又想到mongdb,但是mongdb 因为一些场景问题,也不适合。。。
我就陷入了迷茫,感觉对各个数据库/中间件的优缺点/适合的场景 不是很清晰
今天就整理下 MongDB
用到的所有 软件
链接:https://pan.baidu.com/s/1VSTvDJfpSRlKapzygYhEGQ
提取码:sgu7
MongoDB 介绍
MongoDB 是一种面向文档的数据库,使用的是行式存储(Row-Based Storage),即将一个文档作为一个整体存储在磁盘上。与传统的关系型数据库不同,MongoDB 不需要在磁盘上预留固定大小的列来存储数据,也不需要在读取数据时去访问多个表格或者分区,而是直接访问整个文档。这种存储方式对于文档的读取和更新操作非常高效,并且可以自由地添加或删除字段,非常适合存储半结构化或非结构化数据。
虽然 MongoDB 使用的是行式存储,但它仍然可以使用一些列式存储的技术来提高查询性能。例如,MongoDB 使用了一种称为“覆盖索引”(Covered Index)的技术,它可以在查询索引时直接从索引中获取所需的数据,而不必访问磁盘上的文档。此外,MongoDB 还支持使用聚合管道(Aggregation Pipeline)来对数据进行分组、排序和筛选等操作,这些操作在某种程度上类似于列式存储中的列操作。
总之,MongoDB 使用的是行式存储,但它可以使用一些列式存储的技术来提高查询性能。
MongoDB 6.0 linux安装
https://www.mongodb.com/try/download/community-kubernetes-operator
选择自己的操作系统
Package选择 tgz
下载之后 进入到你自己的 linux 服务
二、安装
1.解压
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-6.0.5.tgz
tar -zxvf mongodb-linux-x86_64-rhel70-6.0.5.tgz
mv mongodb-linux-x86_64-rhel70-6.0.5 mongodb
mv mongodb /usr/local/
cd /usr/local/mongodb/
vim /etc/profile
2.vim配置环境,添加变量
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
source /etc/profile
3.验证安装成功
mongod --version
启动mongodb server
mkdir /data/mongo/ -p
mongod -dbpath /data/mongo/ -logpath /data/mongo/mongo.log -logappend -fork -port 27017 --bind_ip 0.0.0.0
安装mongodb shell
上传到服务器并解压缩
#解压缩
tar -zxvf mongosh-1.6.0-linux-x64.tgz
#移动文件
mv mongosh-1.6.0-linux-x64 /usr/local/mongosh
启动mongosh
#无密码连接 (第一次使用这种)
/usr/local/mongosh/bin/mongosh
#使用账号密码登录
/usr/local/mongosh/bin/mongosh -u root -p wqft678
10、shell简单使用
创建用户
#创建用户
use admin;
db.createUser({user: 'root', pwd: 'wqft678', roles: [{role: 'root', db: 'admin'}]});
db.createUser({user: 'admin', pwd: 'wqft678', roles: [{role: 'userAdminAnyDatabase', db: 'admin'}]});
使用账号密码登录
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限。
切换 账号密码 登录(不设置密码,容易黑库)
db.shutdownServer()
mongod -dbpath /data/mongo/ -logpath /data/mongo/mongo.log -logappend -fork -port 27017 --bind_ip 0.0.0.0 --auth
//使用账号密码登录
/usr/local/mongosh/bin/mongosh -u root -p wqft678
简单指令的使用
use test_user #创建数据库
db.myuser.insertOne({ name: 'tom', age:18 }) #插入数据
show dbs #显示数据库
show collections #显示集合
db.myuser.find(); #查询
db.myuser.find().pretty();
db.myuser.find( { name: 'tom' } ); #根据条件查询
db.myuser.find( { age: 18} );
db.myuser.find().limit(2); #分页查询
db.myuser.find().skip(0).limit(2);
db.myuser.find().skip(2).limit(2);
db.myuser.find().sort({ age: 1 }); #正序查询
db.myuser.find().sort({ age: -1 }); #倒序查询
db.myuser.find().skip(2).limit(10).sort({age:1}); #查询数据之后排序
$gt #大于
$lt #小于
$gte #大于或等于
$lte #小于或等于
db.myuser.find({ age: {$lt: 18} }) #查询年龄小于18
db.myuser.find({ $or: [ {name: 'john'},{name: 'mary'} ] }); #或
db.myuser.find({ $and: [ {name: 'john'},{age: 20} ] }); #且
#正则查询
db.myuser.find({ name: {$regex: "mar[a-z]"} }); #查询名字中下一个字母是a-z的
db.myuser.find( {"name":{$regex:"(a)"}} ); #查询名字中包含字母a的。
db.myuser.find( {age:1} ).explain(true); #解释执行,类比MySQL的explain
db.myuser.getIndexes(); #查看索引
db.myuser.ensureIndex( {age:1} ) #添加索引
db.myuser.dropIndex( {age:1} ) #删除索引,使用正则查询 索引无效
db.myuser.ensureIndex( {userid:1},{unique:true} ) #创建唯一索引
#还可以执行如下语句插入
db.myuser.insert( {age: 29} );
db.myuser.insert( {name: 'james'} );
db.myuser.insert( {'location': '北京'} );
#修改数据
db.myuser.update({ age: 29 }, {$set: { age: 30 }});
db.myuser.update({ 'name': 'tom' }, { $set: { 'name': 'snail' } });
#删除数据
db.myuser.remove({ name: 'snail' }); #根据条件删除
db.myuser.remove( {} ) #删除所有数据
#删除集合,类比mysql删除表
db.myuser.drop();
#删除数据库
db.dropDatabase();
#监控
db.serverStatus(); #查看所有的监控信息
db.serverStatus().network ; #单独查看网络流量信息
db.serverStatus().opcounters; #统计增、删、改、查的次数
db.serverStatus().connections; #连接信息
MongoDB 版本列表
MongoDB 4.0
特性
- 多文档 ACID 事务:MongoDB 4.0 引入了多文档 ACID 事务,支持多个文档的原子性操作,保证了数据的一致性和可靠性。
- 二进制数据类型:MongoDB 4.0 支持新的二进制数据类型,包括 UUID、正则表达式、JavaScript 代码和加密算法等,扩展了 MongoDB 的数据存储能力。
- 云原生支持:MongoDB 4.0 针对云原生应用场景进行了优化,提供了更好的云平台支持和集成,包括 Kubernetes、Docker 和 OpenShift 等。
- 数据库加密:MongoDB 4.0 引入了新的数据库加密功能,可以对整个数据库进行加密,保护数据在磁盘上的安全性。
- 索引优化:MongoDB 4.0 引入了新的查询优化器和索引机制,能够提高查询性能和吞吐量。
- 监控和诊断:MongoDB 4.0 引入了新的监控和诊断工具,包括 MongoDB Cloud Manager、Ops Manager 和 Compass 等,可以帮助管理员更好地管理和维护 MongoDB 系统。
- 支持 ACID 事务的分布式事务:MongoDB 4.0 引入了支持 ACID 事务的分布式事务功能,允许多个 MongoDB 实例之间进行分布式事务处理。
- 支持 GraphQL:MongoDB 4.0 开始支持 GraphQL,允许应用程序使用 GraphQL 来查询和操作 MongoDB 数据库。
MongoDB 5.0
特性
- 更快的查询性能:MongoDB 5.0 引入了全新的查询引擎“Pluggable Storage Engine”,可以提高查询性能和吞吐量。
- 更好的分布式事务支持:MongoDB 5.0 改进了分布式事务机制,支持更多的事务类型和功能,提高了多个 MongoDB 实例之间进行分布式事务处理的能力。
- 更好的安全性:MongoDB 5.0 引入了新的安全功能,包括支持 X.509 证书的认证和授权、更强的加密功能、更好的审计和监控功能等。
- 更好的云原生支持:MongoDB 5.0 提供了更好的云原生支持和集成,包括更好的 Kubernetes 集成、更好的自动化管理和部署功能等。
- 更好的开发者体验:MongoDB 5.0 提供了更好的开发者体验,包括支持更多的数据类型、更好的索引支持、更好的聚合查询功能等。
- 更好的管理工具:MongoDB 5.0 引入了全新的管理工具,包括更好的监控和诊断工具、更好的备份和恢复工具、更好的数据迁移工具等。
- 更好的集成和扩展性:MongoDB 5.0 支持更好的集成和扩展性,包括支持更多的编程语言、更好的驱动程序和 ORM 框架、更好的插件和扩展支持等。
总之,MongoDB 5.0 带来了很多新的特性和改进,扩展了 MongoDB 的功能和能力,提高了性能、安全性和可靠性,可以更好地支持现代应用场景的需求。
MongoDB 6.0
-
新特性
- [可查询加密(Queryable Encryption)]
- [集群同步(Cluster-to-Cluster Sync)]
-
优化项
- [时序集合(Time Series Collection)]
- [变更流(Change Streams)]
- [聚合(Aggregation)]
- [查询(Query)]
- [弹性]
- [安全性]
研究的点
- 基础原理
- 优缺点
- 性能测试结果
- 应用场景
mongdb
基础原理
优缺点
性能测试结果
应用场景
遇到的问题
All your data was backed up. You need to email us at rambler+1bydl@onionmail.org to recover your data. CHECK YOUR SPAM FOLDER! If you dont answer we will reach the General Data Protection Regulation, GDPR,and notify them that you store user data in an uns
本来想搞一个demo ,没搞权限,第二天给我出来这个。。。。上面的脚本添加了账号密码
文档数据库有哪些
文档数据库(Document-oriented databases)是一种非关系型数据库,用于存储和管理文档,通常以 JSON 或 BSON 格式存储文档。下面列出一些常见的文档数据库:
- MongoDB:最流行的开源文档数据库之一,使用 BSON 存储格式,支持高度可扩展性和灵活性。
- Couchbase:开源的文档数据库,支持 JSON 存储格式,提供高度可扩展性、高性能和高可用性。
- CouchDB:另一个开源的文档数据库,使用 JSON 存储格式,具有分布式和版本控制功能。
- Amazon DocumentDB:Amazon Web Services(AWS)提供的高度可扩展的文档数据库服务,兼容 MongoDB API。
- RavenDB:.NET 平台上的文档数据库,支持 JSON 存储格式,提供 ACID 事务和分布式集群。
- MarkLogic:面向企业的文档数据库,支持多种数据存储格式,包括 XML、JSON、文本和二进制数据。
- ArangoDB:多模型数据库,支持文档、图形和键值存储,使用 JSON 存储格式,提供 ACID 事务和多语言支持。
具体优缺点还要根据应用场景和需求进行评估。
mongodb 怎么保证的事务
MongoDB 从版本 4.0 开始引入了多文档事务的支持,通过分布式事务协议(Distributed Transaction Protocol)来保证事务的原子性、一致性、隔离性和持久性(ACID)。
在 MongoDB 中,事务的操作单元是一个会话(session),可以跨多个文档和多个集合进行操作。MongoDB 的事务模型与传统的关系型数据库类似,包括开始事务、执行事务中的多个操作、提交事务或者回滚事务等步骤。
在 MongoDB 的事务模型中,事务的隔离级别可以通过设置事务的读取偏好(read preference)和事务的写入级别(write concern)来控制。例如,可以通过设置 read preference 为 primary,将所有的读取操作都发送到主节点,从而保证读取操作的一致性;同时,可以通过设置 write concern 为 majority,将写入操作同步到大多数节点,从而保证写入操作的可靠性和持久性。
需要注意的是,MongoDB 的事务机制只适用于副本集(replica set)和分片集群(sharded cluster)环境下的操作。在单节点(standalone)环境下,事务机制不可用。
总之,MongoDB 的事务机制通过多文档事务协议来保证事务的 ACID 特性,可以为分布式应用程序提供强大的数据操作和管理能力。
mongdb 怎么保证安全
MongoDB 提供了多种方式来保障数据的安全性,下面列举了一些常见的安全措施:
- 认证和授权:MongoDB 支持基于角色的认证和授权机制,可以对每个用户进行身份验证和访问控制。用户需要提供用户名和密码才能访问 MongoDB 数据库,而且不同的用户可以被分配不同的角色和权限。
- 加密传输:MongoDB 支持 SSL/TLS 加密协议来保证数据在传输过程中的安全性。通过 SSL/TLS 加密协议,MongoDB 可以使用公钥/私钥机制对传输的数据进行加密和解密,从而保障数据的机密性和完整性。
- 安全配置:MongoDB 提供了多种配置选项来提高安全性,例如禁用远程访问、限制网络接口、限制数据库访问等。同时,MongoDB 还提供了审计功能,可以记录用户和管理员的所有操作,以便进行安全审计和追踪。
- 加密存储:MongoDB 支持对存储在磁盘上的数据进行加密,可以保护数据在非授权访问时的安全性。MongoDB 支持两种加密方式:文件级加密和字段级加密。文件级加密是通过对整个数据库文件进行加密来保护数据的安全性;而字段级加密则是对某个字段进行加密,只有在授权的情况下才能查看该字段的内容。
- 漏洞修复:MongoDB 的开发者团队及时修复 MongoDB 的漏洞,并定期发布安全补丁,以便管理员更新 MongoDB 并解决安全漏洞。
总之,MongoDB 提供了一系列的安全措施来保护数据的安全性,管理员可以根据自己的需求和环境选择合适的安全措施来提高 MongoDB 的安全性。
MongoDb 5.0
MongoDB的最新版本是MongoDB 5.0。该版本于2021年7月发布,其中包含许多新功能和改进,包括:
- Distributed Transactions分布式事务的支持
- 更好的复制集故障恢复
- 具有增量备份和恢复的MongoDB备份
- 可插拔存储引擎API
- 全新的Mongosh Shell,支持自动完成、语法突出显示等功能
- 更好的查询性能和索引支持
- 改进的安全性,包括加密存储引擎、自动TLS等
MongoDB 5.0提供了更多的功能和性能改进,适用于各种用例,包括数据湖、实时分析、人工智能/机器学习、Web应用程序等。
mongodb 版本具体信息
https://help.aliyun.com/document_detail/462614.html