MongoDB7.0的安装

摘要

  • 本文介绍Linux下MongoDB7.0的安装

  • MongoDB官方文档

  • 本文基于CentOS8(x86_64)

MongoDB 7.0新特性

安装MongoDB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#下载MongoDB
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel80-7.0.6.tgz
# 解压
tar -zxvf mongodb-linux-x86_64-rhel80-7.0.6.tgz
# 方便起见,创建软连接
ln -s mongodb-linux-x86_64-rhel80-7.0.6 mongodb

# 修改/etc/profile,添加环境变量,方便执行MongoDB命令
export MONGODB_HOME=/usr/local/soft/mongodb
PATH=$PATH:$MONGODB_HOME/bin

#重新加载环境变量
source /etc/profile

#查看版本,检查命令是否可用
mongod --version

#创建dbpath和logpath的存储目录
mkdir -p /mongodb/data /mongodb/log

安装mongoDB时可能遇到的问题

    1. 启动mongodb服务时,提示mongod: error while loading shared libraries: libcrypto.so.1.1: cannot open shared object file: No such file or directory

解决方法:

1
2
3
4
5
6
7
8
wget  https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -zxvf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
./config
# 如果make时提示 /bin/sh: gcc: command not found,需要先安装gcc:sudo yum install gcc -y
make && make install
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1

启动mongodb服务

  • 命令参数启动

1
2
3
4
5
6
7
mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork
# 参数说明
--port: 指定端口,默认为27017
--dbpath: 指定数据文件存放目录
--logpath: 指定日志文件,注意是指定文件不是目录
--bind_ip: 默认只监听localhost网卡
--fork: 后台启动
  • 也可以将上面的参数写到配置文件中,如/mongodb/conf/mongo.conf文件,必须是yaml格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
systemLog:
destination: file
path: /mongodb/log/mongodb.log # log path
logAppend: true
storage:
dbPath: /mongodb/data # data directory
engine: wiredTiger #存储引擎,默认值就是wiredTiger
journal: #journal日志配置
commitIntervalMs: 100 #mongod进程在日志操作之间允许的最大时间(以毫秒为单位)。值可以从1到500毫秒不等。较低的值会增加日志的耐用性,而牺牲了磁盘性能。在WiredTiger上,默认的日志提交间隔是100毫秒。此外,包含或暗示j:true的写入将导致期刊立即同步。
net:
bindIp: 0.0.0.0
port: 27017
processManagement:
fork: true
  • 将命令行参数直接转换为yaml:--outputConfig

1
$ mongod --port=27017 --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --bind_ip=0.0.0.0 --fork --outputConfig
1
2
3
4
5
6
7
8
9
10
11
net:
bindIp: 0.0.0.0
port: 27017
outputConfig: true
processManagement:
fork: true
storage:
dbPath: /mongodb/data
systemLog:
destination: file
path: /mongodb/log/mongodb.log

删除outputConfig: true这一行,然后将其余内容复制到mongo.conf中

1
2
3
4
5
# 启动mongo服务
mongod -f /mongodb/conf/mongo.conf

# 关闭mongo服务,注意:macos下不支持 --shutdown
mongod -f /mongodb/conf/mongo.conf --shutdown

shell客户端mongosh

  • 从mongodb6开始不再支持mongo命令,而是需要使用mongosh命令,关于mongosh命令的使用可以查看官方文档

  • mongosh命令的使用方式与mongo命令基本一致

  • 下载地址:mongosh下载地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 下载安装包
# openssl11是centos7的版本,目前支持centos8,但更推荐使用centos8时下载openssl3的版本
wget https://downloads.mongodb.com/compass/mongosh-2.2.2-linux-x64-openssl11.tgz
# 解压
tar -zxvf mongosh-2.2.2-linux-x64-openssl11.tgz
# 创建软连接
ln -s mongosh-2.2.2-linux-x64-openssl11 mongosh

# 修改/etc/profile,添加环境变量,方便执行MongoShell命令
export MONGODB_SHELL_HOME=/usr/local/soft/mongosh
PATH=$PATH:$MONGODB_SHELL_HOME/bin

#重新加载环境变量
source /etc/profile

# 查看版本
mongosh --version

# 连接mongodb server端
mongosh --host=127.0.0.1 --port=27017
# --host: mongodb server端ip地址
# --port: mongodb server端口
  • mongosh常用命令

命令 说明
show dbs 或 show databases 显示数据库
use 数据库名 切换数据库,如果不存在创建数据库
db.dropDatabase() 删除数据库
show collections 或 show tables 显示当前数据库的集合列表
db.集合名.stats() 查看集合详情
db.集合名.drop() 删除集合
show users 显示当前数据库的用户列表
show roles 显示当前数据库的角色列表
show profile 显示最近发生的操作
load(“xxx.js”) 执行一个JavaScript脚本文件
exit 或 quit 退出
help 查看mongodb支持哪些命令
db.help() 查询当前数据库支持的方法
db.集合名.help() 显示集合的帮助信息
db.version() 查看数据库版本
cls 清屏
db.shutdownServer() 关闭mongodb server端

