MongoDB数据库的安装及基本配置使用(CentOS7)
注意:笔者测试环境CentOS7
,为了偷懒和内容的简洁性直接使用的root用户,如果你使用非root用户需要在命令前加上sodu
更新系统
yum update
添加MongoDB仓库
2018年11月23日更新:
当前版本已经是4.X
,以4.0
为例,这里需要做出一些修改
vi /etc/yum.repos.d/mongodb-org-4.0.repo
输入以下内容
[mongodb-org-4.0] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/7Server/mongodb-org/4.0/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
以下内容为历史版本,仓库源已失效:
我们安装的MongoDB版本为3.2(最新版本为3.6),首先我们需要建立一个Repository文件 /etc/yum.repos.d/mongodb-org-3.2.repo
为接下来yum
安装做装备
vi /etc/yum.repos.d/mongodb-org-3.2.repo
文件内容
[mongodb-org-3.2] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.2/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.2.asc
保存并退出.
安装MongoDB
Repository仓库我们已经添加好了,现在可以直接用yum
命令来安装
yum install mongodb-org
mongodb-org
包会在你的系统中自动安装以下内容:
mongodb-org-server
- MongoDB服务端,守护进程和相关的配置和初始化脚本mongodb-org-mongos
- mongos进程mongodb-org-shell
- MongoDB shell命令行工具mongodb-org-tools
- 包含了大量基础工具,包含数据备份/导入/导出等功能
配置MongoDB
MongoDB的本地配置文件位于 /etc/mongod.conf
使用的是YAML格式书写
systemLog
配置各种日志选项,包含:destination
让MongoDB将日志保存为文件还是以syslog方式存储logAppend
服务重启后日志在旧文件中追加还是新建日志文件path
日志文件的目录配置默认为/var/log/mongodb/mongod.log
storage
配置MongoDB数据存储项,包含:dbPath
数据文件的存储位置,默认为/var/lib/mongo
journal.enabled
启用或关闭操作日志的记录,防止数据丢失。
net
网络配置,包含:port
MongoDB的监听端口bindIP
绑定IP地址,便于从其他应用程序连接
这些是一些非常基础的默认配置
重点推荐:关于安全认证的配置
MongoDB 默认直接连接,无须身份验证,如果当前机器可以公网访问,且不注意Mongodb 端口(默认 27017)的开放状态,那么Mongodb就会产生安全风险,被利用此配置漏洞,入侵数据库。
修改文件 /etc/mongod.conf
取消security
的注释并添加
security: authorization: enabled
授权选项配置,允许数据库基于角色的访问控制。如果不做修改任何用户都可以修改任何数据库。
每次修改配置后别忘记重启服务
用户资源配置管理
基础命令
echo "mongod soft nofiles 64000" >> /etc/security/limits.conf echo "mongod soft nproc 64000" >> /etc/security/limits.conf
详细参数
username|@groupname type resource limit
username|@groupname
:设置需要被限制的用户名,组名前面加@和用户名区别。也可以用通配符*来做所有用户的限制。type
:有soft,hard以及-,soft指的是当前系统生效的设置值。hard 表明系统中所能设定的最大值。soft的限制不能比hard限制高。用-就表明同时设置了soft和hard的值。resource
:core
- 限制内核文件的大小date
- 最大数据大小fsize
- 最大文件大小memlock
- 最大锁定内存地址空间nofile
- 打开文件的最大数目rss
- 最大持久设置大小stack
- 最大栈大小cpu
- 以分钟为单位的最多CPU时间noproc
- 进程的最大数目as
- 地址空间限制maxlogins
- 此用户允许登录的最大数目
要使limits.conf
文件配置生效,必须要确保 pam_limits.so文件被加入到启动文件中。
查看 /etc/pam.d/login
文件中有:(没有就添加)
session required /lib/security/pam_limits.so
注意:好多人设置了limitc.conf没有测试,测试后发现没有生效
- 32位系统
session required /lib/security/pam_limits.so
- 64位系统
session required /lib64/security/pam_limits.so
MongoDB服务管理(启动/重启/停止)
sudo systemctl start mongod sudo systemctl restart mongod sudo systemctl stop mongod
开机自启动
systemctl enable mongod
创建数据库用户
如果你在MongoDB配置中启用了基于角色的访问控制(authorization
),我们需要创建一个存储用户信息的数据库:
1. 打开MongoDB Shell命令行工具
mongo
2. MongoDB默认会连接到名为test
的数据库,在创建任何用户前我们需要创建一个名为admin
数据库来存储用户数据:
use admin
3. 使用以下命令创建一个可以管理任意用户的超级管理员(安全起见,请自行更改 mongo-admin
和 password
的值)
db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})
创建成功后它会显示你刚刚创建的用户信息(除了密码)
Successfully added user: { "user" : "mongo-admin", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
4. 退出MongoDB Shell
quit()
第一次创建完管理员用户记得重启一下mongod服务。
5. 测试使用上面第三步中创建的用户来登录admin
数据库
mongo -u mongo-admin -p --authenticationDatabase admin
是不是和MySql很像?但是要注意authenticationDatabase
参数,如果没有这个参数的话仅可访问,而不可以连接数据库.
另一种验证方法(客户端连接后验证)
mongo --port 27017 use admin db.auth("mongo-admin", "password") // 输出 1 表示验证成功
6. 我们刚刚创建了超级管理员,现在我们创建一个数据库user-data
及其用户
use user-data
7. 创建数据库user-data
的用户example-user
,并做权限控制,对user-data
数据库仅赋予只读权限,对exampleDB
数据库具有读写权限
(请自行修改example-user和password的值)
db.createUser({user: "example-user", pwd: "password", roles:[{role: "read", db: "user-data"}, {role:"readWrite", db: "exampleDB"}]})
创建数据库及其用户只需要按照步骤6,7操作即可
8 退出MongoDB Shell
quit()
管理数据和集合Collections
集合(Collections)就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
通过下面的步骤我们来创建一个集合
1. 打开MongoDB Shell使用我们上面创建的example-user
登录
mongo -u example-user -p --authenticationDatabase user-data
2. 创建一个名为exmpleDB
的数据库
use exampleDB
注意数据库及用户权限的管理,参考上一段创建数据库用户的第7步.
查看当前数据库使用db
命令,显示全部数据库使用 show dbs
3. 创建一个名文exampleCollection
的集合
db.createCollection("exampleCollection", {capped: false})
4. 创建两条数据记录
var a = { name : "John Doe", attributes: { age : 30, address : "123 Main St", phone : 8675309 }} var b = { name : "Jane Doe", attributes: { age : 29, address : "321 Main Rd", favorites : { food : "Spaghetti", animal : "Dog" } }}
注意:上面两条记录的数据结构并不一样,这是NoSQL数据库的一个优势
5. 将数据插入exampleCollection
集合,使用insert()
方法
db.exampleCollection.insert(a) db.exampleCollection.insert(b)
每次执行成功后会返回信息
WriteResult({ "nInserted" : 1 })
6. 查看合集
show collections
该命令会显示所有合集,由于我们刚才仅创建了一个exampleCollection
合集,所以这里显示了
exampleCollection
7. 从集合中查找数据,我们需要使用find()
方法,这和关系型数据库select * from table
一样,会查找出这个集合/表的所有数据
db.exampleCollection.find()
得到结果
{ "_id" : ObjectId("571a3e7507d0fcd78baef08f"), "name" : "John Doe" } { "_id" : ObjectId("571a3e8707d0fcd78baef090"), "age" : 30 }
这时候你应该注意到这里多了一组key为"_id
",value为"ObjectId()
"的键值,这是当用户没有定义_id
的时候MongoDB会自动为其创建唯一索引.
ObjectId
是一个12字节 BSON 类型数据,有以下格式:
- 前4个字节表示时间戳
- 接下来的3个字节是机器标识码
- 紧接的两个字节由进程id组成(PID)
- 最后三个字节是随机数。
MongoDB中存储的文档必须有一个"
_id
"键。这个键的值可以是任何类型的,默认是个ObjectId对象。在一个集合里面,每个文档都有唯一的"
_id
"值,来确保集合里面每个文档都能被唯一标识。MongoDB采用
ObjectId
,而不是其他比较常规的做法(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值既费力还费时。
根据条件查找
db.exampleCollection.find({"name" : "John Doe"})
系统会返回符合{"name" : "John Doe"}
的所有数据
关于集合更多的帮助可以使用help()
命令来获取
db.exampleCollection.find().help()