用户管理
- MongoDB是没有默认管理员账号,所以要先添加管理员账号,再开启权限认证。
- 切换到admin数据库,添加的账号才是管理员账号。
- 用户只能在用户所在数据库登录,包括管理员账号。
- 管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。
角色分类
角色分类 | 角色名称 |
---|---|
数据库用户角色 | read、readWrite |
数据库管理角色 | dbAdmin、dbOwner、userAdmin |
集群管理角色 | clusterAdmin、clusterManager clusterMonitor、hostManager |
备份恢复角色 | backup、restore |
所有数据库角色 | readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase |
超级用户角色 | root,这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) |
内部角色 | __system |
角色说明
角色名称 | 权限作用 |
---|---|
Read | 允许用户读取指定数据库 |
readWrite | 允许用户读写指定数据库 |
dbAdmin | 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile |
userAdmin | 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户 |
clusterAdmin | 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限 |
readAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的读权限 |
readWriteAnyDatabas | 只在admin数据库中可用,赋予用户所有数据库的读写权限 |
userAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限 |
dbAdminAnyDatabase | 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限 |
root | 只在admin数据库中可用。超级账号,超级权限 |
添加用户
- 添加普通管理员用户
注释:没有添加用户的权限,user:是用户名,pwd:密码,roles:添加角色,customData:注释可以不写
db.createUser(
{
user: "root",
pwd: "123456",
customData:{description:"superuser"},
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
- 添加超级管理员
注释:有添加用户的权限,在admin下
db.createUser(
{
user:"root",
pwd:"123456",
roles:["root"]
}
)
- 数据库管理员用户
db.createUser({
user:"test1",
pwd:"123456",
customData:{
name:'jim',
email:'jim@qq.com',
age:18,
},
roles:[
{role:"readWrite",db:"mydb1"}, //给mydb1读写权限
{role:"readWrite",db:"mydb2"},
'read'
]
})
- 启用密码验证
vi /etc/mongod.conf
security:
authorization: enabled
查看用户
show users
db.system.users.find()
db.runCommand({usersInfo:"userName"}) //userName是你的数据库名
修改用户
- 修改用户密码
db.changeUserPassword("root", "123qwe") //修改当前数据库用户密码
- 修改用户密码和信息
db.runCommand(
{
updateUser:"root",
pwd:"123456",
customData:{title:"super"}
}
)
删除用户
db.system.users.deleteOne({user:"test1"})
数据复制
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。mongodb各个节点常见的搭配方式为:一主一从、一主多从。主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
数据复制的作用
- 保障数据的安全性
- 数据高可用性
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
数据复制的特性
- N个节点的集群
- 任何节点可作为主节点
- 所有写入操作都在主节点上
- 自动故障转移
- 自动恢复
创建数据存放目录
mkdir -p /data/{mongo1,mongo2,mongo3}/{data,log}
启动数据库实例
mongod --dbpath /data/mongo1/data --port 10001 --replSet test --nojournal --fork --logpath /data/mongo1/log/mongo1.log
mongod --dbpath /data/mongo2/data --port 10002 --replSet test --nojournal --fork --logpath /data/mongo2/log/mongo2.log
mongod --dbpath /data/mongo3/data --port 10003 --replSet test --nojournal --fork --logpath /data/mongo1/log/mongo3.log
连接数据库
mongo 127.0.0.1:10001
初始化数据库
rs.initiate({_id:"test",members:[
{_id:1,host:"127.0.0.1:10001"},
{_id:2,host:"127.0.0.1:10002"},
{_id:3,host:"127.0.0.1:10003"},
]})
查询状态
rs.status()
数据测试
创建数据
use mydb
db.myset.insertOne({
name:"zhangsan",
age:18,
sex:0
})
- 从节点读取
mongo 127.0.0.1:10002
rs.slaveOk()
use mydb
db.myset.find().pretty()
- 移除复制节点
注释:主(test:PRIMARY>)删从(test:SECONDARY>)
rs.remove('127.0.0.1:10001')
自动故障转移
mongo 127.0.0.1:10001 //连接主数据库
use admin //切换用户
db.shutdownServer() //关闭数据库
exit //‘退出
mongo 127.0.0.1:10002 //连接数据库
rs.status() //查询状态
- 重新启动数据库
mongod --dbpath /data/mongo1/data --port 10001 --replSet test --nojournal --fork --logpath /data/mongo1/log/mongo1.log //查看是主是从