docker-compose 安装MongoDB续:创建用户及赋权

ops/2024/9/23 14:31:19/

文章目录

  • 1. 问题描述
  • 2. 分析
    • 2.1 admin
    • 2.2 config
    • 2.3 local
  • 3. 如何连接
  • 3.解决

1. 问题描述

在这一篇使用docker-compose创建MongoDB环境的笔记里,我们创建了数据库,但是似乎没有办法使用如Robo 3T这样的工具去连接数据库。连接的时候会返回这样的错误:
请添加图片描述
从截图可以看出,明显是Authorization失败了。

2. 分析

我们使用了这样的docker-compose.yaml文件来创建MongoDB的环境:

version: "3.8"
services:mongodb:container_name: mongodbimage: mongo:6.0ports:- 27017:27017restart: "no"volumes:- $PWD/data:/data/db- $PWD/logs:/var/log/mongodbenvironment:MONGO_INITDB_ROOT_USERNAME: rootMONGO_INITDB_ROOT_PASSWORD: 123456

配置文件

# mongod.conf# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data.
storage:dbPath: /var/lib/mongodbjournal:enabled: true
#  engine:
#  wiredTiger:# where to write logging data.
systemLog:destination: filelogAppend: truepath: /var/log/mongodb/mongod.log# network interfaces
net:port: 27017bindIp: 0.0.0.0# how the process runs
processManagement:timeZoneInfo: /usr/share/zoneinfo#security:
auth=true#operationProfiling:#replication:#sharding:## Enterprise-Only Options:#auditLog:#snmp:

在启动数据库环境的时候,这里的INITDB的username和password都是赋值了的,但是这里并不能用这个用户名和密码进行登录。
那么这个用户名和密码是用来做什么的呢?
这个用户名和密码其实是数据库预设的admin库的。我们是可以用这个用户名和密码登录的。请添加图片描述
MongoDB一共有三个系统预设的库:

  • admin
  • config
  • local
    他们分别是用来做什么的呢?

2.1 admin

admin库是用来存储MongoDB的用户、角色等信息。
当MongoDB启用auth选项时,用户需要创建数据库帐号,访问时根据帐号信息来鉴权,而数据库帐号信息就存储在admin数据库下。

root@5db7fcc96e0f:/# mongosh -u root -p 123456
Current Mongosh Log ID:	661f969bdedb617b6878c1b9
Connecting to:		mongodb://<credentials>@127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.6.0
Using MongoDB:		6.0.2
Using Mongosh:		1.6.0For mongosh info see: https://docs.mongodb.com/mongodb-shell/------The server generated these startup warnings when booting2024-04-17T07:59:25.043+00:00: vm.max_map_count is too low
------------Enable MongoDB's free cloud-based monitoring service, which will then receive and displaymetrics about your deployment (disk utilization, CPU, operation statistics, etc).The monitoring data will be available on a MongoDB website with a unique URL accessible to youand anyone you share the URL with. MongoDB may use this information to make productimprovements and to suggest MongoDB products and deployment options to you.To enable free monitoring, run the following command: db.enableFreeMonitoring()To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
------test> show dbs;
admin   148.00 KiB
config  108.00 KiB
local    72.00 KiB
test> use admin
switched to db admin
admin> ls
ReferenceError: ls is not defined
admin> show collections;
system.users
system.version
admin> db.getCollection("system.version").find();
[{ _id: 'featureCompatibilityVersion', version: '6.0' },{ _id: 'authSchema', currentVersion: 5 }
]
admin> db.getCollection("system.users").find();
[{_id: 'admin.root',userId: new UUID("c0456cdb-ee1a-4ac7-a0de-695e48446983"),user: 'root',db: 'admin',credentials: {'SCRAM-SHA-1': {iterationCount: 10000,salt: '+wMEd3wWYjx5M2tuH/S7pg==',storedKey: 'juZ6GSX1639pJM4Xg99X/YLeIiI=',serverKey: 'KH9M9gFvo9DhvHlphTjrLG5HtoM='},'SCRAM-SHA-256': {iterationCount: 15000,salt: 'xJ84t11r+CStAF0EODvMzqPATo5RM8yDallqgA==',storedKey: 'ykgIr3CzzozJnQC5p6dt4quqQs8hcU1npBZFF9Q7b1g=',serverKey: 'C2Y/QrAVVdOTicGCwoAlb0RTYRJMLU02LF+iAQc/WkE='}},roles: [ { role: 'root', db: 'admin' } ]}
]
admin>

admin库里有两个collection:

  • system.version,这张表里存放的是MongoDB的版本信息和authSchema的版本信息。
  • system.users 用户的信息,包括角色

用户可以在admin数据库下建立任意集合,存储任何数据,但强烈建议不要使用admin数据库存储应用业务数据,最好创建新的数据库。
  admin数据库里的system.users、system.roles2个集合的数据MongoDB会cache在内存里,这样不用每次鉴权都从磁盘加载用户角色信息。目前cache的维护代码,只有在保证system.users、system.roles的写入都串行化的情况下才能正确工作。
  MongoDB admin数据库的写入操作的锁级别只能到DB级别,不支持多个collection并发写入,在写入时也不支持并发读取。如果用户在admin数据库里存储业务数据,则可能遭遇性能问题。

