MongoDB—简介 安装 使用
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,读写速度也优于其他文件系统。