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字符串。

  • 不能是空字符串("")。
  • 不得含有 ' '(空格) . $ / \和 \0 (空字符)。
  • 應全部小寫。
  • 最多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版本實現分佈式架構的多文檔事務

命名規範

  • 鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
  • .和$有特別的意義,只有在特定環境下才能使用。
  • 以下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章