MongoDB—简介 安装 使用

RDB

Relational Database 关系型数据库

存储结构化数据

特点

  • 结构化数据

  • 结构化查询语言(SQL)

  • 数据操纵语言,数据定义语言

  • ACID规则

    • 原子性

      事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚

    • 一致性

      数据库从一个有效正确的状态到另一个有效正确的状态

      正确的状态:当前的状态满足预定的约束

      例如:某个表的某个字段在定义的时候给这个字段的类型是number类型,并且它的值不能小于0

      https://www.zhihu.com/question/31346392

    • 隔离性

      并发访问数据库事务之间的影响

      • 脏读

        一个事务读取到另一个事务未提交的数据

      • 不可重复读

        一个事务读取到另一个事务已经提交的数据(修改)

      • 虚读

        一个事务读取到另一个事务新增插入的数据(插入)

      隔离级别

      • Read Uncommited 读未提交

        该隔离界别,上述影响都不能防止

      • Read Commited 读已经提交

        该隔离界别,可以防止上述影响中的 脏读

      • Repeatable Read 可重复读(MySQL 默认级别)

        该隔离界别,可以防止上述影响中的 不可重复读、脏读

      • Serializable 序列化

        该隔离界别,可以防止上述影响中的 不可重复读、脏读、虚读

        效率低

    • 持久性

      事务一旦提交,则改变是永久的,即使出现宕机也不会丢失

NoSQL

NoSQL = Not Only SQL 非关系型数据库

特点

  1. 可扩展性

    采用反正规化设计,数据之间没有关联

  2. 高可用性

    可通过副本集实现故障转移

  3. 可存储巨量数据

    数据之间关联性小,易于分散存储

  4. 高性能(并发读写)

    数据之间关联性小,易于分散存储和并发访问,有较好的读写性能

  5. 易于保存非结构化或半结构化数据

    不需要事先定义数据字段,随时新增

  6. BASE 原则

    https://stackoverflow.com/questions/3342497/explanation-of-base-terminology

    https://blog.csdn.net/hanhuili/article/details/10197153

    BASE思想主要强调基本的可用性,如果你需要高可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲

    • Basically Availble --基本可用性

      指一个分布式系统的一部分发生问题变得不可用时,其他部分仍然可以正常使用

      支持分区失败

    • Soft-state --软状态/柔性事务

      Scalable 可伸缩性

      https://stackoverflow.com/questions/4851242/what-does-soft-state-in-base-mean

      • 指状态可以有一段时间不同步,具有一定的滞后性

      • 系统将由于最终的一致性而在无需用户干预的情况下更改状态

    • Eventual Consistency -- 最终一致性

      系统将随着时间的推移变得一致

MongoDB

特点

存储结构

  • 采用集合来存储文档数据,一个集合可以存储海量文档

  • 文档采用 BSON 格式保存 半结构化数据

  • 在MySQL中,数据层级:数据库(db) -> 表(table) -> 记录(record)-> 字段

    在MongoDB中,数据层级:数据库(db) -> 集合 collection -> 文档 document -> 字段

数据查询

  • 支持单表查询、聚合计算以及映射和归纳
  • 支持添加索引,提高查询性能

架构设计

  • 分布式存储架构
  • 集群具有副本集架构

原子性操作

  • mongodb 提供的原子性操作包括 文档的 保存、修改、删除

    原子性:保存文档时,要么全部被保存,要么全部被回滚

    当一个文档正在进行写操作时,其他对于此文档的操作是不可以进行的

  • mongodb 通过锁机制来实现 隔离性 的写操作

    • 当一个使用者对文档进行读操作时,会取得一个"读"锁,此时其他使用者可以读此文档,但是不可以对此文档进行写操作
    • 当一个使用者对文档进行写操作时,会取得一个"写"锁,此时其他使用者不可以对此文档进行 读/写 操作
  • mongodb 4.0 之前,支持单个文档的原子性操作

  • mongodb 4.0 之后,支持在副本集的架构里实现多个文档的事务(ACID)

适用场景

  • 需要处理大量低价值数据,不需要太高的事务性,但是对数据的存取性能有较高要求

  • 需要借助缓存层来处理数据

    mongodb 可以作为持久化缓存层

  • 高扩展性

概念

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库 表/集合
row document 数据记录 行/文档
column field 数据字段 列/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键

database

MongoDB的默认数据库为"db",该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中

show dbs 显示数据库列表

