超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
日志服务 SLS,月写入数据量 50GB 1个月
简介: 超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》

超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》


目录


前言


1、MongoDB概述


简介


2、MongoDB安装


安装及运行控制

启动和停止

多实例启动

3、MongoDB存储结构


逻辑存储结构

物理存储结构

4、MongoDB基本操作


常用操作

集合和文档操作

5、MongoDB日常维护


备份与恢复管理

安全管理

MongoDB监控


目录


开始了!!!不废话了


20210608093002946.gif


前言


目前我们常用的MS SQL数据库、ACCESS数据库、MongoDB、My SQL数据库等等。

之前我讲过My SQL数据库,有兴趣的朋友可以去看看。今天我们主要讲讲MongoDB。


1、MongoDB概述


20210608092424336.png


简介

MongoDB是一款跨平台、面向文档的数据库。


可以实现高性能、高可用性, 并且能够轻松扩展. 是一个基于分布式文件存储的开源数据库系统, 在高负载的情况下, 添加更多的节点, 可以保证服务器性能。


MongoDB也是一个介于关系数据库和非关系数据库之间的产品, 是非关系数据库当中功能最丰富, 最像关系数据库的. 不采用关系模型主要是为了获得更好的扩展性, MongoDB不再有”行”(row)的概念, 其运行方式主要基于两个概念:集合(collection)与文档(document)。


特点:


MongoDB的特点包括面向集合存储、模式自由、丰富的查询语句和多级索引、复制集机制、易于水平扩展、可插入存储引擎、跨平台多语言支持等。


MongoDB安装简单, 提供了面向文档存储功能, 操作起来比较容易。


MongobB提供了复制、高可用性和自动分片功能。


如果负载增加(需要更多的存储空间和更强的处理能力), 它可以分布在计算机网络中的其他节点上, 这就是所谓的分片. Mongo支 持丰富的查询表达式, 查询指令使用JSON形式的标记, 可轻易查询文档中内嵌的对象及数组。


MongoDB支持各种编程语言:Ruby、Python、Java、C++、PHP、C#等多种语言。

适用领域


MongoDB可以为Web应用提供可扩展的高性能数据存储解决方案. MongoDB主要适用领域有网站数据、分布式场景、数据缓存和JSON文档格式存储. 适合大数据量、高并发、弱事务的互联网应用, 其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力, 可以很好地满足Web2.0和移动互联网应用数据存储的要求。


2、MongoDB安装


安装及运行控制


1、配置yum源进行安装MongoDB


你们也可以再官网下载,就是下载有点慢,我在这里不跟你细讲。你们可以看这篇文章


cat > /etc/yum.repos.d/mongodb-org.repo <<-EOF
[mongodb-org]
name=MongoDB Repository
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.4/x86_64/
gpgcheck=0
enabled=1
EOF
yum install -y mongodb-org

2、MongoDB运行控制

设置内核参数

# 当某个节点可用内存不足时, 系统会从其他节点分配内存.
echo 0 > /proc/sys/vm/zone_reclaim_mode
# 关闭大页内存
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
# 永久生效设置
vi /etc/rc.local
echo 0 > /proc/sys/vm/zone_reclaim_mode
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
sh /etc/rc.local


启动和停止

1、启动MongoDB服务并设置开机自启动


mongod -f /etc/mongod.conf
vim /etc/rc.local
  rm -rf  /var/lib/mongo/mongod.lock
  mongod -f /etc/mongod.conf
mongod -f /etc/mongod.conf
vim /etc/rc.local
  rm -rf  /var/lib/mongo/mongod.lock
  mongod -f /etc/mongod.conf

2、测试是否安装成功


curl http://localhost:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.


3、停止MongoDB


mongod -f /etc/mongod.conf --shutdown
ps aux | grep mongod
# 当没有正常关闭成功时, 直接结束进程.
kill -2 pid号

4、连接并访问MongoDB, 关闭数据库并退出。


mongo
use admin
db.shutdownServer()
exit

注: 用Systemctl运行脚本文件来启动


cat > /lib/systemd/system/mongod.service <<-EOF
[Unit]
Description=MongoDB
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/lib/mongo/mongod.lock
ExecStart=/usr/bin/mongod --auth -f /etc/mongod.conf
ExecReload=rm -rf /var/lib/mongo/mongod.lock &> /dev/null;/usr/bin/mongod -f /etc/mongod.conf --shutdown;/usr/bin/mongod -f /etc/mongod.conf
ExecStop=/usr/bin/mongod -f /etc/mongod.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF


