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秒

相关推荐
纷飞梦雪39 分钟前
使用chroot预安装软件到ubuntu22中
linux·运维·ubuntu
小羊在奋斗4 小时前
【Linux网络】NAT技术、DNS系统、五种IO模型
linux·网络·智能路由器
明矾java4 小时前
MySQL进阶-关联查询优化
数据库·mysql
冰糖码奇朵4 小时前
大数据表高效导入导出解决方案,mysql数据库LOAD DATA命令和INTO OUTFILE命令详解
java·数据库·sql·mysql
迷路的小犀牛4 小时前
【MYSQL数据库异常处理】执行SQL语句报超时异常
数据库·sql·mysql
jiarg5 小时前
linux 内网下载 yum 依赖问题
linux·运维·服务器
yi个名字6 小时前
Linux第一课
linux·运维·服务器
Kurbaneli6 小时前
深入理解 C 语言函数的定义
linux·c语言·ubuntu
极限实验室6 小时前
INFINI Labs 产品更新 | Easysearch 增加异步搜索等新特性
数据库