MongoDB用户管理和复制组

用户管理

1、建用户时,use到的库就是此用户的验证库

2、登录时必须明确指定验证库才能登录

3、通常管理员用的验证库是admin,普通用户的验证库一般是所管理的库设置为验证库

4、如果直接登录到数据库,不进行use(示例),默认的验证库是test,不是我们生产建议的

注意:

验证库,建立用户时use到的库,在使用用户时,要加上验证库才能登陆。对于管理员用户,必须在admin下创建。

建立用户语法:

db.createUser

{

user: "<name>",

pwd: "<cleartext password>",

roles: [

{ role: "<role>",

db: "<database>" } | "<role>",

...

]

}

语法说明:

user:用户名

pwd:密码

roles:

role:角色名

db:作用对象(数据库)

role:root, readWrite,read

实验环境

上一章的基础上

用户管理例子

系统库介绍:

admin:管理

config: 配置

local:本地消息

1、创建超级管理员,管理所有数据库(必须use admin再去创建

use admin

db.createUser(

{

user: "root",

pwd: "root123",

roles: [ { role: "root",db: "admin" } ]

}

)

验证用户:

mongo -uroot -proot123 192.168.8.5/admin

db

启用身份验证,这样可以限制对数据库的访问,只有经过认证的用户才能进行相应的操作。

修改配置文件

vim /mongodb/conf/mongodb.conf

添加:

security:

authorization: enabled

重启mongodb

mongod -f /mongodb/conf/mongodb.conf --shutdown

mongod -f /mongodb/conf/mongodb.conf

登录验证:

mongo -uroot -proot123 admin

mongo -uroot -proot123 192.168.8.5/admin

mongo

use admin

db.auth('root','root123')

查看用户:

use admin

db.system.users.find().pretty()

.pretty() 方法确保输出结果以易于阅读的格式展示,每个字段都会在新的一行显示,提高可读性。

2、创建库管理用户(针对某个库

mongo -uroot -proot123 admin

use app

db.createUser(

{

user: "adminapp",

pwd: "app123",

roles: [ { role: "dbAdmin", db: "app" } ]

}

)

登录adminapp用户测试:

mongo -uadminapp -papp123 192.168.8.5/app

db

show dbs

db.createCollection('a')

db.createCollection('b')

db.haha.insert({id : "1021" ,name : "zhssn" ,age : "22" ,gender : "female",address : "sz"})

dbAdmin 角色权限很低,能建表,也能删表,不能增删改查。

3、创建对app数据库,读、写权限的用户app01

1)超级管理员用户登陆

mongo -uroot -proot123 admin

2)进入app库

use app

3)创建用户app01

db.createUser(

{

user: "app01",

pwd: "app01",

roles: [ { role: "readWrite" , db: "app" } ]

}

)

4)登录app01用户测试

mongo -uapp01 -papp01 192.168.8.5/app

查看数据库

db

往haha表中添加数据

db.haha.insert({id : "101" ,name : "zhangsan" ,age : "18" ,gender : "male"})

查看所有表

show tables

4、创建对app数据库读写权限和对test数据库具有读权限的用户app03

创建对app数据库读权限的用户app02

mongo -uroot -proot123 192.168.8.5/admin

use app

db.createUser(

{

user: "app03",

pwd: "app03",

roles: [ { role: "readWrite", db: "app" },

{ role: "read", db: "test" }]

}

)

db.createUser(

{

user: "app02",

pwd: "app02",

roles: [ { role: "read", db: "app" }]

}

)

测试app03用户:

mongo -uapp03 -papp03 192.168.8.5/app

查看log表中数据

db.log.find()

往haha表中添加数据

db.haha.insert({id : "103" ,name : "zhangsan" ,age : "18" ,gender : "male"})

测试app02用户:

mongo -uapp02 -papp02 192.168.8.5/app

查看所有表

show tables

查看log表中数据

db.log.find()

删除log表

db.log.drop()

只有读权限,无法删除表操作

5、查询mongodb中的用户信息

mongo -uroot -proot123 192.168.8.5/admin

db.system.users.find().pretty()

6、删除用户

root用户登录并切换到对用户授权库

mongo -uroot -proot123 192.168.8.5/admin

use app

db.dropUser('app02')

查看所有用户

use admin

db.system.users.find().pretty()