俗话说得好“工欲善其事必先利其器”,讲到这里呢,我们的准备工作已经就绪了,接下来就可以大展宏图啦。


20210608101812917.jpg


多实例启动

1、复制配置文件并更改


cp /etc/mongod.conf /etc/mongod2.conf
vim /etc/mongod2.conf


systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod2.log
storage:
  dbPath: /var/lib/mongo2
  journal:
    enabled: true
processManagement:
  fork: true  
  pidFilePath: /var/run/mongodb/mongod.pid
net:
  port: 27018
  bindIp: 127.0.0.1  

2、创建数据文件并赋予权限


mkdir /var/lib/mongo2
touch /var/log/mongodb/mongod2.log
chmod -R 777 /var/log/mongodb/mongod2.log

3、启动多实例


mongod -f /etc/mongod2.conf
mongo
use admin
db.shutdownServer()
exit

3、MongoDB存储结构


逻辑存储结构


MongoDB的逻辑结构主要由文档(document)、集合(collection)和数据库(database)三部分组成。


其中文档是MongoDB的核心概念, 它是MongoDB逻辑存储的最小单元, 相当于关系型数据库中的一行记录, 多个文档组成集合, 集合相当于关系型数据库中的表的概念, 多个集合组成数据库。


SQL术语/概念 MongoDB术语/概念 解释/说明

database database 数据库

table collection 数据库表/集合

row documen 数据记录行/文档

column field 数据字段/域

index index 索引

table joins  表连接, MongoDB不支持.

primary key primary key 主键, MongoDB自动将_id字段设置为主键

1、数据库


MongoDB的默认数据库: test

admin: root数据库, 如果将一个用户添加到这个数据库, 这个用户将自动继承所有数据库的权限. 一些特定的服务器端命令也只能从这个数据库运行。


local: 这个数据永远不会被复制, 可以用来存储限于本地单台服务器的任意集合。


config: 当Mongo用于分片设置时, config数据库在内部使用, 用于保存分片的相关信息。

2、集合


集合存在于数据库中, 集合没有固定的结构, 这意味着在集合中可以插入不同格式和类型的数据, 但通常情况下插入集合的数据都会有一定的关联性。


当第一个文档插入时, 集合就会被创建。


合法的集合名不能是空字符串””, 不能含有\0字符(空字符), 这个字符表示集合名的结尾, 不能以”system.”开头, 这是为系统集合保留的前缀。

3、文档


文档是一个键值对:


文档中的键值对是有序的。


文档中的值可以是双引号里面的字符串, 也可以是其他几种数据类型(甚至可以是整个嵌入的文档)。


MongoDB区分类型和大小写。


MongoDB的文档不能有重复的键。


文档的键是字符串. 除了少数例外情况, 键可以使用任意UTF-8字符。


文档键命名规范:


键不能含有\0(空字符), 这个字符用来表示键的结尾。


.和$有特别的意义, 只有在特定环境下才能使用。


以下划线”_”开头的键是保留的(不是严格要求的)。


物理存储结构

MongoDB物理存储结构主要包括数据存储和日志存储。


1、数据存储


MongoDB的数据目录由配置文件中的dbpath指定, 用来存储所有MongoDB的数据文件。


在MongoDB内部, 每个数据库都包含一个.ns文件和一些数据文件。


MongoDB内部有预分配空间的机制, 预分配的文件都用0进行填充, 这样MongoDB始终保持额外的空间和空余的数据文件. 数据文件每次新生成的一个文件, 大小都会是上一个文件的两倍。


文件使用MMAP进行内存映射, 会将所有数据文件映射到内存中, 但是只是虚拟内存, 只有访问到这块数据时才会交换到物理内存。

2、日志存储


结构:


系统日志文件的存放由配置文件中的path指定。

Journal日志文件, 用于MongoDB崩溃恢复的保障。

oplog复制操作日志文件在启动主从复制时出现。

慢查询日志文件, 需要在配置文件中指定profile=1(开启慢查询)与slowms=200(记录毫秒数), 查看慢查询的命令:db.system.profile.find()。


数据类型


常用数据类型


String 字符串, 存储数据常用的数据类型. 在MongoDB中UTF-8编码的字符串才是合法的

Integer 整型数值, 用于存储数值. 根据用户的服务器, 可分为32位或64位

Boolean 布尔值, 用于存储布尔值(真/假)

Double 双精度浮点值, 用于存储浮点值

Arrays 用于将数组或列表或多个值存储为一个键

Object 用于内嵌文档

Null 用于创建空值

