RDB
Relational Database 關係型數據庫
存儲結構化數據
特點
-
結構化數據
-
結構化查詢語言(SQL)
-
數據操縱語言,數據定義語言
-
ACID規則
-
原子性
事務成功的條件是事務裏的所有操作都成功,只要有一個操作失敗,整個事務就失敗,需要回滾
-
一致性
數據庫從一個有效正確的狀態到另一個有效正確的狀態
正確的狀態:當前的狀態滿足預定的約束
例如:某個表的某個字段在定義的時候給這個字段的類型是number類型,並且它的值不能小於0
-
隔離性
併發訪問數據庫事務之間的影響
-
髒讀
一個事務讀取到另一個事務未提交的數據
-
不可重複讀
一個事務讀取到另一個事務已經提交的數據(修改)
-
虛讀
一個事務讀取到另一個事務新增插入的數據(插入)
隔離級別
-
Read Uncommited 讀未提交
該隔離界別,上述影響都不能防止
-
Read Commited 讀已經提交
該隔離界別,可以防止上述影響中的 髒讀
-
Repeatable Read 可重複讀(MySQL 默認級別)
該隔離界別,可以防止上述影響中的 不可重複讀、髒讀
-
Serializable 序列化
該隔離界別,可以防止上述影響中的 不可重複讀、髒讀、虛讀
效率低
-
-
持久性
事務一旦提交,則改變是永久的,即使出現宕機也不會丟失
-
NoSQL
NoSQL = Not Only SQL 非關係型數據庫
特點
-
可擴展性
採用反正規化設計,數據之間沒有關聯
-
高可用性
可通過副本集實現故障轉移
-
可存儲巨量數據
數據之間關聯性小,易於分散存儲
-
高性能(併發讀寫)
數據之間關聯性小,易於分散存儲和併發訪問,有較好的讀寫性能
-
易於保存非結構化或半結構化數據
不需要事先定義數據字段,隨時新增
-
BASE 原則
https://stackoverflow.com/questions/3342497/explanation-of-base-terminology
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方式安裝
-
解壓到 /usr/local/mongodb/ 下面,並改名字
sudo tar -xvf <壓縮包> -C /usr/local/
sudo mv mongodbxxx mongodb
-
將mongodb的可執行文件加入 PATH 路徑
通過修改.bashrc文件,詳見linux筆記
-
創建數據庫目錄
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
安裝
-
導入MongoDB GPG 祕鑰
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
查看
sudo apt-key list
-
修改源文件列表,在/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
-
更新源
sudo apt-get update
-
安裝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
組成
mogod
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
配置
-
添加超級管理員/防火牆
https://blog.csdn.net/freeking101/article/details/80786525
https://www.howtoing.com/how-to-install-mongodb-on-ubuntu-18-04
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 配置,因此不用創建也可以啓動
啓動兩個實例
-
創建配置文件
sudo mkdir /etc/mongo sudo cp /etc/mongod.conf /etc/mongo/mongod-one.conf
-
創建數據保存文件
sudo cp -r -p /var/lib/mongodb /var/lib/mongodb-one
可能會有權限問題,因此這裏 -p 保持原目錄的屬性
-
修改配置文件中的端口和數據存儲路徑
# 數據保存文件 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
-
啓動
# 配置文件啓動 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中停止
-
切換至 admin 數據庫
> use admin Switched to db admin
-
執行關閉指令
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服務停止
-
-
在操作系統下停止
-
查詢 mongod 服務
ps -ef | grep mongod
-
殺死服務
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/
操作方法
啓動
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,讀寫速度也優於其他文件系統。