安全认证

  • 创建管理员

1
2
3
4
5
6
7
8
9
10
11
12
# 设置管理员用户名密码需要切换到admin库
use admin
#显示可设置权限
show roles

#创建管理员,授予root角色
db.createUser({user:"root",pwd:"password",roles:["root"]})

#查看当前数据库所有用户信息
show users
#显示所有用户
db.system.users.find()
  • 常用角色

权限名 描述
read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
dbOwner 允许用户在指定数据库中执行任意操作,增、删、改、查等
userAdmin 允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用。超级账号,超级权限
  • 创建数据库用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
admin> use mydb
switched to db mydb

# 默认认证数据库为当前数据库,下面的授权等同于 { role: 'dbOwner', db: 'mydb' }
mydb> db.createUser({user:"mytest",pwd:"123456",roles:["dbOwner"]})
{ ok: 1 }

# 显示当前数据库下的用户
mydb> show users
[
{
_id: 'mydb.mytest',
userId: UUID('8bc42a74-5d84-4849-af25-09fdcbdfd03a'),
user: 'mytest',
db: 'mydb',
roles: [ { role: 'dbOwner', db: 'mydb' } ],
mechanisms: [ 'SCRAM-SHA-1', 'SCRAM-SHA-256' ]
}
]
  • 重置用户密码

1
2
3
4
5
6
mydb> db.changeUserPassword("mytest", "password")
{ ok: 1 }
# 或者
mydb> db.updateUser("mytest", {pwd: "password"})
{ ok: 1 }

  • 为用户添加角色

1
2
3
4
5
# 假设已经创建了用户mytest,需要重新赋予其角色
mydb> db.grantRolesToUser( "mytest" , [
{ role: "dbAdmin", db: "mydb" } ,
{ role: "userAdmin", db: "mydb"}
])
  • 删除用户的指定角色

1
2
3
mydb> db.revokeRolesFromUser( "mytest" , [
{ role: "dbAdmin", db: "mydb" }
])
  • 删除用户

1
2
3
4
5
6
7
mydb> db.dropUser("mytest")
{ ok: 1 }
mydb> show users
[]

# 删除全部用户
mydb> db.dropAllUsers()

MongoDB启用鉴权

  • 默认情况下,MongoDB不会启用鉴权,以鉴权模式启动MongoDB有两种方法

命令行参数增加 --auth

1
mongod -f /mongodb/conf/mongo.conf --auth

配置文件中加上如下内容

1
2
security:
authorization: enabled
  • 启用鉴权之后,连接MongoDB的相关操作都需要提供身份认证

1
2
3
4
mongosh --host=127.0.0.1 --port=27017 -u root -p password --authenticationDatabase=admin
# -u: 用户名
# -p: 密码
# --authenticationDatabase: 指定认证数据库

mongosh连接mongodb server端的方式

  • 参数方式

1
2
3
4
# 可以通过 mongosh --help 查看帮助
mongosh --host=127.0.0.1 --port=27017 -u root -p password --authenticationDatabase=admin
# 指定连接的数据库,这里指定连接到mydb数据库,如果不指定,默认连接到test数据库
mongosh mydb --host=127.0.0.1 --port=27017 -u root -p password --authenticationDatabase=admin
  • 混合方式

1
2
3
4
5
6
# ip+端口方式连接
mongosh 127.0.0.1:27017
# ip+端口方式连接,后面可以加上各种参数配置
mongosh 127.0.0.1:27017 -u root -p password --authenticationDatabase=admin
# ip+端口方式连接,同时可以指定连接的数据库,这里指定连接到mydb数据库,如果不指定,默认连接到test数据库
mongosh 127.0.0.1:27017/mydb
  • uri方式

1
2
3
4
5
6
7
mongosh mongodb://127.0.0.1:27017
# 指定连接数据库
mongosh mongodb://127.0.0.1:27017/mydb
# 带认证方式连接
mongosh "mongodb://root:password@127.0.0.1:27017/mydb?authSource=admin"
# 带认证方式连接,同时指定readPreference为primaryPreferred,即读取数据时优先从主节点读取数据
mongosh "mongodb://root:password@127.0.0.1:27019/mydb?authSource=admin&readPreference=primaryPreferred"
  • 如果只是连接本机的server端,而且端口为27017,可以省略host和port

1
mongosh

解决连接MongoDB时出现的 vm.max_map_count is too low 的问题

  • 默认的vm.max_map_count值为65530,如果需要开启MongoDB的分片功能,需要将vm.max_map_count设置为较高的值,通常推荐为1048576

  • 查看当前vm.max_map_count的值

1
sysctl vm.max_map_count
  • 临时增加vm.max_map_count的值

1
sysctl -w vm.max_map_count=1048576
  • 永久增加vm.max_map_count的值

1
2
3
4
# 修改/etc/sysctl.conf文件
echo "vm.max_map_count = 1048576" >> /etc/sysctl.conf
# 使配置生效
sysctl -p
  • 重启MongoDB才会生效