随着分布式的发展,传统数据库越来越无法支撑大型并发场景下的数据存储,Nosql数据库占据的比重越来越大,其中MongoDB则是文档数据库的代表
MongoDB入门
MongoDB是一款强大、灵活,并且易于扩展的通用型文档数据库。其自身可以扩展出很多强大的功能,比如二级索引、范围查询、排序、聚合、地理空间索引等。
MongoDB的特点
易于使用:MongoDB是一个面向文档的数据库,而不是传统的关系型数据库。这样的好处自然能带来更优秀的扩展性,与传统关系型数据库比,面向文档的数据库没有行的概念,与之对应的称之为文档,而通过在文档中嵌入文档和数组的方式来记录一条数据,因此MongoDB中也不再有预定义模式,即文档中的键和值不再是固定的类型和固定的大小,MongoDB不限制每个文档的键值对关系与文档的键值对数量,因此我们在操作文档进行增删变得更加简单了。
易于扩展:由于现在程序中的数据量越来越大,而数据库面临着一个选择,如何扩展数据库?如果是纵向扩展数据库的话,一般都是换更强的机器,而横向扩展一般是选择将内容拆分多个分区,在多个机器上分散,纵向的压力在于升级机器需要更大的成本,而横向往往会带来更多的分布式集群问题,给管理和开发带来更大的麻烦。MongoDB基于横向扩展设计,面向文档模型使得能很容易的在多台服务器上分布和迁移,而MongoDB自身能自动处理跨集群的数据,重新分配文档,因此当我们需要扩容时,只需要增加一台机器,MongoDB会自动完成很多管理。
高性能:MongoDB设计之初就是为了满足分布式存储环境下的高性能,MongoDB对文档进行动态填充,并且预分配数据文件使得可以利用额外空间换取稳定性能,并且在有索引的情况下,MongoDB会尽可能的多利用内存来实现索引的缓存,提高索引的效率。
MongoDB基础概念
在MongoDB中有一些最常见的基础概念,如下:
文档:文档是MongoDB数据库中的基本单元,可以类比为关系型数据库中的行
集合:集合在MongoDB中用来定义和承载对应的文档集合,对应关系型数据库中的表
实例:在MongoDB中也保持了和类似关系型数据库中的数据库(database)的概念,每个'数据库'可以有独立的多个集合,而这种数据库在MongoDB中称之为实例
_id:在关系型数据库中,常见的表结构中都会有一个id的字段作为主键,用来实现索引,并且每个表中id不允许为空和重复,而在MongoDB中,每个文档中也会有一个隐式的id键,如果我们指定了就会按照指定的值设置,如果没有指定,则会自动生成一个不重复的值作为—id的值
文档
文档是MongoDB的核心组件之一,而每一个文档就是键值对的有序集,每种语言的文档可能不一样,比如在java中文档可能就是Map,在其他语言中也有Hash作为文档的,在JavaScript中,文档则表现为对象的形式,比如:
{"greeting":"hello,zhangsan"}
而通常情况下我们的文档会包含多个键值对,每个键对应的值可以是不同类型,但是文档的键必须是字符串格式,键的定义不可以是以下几种情况:
1)键中包含\0,\0在文档中表示键的结尾
2).和$在文档结构中有特殊的意义,不建议在键中使用这两个特殊字符
除此之外,我们还要注意,mongoDB的文档虽然不在乎键值对的顺序,但是键和值的大小写是区分的,比如以下两种是完全不同的两个文档
{"foo":3}
{"foo":"3"}
并且在MongoDB的文档中,不能出现一样的键,因为文档本身不依赖顺序来查找对应的值,但是却需要依赖键来查找对应的值,如果允许出现重复的键,则会导致一系列的程序问题
集合
集合就是一类文档的组,如果说MongoDB中的文档等于关系型数据库中的行的话,那么集合就等同于关系型数据库中的表结构。在MongoDB中集合是动态模式的,即不限制文档内容必须一致,因此我们可以存放不同键值对的文档到同一个集合中,那么我们为何需要多个集合呢?只使用一个集合不也可以完成所有的文档操作吗?这里我们需要思考,如果所有的文档都存放一个集合中,会带来什么样的问题:
1.对于文档管理者或者开发者来说,操作难度变大,比如开发者可能希望每次查询返回的内容都是一样的格式,尤其是在强语言类型的情况下,例如java语言开发者,需要固定的格式传输和接受,因此当集合中出现多种不同格式的文档的时候,需要额外筛选文档,增加工作负担
2.MongoDB本身支持各种索引,而索引本身就是使用了文档的结构,而且索引是基于集合来建立的,因此当集合中都是同样格式的文档时,才能发挥出索引的效率
3.在一个集合中如果混入了大量的不同类型的文档,会比单一类型的集合查找起来更麻烦,相比较之下,单一类型的集合查找时需要的磁盘寻址操作会更少,效率会更高
因此,建议使用MongoDB的时候,我们可以尽量使用同一个模式,把一个类型的文档集合在一起,发挥出MongoDB的优势。集合在创建时,命名建议也要有一定的规范,不建议以下几种特殊情况的命名出现:
1)与文档的键命名一样,集合的命名中不要出现""或者\0这类代表空字符或者集合结束的字符
2)自己管理的集合不要命名为system.作为前缀,因为该命名是系统自带集合使用的前缀,例如system.users这个集合保存着整个数据库实例中的用户信息,而system.namespaces集合保存着所有数据库集合的信息
3)用户自定义创建的集合,命名中不建议出现保留字符或者特殊字符,比如$,部分驱动的确支持集合中包含特殊字符,但是部分驱动并不支持
数据库实例
在MongoDB中,多个文档组合一个集合,而多个集合可以组成数据库实例,每个实例可以承载0-多个集合,并且每个实例拥有独立的权限,因此存储在磁盘上的时候,每个数据库实例也是独立存放在不同的文件中的。数据库在创建的时候也有命名的问题,一般来说只要是UTF-8编码的字符串即可,建议注意以下几点:
1)命名不能为“”或者是\0这种代表数据库命名结束或者空字符串
2)命名中不能有/、\、.、、<、>、:、|、?、$、等,建议只出现ASCII中的字母和数字*
3)在MongoDB中数据库实例是区分大小写的,如命名为ABC的数据库实例和abc的实例并不会识别为同一个,为了规范建议统一使用小写命名
4)数据库实例的命名最大不能超过64字节
除了我们自定义的数据库实例以外,在MongoDB中有一些数据库是默认保留的,这部分数据库实例都是具有特殊语义的系统数据库,常见如:
admin:从身份认证授权的角度来说,admin数据库实例属于root级别的数据库,如果把一个用户授权到admin中,那么这个用户将获取所有数据库的权限,另外我们在admin数据库中也可以执行一些比较危险的操作,比如关闭服务器
local:local数据库实例如同名字一样,每个服务器上都会有一个本地的,用来存储服务器本地所有的集合信息,最重要的是此数据库无法被复制到其他服务器实例
config:config数据库实例存储了mongoDB中分片的信息,在集群环境下,可以在config数据库实例中看到集群分片设置的信息
安装及启动MongoDB
了解了Mongo的基础概念,我们开始正式安装MongoDB,首先进入MongoDB的官方网站:
找到Software,选择社区版的mongoDB Server下载
可以看到下载页面可以选择不同的操作系统以及包类型进行下载,
相比较其他的很多中间件的下载页友好很多,另外需要说明一下,MongoDB的版本管理比较简单,一般来说偶数号的版本,都是当前版本的稳定版,奇数号版本则是代表当前版本是开发迭代的版本,当然MongoDB的版本有三层,例如当前下载页默认的版本:4.2.8版本,第一位4代表是大版本4.X,而第二个版本才是我们刚刚说的是否正式的版本--这里的版本为8,代表当前的服务属于稳定版。
Window环境安装MongoDB
window版本的MongoDB安装就简单很多了,我们直接选择默认下载的版本,msi格式的安装包,点击Download进行下载,等待数秒后双击mongodb-win32-x86_64-2012plus-4.2.8-signed.msi,开始安装
点击Next,如果需要自定义安装地址,请选择Custom,不需要的可以直接选择Complete,默认安装在C盘路径中
到这一步,我们可以选择是否安装MongoDB服务,默认是勾选安装服务,建议保持勾选,不需要自启的可以考虑设置服务自启为手动启动
接着就到了是否安装MongoDB Compass的选项,MongoDB Compass是一个可视化的MongoDB数据管理工具,这里我们取消勾选,不需要使用该工具,后续我们可以使用Navicat For MongoDB等可视化工具操作管理
继续操作直到安装完成的界面,点击Finsh完成安装,接着我们可以进入MongoDB的安装目录下,找到mongo.exe程序,双击即可启动,启动后,我们来初始化设置管理员账号:
use admin; //切换数据库到admin
创建用户,及相关的角色
db.createUser({ user: "root", pwd: "123456", roles: [{ role: "root", db: "admin" }] });
创建完毕后,退出mongo shell:
exit;
接着我们可以找到配置文件mongod.cfg 并开始修改,找到security 字段,去掉前面的#,并且在下一行设置authorization: enabled ,代表着我们要启动MongoDB的认证机制
此时,我们重启mongo以后,随便查询操作数据库的时候,会提示我们没有进行授权认证操作,我们进行认证授权操作:
db.auth("root", "123456");
即可完成认证,当然我们也可以在启动mongdb的时候,在启动命令上添加账号密码信息的方式进行启动,例如:
mongo -u "root" -p "123456" --authenticationDatabase admin
注:需要注意一点,安装以后,在没有指定启动文件等存放的目录的情况下,MongoDB会默认找安装目录所在盘的根目录中的/data/db,如果是C盘那么在C盘的根目录中必须有/data/db目录,不然启动的时候会出现启动失败的情况
Linux环境安装MongoDB
Linux环境下,安装方式有很多,比如Docker直接镜像安装,本次在Centos7系统中使用传统的YUM安装和解压安装两种方式进行安装
YUM方式安装
如果是YUM安装的方式,需要注意,直接使用YUM下载的版本比较旧,按照官方安装的指导,我们可以看到,需要先创建YUM源(官方安装启动文档地址:https://mongodb.net.cn/manual/tutorial/install-mongodb-on-red-hat/ )
1.首先我们使用vim创建一个/etc/yum.repos.d/mongodb-org-4.2.repo
源文件:
vim /etc/yum.repos.d/mongodb-org-4.2.repo
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
esc后,:wq退出编辑,可以看到文件已经创建编辑完毕
接着我们开始下载安装稳定版的mongoDB,此时只需要使用yum命令即可:
sudo yum install -y mongodb-org
等待安装完成即可,需要注意的是,默认情况下,MongoDB使用mongod
用户帐户运行,并使用以下默认目录:
/var/lib/mongo (数据目录)
/var/log/mongodb (日志目录)
/etc/mongod.conf (配置文件)
安装完成后,可以启动mongoDB,启动和停止服务可以直接使用Centos7的systemctl管理:
systemctl start mongod.service (启动mongo服务)
systemctl stop mongod.service (关闭mongo服务)
如果是需要设置开启远程连接mongo,我们需要vim /etc/mongod.conf文件,找到bindIp
,将其注释掉,重启mongoDB服务即可,需要注意的是,不要忘记关闭防火墙或者开放默认的27017端口的防火墙
解压方式安装
如果是压缩包的方式解压下载的话,我们需要注意,Centos7有多个不同版本的选择,我们需要先知道当前版本:
cat /etc/redhat-release
可以看到我们当前的版本:
因此我们选择7.0对应的版本的压缩包进行下载:
这里我们选择直接copy link,在linux上使用wget直接下载
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz
等待下载完毕后,我们将其解压
tar -zxvf mongodb-linux-*-4.2.8.tgz
需要注意的是手动安装的话,我们需要保证mongoDB配置在环境变量中,此时可以选择将mongoDB的二进制文件(默认二进制文件位于/bin目录中)复制到PATH变量已经引用的目录中,例如:
sudo cp /path/to/the/mongodb-directory/bin/* /usr/local/bin/
接着指定PATH
变量中列出的目录创建 二进制文件的符号链接,即可,例如:
sudo ln -s /path/to/the/mongodb-directory/bin/* /usr/local/bin/
当然,除此之外,我们也可以选择,将我们的文件目录配置在环境变量中:
vim /etc/profile
在文件末尾添加:
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
修改完毕,我们推出环境变量文件,刷新环境变量文件
source /etc/profile
即可完成配置
修改常见配置
经过前面的步骤,我们基本已经完成了配置,但是在使用过程中,一般我们还会配置指定一些常见文件的目录,例如数据所在的目录,以及日志的目录,接下来我们来配置一下数据库文件/日志文件等的目录:
//进入mongo目录
cd /usr/local/mongodb
//创建数据库目录 并且设置权限
mkdir -p data/db
chmod -r 777 data/db
//创建日志所在的目录和日志文件
mkdir logs
cd logs
touch mongodb.log
//创建并编辑启动文件
cd ../
vim mongodb.conf
在mongodb.conf配置文件中添加如下配置:
dbpath=/usr/local/mongodb/data/db #数据文件存放目录
logpath=/usr/local/mongodb/logs/mongodb.log #日志存放目录
port=27017 #端口
fork=true #以守护程序的方式启用,即在后台运行
httpinterface=true #开启web控制台
logappend=true
maxConns=5000
storageEngine = mmapv1
这里我们可以看到配置文件中除了常见的配置以外,多了一个参数:
httpinterface
,原来mongoDB还可以在启动的时候启动一个HTTP服务器,用来监控比启动端口高1000的端口,默认情况下是28017端口,而开启这个端口则需要启用httpinterface
参数,启动以后则意味着我们可以通过浏览器访问http://192.168.1.130:28017,可以获取数据库的管理信息,而配置完成后,我们需要启动MongoDB服务的时候,只需要进入其二进制bin目录下:
cd /usr/local/mongodb/bin
使用mongod进行启动,不过需要注意的是,我们需要指定刚刚的配置文件进行启动
./mongod --config mongodb.conf
至此,MongoDB安装启动完成