用户管理
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 用的是变种))
如果发生主库宕机,复制集内部会进行投票选举,选择一个新的主库替代原有主库对外提供服务。同时复制集会自动通知客户端程序,主库已经发生切换了。应用就会连接到新的主库。
- 副本集特性
- 多个 MongoDB 实例建立的集群
- 任何节点都可以作为 Primary
- 所有写操作都走 Primary
- 自动故障转移
- 自动恢复
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秒