db 显示当前数据库对象或集合

use <db> 连接到一个指定的数据库

数据库名命名规范

数据库名可以是满足以下条件的任意UTF-8字符串。

  • 不能是空字符串("")。
  • 不得含有 ' '(空格) . $ / 和 (空字符)。
  • 应全部小写。
  • 最多64字节。

保留数据库

有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

collection

mongodb 是面向集合的存储,存储数据时使用不同的集合来分类,对应关系数据库中的表

  • 集合之间没有关联,不需要事先定义模式(schema)
  • schema-less ,可以在同一个集合中存储不同格式的数据
  • 典型应用:存储日志类型的数据

document

  • 文档是mongodb存储数据的基本单元,对应关系数据库中的行(记录)

  • 文档使用 BSON 格式来存储数据

BSON

  • 一种数据格式,由一个有序元素列表组成,每个元素由键、值、及其类型组成

    • 键的类型是字符串(要加双引号),除了少数例外情况,键可以使用任意UTF-8字符(不能重复,区分大小写)

    • 值的类型可以是字符串(双引号)、数字、null、布尔、数组、对象、日期、二进制、子文档等多种数据类型

    • mongodb 存储数据时区分类型,每个类型都有对应的数字,修改字段类型需要修改对应的名称或数字

      • ObjectId 类型

        • mongodb 驱动程序在写入数据时会自动生成一个字段_id,值类型为 ObjectId,具有唯一性

        • mongodb 默认使用_id 作为主键

        • ObjectId 类型由12byte字符串组成,分为4部分

          UNIX 时间戳---运行机器标识---生成此_id的过程---随机值

          可以通过API获取时间戳

          db.Product.findOne()._id.getTimestamp()
          
        • mongodb 默认为_id建立索引,依照写入时间进行排序

      • 数组

        mongodb 能够解读数组结构,能够获取指定下标的元素

      • 日期

        • mongodb 中的日期类型是 UTC 格式

          • 使用 new Date()ISODate() 创建对象类型的日期,属于mongodb中的日期类型

          • 使用 Date() 创建的值是字符串类型的日期,非mongodb中的日期类型

            可以使用 new Date("YYYY-mm-dd") 转换为 UTC 格式
            new Date("<YYYY-mm-ddTHH:MM:ss>") 将本地时间转换为 UTC 时间

        • 使用 UTC 时间,等同于 GMT 时间,跟北京时间差 8 个小时

          北京时间 CST = GMT+8

  • 特点

    • 相比JSON,在存储上占用较多空间
    • 更轻量,具有遍历性和高性能

原子性

  • 对单个文档的操作具有原子性

  • 3.6及之前的版本不支持多文档事务

    4.0版本可以在其副本集架构里实现多文档事务

    4.2版本实现分布式架构的多文档事务