没有app02用户,删除成功

MongoDB 复制集RS(ReplicationSet)

  • 基本原理

Primary 节点将数据修改操作记录到本地的 oplog(操作日志,在 local 库下)中,Secondary 节点定期到 Primary 节点获取这些操作(日志),然后对自己的数据副本执行这些操作,从而保证 Secondary 与 Primary 数据一致。

在 MongoDB 副本集中,Secondary 会不间断的通过心跳来探测 Primary 是否正常,当 Primary 不可用时,各 Secondary 之间会触发选举操作,通过优先级来选举出一个 Secondary 做为新的 Primary,这个过程是无需人工干预的

基本构成是1主2从的结构,自带互相监控投票机制(Raft(MongoDB) Paxos(mysql MGR 用的是变种))

如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序,主库已经发生切换了。应用就会连接到新的主库。

  • 副本集特性
  1. 多个 MongoDB 实例建立的集群
  2. 任何节点都可以作为 Primary
  3. 所有写操作都走 Primary
  4. 自动故障转移
  5. 自动恢复

Replication Set 配置过程详解

三个以上的mongodb节点(或多实例)

1、创建多实例mongodb目录

su - mongod

mkdir -p /mongodb/280{17..20}/{conf,data,log}

2、创建配置文件

cat > /mongodb/28017/conf/mongod.conf <<EOF

systemLog:

destination: file

path: /mongodb/28017/log/mongodb.log

logAppend: true

storage:

journal:

enabled: true

dbPath: /mongodb/28017/data

directoryPerDB: true

#engine: wiredTiger

wiredTiger:

engineConfig:

cacheSizeGB: 1

directoryForIndexes: true

collectionConfig:

blockCompressor: zlib

indexConfig:

prefixCompression: true

processManagement:

fork: true

net:

bindIp: 192.168.8.5,127.0.0.1

port: 28017

replication:

oplogSizeMB: 2048

replSetName: my_repl

EOF

cp /mongodb/28017/conf/mongod.conf /mongodb/28018/conf/

cp /mongodb/28017/conf/mongod.conf /mongodb/28019/conf/

cp /mongodb/28017/conf/mongod.conf /mongodb/28020/conf/

sed 's#28017#28018#g' /mongodb/28018/conf/mongod.conf -i

sed 's#28017#28019#g' /mongodb/28019/conf/mongod.conf -i

sed 's#28017#28020#g' /mongodb/28020/conf/mongod.conf -i

3、启动mongodb多实例

mongod -f /mongodb/28017/conf/mongod.conf

mongod -f /mongodb/28018/conf/mongod.conf

mongod -f /mongodb/28019/conf/mongod.conf

mongod -f /mongodb/28020/conf/mongod.conf

netstat -anpt | grep mongod

4、配置普通复制集(1主2从)

mongo -port 28017 admin

config = {_id: 'my_repl', members: [

{_id: 0, host: '192.168.8.5:28017'},

{_id: 1, host: '192.168.8.5:28018'},

{_id: 2, host: '192.168.8.5:28019'}]

}

初始化副本集

rs.initiate(config)

自动选择主从

输入命令前面变成复制集的状态,一开始是SECONARY等待变成PRIMARY

查看复制集状态

rs.status()

复制当前会话登录mongodb实例28018端口验证

su - mongod

mongo -port 28018 admin

输入命令前面变成复制集的状态SECONDAY

5、配置1主1从1仲裁(arbiter)的命令,了解不用执行

mongo -port 28017 admin

config = {_id: 'my_repl', members: [

{_id: 0, host: '192.168.8.5:28017'},

{_id: 1, host: '192.168.8.5:28018'},

{_id: 2, host: '192.168.8.5:28019',"arbiterOnly":true}]

}

初始化副本集

rs.initiate(config)

6、复制集管理操作

1)查看复制集状态

查看整体复制集状态

rs.status()

查看当前是否是主节点

rs.isMaster()

查看复制集配置信息

rs.conf()

从节点临时可读

rs.slaveOk()

2)添加删除节点

删除一个节点

rs.remove("ip:port")

新增从节点

rs.add("ip:port")

新增仲裁节点

rs.addArb("ip:port")

例子1:

添加 arbiter节点(平时不工作,作用不大)

mongo -port 28017 admin

添加仲裁节点

