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

Posted 苏州程序大白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》相关的知识,希望对你有一定的参考价值。

目录

开始了!!!不废话了

在这里插入图片描述

前言

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

1、MongoDB概述

在这里插入图片描述

简介

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

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

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

在这里插入图片描述

多实例启动

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术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocumen数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接, MongoDB不支持.
primary keyprimary 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指明导出数据的过滤条件
-hMongoDB所在服务器地址(可指定端口号)
–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数据库

在这里插入图片描述
关注苏州程序大白,持续更新技术分享。谢谢大家支持
在这里插入图片描述

以上是关于超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》的主要内容,如果未能解决你的问题,请参考以下文章

超硬核的Java工程师分享,什么是Java?为什么我要做Java,我是如何学习Java的?

超硬核的java开源物联网智能家居系统

JVM肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!

万字长文超硬核详细学习系列——深入浅出Linux基础篇的知识点,值得你收藏学习必备

❤️用一万字给小白全面讲解python编程基础问答❤️《记得收藏不然看着看着就不见了》

#导入MD文档图片#超硬核学习手册系列2查询篇——深入浅出MySQL的知识点,学习收藏必备