命名规范

  • 键不能含有 (空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线"_"开头的键是保留的(不是严格要求的)。

View

视图,数据查询的结果,非实际存在的集合

Index

索引,一个单独的、存储在磁盘上的数据结构,包含数据表中所有记录的引用指针

给某个字段添加索引,可以快速找出在该字段有特定值的文档,提高查询性能

User

用户,如果mongodb开启了安全认证,则会在数据库中产生用户表。每个数据库中都有独立的用户表

Stored Procedure

存储过程,用 javascript 编写,存储在 system.js 集合中,具有输入和输出参数和嵌套调用等特性,可提供应用程序调用

Field

字段,文档中的每个键值对中的键,可以弹性的增加或减少,相当于关系数据库中的列

安装

通过tgz方式安装

  1. 下载安装包

    地址:https://www.mongodb.com/download-center#community

  1. 解压到 /usr/local/mongodb/ 下面,并改名字

    sudo tar -xvf <压缩包> -C /usr/local/

    sudo mv mongodbxxx mongodb

  2. 将mongodb的可执行文件加入 PATH 路径

    通过修改.bashrc文件,详见linux笔记

  3. 创建数据库目录

    MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。

    sudo mkdir -p /data/db我们将data目录创建于根目录下(/)。

    注意:/data/db 是 MongoDB 默认的启动的数据库路径(可以通过 --dbpath 来指定)。

通过命令行安装(推荐)

官方文档 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

troubleshooting https://docs.mongodb.com/manual/reference/installation-ubuntu-community-troubleshooting/#install-ubuntu-troubleshooting

安装

https://desirefire.github.io/2019/06/07/%E5%B0%8F%E6%8A%80%E8%83%BDGET%EF%BC%9AUbuntu18-04%E5%AE%89%E8%A3%85mongodb%E6%95%B0%E6%8D%AE%E5%BA%93/#mongoDB%E5%9C%A8Linux-Ubuntu18-04%E4%B8%AD%E5%AE%89%E8%A3%85

https://www.jianshu.com/p/5598f1dcbb98

  1. 导入MongoDB GPG 秘钥

    wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
    

    查看

    sudo apt-key list
    
  2. 修改源文件列表,在/etc/apt/sources.list.d/中添加一个MongoDB源

    echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
    
  3. 更新源

    sudo apt-get update
    
  4. 安装Mongodb

    安装指定版本

    sudo apt-get install -y mongodb-org=4.2.0 mongodb-org-server=4.2.0 mongodb-org-shell=4.2.0 mongodb-org-mongos=4.2.0 mongodb-org-tools=4.2.0
    

    锁定当前版本

    echo "mongodb-org hold" | sudo dpkg --set-selections
    echo "mongodb-org-server hold" | sudo dpkg --set-selections
    echo "mongodb-org-shell hold" | sudo dpkg --set-selections
    echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
    echo "mongodb-org-tools hold" | sudo dpkg --set-selections
    

    查看

     sudo dpkg --get-selections | grep "hold"
    

卸载

sudo service mongod stop
sudo apt-get purge mongodb-org*
sudo rm -r /var/log/mongodb
sudo rm -r /var/lib/mongodb

组成

https://docs.mongodb.com/manual/reference/program/

mogod

https://docs.mongodb.com/manual/reference/program/mongod/

mongodb 的主要守护进程,处理数据请求,管理数据访问,执行后台管理操作

mongod is the primary daemon process for the MongoDB system. It handles data requests, manages data access, and performs background management operations.

目录

/usr/bin/mongod

/usr/bin/mongod --config /etc/mongod.conf

选项

General options
-f [--config] arg

指定配置文件

mongod --config /etc/mongod.conf

--logpath arg

指定日志输出文件

将所有诊断日志信息发送到日志文件,而不是标准输出或主机的syslog系统。MongoDB在指定的路径上创建日志文件。默认情况下,MongoDB将备份现有的日志文件(不是覆盖)并创建一个新的文件。要改为追加到现有的日志文件,请设置——logappend选项

Storage options
--dbpath arg

指定数据保存文件,默认 /data/db

mongod --dbpath=/data/db2 --port=27018

--port arg

指定mongodb运行实例的端口,默认 27017

mongod --dbpath=/data/db2 --port=27018

mongos

应用程序和数据库交互结合的接口

mongo

mongodb 的交互式shell客户端

使用

相关文件

通过命令行安装,会自动生成如下文件

  • 存储数据库文件的文件夹

    data directory /var/lib/mongodb

  • 存储日志文件的文件夹

    log directory /var/log/mongodb

  • 启动配置文件

    configuration file /etc/mongod.conf

配置

systemLog

destination
  • 字符串:file 或 syslog

    • file

      一般使用 file,需指定 path

    • syslog

      使用 syslog 守护进程记录日志,时间戳上有误差

    syslog 是在记录消息时才生成时间戳,而不是在mongodb发出消息时,在时间戳上有误差,建议使用 file 来记录日志,确保时间戳的准确性

logAppend
  • 布尔值
    • true

      实例重启时,新的日志会追加到现有日志文件中

    • false

      默认值,实例重启时,备份现有日志文件,并创建新的日志文件

path
  • 字符串

    存放日志的文件路径

storage

dbPath
  • 存放数据的文件路径

    linux 默认 /data/db

journal
  • enabled

    • 布尔值

      • true

        表示启动永久性日志,以确保数据文件保持有效性并可以恢复

processManagement

https://docs.mongodb.com/manual/reference/configuration-options/#processmanagement-options

fork
  • 布尔值

    • true

      启动守护进程模式,程序可以在后台执行

    • false(默认)

      以非守护进程运行

pidFilePath

指定保存 mongod 或 mongos 进程 ID 的文件

  • 一般结合 fork 属性使用
  • 在 linux 中,PID 文件是初始化系统的责任,当使用 systemd 初始化系统的时候,无需启用该配置
timeZoneInfo

加载数据库时区的路径,默认为/usr/share/zoneinfo

net

port

启动端口,默认 27017

bindIp

监听客户端链接的 IP 地址,默认 127.0.0.1,仅用本机 IP 登录。

  • 若绑定所有 IPv4 ,则设定为 0.0.0.0

  • 若绑定所有 IPv4 和 IPv6,则设定为 ::, 0.0.0.0

    4.2 版本中可以用 "*" 代替

  • 若需绑定多个IP地址,则需用逗号隔开

bindIpAll
  • 布尔值

    • true

      绑定所有的 IPv4 地址

启动

配置文件启动

mongod --config /etc/mongod.conf 

命令启动

mongod --dbpath=/home/data/db2 --port=27018 

systemd 启动

sudo systemctl start mongod

检查端口占用sudo lsof -i:27018

Unit File

ubuntu 18.04 使用 systemd 初始化系统,mongodb 的 单元文件中的相关配置

  • Type 使用默认的 simple ,即该服务无法启动其他服务

  • PIDFile 指定了路径文件,但是没有创建

    配置文件中也没有使用 fork 配置,因此不用创建也可以启动

启动两个实例

https://blog.csdn.net/tianjiewang/article/details/83414659

  1. 创建配置文件

    sudo mkdir /etc/mongo
    sudo cp /etc/mongod.conf /etc/mongo/mongod-one.conf
    
  2. 创建数据保存文件

    sudo cp -r -p /var/lib/mongodb /var/lib/mongodb-one
    

    可能会有权限问题,因此这里 -p 保持原目录的属性

  3. 修改配置文件中的端口和数据存储路径

    # 数据保存文件
    storage:
      dbPath: /var/lib/mongodb-one
      journal:
        enabled: true
        
    # 日志保存文件(在原目录的新文件中)
    systemLog:
      destination: file
      logAppend: true
      path: /var/log/mongodb/mongod-one.log
      
    # 启动端口
    net:
      port: 27018
      bindIp: 127.0.0.1
    
  4. 启动

    # 配置文件启动
    mongod --config /etc/mongo/mongod-one.conf
    
    # 分别指定参数启动
    mongod --dbpath=/home/data/db2 --port=27018
    

开机自启动

通过 systemd 设置

# 开启自启动
systemctl enable mongod.service
# 关闭自启动
systemctl disable mongod.service

停止

  • 在mongo shell中停止

    1. 切换至 admin 数据库

      > use admin
      Switched to db admin
      
    2. 执行关闭指令

      db.shutdownServer()
      2020-08-05T00:21:14.266+0800 I  NETWORK  [js] DBClientConnection failed to receive message from 127.0.0.1:27017 - HostUnreachable: Connection closed by peer
      server should be down...
      2020-08-05T00:21:14.269+0800 I  NETWORK  [js] trying reconnect to 127.0.0.1:27017 failed
      2020-08-05T00:21:14.269+0800 I  NETWORK  [js] reconnect 127.0.0.1:27017 failed failed
      

      在外面执行 systemctl status mongod.service 发现mongodb服务停止

  • 在操作系统下停止

    1. 查询 mongod 服务

      ps -ef | grep mongod
      
    2. 杀死服务

      kill <pid>
      

      不建议使用 kill -9 ,会造成程序出错

  • 使用 systemd 停止

    sudo systemctl stop mongod
    

重启

使用 systemd 停止

sudo systemctl restart mongod

mongo shell

安装及使用

https://docs.mongodb.com/manual/mongo/

https://docs.mongodb.com/manual/reference/program/mongo/

操作方法

https://docs.mongodb.com/manual/reference/method/

启动

MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境

mongo

默认连接27017端口,可以通过 --port 选项指定端口

mongo --port 28015

优化

通过简单的配置启动mongodb终端,会提示一些警告信息,即需要优化的地方

http://www.ityouknow.com/mongodb/2017/09/01/mongodb-performance-optimization.html

XFS 文件系统

https://docs.mongodb.com/manual/administration/production-notes/#kernel-and-file-systems

  • Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
  • 建议启用 XFS 文件系统,启用 XFS 文件系统会对性能有比较好的提升
  • XFS 特别擅长处理大文件,同时提供平滑的数据传输。在存储量很大的环境下进行格式化操作,XFS文件系统的速度比ext3、ext4文件系统快了很多!而且据说XFS可以支持到100T,读写速度也优于其他文件系统。

优化方法

https://blog.csdn.net/xiegh2014/article/details/52687734

原文地址:https://www.cnblogs.com/usmile/p/13574840.html