Date 日期时间, 用户可以指定自己的日期时间, 创建Date对象, 传入年月日信息

Binary Data 二进制数据, 用于存储二进制数据.

4、MongoDB基本操作


常用操作


// 查看当前操作的库
db
// 查看当前实例下的数据库列表
show dbs
// 切换到指定数据库, 如果数据库不存在, 则创建数据库.
use db_name
// 显示当前数据库中的集合
show collections
// 显示数据库操作命令
db.help()
// 显示集合操作命令
db.ct_name.help()
// 对当前数据库中指定的集合进行数据查找
db.ct_name.find()
db.ct_name.findOne()
创建、复制、删除数据库

1、创建数据库或切换数据库


use db_name
show dbs

2、复制数据库


 db.copyDatabase("db_name","db_name2","localhost")
show dbs

3、删除数据库


 db.dropDatabase()
show dbs


集合和文档操作

1、集合中插入文档


// 没有该集合时会自动创建
db.ct_name.insert({id:数字, '字段名':'值'})
db_ct_name.fint()
// 删除当前这个集合
db.ct.name.drop()

2、修改集合中的文档


// 修改匹配的第一条数据
db.ct_name.update({id:数字,"字段名":"值"}, {"字段名":"值",...})


3、删除集合中符合条件的所有数据


db.ct_name.remove({"字段名":"值"})

4、克隆集合


# 启动另一个实例
mongod -f /etc/mongod2.conf
# 查看实例端口是否存在
netstat -lnt
mongo --port 27018
// 从指定来源实例中克隆指定数据库下的指定集合到当前实例中
db.runCommand({"cloneCollection":"db_name.ct_name", "from":"127.0.0.1:27017"})
show dbs

5、MongoDB日常维护

-d 指明数据库的名字

-c 指明集合的名字

-f 指明要导出的列名

-o 指明要导出的文件名

-q 指明导出数据的过滤条件

-h MongoDB所在服务器地址(可指定端口号)

–authenticationDatabase 授权用户的数据库角色


备份与恢复管理


1、导入与导出


导出

use info
\\ 创建测试数据
for(var i=1;i<=1000;i++){db.test.insert({'id':i,'name':'Alice'});}
exit
# 导出数据
mongoexport -d info -c test -o /opt/info.json
# 带用户认证的导出数据
mongoexport -h 192.168.100.10:27017 -uroot -p123456 -d info -c test -o /opt/info.json --authenticationDatabase admin
# 导出id>500的数据
mongoexport -d info -c test -q '{ "id":{ "$gt":500} }' -o /opt/info_gt500.json
# 带用户认证导出id>500的数据
mongoexport -h 192.168.100.10:27017 -uroot -p123456 -d info -c test -q '{ "id":{ "$gt":500} }' -o /opt/info_gt500.json --authenticationDatabase admin
head -10 /opt/info_gt500.json


导入


\\ 删除集合
db.test.drop()
exit
# 导入数据
mongoimport -d info -c test --file /opt/info.json
# 查看数据
mongo
use info
show collections


2、备份与恢复


备份


mongodump -h 127.0.0.1:27017 -d info -o /opt/
# 带用户认证
mongodump -h 192.168.100.10:27017 -uroot -p123456 -d info -o /opt/ --authenticationDatabase admin


恢复


mongorestore -h 127.0.0.1:27017 -d info --dir=/opt/info/
# 带用户认证
mongorestore -h 192.168.100.10:27017 -uroot -p123456 -d info --dir=/opt/info/  --authenticationDatabase admin


安全管理

1、限定监听特定IP和端口


vim /etc/mongod.conf
  port: 27017
  bindIp: 192.168.100.10
netstat -antp | grep 27017
# 连接MongoDB
mongo --host 192.168.100.10:27017


2、授权启动


# 重新连接MongoDB
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf 
mongo --host 192.168.100.10:27017
use admin 
// 创建用户
db.createUser(
  {
    user:"root",
    pwd:"123456",
    roles:[{role:"root", db:"admin"}]
  }
)
// 删除用户
db.dropUser('用户名')
// 授权验证
db.auth('root','123456')
// 查看用户
db.system.users.find().pretty()
exit
# 开启MongoDB的授权
vim /etc/mongod.conf
  security:
    authorization: enabled
# 重新连接MongoDB
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf 
# 连接验证
mongo -uroot -p123456  192.168.100.10/admin


