环境准备
- Linux 发行版:CentOS 7.8;
- 主机 IP:10.0.1.51;
- MongoDB 版本:3.6.12;
- 关闭 iptables 和 SELinux;
MongoDB 安装包的下载方式有如下两种:
- 官网下载:https://www.mongodb.com/try/download/community。
- 百度网盘下载:https://pan.baidu.com/s/1bYRH_5IA1BIugnRAdw7_eQ | 提取码:
vaju
。
除了上述的操作之外,官方推荐关闭大页内存机制,在 /etc/rc.local
下添加如下代码即可:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
重读该文件让配置立即生效:
$ . /etc/rc.local
安装
1、创建所需用户和组:
$ useradd mongod && echo 123 | passwd mongod --stdin
2、创建所需目录结构:
$ mkdir -p /mongodb/{conf,log,data,bin}
3、上传安装包到 /opt
目录并解压:
$ tar xf mongodb-linux-x86_64-rhel70-3.6.12.tgz
4、拷贝解压后的 bin
目录到 /mongodb
目录下:
$ cp -r /opt/mongodb-linux-x86_64-rhel70-3.6.12/bin /mongodb/
5、设置目录权限:
$ chown -R mongod.mongod /mongodb
6、配置 mongod
用户的环境变量:
$ su - mongod
$ vim .bash_profile
# 添加如下配置
PATH=$PATH:/mongodb/bin
export PATH
$ . .bash_profile
7、启动 MongoDB 服务:
# 在 mongod 用户下启动
$ mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongod.log --port=27017 --logappend --fork
about to fork child process, waiting until server is ready for connections.
forked process: 11972
child process started successfully, parent exiting
8、测试登录:
$ mongo
MongoDB shell version v3.6.12
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
...
Number of processes should be at least 32767.5 : 0.5 times number of files.
>
配置文件
MongoDB 服务的配置文件可在启动服务时通过 -f
选项来指定,如 mongod -f /mongodb/conf/mongod.conf
,对应的关机操作则为 mongod -f /mongodb/conf/mongod.conf --shutdown
。
常用的配置项有如下:
# 系统日志相关
systemLog:
destination: file
# 日志路径
path: "/mongodb/log/mongodb.log"
# 日志以追加模式记录
logAppend: true
# 数据存储相关
storage:
journal:
enabled: true
# 存放数据的目录
dbPath: "/mongodb/data"
# 进程控制
processManagement:
# 启用后台守护进程
fork: true
# pid 文件的位置,一般不用配置,默认生成到数据目录中
pidFilePath: <string>
# 网络配置相关
net:
# 指定监听的地址,默认监听在 0.0.0.0
bindIp: <ip>
# 指定监听端口,默认为 27017
port: <port>
# 安全验证相关
security:
# 是否打开用户名密码验证
authorization: enabled
# 以下是复制集与分片集群相关
replication:
oplogSizeMB: <NUM>
replSetName: "<REPSETNAME>"
secondaryIndexPrefetch: "all"
sharding:
clusterRole: <string>
archiveMovedChunks: <boolean>
configDB: <string>
replication:
localPingThresholdMs: <int>
看完上述说明我们就可以自己来给 MongoDB 编写配置文件啦~看如下示例:
$ cat << EOF > /mongodb/conf/mongod.conf
systemLog:
destination: file
path: "/mongodb/log/mongod.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/data/"
processManagement:
fork: true
net:
port: 27017
bindIp: 10.0.1.51,127.0.0.1
EOF
下面可以通过上述配置文件关闭前面启动的 MongoDB 服务:
$ mongod -f /mongodb/conf/mongod.conf --shutdown
使用 systemd 管理
下面操作需使用
root
用户操作。
添加如下 unit service 文件:
$ cat > /etc/systemd/system/mongod.service <<EOF
[Unit]
Description=mongodb
After=network.target remote-fs.target nss-lookup.target
[Service]
User=mongod
Type=forking
ExecStart=/mongodb/bin/mongod --config /mongodb/conf/mongod.conf
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/mongodb/bin/mongod --config /mongodb/conf/mongod.conf --shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
测试重启:
$ systemctl restart mongod.service
常用操作
这里说的常用操作指的是在 MongoDB 命令行提示符下的常用操作,所以这里需要切换到 mongod
用户并登录到 MongoDB
# 也可在 mongo 命令后指定一个库名,表示登入后立即切换到该库
$ mongo
MongoDB shell version v3.6.12
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
...
>
在传统关系型数据库(如 mysql)中数据库对象主要可分为库(database)、表(table)、行(raw),而在 MongoDB 中,也有对应的对象与库、表、行对应,分别是库(database)、集合(collection)、文档(document)。
所以在 MongoDB 中的操作也主要就是针对这几个对象,下面列出一些常用操作:
# 查看所有数据库,可简写为 show dbs
> show databases;
admin 0.000GB
config 0.000GB
local 0.000GB
# 切换到指定数据库
> use local
switched to db local
# 查看所有集合
> show tables
startup_log
# 在 mongodb 中表对应的概念为集合,也可使用 show collections 查看,和 show tables 的效果相同
> show collections
startup_log
# 查看当前所在的数据库
> db
local
# mongodb 中不需要新建数据库,直接 use 一个库,如果没有这个库则会自动创建,此时该数据库只是一个临时库,只有在该库中真正插入了数据该库才会持久化存在
> use test
switched to db test
# mongodb 中不需要事先新建集合,直接向指定名称的集合插入数据,如果没有这个集合则会自动创建,如下操作则是在 test 库下创建了一个 test 集合
> db.test.insert({id:1,name:"zs"})
WriteResult({ "nInserted" : 1 })
> db.test.insert({id:2,name:'ls'})
WriteResult({ "nInserted" : 1 })
# 查看 test 表中的内容
> db.test.find()
{ "_id" : ObjectId("5ee9a2cc3af1c6e2e18c2a79"), "id" : 1, "name" : "zs" }
{ "_id" : ObjectId("5ee9a2d83af1c6e2e18c2a7a"), "id" : 2, "name" : "ls" }
# 按指定条件查询
> db.test.find({id:1})
{ "_id" : ObjectId("5ee9a2cc3af1c6e2e18c2a79"), "id" : 1, "name" : "zs" }
# 批量插入数据
> for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mongodb","age":6,"date":new Date()})}
WriteResult({ "nInserted" : 1 })
# 设定查询时每页显示的行数,默认为 20
> DBQuery.shellBatchSize=50
50
# 删除集合中的所有记录
> db.log.remove({})
WriteResult({ "nRemoved" : 10000 })
# 去重显示指定字段信息
> db.test.distinct('name')
[ "zs", "ls" ]
# 查看集合的状态信息
> db.test.stats()
# 查看集合中数据的原始大小
> db.log.dataSize()
800000
# 查看集合中索引数据的原始大小
> db.log.totalIndexSize()
110592
# 查看集合中索引+数据压缩后存储占用的大小
> db.log.totalSize()
376832
# 查看集合中数据压缩后存储占用的大小
> db.log.storageSize()
266240
# 查看库级别下的所有可操作函数
> db.help()
# 查看表级别下的所有可操作函数
> db.test.help()
# 查看复制集的所有可操作函数
> rs.[tab]
# 查看分片的所有可操作函数
> sh.[tab]
用户管理
和其它数据库产品不同的是,MongoDB 的用户认证除了要验证用户名和密码外,还需要指定一个验证库,验证库其实就是建立用户时 use
到的库,之后在使用用户登录时,要加上验证库才能登陆。
关于验证库总结有如下几点:
- 建用户时,
use
到的库,就是此用户的验证库; - 登录时,必须明确指定验证库才能登录;
- 通常,管理员用的验证库是
admin
,普通用户的验证库一般是所管理的库设置为验证库; - 如果直接登录到数据库,不进行
use
,默认的验证库是test
,不是我们生产建议的; - 从 3.6 版本开始,不添加
bindIp
参数,默认不让远程登录,只能本地管理员登录;
创建用户
创建用户语法如下:
db.createUser
{
user: "<name>",
pwd: "<pwd>",
roles: [
{ role: "<role>", db: "<database>" },
...
]
}
说明:
user:用户名
pwd:密码
roles:
role:角色名,常用有如下几个取值:
root:管理员用户;
readWrite:读写;
read:只读;
dbOwner:该数据库的所有者,具有该数据库的全部权限;
dbAdmin:只能对一些数据库对象的管理操作,但是没有数据库的读写权限;
db:作用对象
看下面示例,在 MongoDB 命令提示符下执行如下操作:
> use admin
> db.createUser(
{
user: "root",
pwd: "root123",
roles: [ { role: "root", db: "admin" } ]
})
如上操作则创建了一个名为 root
的管理员用户,手动测试认证是否通过:
> db.auth("root","root123")
1
默认情况下 MongoDB 是没有开启认证功能的,我们需要在配置文件中添加如下配置以启用认证功能:
$ vim /mongodb/conf/mongod.conf
security:
authorization: enabled
重启 MongoDB 并使用新用户登录:
# 重启
$ systemctl restart mongod.service
# 如果是本机,则 10.0.1.51/ 可省略
$ mongo -uroot -proot123 10.0.1.51/admin
MongoDB shell version v3.6.12
connecting to: mongodb://10.0.1.51:27017/admin?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("3ba3f9e4-d3bb-4722-8640-d85edf204dd2") }
MongoDB server version: 3.6.12
>
测试使用 navicat 远程连接:
查看用户
在 mongodb 中已创建的用户保存在 admin
库中的 system.users
中,所以可以通过如下方式查看:
> use admin
switched to db admin
# pretty() 函数可格式化输出
> db.system.users.find().pretty()
{
"_id" : "admin.root",
"user" : "root",
"db" : "admin",
"credentials" : {
"SCRAM-SHA-1" : {
"iterationCount" : 10000,
"salt" : "1HzQ1cBduCuoeMQkpeTXig==",
"storedKey" : "mXcgJwrS1PAffxHjYRDvBBDs4/A=",
"serverKey" : "1tIwEI8bXYK85r7IgwTu75rSpyw="
}
},
"roles" : [
{
"role" : "root",
"db" : "admin"
}
]
}
删除用户
先创建一个拥有 app1
库所有权限的用户,如下:
> use app1
> db.createUser(
... {
... user: "admin",
... pwd: "123",
... roles: [ { role: "dbOwner", db: "app1" } ]
... })
而如果要执行删除用户的操作,则需要先 use
到创建该用户的库下,然后执行删除操作:
> use app1
> db.dropUser("admin")
true
评论区