1.1 数据库管理系统
在了解MongoDB之前需要先了解先数据库管理系统
1.1.1 什么是数据?
数据(英语:data),是指未经过处理的原始记录。
一般而言,数据缺乏组织及分类,无法明确的表达事物代表的意义,它可能是一堆的杂志、一大叠的报纸、数种的开会记录或是整本病人的病历纪录。数据描述事物的符号记录,是可定义为意义的实体,涉及事物的存在形式。是关于事件之一组离散且客观的事实描述,是构成讯息和知识的原始材料。
1.1.2 什么是数据库管理系统?
数据库管理系统(英语:database management system,缩写:DBMS) 是一种针对对象数据库,为管理数据库而设计的大型电脑软件管理系统。
具有代表性的数据管理系统有:Oracle、Microsoft SQL Server、Access、MySQL及PostgreSQL等。通常数据库管理师会使用数据库管理系统来创建数据库系统。
现代DBMS使用不同的数据库模型追踪实体、属性和关系。在个人电脑、大型计算机和主机上应用最广泛的数据库管理系统是关系型DBMS(relational DBMS)。在关系型数据模型中,用二维表格表示数据库中的数据。这些表格称为关系。
数据库管理系统主要分为俩大类:RDBMS、NOSQL
关于RDBMS的更多信息参考:http://www.cnblogs.com/clsn/category/1131345.html
1.1.3 常见数据库管理系统?
常见的数据库管理系统,及其排名情况如下:
1.2 NoSQL是什么?
1.2.1 NoSQL简介
NoSQL是对不同于传统的关系数据库的数据库管理系统的统称。
两者存在许多显著的不同点,其中最重要的是NoSQL不使用SQL作为查询语言。其数据存储可以不需要固定的表格模式,也经常会避免使用SQL的JOIN操作,一般有水平可扩展性的特征。
NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。
2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论,来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。
2009年在亚特兰大举行的"no:sql(east)“讨论会是一个里程碑,其口号是"select fun, profit from real_world where relational=false;”。因此,对NoSQL最普遍的解释是“非关联型的”,强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。
基于2014年的收入,NoSQL市场领先企业是MarkLogic,MongoDB和Datastax。基于2015年的人气排名,最受欢迎的NoSQL数据库是MongoDB,Apache Cassandra和Redis.
1.2.2 NoSQL数据库四大家族
NoSQL中的四大家族主要是:列存储、键值、图像存储、文档存储,其类型产品主要有以下这些。
1.2.3 NoSQL的优势
高可扩展性、分布式计算、没有复杂的关系、低成本
架构灵活、半结构化数据
1.2.4 NoSQL与RDBMS对比
1.3 MongoDB简介
1.3.1 MongoDB是什么
MongoDB并非芒果的意思,而是源于 Humongous(巨大)一词。
1.3.2 MongoDB的特性
MongoDB的3大技术特色如下所示:
除了上图所示的还支持:
二级索引、动态查询、全文搜索 、聚合框架、MapReduce、GridFS、地理位置索引、内存引擎 、地理分布等一系列的强大功能。
但是其也有些许的缺点,例如:
- 多表关联: 仅仅支持Left Outer Join
- SQL 语句支持: 查询为主,部分支持
- 多表原子事务: 不支持
- 多文档原子事务:不支持
- 16MB 文档大小限制,不支持中文排序 ,服务端 Javascript 性能欠佳
1.3.3 关系型数据库与mongodb对比
存储方式对比
在传统的关系型数据库中,存储方式是以表的形式存放,而在MongoDB中,以文档的形式存在。
数据库中的对应关系,及存储形式的说明
MongoDB与SQL的结构对比详解
1.3.4 MongoDB数据存储格式
JSON格式
JSON 数据格式与语言无关,脱胎于 JavaScript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。
JSON数据库语句可以容易被解析。
Web 应用大量使用,NAME-VALUE 配对
BSON格式
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
二进制的JSON,JSON文档的二进制编码存储格式
BSON有JSON没有的Date和BinData
MongoDB中document以BSON形式存放
例如:
db.meeting.insert({meeting:“M1 June",Date:"2018-01-06"});
1.3.5 MongoDB的优势
📢 MongoDB是开源产品
📢 On GitHub Url:https://github.com/mongodb
📢 Licensed under the AGPL,有开源的社区版本
📢 起源& 赞助by MongoDB公司,提供商业版licenses 许可
这些优势造就了mongodb的丰富的功能:
JSON 文档模型、动态的数据模式、二级索引强大、查询功能、自动分片、水平扩展、自动复制、高可用、文本搜索、企业级安全、聚合框架MapReduce、大文件存储GridFS
1.3.6 高可用的复制集群
自动复制和故障切换
多数据中心支持滚动维护无需关机支持最多50个成员
1.3.7 水平扩展
这种方式是目前构架上的主流形式,指的是通过增加服务器数量来对系统扩容。在这样的构架下,单台服务器的配置并不会很高,可能是配置比较低、很廉价的 PC,每台机器承载着系统的一个子集,所有机器服务器组成的集群会比单体服务器提供更强大、高效的系统容载量。
这样的问题是系统构架会比单体服务器复杂,搭建、维护都要求更高的技术背景。分片集群架构如下图所示:
1.3.8 各存储引擎的对比
MySQL InnoDB | MySQL NDB | Oracle | MongoDB MAPI | MongoDB WiredTiger | |
---|---|---|---|---|---|
事务 | YES | YES | ES | NO | NO |
锁粒度 | ROW-level | ROW-level | ROW-level | Collection-level | Document-level |
Geospatial | YES | YES | YES | YES | YES |
MVCC | YES | NO | YES | NO | NO |
Replication | YES | YES | YES | YES | YES |
外键 | YES | YES(From | 7.3) | YES | NO |
数据库集群 | NO | YES | YES | YES | YES |
B-TREE索引 | YES | YES | YES | YES | YES |
全文检索 | YES | NO | YES | YES | YES |
数据压缩 | YES | NO | YES | NO | YES |
存储限制 | 64TB | 384EB | NO | NO | NO |
表分区 | YES | YES | YES | YES (分片) | YES (分片) |
1.3.9 数据库功能和性能对比
由下图可以看出MongoDB数据库的性能扩展能力及功能都较好,都能够在数据库中,站立一足之地。
1.3.10 MongoDB适用场景
网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。
1.3.11 MongoDB 慎用场景
慎用场景 | 原因 |
---|---|
PB 数据持久存储大数据分析数据湖 | Hadoop、Spark提供更多分析运算功能和工具,并行计算能力更强 MongoDB + Hadoop/Spark |
搜索场景:文档有几十个字段,需要按照任意字段搜索并排序限制等 | 不建索引查询太慢,索引太多影响写入及更新操作 |
ERP、CRM或者类似复杂应用,几十上百个对象互相关联 | 关联支持较弱,事务较弱 |
需要参与远程事务,或者需要跨表,跨文档原子性更新的 | MongoDB 事务支持仅限于本机的单文档事务 |
100% 写可用:任何时间写入不能停 | MongoDB换主节点时候会有短暂的不可写设计所限 |
1.3.12 什么时候该MongDB
应用特征 | Yes/No? |
---|---|
我的数据量是有亿万级或者需要不断扩容 | |
需要2000-3000以上的读写每秒 | |
新应用,需求会变,数据模型无法确定 | |
我需要整合多个外部数据源 | |
我的系统需要99.999%高可用 | |
我的系统需要大量的地理位置查询 | |
我的系统需要提供最小的latency | |
我要管理的主要数据对象<10 |
在上面的表格中进行选择,但有1个yes的时候:可以考虑MongoDB;当有2个以上yes的时候:不会后悔的选择!
1.4 MongoDB的部署
我的安装环境:CentOS7.6 + MongoDB4.0.13。
1.4.1 下载MongoDB。
官网下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.13.tgz
压缩包下载完成后winscp上传到Linux上,然后解压、改名:
tar -zxvf mongodb-linux-x86_64-4.0.13.tgz
mv mongodb-linux-x86_64-4.0.13 mongodb
1.4.2 配置系统环境变量
vi /etc/profile
键盘按下“i”进入编辑模式即可。在文件的最后加上:
#mongodb
export PATH=$PATH:/usr/local/mongodb/bin
最后按下“Esc”,输入“:wq”保存退出vi编辑模式,source /etc/profile使修改生效即可。
1.4.3 创建MongoDB数据存放文件夹和日志记录文件夹,为后面的配置文件使用
mkdir -p /home/data/mongodb/data/db
mkdir -p /home/data/mongodb/logs
touch /home/data/mongodb/logs/mongodb.log #创建空文件!!! 注意不是目录而是文件
注意:这里不创建空的log文件的话,后面 mongodb 启动的时候会报错。
ERROR: child process failed, exited with error number 1
1.4.4 创建MongoDB运行时使用的配置文件
进入bin目录下:
cd /usr/local/mongodb/bin
创建mongodb.conf配置文件:
vim mongodb.conf
会提示是new file,直接输入下面内容:
dbpath = /home/data/mongodb/data/db #数据文件存放目录
logpath = /home/data/mongodb/logs/mongodb.log #日志文件存放目录
port = 27017 #端口
fork = true #以守护程序的方式启用,即在后台运行
#auth=true #需要认证。如果放开注释,就必须创建MongoDB的账号,使用账号与密码才可远程访问,第一次安装建议注释
bind_ip=0.0.0.0 #允许远程访问,或者直接注释,127.0.0.1是只允许本地访问
最后“Esc”,输入“:wq”保存退出vim编辑模式即可。注意:注释符号#和数据之间必须是一个空格。
1.5 mongodb 启动与关闭
1.5.1 启动MongoDB服务:
进入bin目录下,加载配置文件方式启动:
cd /usr/local/mongodb/bin
./mongod -f mongodb.conf
至此,MongoDB在Linux上的安装启动完毕。
查看端口映射检查是否启动成功:
netstat -nltp|grep mongod
显示:
[root@nash ~]# netstat -nltp | grep mongod
tcp 0 0 0.0.0.0:27017 0.0.0.0:* LISTEN 3747/mongod
[root@nash ~]#
或者:netstat -nltp|grep 27017
或者: ps -ef | grep mongo ,显示
[root@nash ~]# ps -ef | grep mongo
root 3747 1 0 17:26 ? 00:00:51 /usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb.conf
root 6302 2892 0 20:03 pts/0 00:00:00 grep --color=auto mongo
[root@nash ~]#
1.5.2 关闭MongoDB。
关闭方式也有很多种,下面列举几种。
1.5.2.1 mongod命令关闭
./mongod -f mongodb.conf --shutdown
mongod 命令的 shutdown 选项能干净的关闭 MongoDB 服务,会释放内存中MongoDB占用的内存,个人推荐。
1.5.2.2 kill进程
kill MongoDB的pid ,直接杀死MongoDB的进程id。kill -9 pid 强制杀死,有时可能会出现错误关不掉时就可使用这种强制方式,但注意这种方式可能并不会马上释放内存中MongoDB占用的内存,且如果这时候有数据往MongoDB新增可能会导致数据丢失。注:查看pid:ps -ef | grep mongo , 结果的第二列就是pid。
1.5.2.3 pkill mongod
pkill mongod
1.6 mongodb 以服务的形式启动及自启动
cd /etc/init.d/
vim mongodb
添加一下内容:
#!/bin/bash
# chkconfig: - 85 15
start() {
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb.conf
}
stop() {
/usr/local/mongodb/bin/mongod -f /usr/local/mongodb/bin/mongodb.conf --shutdown
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
echo $"Usage:$0 {start|stop|restart}"
exit 1
esac
加入自启动:
cd /etc/init.d/
#设置执行权限
chmod a+x mongodb
#加入系统服务
chkconfig --add mongodb
#开机服务自启
chkconfig mongodb on
1.7 创建MongoDB的账号
这也是我第一次搭MongoDB,由于刚开始在配置文件中加了auth=true,导致本地可正常访问,远程却一直连接不上MongoDB(远程使用的是默认空用户名和密码),看了很多博客也没找到原因,最后为MongoDB创建了账号远程才可访问(这里吐槽一下有的博主写的东西没有亲自操作一遍就从网上复制粘贴然后发布,有些没有责任心)。现在自己才发现原来是这个配置导致的,这也是上面的配置文件我为什么建议刚安装时注释掉auth=true,当然,后面如果熟悉了账号的创建,为了安全还是应该开启的。
建议注释了auth=true后进行下面的操作,如果开启了认证,可能会导致下面的操作执行失败(只是可能)。
进入bin目录下:
cd /opt/mongodb-4.0.1/bin
运行mongo命令:
[root@nash ~]# mongo
MongoDB shell version v4.0.13
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c54e6ebe-06f0-4796-b6ec-f857a5c4a7a1") }
MongoDB server version: 4.0.13
使用admin数据库:use admin ,注意admin数据库下创建的账号权限是所有库通用的,即是全局认证的。
创建用户:
db.createUser({ user: 'root', pwd: 'root',roles: [ { role: "dbOwner", db: "admin" }] })
> use admin
switched to db amin
> db.createUser({ user: 'root', pwd: 'root',roles: [ { role: "dbOwner", db: "admin" }] })
Successfully added user: {
"user" : "root",
"roles" : [
{
"role" : "dbOwner",
"db" : "admin"
}
]
}
>
这时候MongoDB的admin数据库就有了账号,启用auth=true,重启后,再连接就需要账号密码授权了。
重新登录之后,授权:
> use admin
switched to db amin
> db.auth("root","root")
这时候就拥有了权限对数据库进行操作:
> db.firstCollection.save({"name":"yzh","age":"25"})
WriteResult({ "nInserted" : 1 })
>
退出mongo命令行工具:ctrl + c
mongo工具的其它命令就不再详述,待更新。。。