侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

MongoDB运维篇(1)之安装部署与基本管理

zze
zze
2020-06-17 / 0 评论 / 0 点赞 / 672 阅读 / 10460 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

环境准备

  • Linux 发行版:CentOS 7.8;
  • 主机 IP:10.0.1.51;
  • MongoDB 版本:3.6.12;
  • 关闭 iptables 和 SELinux;

MongoDB 安装包的下载方式有如下两种:

除了上述的操作之外,官方推荐关闭大页内存机制,在 /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 到的库,之后在使用用户登录时,要加上验证库才能登陆。

关于验证库总结有如下几点:

  1. 建用户时,use 到的库,就是此用户的验证库;
  2. 登录时,必须明确指定验证库才能登录;
  3. 通常,管理员用的验证库是 admin,普通用户的验证库一般是所管理的库设置为验证库;
  4. 如果直接登录到数据库,不进行 use,默认的验证库是 test,不是我们生产建议的;
  5. 从 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 远程连接:

image.png

查看用户

在 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
0

评论区