阶段三:非关系型数据库MongoDB

MongoDB业务背景及其方案设计

业务背景

时间:2023.6-2024.9

发布产品类型:互联网动态站点 商城

用户数量: 25000-30000(用户量猛增)

PV : 1000000-5000000(24小时访问次数总和)

DAU: 10000 \~ 20000(每日活跃用户数)

根据业务需求:用户访问日志是在web服务器access.log存储。

运维架构设计

image

根据以上业务需求,采用mongodb数据库存储用户的访问日志,使用单台服务器

① 实现访问日志集中化存储

② 在mongo中筛选查看信息,实现用户行为分析

MongoDB概述

MongoDB介绍

image

数据库排名:https://db-engines.com/en/ranking

关系数据库 RDBMS 设计表结构,通过SQL语句进行操作。

常见的关系型数据库:mysql oracle(商业) DB2(IBM) sqlserver(微软) access(微软) sqlite3(小型 嵌入到APP中) postgresql(加州伯克利大学)

nosql 泛指非关系数据库 存储格式key=>value

memcached redis 内存缓存数据库

mongodb 具有更多的功能,可以适用于大部分的mysql场景 => document store 文档型数据库

存储介质:

关系型数据库大部分存储在硬盘中(MySQL/Mariadb/SQL Server/Oracle)

非关系型数据库大部分存储在内存中(MongoDB/Redis)

MongoDB特点

☆ 存储性

比较适合存储大量的没有规则、无序的数据。

存储量大:单表实现存储PB级别的数据。

1KB = 1024B

1M = 1024KB

1G = 1024M

1TB = 1024G

1PB = 1024TB

☆ 效率性

数据的效率,就是指存储和读写速度。

MongoDB效率(对比MySQL)

image

术语与概念(理解)

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
column/fieldfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary key主键,MongoDB自动将_id字段设置为主键

MongoDB安装与配置

MongoDB安装方式

官方网站:https://www.mongodb.com/

MongoDB软件的安装

前提:准备一个MongoDB服务器,更改Mac地址、主机名称、IP地址、绑定主机与IP到/etc/hosts文件、关闭防火墙、SELinux以及NetworkManager、时间同步、安装必备软件如vim、wget、rsync、net-tools等...

编号主机名称IP地址角色
1mongodb.itcast.cn192.168.88.114MongoDB日志服务器

第一步:下载并解压mongodb

下载地址:https://www.mongodb.com/try/download/community

image
tar -xf mongodb-linux-x86_64-rhel93-8.0.3.tgz
mv mongodb-linux-x86_64-rhel93-8.0.3 /usr/local/mongodb

命令作用:

执行结果:

关键参数:

注意事项:

注:由于我们的Linux采用最小化安装,所以install_compass安装后看不到效果。必须安装图形化界面才可以使用


第二步:创建存储目录与日志目录

关键参数:

注意事项:

下载地址:https://www.mongodb.com/try/download/shell

image

**关键参数:**

**注意事项:**

storage:

net:

systemLog:

processManagement:


operationProfiling:

说明:

第四步:重启mongodb


**注意事项:**




[https://docs.mongodb.com/manual/tutorial/create-users/](https://docs.mongodb.com/manual/tutorial/create-users/)


db.createUser({
});

开启配置文件中的用户验证

storage:

net:

systemLog:

processManagement:

security:

operationProfiling:

说明:


设置完成后,需要重启mongod服务

注意事项:


或者先进入MongoDB,然后使用db.auth进行授权认证




db.dropUser("admin")

https://docs.mongodb.com/manual/reference/built-in-roles/#all-database-roles

需求:设置一个超级管理员账户,对于所有库具有读写权限

登录mongodb


验证权限:

db.auth('root','123456')
image

下载驱动程序

image

效果如下图所示

image

连接成功后,如下图所示:

image

问题1:如果MongoDB报错了,如何解决?

答:首先查看/usr/local/mongodb/logs/mongod.log,除了这个文件以外,我们还可以使用/var/log/messages查看最后100行信息,往往也可以看到具体MongoDB问题

原生启动:

systemctl方式启动:

#如果实在搞不清楚自己是怎么启动的,还可以使用pkill强制终止mongod进程


**注意事项:**

db.auth('admin','123456')

问题5:MongoDB到底把数据存储在哪里?为什么有索引情况下,查询特别快?

为什么比传统关系型数据库快很多?

总结:

MongoDB里存储数据的格式文档形式,以BSON格式的文档形式:

无固定结构:适合存储灵活的非结构化数据

轻量:结构紧凑,适合传输 可遍历:支持快速定位字段 高效:读取某字段无需解析整个文档



示例:

{
    title:"MongoDB",
    last_editor:"192.168.1.122",
    categories:["Database","NoSQL","BSON"],
    revieved:false
}

这是一个简单的BSON结构体,其中每一个element都是由key/value对组成的。

官方文档:https://www.mongodb.com/zh-cn/docs/manual/crud/

菜鸟文档:https://www.runoob.com/mongodb/mongodb-tutorial.html

由于MongoDB暂未创建账号,所以临时把配置文件的用户验证关闭掉,然后重启mongod服务

4 9 15 20 24


**注意事项:**



        price:{'$gt':5000},
        weight:{'$gt':130}
}).pretty()

什么是限定字段查询?就是我们可以人为设计在查询结果中显示某些字段或者不显示某些字段。

语法:db.集合名称.find({查询条件},{筛选条件}) 显示为1,不显示为0 特别注意:field要是1必须所有都是1,要是0必须都是0,_id除外


案例:只显示产品集合中的title与price两个字段

\_id是mongodb数据库里的集合中,默认的主键id,具有索引内容,通过主键查询,会很快的查询速度。不要随意修改此值,使用默认即可。

满足其中之一的条件就可以显示,类似MySQL的中的or条件

第一步: 第二步: 第三步:



排序主要是针对某个字段

选项说明:

案例:把所有产品按价格进行降序排列

skip:跳过几个文档,定义从哪个位置开始查询,其默认值为0,代表从第一条数据开始

limit:限制数据的查询数量



基本语法:

或 _id:ObjectId("6846443164a10beabbc1c18c")}, {'$set':{'price':3500}} )




语法:

db.goods.deleteMany({price:{'$gt':2000}})


值给一个就可以删除了

真实业务当中,一般不做物理删除,会使用一个标识,来确认是否已经被删除的数据


可以删除某个字段的操作,使用的是update语法的\$unset

{ }, }

-----------------------------------------------

3、查询所有学生的信息。



{
}

---------------------------------------------------------
姓名:李四,年龄:35,职位:manager,薪资:20000,部门:HR。
姓名:王五,年龄:30,职位:developer,薪资:15000,部门:R&D(研发部)。




5、删除姓名为“张三”的员工。

练习题1答案:

db.students.insertOne({ })

db.students.insertMany([ { }, { }, { } ])

db.students.find()


练习题2答案:

db.employees.insertMany([
  {
  },
  {
  }
])

db.employees.updateOne(
)

db.employees.updateMany(
)

由于MongoDB8.0版本并没有集成备份还原工具,所以我们需要提前安装MongoDB工具包,如下所示:


**注意事项:**

注意事项: