Files
zfoo/doc/mongodb/mogodb-setup.md
T
2021-07-09 10:23:17 +08:00

260 lines
7.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 一、MongoDB简介
## 1.MongoDB的特点
1. 数据文件为二进制Bson,一种Json的扩展
2. 模式自由,在生产环境可以轻松增加字段
3. 丰富的查询
4. 完整的索引支持
5. 复制和故障恢复
6. 自动分片
7. 客户端支持多种语言
8. 支持内存映射存储引擎
## 2.MongoDB的适用场景
- MongoDB 4.2 以后支持分布式事务,理论上适合所有场景
# 二、MongoDB安装
## Windows
### 1. MongoDB安装配置
1. 直接安装MongoDB,用custom自定义安装目录,一般用默认的安装目录即可,不要勾选mongoDB compass
2. 将C:\Program Files\MongoDB\Server\4.2\bin配置到环境变量中,便于全局使用
3. mongo -version # 查看安装的版本
4. MongoDB的工具
```
bsondump # bson转换工具
mongodump # 逻辑备份工具
mongorestore # 逻辑恢复工具
mongoexport # 数据导出工具
mongoimport # 数据导入工具
mongofiles # GriedFS文件工具
mongos # 分片路由工具
mongostat # 状态监控工具
mongotop # 读写监控工具
```
### 2. studio 3t安装(MongoDB可视化工具),收费
- 可视化工具直接默认安装即可
- 3t的补丁
```
每次开机重启脚本重置试用时间,即可重新获得使用权Studio 3T,重置studio 3t的试用时间解决无法使用的问题,并非永久破解。
1. 将批处理文件studio3t.bat剪贴或复制到如下路径:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
2. 双击重置时间
```
### 3. MongoDB Compass
- 官方工具,免费,推荐使用
## Linux
### 1.MongoDB安装配置
- 把MongoDB下载到/usr/local目录下,在/usr/local下新建文件夹MongoDB
```
tar -zxvf mongodb-linux-x86_64-enterprise-rhel70-4.2.0.tgz -C /usr/local
rename /usr/local/mongodb-linux-x86_64-enterprise-rhel70-4.2.0 mongodb /usr/local/mongodb-linux-x86_64-enterprise-rhel70-4.2.0
vim /usr/local/mongodb/mongodb.config # 创建自定义配置文件,解压的mongodb安装包没有默认的配置文件
```
- wiredTiger
```yaml
#security:
# authorization: enabled
systemLog:
destination: file
path: "/data/mongodb/logs/mongodb.log"
logAppend: true
storage:
engine: wiredTiger
dbPath: "/data/mongodb/db"
directoryPerDB: true
# MongoDB默认端口是27017,为了安全,可以修改这个端口,避免恶意的连接尝试
# 生产环境需要设置ipbind_ip=127.0.0.1,本机ip
net:
bindIp: 0.0.0.0
port: 22400
maxIncomingConnections: 900
processManagement:
fork: true
```
- inMemory
```yaml
#security:
# authorization: enabled
systemLog:
destination: file
path: "/data/mongodb/logs/mongodb.log"
logAppend: true
storage:
engine: inMemory
dbPath: "/data/mongodb/db"
# MongoDB默认端口是27017,为了安全,可以修改这个端口,避免恶意的连接尝试
# 生产环境需要设置ipbind_ip=127.0.0.1,本机ip
net:
bindIp: 0.0.0.0
port: 22400
processManagement:
fork: true
```
- mkdir -p /data/mongodb/db /data/mongodb/logs
- touch /data/mongodb/logs/mongodb.log
- vim /etc/profile # 添加命令运行环境变量,在文件最后面添加下面两
```
JAVA_HOME=/usr/local/java
JRE_HOME=$JAVA_HOME/lib
MONGODB_HOME=/usr/local/mongodb
PATH=$JAVA_HOME/bin:$MONGODB_HOME/bin:$PATH
export JAVA_HOME JRE_HOME MONGODB_HOME PATH
```
- source /etc/profile,加载环境变量
- mongod --config /usr/local/mongodb/mongodb.config # 启动MongoDB
```
mongod: error while loading shared libraries: libnetsnmpmibs.so.31: cannot open shared object file: No such file or directory
如果启动看到上面这个错误,则是缺少net-snmp安装包,yum install net-snmp
```
- mongo -port 22400 # 使用mongo客户端链接MongoDB
### 2.关闭MongoDB服务
- 方式一:进入mongo客户端关闭(推荐方式)
```
mongo -port 22400
use admin
db.shutdownServer()
```
- 方式二:kill -2 pid 或者 kill -15 pid
```
-2 和 -15 都会等MongoDB处理完,释放相应资源再停止。kill -9 会强制服务i停止,会导致数据的顺坏,不建议使用。
```
- 方式三:如果MongoDB注册为service,可以使用服务的命令关闭
```
systemctl stop mongodb
```
- 修复未正常关闭MongoDB,导致无法启动
```
进入/data/mongodb/db,将文件夹下的mongod.lock(也可以使用find命令查找)删除。
如果还有数据顺坏,需要使用mongod --repair命令修复一次,再正常启动。
修复数据库的实际过程很简单:将所有的文档导出后马上导入,忽略无效的文档,完成后会重建索引。
```
### 3.将MongoDB设置为开机自动启动
- vim /usr/lib/systemd/system/mongodb.service,创建启动脚本,systemctl是最新的启动命令,避免用service
- chmod 754 /usr/lib/systemd/system/mongodb.service,赋予启动脚本可执行的权限
```bash
[Unit]
#服务描述
Description=High-performance, schema-free document-oriented database
#指定了在systemd在执行完那些target之后再启动该服务
After=network.target
[Service]
#定义Service的运行类型,一般是forking(后台运行)
Type=forking
ExecStart=/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.config
ExecReload=
ExecStop=/usr/bin/pkill mongod
[Install]
#多用户
WantedBy=multi-user.target
```
- systemctl daemon-reload,重新加载服务
- systemctl enable mongodb,会有一行反馈
- systemctl status mongodb,注意看 -> enabled; vendor preset: disabled)
- systemctl start mongodb
### 4.安全和访问控制
#### windows不用设置用户,为了方便便于开发
#### Linux用户设置
- 添加用户之前,要在数据库admin里添加一个拥有userAdminAnyDatabase角色的管理员账号,这个账号可以管理数据库admin和创建其它用户
- 创建管理员帐号,账号信息保存在admin数据库
```
use admin
db.createUser({ user: "root", pwd: "zfoo*5qtWy?cwajCGQl.Jh7o8D%X24A;", roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]})
```
- 创建普通帐号,账号信息保存在test数据库
```
use test
db.createUser({ user: "test", pwd: "123456", roles: [ { role: "readWrite", db: "test" }, { role: "read", db: "reporting" }]})
```
- 查看用户权限
```
use test
db.getUser("myTester")
db.getRole( "read", { showPrivileges:true } ) # 查看权限能执行哪些操作,例如要看test数据库中read权限能执行哪些操作
db.grantRolesToUser( "test", [{ role: "readWrite", db: "reporting" }]) # 授权
db.revokeRolesFromUser( "test", [{ role: "readWrite", db: "reporting" }]) # 取消权限
```
- 添加完成后,在配置文件中取消注释,#authorization
- 再重启mongod服务:systemctl restart mongodb
- 用户登录
```
# 启动mongo客户端时登录,--authenticationDatabase "admin"表示myUserAdmin用户在admin数据库下
# 远程用户登录注意打开防火墙的端口,或者直接关闭防火墙
mongo --port 22400 -u "root" -p "123456" --authenticationDatabase "admin"
# 进入mongo客户端后再登录:
mongo --port 22400
use admin
db.auth("root", "123456" )
# 修改密码,将root的密码修改为456789,需要admin管理员权限。
db.changeUserPassword("root", "456789")
# 删除用户,需要admin管理员权限
db.dropUser("root")
```