rs.addArb('192.168.8.5:28020')

查看节点状态

rs.isMaster()

删除节点

rs.remove("192.168.8.5:28020")

查看节点状态

rs.isMaster()

再把28020实例作为仲裁节点

rs.addArb("192.168.8.5:28020")

rs.isMaster()

例子2:

删除节点

rs.remove("192.168.8.5:28019")

rs.isMaster()

新增从节点

rs.add("192.168.8.5:28019")

rs.isMaster()

3)特殊从节点

介绍:

arbiter节点:主要负责选主过程中的投票,但是不存储任何数据,也不提供任何服务

hidden节点:隐藏节点,不参与选主,也不对外提供服务。

delay节点:延时节点,数据落后于主库一段时间,因为数据是延时的,也不应该提供服务或参与选主,所以通常会配合hidden(隐藏)

一般情况下会将delay+hidden一起配置使用

配置延时节点(一般延时节点也配置成hidden)

1、查看配置信息

rs.conf()

2、配置延时从库(这里让28018端口实例延时从库)

[] 中是节点id号

28018 端口实例的id号为1

cfg=rs.conf() ------定义配置为cfg变量

输入后不弹消息

cfg.members[1].priority=0 ------定义权重为0,不参与选主

cfg.members[1].hidden=true ------隐藏节点,不参与业务

cfg.members[1].slaveDelay=60 ------延时的秒数

cfg.members[1].votes=0 ------不投票,持有票数为0

rs.reconfig(cfg) ------重新加载配置

3、查看配置信息

rs.conf()

测试:

复制当前会话

第二个会话:

su -- mongod

mongo -port 28018 admin

开启从节点临时可读

rs.slaveOk()

查看所有数据库

show dbs

第一个会话:

创建数据库delay并创建haha表写入内容

use delay

db.haha.insert({id : "101" ,name : "zhangsan" ,age : "18" ,gender : "male"})

查看数据库

show dbs

第二个会话:

查看数据库

show dbs

数据还未同步到

等待60秒后再次查询

show dbs

delay 数据库同步

查看数据库中内容

use delay

show tables

db.haha.find()

取消延时从库命令:

cfg=rs.conf()

cfg.members[2].priority=1

cfg.members[2].hidden=false

cfg.members[2].slaveDelay=0

rs.reconfig(cfg)

4)副本集其他操作命令

查看副本集的配置信息

rs.conf()

查看副本集各成员的状态

rs.status()

副本集角色降级(不要人为随便操作)

rs.stepDown(300)

rs.freeze(300) //锁定从,使其不会转变成主库

freeze()和stepDown单位都是秒。

设置副本节点可读:在副本节点执行

rs.slaveOk() ------临时,重启失效

注:每次在从库上查询必须输入"rs.slaveOk()"才能查询数据,可以设置永久可读

会话二:

创建配置文件

vim /home/mongod/.mongorc.js

添加:

rs.slaveOk()

验证:

mongo -port 28018 admin

查看所有数据库

show dbs

可以直接查看,不用输入rs.slaveOk()

查看副本节点(监控主从延时)

rs.printSlaveReplicationInfo()

28018 做了从库延时,所以延时60秒

相关推荐
程序员拂雨1 小时前
MongoDB知识框架
数据库·mongodb
半新半旧1 小时前
mongodb 学习笔记
笔记·学习·mongodb
风行無痕2 小时前
Ubuntu Linux系统配置账号无密码sudo
linux·服务器·ubuntu
消失在人海中3 小时前
oracle 会话管理
数据库·oracle
爆农3 小时前
centos搭建dokcer和vulhub
linux·运维·centos
Wyc724093 小时前
JDBC:java与数据库连接,Maven,MyBatis
java·开发语言·数据库
重启就好4 小时前
【Ansible】模块详解
linux·服务器·ansible
烧瓶里的西瓜皮4 小时前
Go语言从零构建SQL数据库(9)-数据库优化器的双剑客
数据库·sql·golang
o0o_-_4 小时前
【瞎折腾/mi50 32G/ubuntu】mi50显卡ubuntu运行大模型开坑(三)安装风扇并且控制转速
linux·运维·ubuntu
Huazzi.4 小时前
Ubuntu 22虚拟机【网络故障】快速解决指南
linux·网络·学习·ubuntu·bash·编程