文章目录

  • 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('用户名','密码')

python MongoClient 账号密码 mongo账号密码登录_学习

python MongoClient 账号密码 mongo账号密码登录_mongodb_02

python MongoClient 账号密码 mongo账号密码登录_数据库_03

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

python MongoClient 账号密码 mongo账号密码登录_mongodb_04

python MongoClient 账号密码 mongo账号密码登录_学习_05

python MongoClient 账号密码 mongo账号密码登录_数据_06

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. 如果票数相同,则按有最新的操作日志则为主节点
方法

机器的优先级以及票数

python MongoClient 账号密码 mongo账号密码登录_学习_07

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

python MongoClient 账号密码 mongo账号密码登录_数据库_08

设置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

python MongoClient 账号密码 mongo账号密码登录_数据库_09

启动

三个端口(机器)的MongoDB都启动成功,如果使用Navicat去连是会遇上这种情况,需要设置好主、从、仲裁节点机器才可以访问

python MongoClient 账号密码 mongo账号密码登录_mongodb_10

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()

python MongoClient 账号密码 mongo账号密码登录_数据库_11

python MongoClient 账号密码 mongo账号密码登录_学习_12


python MongoClient 账号密码 mongo账号密码登录_数据库_13


python MongoClient 账号密码 mongo账号密码登录_mongodb_14


python MongoClient 账号密码 mongo账号密码登录_数据库_15


python MongoClient 账号密码 mongo账号密码登录_数据_16


python MongoClient 账号密码 mongo账号密码登录_mongodb_17


python MongoClient 账号密码 mongo账号密码登录_mongodb_18


python MongoClient 账号密码 mongo账号密码登录_学习_19


python MongoClient 账号密码 mongo账号密码登录_数据库_20

数据查看

python MongoClient 账号密码 mongo账号密码登录_学习_21

1.2.3 遇到问题
从库查询不了
//在从库中运行
rs.secondaryOk()

python MongoClient 账号密码 mongo账号密码登录_mongodb_22

解决

python MongoClient 账号密码 mongo账号密码登录_mongodb_23

安全认证+复制集
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('用户名','密码')

python MongoClient 账号密码 mongo账号密码登录_数据_24


服务脚本:/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

python MongoClient 账号密码 mongo账号密码登录_数据库_25

python MongoClient 账号密码 mongo账号密码登录_学习_26

复制集的主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);

python MongoClient 账号密码 mongo账号密码登录_学习_27

1.3 分片集群(Sharded Cluster) == 配置成功后关闭所有MongoDB启不来不知为什么

1.3.1 概述





组件

分片(存储):每个分片包含分片数据的子集。每个分片都可以部署为副本集

mongos(路由):mongos充当查询路由器,在客户端应用程序和分片集群之间提供接口 == 不存储数据仅分发请求

config servers(“调度”的配置):配置服务器存储群集的元数据和配置设置。从MongoDB3.4开始,必须将配置服务器部署为副本集(CSRS)


搭建

注意: 先搭路由节点,再搭分片或配置节点

python MongoClient 账号密码 mongo账号密码登录_学习_28

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")

python MongoClient 账号密码 mongo账号密码登录_数据_29

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