Relational Database 关系型数据库
存储结构化数据
结构化数据
结构化查询语言(SQL)
数据操纵语言,数据定义语言
ACID规则
原子性
事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚
一致性
数据库从一个有效正确的状态到另一个有效正确的状态
正确的状态:当前的状态满足预定的约束
例如:某个表的某个字段在定义的时候给这个字段的类型是number类型,并且它的值不能小于0
隔离性
并发访问数据库事务之间的影响
脏读
一个事务读取到另一个事务未提交的数据
不可重复读
一个事务读取到另一个事务已经提交的数据(修改)
虚读
一个事务读取到另一个事务新增插入的数据(插入)
隔离级别
Read Uncommited 读未提交
该隔离界别,上述影响都不能防止
Read Commited 读已经提交
该隔离界别,可以防止上述影响中的 脏读
Repeatable Read 可重复读(MySQL 默认级别)
该隔离界别,可以防止上述影响中的 不可重复读、脏读
Serializable 序列化
该隔离界别,可以防止上述影响中的 不可重复读、脏读、虚读
效率低
持久性
事务一旦提交,则改变是永久的,即使出现宕机也不会丢失
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 -- 最终一致性
系统将随着时间的推移变得一致
存储结构
采用集合来存储文档数据,一个集合可以存储海量文档
文档采用 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 字段设置为主键 |
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
show dbs
显示数据库列表
db
显示当前数据库对象或集合
use <db>
连接到一个指定的数据库
数据库名可以是满足以下条件的任意UTF-8字符串。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库
mongodb 是面向集合的存储,存储数据时使用不同的集合来分类,对应关系数据库中的表
文档是mongodb存储数据的基本单元,对应关系数据库中的行(记录)
文档使用 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
特点
对单个文档的操作具有原子性
3.6及之前的版本不支持多文档事务
4.0版本可以在其副本集架构里实现多文档事务
4.2版本实现分布式架构的多文档事务
视图,数据查询的结果,非实际存在的集合
索引,一个单独的、存储在磁盘上的数据结构,包含数据表中所有记录的引用指针
给某个字段添加索引,可以快速找出在该字段有特定值的文档,提高查询性能
用户,如果mongodb开启了安全认证,则会在数据库中产生用户表。每个数据库中都有独立的用户表
存储过程,用 javascript 编写,存储在 system.js 集合中,具有输入和输出参数和嵌套调用等特性,可提供应用程序调用
字段,文档中的每个键值对中的键,可以弹性的增加或减少,相当于关系数据库中的列
解压到 /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
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
-f [--config] arg
指定配置文件
mongod --config /etc/mongod.conf
--logpath arg
指定日志输出文件
将所有诊断日志信息发送到日志文件,而不是标准输出或主机的syslog系统。MongoDB在指定的路径上创建日志文件。默认情况下,MongoDB将备份现有的日志文件(不是覆盖)并创建一个新的文件。要改为追加到现有的日志文件,请设置——logappend选项
--dbpath arg
指定数据保存文件,默认 /data/db
mongod --dbpath=/data/db2 --port=27018
--port arg
指定mongodb运行实例的端口,默认 27017
mongod --dbpath=/data/db2 --port=27018
应用程序和数据库交互结合的接口
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
字符串:file 或 syslog
file
一般使用 file,需指定 path
syslog
使用 syslog 守护进程记录日志,时间戳上有误差
syslog 是在记录消息时才生成时间戳,而不是在mongodb发出消息时,在时间戳上有误差,建议使用 file 来记录日志,确保时间戳的准确性
true
实例重启时,新的日志会追加到现有日志文件中
false
默认值,实例重启时,备份现有日志文件,并创建新的日志文件
字符串
存放日志的文件路径
存放数据的文件路径
linux 默认 /data/db
enabled
布尔值
true
表示启动永久性日志,以确保数据文件保持有效性并可以恢复
https://docs.mongodb.com/manual/reference/configuration-options/#processmanagement-options
布尔值
true
启动守护进程模式,程序可以在后台执行
false(默认)
以非守护进程运行
指定保存 mongod 或 mongos 进程 ID 的文件
fork
属性使用加载数据库时区的路径,默认为/usr/share/zoneinfo
启动端口,默认 27017
监听客户端链接的 IP 地址,默认 127.0.0.1
,仅用本机 IP 登录。
若绑定所有 IPv4 ,则设定为 0.0.0.0
若绑定所有 IPv4 和 IPv6,则设定为 ::, 0.0.0.0
4.2 版本中可以用
"*"
代替
若需绑定多个IP地址,则需用逗号隔开
布尔值
true
绑定所有的 IPv4 地址
配置文件启动
mongod --config /etc/mongod.conf
命令启动
mongod --dbpath=/home/data/db2 --port=27018
systemd 启动
sudo systemctl start mongod
检查端口占用
sudo lsof -i:27018
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
安装及使用
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
https://docs.mongodb.com/manual/administration/production-notes/#kernel-and-file-systems
https://blog.csdn.net/xiegh2014/article/details/52687734
原文:https://www.cnblogs.com/usmile/p/13574840.html