2.2 config

config库在使用MongoDB分片功能时起到作用,主要存储分片集群基础信息。
(挖个坑,以后再填,这里没怎么研究过)

2.3 local

local库它只会在本地存储数据,local数据库里的内容不会同步到副本集里其他节点上去;local数据库主要存储副本集的配置信息、oplog信息。
另外,对于重要的数据不能存储在local数据库,还要注意MongoDB默认的WriteConcern是{w: 1},即数据写到Primary上(不保证journal已经写成功)就向客户端确认,这时同样存在丢数据的风险。对于重要的数据,可以设置更高级别的如{w: “majority”}来保证数据写到大多数节点后再向客户端确认,当然这对写入的性能会造成一定的影响。

3. 如何连接

我们可以连接上admin库,那么我们就可以创建数据库,也可以为数据库创建用户,并指定用户的角色,根据不同角色赋予不同的权利。

test> use phone;
switched to db phone
phone> show dbs;
admin   100.00 KiB
config   72.00 KiB
local    72.00 KiB
admin> use admin;
admin> db.auth('root','123456');
{ ok: 1 }
admin> use phone;
switched to db phone
phone> db.createUser({user:'yy',pwd:'yy123456',roles:[{role:"readWrite", db:"phone"}]});
{ ok: 1 }

这里先创建了数据库phone,然后创建了用户yy,并设置密码为yy123456,赋予的role是读写。

数据库用户角色主要read和readWrite。
详细的角色信息看这里内置角色

3.解决

在执行完上面的操作后,就可以通过Robo 3T连接数据库了。
请添加图片描述


http://www.ppmy.cn/ops/5971.html

相关文章

git 小记

一、 github新建仓库 git clone 。。。。。。。。。。。 &#xff08;增删查补&#xff0c;修改&#xff09; git add . git commit -m "修改” git push (git push main) 二、branch 分支 branch并不难理解&#xff0c;你只要想像将代码拷贝到不同目录…

【24届数字IC秋招总结】正式批面试经验汇总6——禾赛

文章目录 一、禾赛-数字IC验证工程师1.1 一面面试问题1.2 二面面试问题一、禾赛-数字IC验证工程师 面试时间:9.19 9.25 1.1 一面面试问题 1、自我介绍 2、研究生课题 3、build_phase从上至下还是从下至上 4、哪些phase是task phase 5、perl脚本做了什么 6、整个验证环境是怎…

NASA数据集——TANSO-FTS 运行前 11 年收集的测量数据中得出二氧化碳(CO2)干空气摩尔分数(XCO2)的估计值

ACOS GOSAT/TANSO-FTS Level 2 bias-corrected XCO2 and other select fields from the full-physics retrieval aggregated as daily files V7.3 (ACOS_L2_Lite_FP) at GES DISC 简介 ACOS Lite 文件包含经过偏差校正的 XCO2 以及其他选定字段的每日汇总文件。ACOS 2 级标准…

【wpf】ObservableCollection 跨线程报错问题

背景 ObservableCollection 我们之前介绍过他和List的区别。ObservableCollection 的好处在于&#xff0c;当集合发生变化时&#xff0c;能发送通知通知界面发生相应的更改。但是ObservableCollection 有个弊端。无法在非UI线程中访问。 要么就是通知失效了&#xff0c;要么就…

适用于Windows电脑的最佳数据恢复软件是哪些?10佳数据恢复软件

丢失我们系统中可用的宝贵信息是很烦人的。我们可以尝试几种手动方法来重新获取丢失的数据。然而&#xff0c;当我们采用非自动方法来恢复数据时&#xff0c;这是一项令人厌烦和乏味的工作。在这种情况下&#xff0c;我们可以尝试使用一些正版硬盘恢复软件进行数据恢复。此页面…

Vue3+TS版本Uniapp:项目前置操作

环境&#xff1a;使用vscode进行开发 如果一开始是使用的HbuilderX&#xff0c;请看hbuilderX创建的uniapp项目转移到vscode 为什么选择vscode&#xff1f;有更好的TS支持 学习TS的好处&#xff1f;减少维护代码的压力、鸿蒙ArkTS是基于TS的、提高代码水平拿高薪等… Vue3版…

MySQL8.0.36-社区版:通用语法(2)

语法格式规范 sql语句可以以单号或者多行为书写&#xff0c;以分号结尾 可以使用空格或者缩进来增加可读性 mysql的sql语句不区分大小写&#xff0c;但是推荐大写关键字 注释分为单号注释和多行 单号注释&#xff1a;--内容 或者 # 内容 多行注释/* 注释内容 */ sql语句的…

CentOS系统常用命令

CentOS系统是基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的流行Linux发行版&#xff0c;它在服务器和桌面环境中广泛使用。以下是一些在CentOS系统中常用的命令及其用法&#xff1a; 1. **文件和目录操作** - ls&#xff1a;列出目录内容ls -lh # 以易读的格式…