MongoDB学习2 - 账号密码登录、副本集配置

x33g5p2x  于2022-05-05 转载在 其他  
字(10.9k)|赞(0)|评价(0)|浏览(417)

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. 仲裁者:不保留任何数据的副本,只具有投票选举主节点作用

选举规则
概念

文档: https://docs.mongodb.com/manual/reference/replication/

触发主节点重新选举的条件== 满足任何一个即可1. 主节点故障2. 主节点网络不可达(默认心跳10秒)3. 人工干预(rs.stepDown(600))== 当前主节点在600秒内不能获得选举资格

选举规则

  1. 票数高且获取大多数成员支持的节点获胜
  2. 每台机器可投的票数即该台机器的优先级,默认每台机器都为1票(如果某台设置为10优先级,则该台机器投1次票,人家直接获得10票)
  3. 优先级越高,约可能获得多数成员投票
  4. 如果票数相同,则按有最新的操作日志则为主节点
方法

机器的优先级以及票数

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 配置文件路径

相关文章

微信公众号

最新文章

更多

目录