文章目录
- 1. 高级
- 1.1 用户账号密码登陆、集群机器使用Key文件 - 安全认证
- 1.1.1 概述
- 1.1.1.1 内置角色 - 用于普通用户登录
- 1.1.1.2 内置语法 - 用于普通用户登录
- 1.1.1.3 Key文件 - 用于集群机器认证
- 1.1.2 使用
- 1.2 副本集 - Replica Sets - 类似MySQL的主从复制概念
- 1.2.1 概述
- 类型、角色
- 选举规则
- 概念
- 方法
- 1.2.2 开始配置
- 配置文件 - replSetName设置为一样(不管主从仲裁节点都一样)
- 将MongoDB(27018、27019)设置为Windows服务,方便后续测试 - MongoDB安装好后自动会将27017端口为Windows服务
- 启动
- 数据查看
- 1.2.3 遇到问题
- 从库查询不了
- 安全认证+复制集
- 复制集的主27017、从27018、仲裁节点27019(共3个MongoDB)的挂机情况分析
- 从节点挂机27018 - 结果:有主节点
- 主节点27017挂机 - 结果:有主节点
- 主节点27018、仲裁节点27019都挂机 - 结果:无主节点
- 从节点27017、仲裁节点27019都挂机 - 结果:无主节点
- 1.2.4 更新配置
- 1.3 分片集群(Sharded Cluster) == 配置成功后关闭所有MongoDB启不来不知为什么
- 1.3.1 概述
- 搭建
- Windows
- mongodb启动不了 - 一直卡住不动
- Requested option conflicts with current storage engine option for directoryPerDB; you requested true but the current server storage is already set to false and cannot be changed 【或者】 An incomplete repair has been detected! This is likely because a repair operation unexpectedly failed before completing. MongoDB will not start up again without --repair
1. 高级
1.1 用户账号密码登陆、集群机器使用Key文件 - 安全认证
1.1.1 概述
1.1.1.1 内置角色 - 用于普通用户登录
分类 | 角色 | 描述 |
数据库用户角色 | read | 可以读取指定数据库中任何数据 |
数据库用户角色 | readWrite | 可以读写指定数据库中任何数据,包括创建、重命名、删除集合 |
所有数据库用户角色 | readAnyDatabase | 可以读取所有数据库中任何数据(除了数据库config和local之外) |
所有数据库用户角色 | readWriteAnyDatabase | 可以读写所有数据库中任何数据(除了数据库config和local之外)。 |
所有数据库用户角色 | userAdminAnyDatabase | 可以在指定数据库创建和修改用户(除了数据库config和local之外)。 |
所有数据库用户角色 | dbAdminAnyDatabase | 可以读取任何数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行 检查等操作(除了数据库config和local之外)。 |
数据库管理角色 | dbAdmin | 可以读取指定数据库以及对数据库进行清理、修改、压缩、获取统计信息、执行 检查等操作。 |
数据库管理角色 | userAdmin | 可以在指定数据库创建和修改用户。 |
集群管理角色 | clusterAdmin | 可以对整个集群或数据库系统进行管理操作。 |
备份恢复角色 | backup | 备份MongoDB数据最小的权限。 |
备份恢复角色 | restore | 从备份文件中还原恢复MongoDB数据(除了system.profile集合)的权限 |
超级用户角色 | root | 超级账号,超级权限 |
1.1.1.2 内置语法 - 用于普通用户登录
//当前用户创建的所有角色
db.runCommand({rolesInfo:1})
//所有角色查看-包括内置、以及用户创建
db.runCommand({rolesInfo:1, showBuiltinRoles:true})
//查看某个角色的描述
db.runCommand({rolesInfo:"root"})
db.runCommand({rolesInfo:["root", "__system"]})
//查看某库中某个角色的描述
db.runCommand({rolesInfo: {role:"__system", db:"lrc_blog"}})
//创建用户、并赋予角色
//角色仅可读所有库数据,用户lrcread
db.createUser({
user: 'lrcread',
pwd: 'lrcread',
roles:[{
role: 'readAnyDatabase',
db: 'admin'
}]
})
//创建root用户,囊括所有权限
db.createUser({
user: 'root', // 用户名
pwd: 'fsdfdsfdsfds', // 密码
roles:[{
role: 'root', // 角色
db: 'admin' // 数据库
}]
})
//创建lrc_blog_user用户,仅可对库lrc_blog进行读写
db.createUser({
user: 'lrc_blog_user', // 用户名
pwd: 'lrc_blog_user', // 密码
roles:[{
role: 'readWrite', // 角色
db: 'lrc_blog' // 数据库
}]
})
//删除用户
db.dropUser("用户名")
//用户登陆
db.auth('用户名','密码')
1.1.1.3 Key文件 - 用于集群机器认证
cd /www/server/mongodb/key
openssl rand -base64 753 > key1.txt
chmod 600 key1.txt
//将key1.txt文件所属用于设置成mongo,即跟宝塔面板的/etc/init.id/mongodb的脚本所属用于是一样的 == 必须这样设置否则宝塔面板启动不成功,因为默认的mongodb服务是以mongo用户启动的,所以上面的key1.txt也必须改成mongo用户
chown -R mongo:mongo /www/server/mongodb/key/
配置文件 == /www/server/mongodb/config.conf
## content
systemLog:
destination: file
logAppend: true
path: /www/server/mongodb/log/config.log
# Where and how to store data.
storage:
dbPath: /www/server/mongodb/data
directoryPerDB: true
journal:
enabled: true
# how the process runs
processManagement:
fork: true
pidFilePath: /www/server/mongodb/log/configsvr.pid
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,10.0.20.8
#operationProfiling:
replication:
replSetName: myrs
security:
# 开启安全认证,用户需要使用db.auth登录、集群机器使用keyFile进行认证
authorization: enabled
javascriptEnabled: false
# 用于集群数据同步、访问之间的安全认证,各集群必须使用一样内容的key文件
keyFile: /www/server/mongodb/key/key1.txt
#sharding:
# clusterRole: shardsvr
1.1.2 使用
use admin
//创建root用户
db.createUser({
user: 'root', // 用户名
pwd: 'fsdfdsfdsfds', // 密码
roles:[{
role: 'root', // 角色
db: 'admin' // 数据库
}]
})
//将配置文件 mongo.conf disabled设成enabled - 启动用户认证
security:
authorization: enabled
//重启mongodb
1.2 副本集 - Replica Sets - 类似MySQL的主从复制概念
1.2.1 概述
类型、角色
副本集: 主服务器一旦宕机则由其他从服务器选举出一台作为新的主服务器,而主从复制则需手动介入更改作为新的主服务器
//作用
1. 数据备份
2. 读写分离
类型
1. 主节点:数据操作的主要连接点,可读写
2. 从节点:数据冗余备份节点,可读可选举新的主节点 == 【不可写】
有投票者有被选举权
有投票者有被选举权
有投票者无被选举权
角色
1. 主成员:主要接收所有写操作。就是主节点
2. 副本成员:从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型
3. 仲裁者:不保留任何数据的副本,只具有投票选举主节点作用
选举规则
概念
触发主节点重新选举的条件== 满足任何一个即可
1. 主节点故障
2. 主节点网络不可达(默认心跳10秒)
3. 人工干预(rs.stepDown(600))== 当前主节点在600秒内不能获得选举资格
选举规则
- 票数高且获取大多数成员支持的节点获胜
- 每台机器可投的票数即该台机器的优先级,默认每台机器都为1票(如果某台设置为10优先级,则该台机器投1次票,人家直接获得10票)
- 优先级越高,约可能获得多数成员投票
- 如果票数相同,则按有最新的操作日志则为主节点
方法
机器的优先级以及票数
1.2.2 开始配置
配置文件 - replSetName设置为一样(不管主从仲裁节点都一样)
G:\MongoDB\bin\mongod.cfg == 默认配置文件,需要在后面添加复制集节点名
# Where and how to store data.
storage:
dbPath: G:\MongoDB\data
journal:
enabled: true
# engine:
# wiredTiger:
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: G:\MongoDB\log\mongod.log
# network interfaces
net:
port: 27017
bindIp: 127.0.0.1,内网IP
# 副本集节点名 == 需要新增这个节点
replication:
replSetName: myrs
G:\MongoDB\bin\mongod.27018.cfg
# Where and how to store data.
storage:
dbPath: G:\MongoDB\backup\data27018
journal:
enabled: true
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: G:\MongoDB\backup\data27018\mongod.log
# network interfaces
net:
port: 27018
bindIp: 127.0.0.1,内网IP
replication:
replSetName: myrs
G:\MongoDB\bin\mongod.27019.cfg
# Where and how to store data.
storage:
dbPath: G:\MongoDB\backup\data27019
journal:
enabled: true
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: G:\MongoDB\backup\data27019\mongod.log
# network interfaces
net:
port: 27019
bindIp: 127.0.0.1,内网IP
replication:
replSetName: myrs
将MongoDB(27018、27019)设置为Windows服务,方便后续测试 - MongoDB安装好后自动会将27017端口为Windows服务
首先看一下mongod的命令参数有什么
mongod --help
设置Windows服务,注意:第一次添加自行打开启动27018、27019的服务,我下面那种图我已经打开了的
//设置27018端口为windows服务
mongod --config G:\MongoDB\bin\mongod.27018.cfg --install --serviceName MongoDB_27018 --serviceDisplayName MongoDB_27018
//设置27019口为windows服务
mongod --config G:\MongoDB\bin\mongod.27019.cfg --install --serviceName MongoDB_27019 --serviceDisplayName MongoDB_27019
启动
三个端口(机器)的MongoDB都启动成功,如果使用Navicat去连是会遇上这种情况,需要设置好主、从、仲裁节点机器才可以访问
mongod -f ./mongod.27018.cfg
mongod -f ./mongod.27019.cfg
mongo --host=127.0.0.1 --port=27017
//============注意下面的命令仅仅只能在主节点上运行=======================
//节点初始化
rs.initiate()
//节点配置
rs.conf()
//节点运行状态
rs.status()
//添加副本节点
rs.add("127.0.0.1:27018")
//节点配置 == 查看是否有将127.0.0.1:27018设置为从节点
rs.conf()
//添加仲裁节点 == 我这里会一直卡住不动 === 配好这里就可以上Navicat连数据库了,不过仲裁节点依然不能用Navicat打开的
//rs.add("127.0.0.1:27019",true)
rs.addArb("127.0.0.1:27019")
//当前主节点降级,强制重新选举新的服务器作为主节点
rs.stepDown()
数据查看
1.2.3 遇到问题
从库查询不了
//在从库中运行
rs.secondaryOk()
解决
安全认证+复制集
cd /www/server/mongodb/key
openssl rand -base64 753 > key1.txt
chmod 600 key1.txt
//将key1.txt文件所属用于设置成mongo,即跟宝塔面板的/etc/init.id/mongodb的脚本所属用于是一样的 == 必须这样设置否则宝塔面板启动不成功,因为默认的mongodb服务是以mongo用户启动的,所以上面的key1.txt也必须改成mongo用户
chown -R mongo:mongo /www/server/mongodb/key/
//只要一开启,不管主从都要校验才能查询数据
use admin
db.auth('用户名','密码')
服务脚本:/etc/init.d/mongodb_27019
#!/bin/bash
# chkconfig: 2345 55 25
# description: mongodb
### BEGIN INIT INFO
# Provides: mongodb
# Required-Start: $all
# Required-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: starts mongodb
# Description: starts the mongodb
### END INIT INFO
MONGO_PATH=/www/server/mongodb
if [ ! -f $MONGO_PATH/bin/mongod ];then
echo "No installation of mognodb."
exit;
fi
Config=/www/server/mongodb/config.27019.conf
User=mongo
start()
{
#chmod -R mongo:mongo /www/server/mongodb
mongod -f $Config
}
stop()
{
mongod --shutdown -f $Config
a=`ps aux|grep '/www/server/mongodb'|grep -v 'grep'| grep '27019' |awk '{print $2}'`
if [ "$a" != "" ];then
kill -9 $a
fi
}
case "$1" in
'start')
start
;;
'stop')
stop
;;
'restart')
stop
sleep 2
start
;;
*)
echo "Usage: /etc/init.d/mongodb_27019 {start|stop|restart}"
;;
esac
//进入系统服务目录
cd /etc/init.id
//将mongodb_27019脚本作为服务
chkconfig --add mongodb_27019
//查看系统所有服务
chkconfig --list
//服务启动、关闭、停止
service mongodb_27019 start
service mongodb_27019 stop
service mongodb_27019 restart
复制集的主27017、从27018、仲裁节点27019(共3个MongoDB)的挂机情况分析
从节点挂机27018 - 结果:有主节点
主节点依然正常运行,可以正常写入读取。从服务器恢复时,自动会同步主服务的数据过去
主节点27017挂机 - 结果:有主节点
主节点挂机,触发主节点的选举,从节点则提升27018为主节点
原主节点27017恢复时,则27017为从节点,自动从27018拉取数据同步
主节点27018、仲裁节点27019都挂机 - 结果:无主节点
仲裁节点、主节点都挂机了,不能触发选举,27017依然是从节点,不可进行写入操作
从节点27017、仲裁节点27019都挂机 - 结果:无主节点
仲裁节点、从节点都挂机了,主节点27018自动降级为从节点,不可进行写入操作
1.2.4 更新配置
var config = rs.config();
config.members[0].host="10.0.20.8:27017";
rs.reconfig(config);
1.3 分片集群(Sharded Cluster) == 配置成功后关闭所有MongoDB启不来不知为什么
1.3.1 概述
组件
分片(存储):每个分片包含分片数据的子集。每个分片都可以部署为副本集
mongos(路由):mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口 == 不存储数据仅分发请求
config servers(“调度”的配置):配置服务器存储群集的元数据和配置设置。从MongoDB3.4开始,必须将配置服务器部署为副本集(CSRS)
搭建
注意: 先搭路由节点,再搭分片或配置节点
Windows
创建Windows服务,方便后续启动测试
//副本集1服务
mongod --config G:\MongoDB\bin\mongod.27118.cfg --install --serviceName MongoDB_27118 --serviceDisplayName MongoDB_27018
mongod --config G:\MongoDB\bin\mongod.27119.cfg --install --serviceName MongoDB_27119 --serviceDisplayName MongoDB_27019
//副本集2服务
mongod --config G:\MongoDB\bin\mongod.27117.cfg --install --serviceName MongoDB_27117 --serviceDisplayName MongoDB_27117
mongod --config G:\MongoDB\bin\mongod.27118.cfg --install --serviceName MongoDB_27118 --serviceDisplayName MongoDB_27118
mongod --config G:\MongoDB\bin\mongod.27119.cfg --install --serviceName MongoDB_27119 --serviceDisplayName MongoDB_27119
//存储路由复制主从集(无仲裁服务器)
mongod --config G:\MongoDB\bin\mongod.27217.cfg --install --serviceName MongoDB_27217 --serviceDisplayName MongoDB_27217
mongod --config G:\MongoDB\bin\mongod.27218.cfg --install --serviceName MongoDB_27218 --serviceDisplayName MongoDB_27218
mongod --config G:\MongoDB\bin\mongod.27219.cfg --install --serviceName MongoDB_27219 --serviceDisplayName MongoDB_27219
//配置路由节点
mongos --config G:\MongoDB\bin\mongod.27317.cfg --install --serviceName MongoDB_Mongs_27317 --serviceDisplayName MongoDB_Mongs_27317
mongos --config G:\MongoDB\bin\mongod.27318.cfg --install --serviceName MongoDB_Mongs_27318 --serviceDisplayName MongoDB_Mongs_27318
//第一个副本集
mongo --port 27017
rs.initiate() //重新初始化集群配置
rs.add('127.0.0.1:27018')
rs.addArb('127.0.0.1:27019')
//第二个副本集
mongo --port 27117
rs.initiate() //重新初始化集群配置
rs.add('127.0.0.1:27118')
rs.addArb('127.0.0.1:27119')
//第三个主从集,用于存储分片信息 = 不用建立仲裁服务器
mongo --port 27217
rs.initiate() //重新初始化集群配置
rs.add('127.0.0.1:27218')
rs.add('127.0.0.1:27219')
//路由节点配置副本集信息 == 注意这里使用mongos启动路由节点,mongo连接路由节点进行配置
mongo --port 27317
sh.addShard("myrs/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019")
sh.addShard("myrs2/127.0.0.1:27117,127.0.0.1:27118,127.0.0.1:27119")
sh.status();
mongo --port 27318
sh.addShard("myrs/127.0.0.1:27017,127.0.0.1:27018,127.0.0.1:27019")
sh.addShard("myrs2/127.0.0.1:27117,127.0.0.1:27118,127.0.0.1:27119")
sh.status();
//使用分片路由器进行连接mongodb进行正常的增删改查操作 即 27317、27318端口
针对某个库或者某个库的表进行分开功能开启
sh.enableSharding("lrc_blog")
mongodb启动不了 - 一直卡住不动
about to fork child process, waiting until server is ready for connections.
forked process: 12575
rm -rf /www/server/mongodb/data/*.lock
rm -rf /www/server/mongodb/backup/27018/data/*.lock
rm -rf /www/server/mongodb/backup/27019/data/*.lock
rm -rf /www/server/mongodb/backup/27117/data/*.lock
rm -rf /www/server/mongodb/backup/27118/data/*.lock
rm -rf /www/server/mongodb/backup/27119/data/*.lock
rm -rf /www/server/mongodb/backup/27217/data/*.lock
rm -rf /www/server/mongodb/backup/27218/data/*.lock
rm -rf /www/server/mongodb/backup/27219/data/*.lock
rm -rf /www/server/mongodb/backup/27317/data/*.lock
rm -rf /www/server/mongodb/backup/27318/data/*.lock
mongod --repair --dbpath=/www/server/mongodb/data
mongod --repair --dbpath=/www/server/mongodb/backup/27018/data
mongod --repair --dbpath=/www/server/mongodb/backup/27019/data
mongod --repair --dbpath=/www/server/mongodb/backup/27117/data
mongod --repair --dbpath=/www/server/mongodb/backup/27118/data
mongod --repair --dbpath=/www/server/mongodb/backup/27119/data
mongod --repair --dbpath=/www/server/mongodb/backup/27217/data
mongod --repair --dbpath=/www/server/mongodb/backup/27218/data
mongod --repair --dbpath=/www/server/mongodb/backup/27219/data
mongod --repair --dbpath=/www/server/mongodb/backup/27317/data
mongod --repair --dbpath=/www/server/mongodb/backup/27318/data
//解决
1.
Requested option conflicts with current storage engine option for directoryPerDB; you requested true but the current server storage is already set to false and cannot be changed 【或者】 An incomplete repair has been detected! This is likely because a repair operation unexpectedly failed before completing. MongoDB will not start up again without --repair
//直接先修复数据
mongod --dbpath db目录 --repair
//删除db目录里面的storage.bson
rm -rf db目录/storage.bson
//然后用root用户进行启动
sudo -u root mongod -f 配置文件路径