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/mongojournal.enabled启用或关闭操作日志的记录,防止数据丢失。
net网络配置,包含:portMongoDB的监听端口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()