1: 表示验证成功
db.createUser({
    user: "用户名",
    pwd: "密码",
    roles: [ { role: "角色", db: "作用数据库" } ]
})
数据库用户角色: read、readWrite
数据库管理角色: dbAdmin、dbOwner、userAdmin
集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色: backup、restore
所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色: root

3、进程管理


// 查看当前正在运行的进程
db.currentOp()
// 根据PID结束进程
db.killOp(4988)


{
    "inprog" : [
        {
            "desc" : "conn2",
            "threadId" : "140116274083584",
            "connectionId" : 2,
            "client" : "192.168.100.10:51702",
            "appName" : "MongoDB Shell",
            "clientMetadata" : {
                "application" : {
                    "name" : "MongoDB Shell"
                },
                "driver" : {
                    "name" : "MongoDB Internal Client",
                    "version" : "3.4.24"
                },
                "os" : {
                    "type" : "Linux",
                    "name" : "CentOS Linux release 7.5.1804 (Core) ",
                    "architecture" : "x86_64",
                    "version" : "Kernel 3.10.0-862.el7.x86_64"
                }
            },
            "active" : true,
            "opid" : 4988,
            "secs_running" : 0,
            "microsecs_running" : NumberLong(47),
            "op" : "command",
            "ns" : "admin.$cmd",
            "query" : {
                "currentOp" : 1
            },
            "numYields" : 0,
            "locks" : {
            },
            "waitingForLock" : false,
            "lockStats" : {
            }
        }
    ],
    "ok" : 1
}

MongoDB监控


1、查看数据库统计信息的命令


查看数据库实例的状态信息: db.serverStatus()


查看当前数据库的统计信息: db.stats()


用Web界面查看系统监控信息


官方文档资料参考


vim /etc/mongod.conf
  net:
    ...
    http:
      enabled: true
  #security:
    #authorization: enabled
# 重新连接MongoDB
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf 
# 访问HTTP状态界面
curl http://192.168.100.10:28017


2、查看集合统计信息的命令


查看集合统计信息: db.users.stats()


查看集合大小: db.users.dataSize()

3、第三方监控工具


在Nagios中配置使用MongoDB插件来监控MongoDB数据库。


后面我的文章会细讲Nagios中配置使用MongoDB插件来监控MongoDB数据库


2021060811220962.gif

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL MongoDB 数据库
MongoDB数据库基础【完整版】:简介和常用命令、数据库&集合以及文档的增删改查、MongoDB与Python交互(附源代码)2
MongoDB数据库基础【完整版】:简介和常用命令、数据库&集合以及文档的增删改查、MongoDB与Python交互(附源代码)
195 0
MongoDB数据库基础【完整版】:简介和常用命令、数据库&集合以及文档的增删改查、MongoDB与Python交互(附源代码)2
|
存储 JSON NoSQL
MongoDB数据库基础【完整版】:简介和常用命令、数据库&集合以及文档的增删改查、MongoDB与Python交互(附源代码)
MongoDB数据库基础【完整版】:简介和常用命令、数据库&集合以及文档的增删改查、MongoDB与Python交互(附源代码)
233 0
MongoDB数据库基础【完整版】:简介和常用命令、数据库&集合以及文档的增删改查、MongoDB与Python交互(附源代码)
|
NoSQL Java Linux
Linux java基础环境搭建 ->mongodb
Linux java基础环境搭建 ->mongodb
162 0
|
存储 XML 分布式计算
[Java基础篇]Spring Boot整合MongoDB
[Java基础篇]Spring Boot整合MongoDB
323 0
[Java基础篇]Spring Boot整合MongoDB
|
存储 SQL NoSQL
mongoDB-基础
不能言而无信 今天就先把这个MongoDB 补了
214 0
mongoDB-基础
|
开发框架 NoSQL Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API重构)--学习笔记
- Lighter.Domain - Lighter.Application.Contract - Lighter.Application - LighterApi - Lighter.Application.Tests
259 0
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API重构)--学习笔记
|
开发框架 NoSQL Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API实现)--学习笔记
- 问题查询单个实现 - 问题查询列表实现 - 问题跨集合查询实现 - 问题创建实现 - 问题更新实现 - 问题回答实现 - 问题评论实现 - 问题投票实现 - 回答实现
280 0
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB API实现)--学习笔记
|
NoSQL Cloud Native 架构师
|
NoSQL Cloud Native 架构师
|
开发框架 NoSQL Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 更新和删除)--学习笔记
- 整体更新 - 更新字段 - 字段操作 - 数组操作 - 删除
289 0
.NET 云原生架构师训练营(模块二 基础巩固 MongoDB 更新和删除)--学习笔记