https://docs.mongodb.com/manual/tutorial/configure-scram-client-authentication/#std-label-create-user-admin
01 mongodb用户认证
1.开启访问控制流程
1)在未开启访问控制的条件下,创建一个管理员账号密码
2)修改配置文件开启认证
3)再使用管理员账户去创建其他普通账户并授予权限
先确定已经启动 mongo_27017
2.创建管理员账户
use admin
db.createUser(
{
user: "myUserAdmin",
pwd: "123456",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" }
]
}
)
注意:管理员用户就是admin库
3.查看当前库的用户
use admin
db.getUsers()
4.开启访问控制
vim /opt/mongo_27017/conf/mongodb.conf
security:
authorization: enabled
5.重启Mongod
systemctl restart mongod
6.使用管理员认证登陆
mongo -u myUserAdmin -p 123456 --authenticationDatabase admin
7.使用管理员创建普通账户
use test
db.createUser(
{
user: "myTester",
pwd: "123456",
roles: [
{ role: "readWrite", db: "db1" },
{ role: "read", db: "db2" }
]
}
)
db.getUsers()
验证
8.使用管理员创建测试数据
use db1
db.www.insertOne({"name":"abc"})
use db2
db.rrr.insertOne({"name":"bbbbbb"})
9.使用普通账户验证
mongo -u myTester -p 123456 --authenticationDatabase test
> show dbs
db1 0.000GB
db2 0.000GB
#测试写
> use db1
> db.www.insertOne({"name":"bbb"})
{
"acknowledged" : true,
"insertedId" : ObjectId("61f23db1681d3f1b984c723f")
}
>
> db.www.insertOne({"name":"ccc"})
{
"acknowledged" : true,
"insertedId" : ObjectId("61f23db5681d3f1b984c7240")
}
> db.www.find()
{ "_id" : ObjectId("61f23cf65e6b075cdd6cb68f"), "name" : "abc" }
{ "_id" : ObjectId("61f23db1681d3f1b984c723f"), "name" : "bbb" }
{ "_id" : ObjectId("61f23db5681d3f1b984c7240"), "name" : "ccc" }
#测试读权限
> use db2
switched to db db2
> db.rrr.find()
{ "_id" : ObjectId("61f23d155e6b075cdd6cb690"), "name" : "bbbbbb" }
> db.rrr.insertOne({"name":"cccccc"})
2022-01-27T14:39:09.160+0800 E QUERY [js] WriteCommandError: not authorized on db2 to execute command { insert: "rrr", ordered: true, lsid: { id: UUID("c9b5f5b2-89d4-404b-8fd8-d44a45371ac4") }, $db: "db2" } :
WriteCommandError({
"ok" : 0,
"errmsg" : "not authorized on db2 to execute command { insert: \"rrr\", ordered: true, lsid: { id: UUID(\"c9b5f5b2-89d4-404b-8fd8-d44a45371ac4\") }, $db: \"db2\" }",
"code" : 13,
"codeName" : "Unauthorized"
})
WriteCommandError@src/mongo/shell/bulk_api.js:420:48
Bulk/executeBatch@src/mongo/shell/bulk_api.js:902:1
Bulk/this.execute@src/mongo/shell/bulk_api.js:1150:21
DBCollection.prototype.insertOne@src/mongo/shell/crud_api.js:252:9
@(shell):1:1
>
02 副本集
主从复制-->副本集
https://docs.mongodb.com/manual/replication/
第1章 副本集相关名词
主节点:
负责读和写并给从库提供复制数据
从节点:
从主节点上复制数据
参与竞选主的选举
只读不可写
仲裁节点:
不存储也不处理数据
自己永远不竞选主,只负责投票
选举机制:
大多数投票原则,存活的节点必须是副本集一半以上的数量
第2章 副本集安装部署
1.创建目录
mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid}
mkdir -p /data/mongo_2801{7,8,9}
2.创建配置文件
cat >/opt/mongo_28017/conf/mongodb.conf <<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_28017/log/mongodb.log
storage:
journal:
enabled: true
dbPath: /data/mongo_28017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 0.5
directoryForIndexes: true
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true
processManagement:
fork: true
pidFilePath: /opt/mongo_28017/pid/mongod.pid
net:
port: 28017
bindIp: 127.0.0.1,10.0.0.51
replication:
oplogSizeMB: 1024
replSetName: dba
EOF
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28018/conf/
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28019/conf/
sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongodb.conf
sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongodb.conf
3.启动
mongod -f /opt/mongo_28017/conf/mongodb.conf
mongod -f /opt/mongo_28018/conf/mongodb.conf
mongod -f /opt/mongo_28019/conf/mongodb.conf
4.检查
[root@db-51 /opt]# ps -ef|grep mongod
mongo 7990 1 0 14:26 ? 00:00:10 /opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
root 8345 1 3 15:17 ? 00:00:00 mongod -f /opt/mongo_28017/conf/mongodb.conf
root 8378 1 5 15:17 ? 00:00:00 mongod -f /opt/mongo_28018/conf/mongodb.conf
root 8411 1 6 15:17 ? 00:00:00 mongod -f /opt/mongo_28019/conf/mongodb.conf
5.初始化副本集
mongo --port 28017
rs.initiate(
{
_id: "dba",
version: 1,
members: [
{ _id: 0, host : "10.0.0.51:28017" },
{ _id: 1, host : "10.0.0.51:28018" },
{ _id: 2, host : "10.0.0.51:28019" }
]
}
)
继续回车
6.主库插入数据测试
mongo --port 28017
db.inventory.insertMany([
{ item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" },
{ item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" },
{ item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" },
{ item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" },
{ item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" }
]);
7.从库检查同步情况
方法1:临时可读
rs.slaveOk()
方法2:写入配置
echo 'rs.slaveOk()' > ~/.mongorc.js
查看数据
db.inventory.find()
8.查看复制状态
rs.status()
================================
"_id" : 成员序号,
"name" : "成员IP:端口",
"health" : 1表示存活,0表示挂了,
"state" : 2,
"stateStr" : "副本集的角色",
================================
9.副本集相关命令
rs.config()
rs.status()
rs.isMaster()
rs.printReplicationInfo()
rs.printSlaveReplicationInfo()
03MongoDB副本集增加删除节点
第1章 副本集故障转移
1.停止主库
mongod -f /opt/mongo_28017/conf/mongodb.conf --shutdown
2.查看副本集状态
rs.status()
rs.isMaster()
3.在新主库上写入数据
mongo --port 28018
db.heming.insertOne({"name":"aaaa"})
4.在新从库上查看
mongo --port 28019
db.heming.find()
5.修复故障节点
mongod -f /opt/mongo_28017/conf/mongodb.conf
mongo --port 28017
dba:SECONDARY> db.heming.find()
{ "_id" : ObjectId("61f253fff9493d342718d017"), "name" : "aaaa" }
6.结论
主节点挂了,会选举新的主节点
选举完成后,另一个从节点会自动同步新的主节点
故障节点修复后,只需要启动即可,启动后会自动变成从节点
整个规章转移过程不需要人为干预
第2章 增加节点
1.增加节点流程
新节点安装部署启动
在副本集的主节点上执行添加节点命令
查看集群状态
2.部署新节点
mkdir -p /opt/mongo_28010/{conf,log,pid}
mkdir -p /data/mongo_28010
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28010/conf/
sed -i 's#28017#28010#g' /opt/mongo_28010/conf/mongodb.conf
mongod -f /opt/mongo_28010/conf/mongodb.conf
3.副本集主节点执行添加节点命令
注意:现在主节点是28018
mongo --port 28018
dba:PRIMARY> rs.add("10.0.0.51:28010")
4.新节点登陆查看自己状态
mongo --port 28010
dba:SECONDARY> db.heming.find()
{ "_id" : ObjectId("61f253fff9493d342718d017"), "name" : "aaaa" }
dba:SECONDARY>
第3章 删除节点
1.副本集主节点执行删除节点命令
mongo --port 28010
dba:SECONDARY> rs.status()
删除节点要在主库上操作
dba:PRIMARY> rs.remove("10.0.0.51:28017")
查看集群状态
dba:SECONDARY> rs.status()
04MongoDB副本集权重选举
1.查看副本集配置信息
rs.config()
2.设置副本集权重
myconfig=rs.conf()
myconfig.members[0].priority=100
rs.reconfig(myconfig)
3.恢复默认权重
myconfig=rs.conf()
myconfig.members[0].priority=1
rs.reconfig(myconfig)
4.主动降级
rs.stepDown()
05MongoDB仲裁节点
第1章 仲裁节点
1.仲裁节点安装部署
mkdir -p /opt/mongo_28011/{conf,log,pid}
mkdir -p /data/mongo_28011
cp /opt/mongo_28017/conf/mongodb.conf /opt/mongo_28011/conf/
sed -i 's#28017#28011#g' /opt/mongo_28011/conf/mongodb.conf
mongod -f /opt/mongo_28011/conf/mongodb.conf
mongo --port 28011
2.主节点执将仲裁节点加入副本集
rs.addArb("10.0.0.51:28011")
3.仲裁节点登陆查看
mongo --port 28011
dba:ARBITER>
4.结论
1主+3从+1仲裁 可以坏2次主