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

7.2 KiB
Raw Blame History

一、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
#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
#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,赋予启动脚本可执行的权限
[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")