• 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

  • 相关阅读:
    Jenkins系列——使用SonarQube进行代码质量检查
    HTTP1.0工作原理
    Jenkins系列——使用checkstyle进行代码规范检查
    Jenkins系列——定时构建
    Hadoop环境搭建
    eclipse3.4+对的处理插件(附SVN插件安装实例)
    MD5
    RedHat6.5更新软件源
    ubuntu软件推荐
    disconf系列【2】——解决zk部署情况为空的问题
  • 原文地址:https://www.cnblogs.com/usmile/p/13574840.html
Copyright © 2020-2023  润新知