Nosql特点 Mongo部署 报错 工具 用户登录及权限管理


一、NoSQL介绍

1.NoSQL 简介

NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL",指的是非关系型的数据库,是对不同于传统的关系型数据库的数据库管理系统的统称。 

在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理,也有一部分使用非系型数据库处理

对NoSQL最普遍的解释是"非关联型的",强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。 

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

2.为什么使用NoSQL

关系型数据库对数据要求严格,而非关系型数据库没有那么严格,对于大量不同字段的数据,存储更加方便

二、MongoDB简介

参考文献: https://www.runoob.com/mongodb/mongodb-dropdatabase.html

Mongodb由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。是专为可扩展性,高性能和高可用性而设计的数据库, 是非关系型数据库中功能最丰富,最像关系型数据库的,它支持的数据结构非常散,是类似 json 的 bjson 格式,因此可以存储比较复杂的数据类型。

MongoDB的(来自于英文单词“Humongous”,中文含义为“庞大”)是可以应用于各种规模的企业,各个行业以及各类应用程序的开源数据库。作为一个适用于敏捷开发的数据库,MongoDB的的数据模式可以随着应用程序的发展而灵活地更新。

MongoDB 以一种叫做 BSON(二进制 JSON)的存储形式将数据作为文档存储。具有相似结构的文档通常被整理成集合。可以把这些集合看成类似于关系数据库中的表: 文档和行相似, 字段和列相似。

json格式:{key:value,key:value}
bjson格式:{key:value,key:value}
#区别在于:对于数据{id:1},在JSON的存储上1只使用了一个字节,而如果用BJSON,那就是至少4个字节

1.MySQL与mongoDB对比

1)结构对比

mysql MongoDB
集合
字段 键值
文档
文档
表联合 嵌入文档
主键 主键 (MongoDB 提供了 key 为 _id )
# 需要注意的是:

1.文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。

2.MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范:

3.键不能含有\0 (空字符)。这个字符用来表示键的结尾。
.和$有特别的意义,只有在特定环境下才能使用。
以下划线"_"开头的键是保留的(不是严格要求的)。'

2)student库,user表

uid name age
1 zhangyu 18
2 chencgheng 28

3)student库,user集合

1) {uid:1,name:zhangyu,age:18}
2) {uid:2,name:chencgheng,age:28}

4)区别总结

1.数据结构不同
2.数据库添加不存在字段的数据时报错
3.mongoDB可以添加不存在的字段的数据
4.mongoDB不需要提前创建好库和表,创建数据直接会帮助我们创建好

2.MongoDB 特点

1.高性能:
    Mongodb 提供高性能的数据持久性,索引支持更快的查询

2.丰富的语言查询:
    Mongodb 支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总

3.高可用性: 
    Mongodb 的复制工具,成为副本集,提供自动故障转移和数据冗余, 

4.水平可扩展性:
    Mongodb 提供了可扩展性,作为其核心功能的一部分,分片是将数据分在一组计算机上。

5.支持多种存储引擎: 
    WiredTiger存储引擎和、 MMAPv1存储引擎和 InMemory 存储引擎
    3.0以上版本            3.0以下版本
    新的引擎压缩比特别大,原来100个G,可能升级之后所有数据都在,只占用10个G

MMAPv1存储引擎相当于myisam引擎.
WiredTiger存储引擎相当于innodb支持事务文档锁,redo等功能.

6.强大的索引支持:
    地理位置索引可用于构建 各种 O2O 应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求

3.MongoDB应用场景

1.游戏场景:
    使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新.

2.物流场景:
    使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

3.社交场景:
    使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能.
    将送快递骑手、快递商家的信息(包含位置信息)存储在 MongoDB,然后通过 MongoDB 的地理位置查询,这样很方便的实现了查找附近的商家、骑手等功能,使得快递骑手能就近接单.
    地图软件、打车软件、外卖软件,MongoDB强大的地理位置索引功能使其最佳选择.

4.物联网场景:
    使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析.

5.视频直播:
    使用 MongoDB 存储用户信息、礼物信息等.

6.电商场景:
    上衣有胸围,裤子有腰围,如果用数据库需要分成两个库,如果使用MongoDB都可以存在一起.

三、MongoDB安装3.6版本/4.0版本

系统准备:
- redhat或centos6.2以上系统
- ip地址和hosts文件解析正常
- 系统开发包完整
- iptables防火墙selinux关闭
- 关闭大页内存机制

# 关闭大页内存机制
-------------------------
# 代码设置,root用户下
在vi /etc/rc.local最后添加如下代码
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

# 手工设置
cat /sys/kernel/mm/transparent_hugepage/enabled   
cat /sys/kernel/mm/transparent_hugepage/defrag

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

其他系统关闭参照官方文档:   
https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
---------------
为什么要关闭?
Transparent Huge Pages (THP) is a Linux memory management system 
that reduces the overhead of Translation Lookaside Buffer (TLB) 
lookups on machines with large amounts of memory by using larger memory pages.
However, database workloads often perform poorly with THP, 
because they tend to have sparse rather than contiguous memory access patterns. 
You should disable THP on Linux machines to ensure best performance with MongoDB.

0.安装依赖

[root@redis01 ~]# yum install -y libcurl openssl

1.上传或下载包

#下载地址:https://www.mongodb.com/download-center/community
[root@redis01 ~]# rz mongodb-linux-x86_64-3.6.13.tgz 

2.解压包

[root@redis01 ~]# tar xf mongodb-linux-x86_64-3.6.13.tgz -C /usr/local/
[root@redis01 ~]# ln -s /usr/local/mongodb-linux-x86_64-3.6.13 /mongodb

3.配置文件

window和linux通用简易配置

dbpath=/home/mongodb/data  #数据库的数据目录
logpath=/home/mongodb/log/mongo.log  #数据库日志存放目录
logappend=true  #以追加的方式记录日志
port=12138  #端口号 默认为27017
fork=true  #以后台方式运行进程
auth=true  #开启用户认证
journal=true #启用日志文件,默认启用
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
#bind_ip=0.0.0.0
oplogSize=2048  #日志
maxConns=20000  #最大连接数
wiredTigerCacheSizeGB=100  #最大内存
#创建目录
[root@redis01 ~]# mkdir /mongodb/{conf,logs,pid,data} -p

#创建所需用户和组
useradd mongod
passwd mongod
chown -R mongod.mongod /mongodb
chown -R mongod.mongod /usr/local/mongodb-linux-x86_64-3.6.13

#YAML方式配置文件
[root@redis01 ~]# vim /mongodb/conf/mongodb.conf
systemLog:
  destination: file   
  logAppend: true  
  path: /mongodb/logs/mongodb.log

storage:
  journal:
    enabled: true
  dbPath: /mongodb/data
  directoryPerDB: true
  wiredTiger:
     engineConfig:
        cacheSizeGB: 1
        directoryForIndexes: true
     collectionConfig:
        blockCompressor: zlib
     indexConfig:
        prefixCompression: true

processManagement:
  fork: true
  pidFilePath: /mongodb/pid/mongod.pid

net:
  port: 27017
  bindIp: 127.0.0.1,10.0.0.6

security:
  authorization: enabled


#配置详解
#日志相关
systemLog:
  #以文件格式存储
  destination: file
  #每次重启,不生成新文件,每次都追加到文件
  logAppend: true
  #指定文件路径
  path: /mongodb/logs/mongodb.log

#数据部分
storage:
  #数据回滚。类似于mysql的undolog
  journal:
    enabled: true
  #数据目录
  dbPath: /mongodb/data
  #默认 false,不适用 inmemory engine
  directoryPerDB: true
  #存储引擎
  wiredTiger:
     #存储引擎设置
     engineConfig:
        #想把数据存到缓存,缓存的大小
        cacheSizeGB: 1
        #设置一个库就是一个目录,关闭就全放到一个目录下,很乱
        directoryForIndexes: true
     #压缩相关
     collectionConfig:
        blockCompressor: zlib
     #索引压缩(与压缩一起使用)
     indexConfig:
        prefixCompression: true
#守护进程的模式
processManagement:
  fork: true
  #指定pid文件
  pidFilePath: /mongodb/pid/mongod.pid
#指定端口和监听地址
net:
  port: 27017
  bindIp: 127.0.0.1,10.0.0.6
  maxIncomingConnections: 65536
#最大连接数设置(重要)

#版本3.4以后有密码设置.
security:
  authorization: enabled



=========================
# 查看最大连接数
db.serverStatus().connections

current数 + available数 即为最大连接数
说明:最大连接数是由maxConn (maxIncomingConnections)和操作系统单个进程能打开的最大文件描述符数总量的80%决定的,取两个之间的最小值。默认单个进程能打开的最大文件描述符数为1024,1024*80% = 819.2 取整数819。所以最大可以支持的并发连接数默认为819。

!! 最大连接数问题

======== 当连接mongo报错 ===========
[thread1] Error: network error while attempting to run command 'isMaster' on host ...
'此时可以看到mongo的后台进程,但是mongostat和mongo都连不上.
可能就是最大连接数到上限了'

查看最大连接数,如果还是819。那么考虑是不是linux系统的限制,Linux系统默认一个进程最大文件打开数目为1024。

当然这个问题也跟ulimit限制有关, 可以手动修改ulimit -n 来改动open file 的数目.

如果想使open file的值永久生效的话,请在/etc/security/limits.conf中添加以下四行, 数目根据系统情况具体修改.

#<domain>      <type>  <item>         <value>
#

#*               soft    core            0
#*               hard    rss             10000
#@student        hard    nproc           20
#@faculty        soft    nproc           20
#@faculty        hard    nproc           50
#ftp             hard    nproc           0
#@student        -       maxlogins       4

* soft nofile 102400
* hard nofile 102400

root soft nofile 102400
root hard nofile 102400

# End of file

然后在/etc/pam.d/login中添加“session required /lib64/security/pam_limits.so”

[root@localhost mongodb]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule

session    required     /lib64/security/pam_limits.so
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so

reboot后即可永久生效.

4.启动3.6版本

# 配置环境变量
[root@redis01 ~]# vim /etc/profile.d/mongo.sh
export PATH="/mongodb/bin:$PATH"

[root@redis01 ~]# source /etc/profile

# 启动3.6版本
====================================
[root@redis01 ~]# /mongodb/bin/mongod -f /mongodb/conf/mongodb.conf 
about to fork child process, waiting until server is ready for connections.
forked process: 11547
child process started successfully, parent exiting

#验证启动
[root@redis01 ~]# ps -ef | grep mongo
root      11547      1  6 08:48 ?        00:00:00 /usr/local/mongodb/bin/mongod -f /server/mongo_27017/conf/mongodb.conf

#启动mongo shell
mongo

5.启动4.0版本

# 普通配置文件
vim /mongodb/conf/mongodb.conf
logpath=/mongodb/log/mongodb.log
dbpath=/mongodb/data 
port=27017
logappend=true
fork=true

# YAML配置文件例子
vim /mongodb/conf/mongo.conf
systemLog:
   destination: file
   path: "/mongodb/log/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 10.0.0.21,127.0.0.1

# YAML 配置文件说明
--系统日志有关  
systemLog:
   destination: file        
   path: "/mongodb/log/mongodb.log"    --日志位置
   logAppend: true                     --日志以追加模式记录
--数据存储有关   
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data"            --数据路径的位置
-- 进程控制  
processManagement:
   fork: true                         --后台守护进程
   pidFilePath: <string>              --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中

--网络配置有关   
net:            
   bindIp: <ip>                       -- 监听地址,如果不配置这行是监听在127.0.0.1
   port: <port>                       -- 端口号,默认不配置端口号,是27017

-- 安全验证有关配置      
security:
  authorization: enabled              --是否打开用户名密码验证

-------------以下是复制集与分片集群有关-----------------  
replication:
 oplogSizeMB: <NUM>
 replSetName: "<REPSETNAME>"
 secondaryIndexPrefetch: "all"

sharding:
   clusterRole: <string>
   archiveMovedChunks: <boolean>

---for mongos only
replication:
   localPingThresholdMs: <int>

sharding:
   configDB: <string>
---

# 启动方式1 (不推荐)
'此方式会指定启动的数据位置,但是多次启动每次启动都会用一个新文件存储,会导致无法远端连接数据库的问题.':
mongod --dbpath=/mongodb/data --logpath=/mongodb/logs/mongodb.log --port=27017 --logappend --fork
# 数据路径 日志路径 端口 日志记录方式 后台启动

=========报错1=========
远端工具连接不上.(找不到用户数据文件)
解决方法: 用下述方式二启动即可.

=========报错2=========
ERROR: child process failed, exited with error number 100
To see additional information in this output, start without the "--fork" option.
'原因是没有创建mongo用户和文件夹授权'

# 使用配置文件方式2启动mongodb:(推荐使用)
mongod -f /mongodb/conf/mongodb.conf

## 正确关闭mongod 的方法:进入mongo shell
use admin
db.shutdownServer()

## 关闭mongodb(不推荐,会出问题)
[root@db01 ~]# mongod -f /mongodb/conf/mongodb.conf --shutdown

#验证启动
[root@db01 ~]# ps -ef | grep mongo
root      11547      1  6 08:48 ?        00:00:00 /usr/local/mongodb/bin/mongod -f /server/mongo_27017/conf/mongodb.conf
执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接的建立,当连接被建立后,就会开始打印日志信息。

你可以使用 MongoDB shell 来连接 MongoDB 服务器。你也可以使用 PHP 来连接 MongoDB。
[root@db01 ~]# mongo

======报错3=====
1.非正常关闭或者配置错误启动后产生的问题,需要先删除/mongo/data/mongo.lock

2.然后重新启动时使用--repair
mongod --dbpath=/mongodb/data --logpath=/mongodb/logs/mongodb.log --port=27017 --logappend --fork --repair
# YAML模式配置文件
NOTE:
YAML does not support tab characters for indentation: use spaces instead.

--系统日志有关  
systemLog:
   destination: file        
   path: "/mongodb/logs/mongodb.log"    --日志位置
   logAppend: true                     --日志以追加模式记录

--数据存储有关   
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data"            --数据路径的位置

-- 进程控制  
processManagement:
   fork: true                         --后台守护进程
   pidFilePath: <string>              --pid文件的位置,一般不用配置,可以去掉这行,自动生成到data中

--网络配置有关   
net:            
   bindIp: <ip>                       -- 监听地址
   port: <port>                       -- 端口号,默认不配置端口号,是27017

-- 安全验证有关配置      
security:
  authorization: enabled              --是否打开用户名密码验证

------------------以下是复制集与分片集群有关----------------------  

replication:
 oplogSizeMB: <NUM>
 replSetName: "<REPSETNAME>"
 secondaryIndexPrefetch: "all"

sharding:
   clusterRole: <string>
   archiveMovedChunks: <boolean>

---for mongos only
replication:
   localPingThresholdMs: <int>

sharding:
   configDB: <string>

=====================
YAML例子
cat >  /mongodb/conf/mongo.conf <<EOF
systemLog:
   destination: file
   path: "/mongodb/logs/mongodb.log"
   logAppend: true
storage:
   journal:
      enabled: true
   dbPath: "/mongodb/data/"
processManagement:
   fork: true
net:
   port: 27017
   bindIp: 10.0.0.8,127.0.0.1
EOF
mongod -f /mongodb/conf/mongo.conf --shutdown
mongod -f /mongodb/conf/mongo.conf   

6.使用systemd管理并自启

# 注意路径是否一致
vim /etc/systemd/system/mongod.service
——————————
[Unit]
Description=MongoDB document-oriented database
After=network.target
[Service]
PIDFile=/mongodb/pid/mongod.pid  #按需修改
ExecStart=/mongodb/bin/mongod -f /mongodb/conf/mongodb.conf #修改
ExecStop=/bin/kill -INT $MAINPID
[Install]
WantedBy=multi-user.target
——————————
# 赋予执行权限
chmod +x /etc/systemd/system/mongod.service

[root@db01 ~]# systemctl restart mongod
[root@db01 ~]# systemctl stop mongod
[root@db01 ~]# systemctl start mongod

# 如果启动日志出现”WARNING: /sys/kernel/mm/.... 报错信息,需加入一行:
ExecStartPre=echo never >> /sys/kernel/mm/transparent_hugepage/enabled && echo never >> /sys/kernel/mm/transparent_hugepage/defrag

# 加入开机自启动
systemctl enable mongod.service

7.连接mongo实例

# 0.默认登录
mongo -port 端口  (未设置认证情况下,即可无需密码登录系统)

# 1.连接MongoDB可以使用以下方式登录:
类似Mysql一样连接
mongo --host 10.10.18.11 -u "myUserAdmin" --authenticationDatabase "admin" -p'abc123'
其中--authenticationDatabase "admin" 是指定认证库

# 2.mongodb标准程序连接语法:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
mongodb:// 这是固定的格式,必须要指定。

username:password@  可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库

host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。

portX 可选的指定端口,如果不填,默认为27017

/database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。

?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开

=========================
# 使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。如下所示:
> mongodb://admin:123456@localhost/

8.更多连接实例

使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:
mongodb://admin:123456@localhost/

使用用户名和密码连接登陆到指定数据库,格式如下:
mongodb://admin:123456@localhost/test

连接本地数据库服务器,端口是默认的。
mongodb://localhost

使用用户名fred,密码foobar登录localhost的admin数据库。
mongodb://fred:foobar@localhost

使用用户名fred,密码foobar登录localhost的baz数据库。
mongodb://fred:foobar@localhost/baz

连接 replica pair, 服务器1为example1.com服务器2为example2。
mongodb://example1.com:27017,example2.com:27017

连接 replica set 三台服务器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019

连接 replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。
mongodb://host1,host2,host3/?slaveOk=true

直接连接第一个服务器,无论是replica set一部分或者主服务器或者从服务器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
当你的连接服务器有优先级,还需要列出所有服务器,你可以使用上述连接方式。

安全模式连接到localhost:
mongodb://localhost/?safe=true

以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000

java下无法认证的情况使用的链接方式:

# java下无法认证的情况使用的链接方式:
mongodb://用户名:密码@host:端口/库名?authSource=admin&authMechanism=SCRAM-SHA-1

四、mongo登录警告处理

1.警告一

#访问设置没有被允许
WARNING: Access control is not enabled for the database.

#解决方式:开启安全认证
[root@redis01 ~]# vim /server/mongo_27017/conf/mongodb.conf 
security:
  authorization: enabled

2.警告二

#以root用户运行了
WARNING: You are running this process as the root user, which is not recommended.

#解决方式:使用普通用户启动
1.先关闭mongodb
[root@redis01 ~]# mongod -f /mongodb/conf/mongodb.conf --shutdown
2.创建mongo用户
[root@redis01 ~]# useradd mongo
[root@redis01 ~]# echo '123456'|passwd --stdin mongo
Changing password for user mongo.
passwd: all authentication tokens updated successfully.
3.授权目录
[root@redis01 ~]# chown -R mongo.mongo /usr/local/mongodb/
[root@redis01 ~]# chown -R mongo.mongo /server/mongo_27017/
4.重新启动
[root@redis01 ~]# su - mongod
Last login: Wed May 27 09:07:51 CST 2020 on pts/1
[mongo@redis01 ~]$ mongod -f /server/mongo_27017/conf/mongodb.conf

3.警告三、四

#你使用的是透明大页,可能导致mongo延迟和内存使用问题。
WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
       We suggest setting it to 'never'
WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
       We suggest setting it to 'never'

#解决方法:执行 echo never > /sys/kernel/mm/transparent_hugepage/enabled 修复该问题
#         执行 echo never > /sys/kernel/mm/transparent_hugepage/defrag 修复该问题

#配置之后重启
[root@redis01 ~]# su - mongo
[mongo@redis01 ~]mongod -f /server/mongo_27017/conf/mongodb.conf --shutdown
[mongo@redis01 ~] mongod -f /server/mongo_27017/conf/mongodb.conf

#这样设置是临时的,我们要把他加到 rc.local,在授个权

4.警告五

#rlimits太低,MongoDB的软件进程被限制了,MongoDB希望自己是最少rlimits 32767.5
WARNING: soft rlimits too low. rlimits set to 7837 processes, 65535 files. Number of processes should be at least 32767.5 : 0.5 times number of files.

#解决方法1:
------------------------
[root@redis01 ~]# vim /etc/profile
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 65535
ulimit -m unlimited
ulimit -u 65535
#以上为仅仅修改root用户,mongo用户下不生效.

[root@redis01 ~]# vim /etc/security/limits.d/20-nproc.conf
*          soft    nproc     65535
root       soft    nproc     unlimited
#这个是可以修改mongo用户.永久生效.

[root@redis01 ~]# source /etc/profile
--------------------

#解决方法2:
[root@db02 ~]# ulimit -u 65535
[root@db02 ~]# bash
[root@db02 ~]# su - mongo
[mongo@db02 ~]vim .bashrc
----加入一行
ulimit -u 65535
查看结果.
[mongo@db02 ~] ulimit -u


五、mongo工具

'如果开启验证方式的话需要使用用户名密码及验证库才能使用命令.'
================================
mongo               #登录命令
mongodump           #备份导出,全备(数据时压缩过的)
mongorestore        #恢复数据
mongostat           #查看运行状态的
mongod              #启动命令
mongoexport         #备份,导出json格式
mongoimport         #恢复数据
mongos              #集群分片命令
mongotop            #查看运行状态

1.mongostat命令


六、用户授权认证

默认登录
mongo -port 端口  (未设置密码情况下,即可无需密码登录系统)

1.授权命令

用户管理界面
要添加用户, MongoDB提供了该db.createUser()方法。添加用户时,您可以为用户分配色以授予权限。
注意:
在数据库中创建的第一个用户应该是具有管理其他用户的权限的用户管理员。
db.createUser()

use admin

db.createUser({user: "root",pwd: "123",roles:[ { role: "root", db:"admin"}]})

您还可以更新现有用户,例如更改密码并授予或撤销角色。

db.auth() 将用户验证到数据库。
db.changeUserPassword() 更改现有用户的密码。

db.changeUserPassword('root','新密码')

db.createUser() 创建一个新用户。
db.dropUser() 删除单个用户。
db.dropAllUsers() 删除与数据库关联的所有用户。
db.getUser() 返回有关指定用户的信息。
db.getUsers() 返回有关与数据库关联的所有用户的信息。
db.grantRolesToUser() 授予用户角色及其特权。
db.removeUser() 已过时。从数据库中删除用户。
db.revokeRolesFromUser() 从用户中删除角色。
db.updateUser() 更新用户数据。

=========创建用户=========
user:用户名
pwd:密码
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。

# role里的角色可以选:
  Built-In Roles(内置角色):
  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色:root 
  这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  7. 内部角色:__system

# 具体角色权限:
  Read:允许用户读取指定数据库
  readWrite:允许用户读写指定数据库
  dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问   system.profile
  userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
  clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
  readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
  readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
  userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
  dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
  root:只在admin数据库中可用。超级账号,超级权限。

建立userAdminAnyDatabase 角色,用来管理用户,可以通过这个角色来创建、删除用户。

# mongodb没有直接用户ip访问控制的设置,需要通过bind_ip控制网段方式实现.

2.创建用户和角色

[mongo@db01 ~]$ mongo
> use admin
> db.createUser({user: "root",pwd: "123",roles:[ { role: "root", db:"admin"}]})
Successfully added user: {
        "user" : "admin",
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

3.查看用户

> db.getUsers()
[
    {
        "_id" : "test.admin",
        "userId" : UUID("b840b96c-3442-492e-a45f-6ca7dff907fd"),
        "user" : "admin",
        "db" : "test",
        "roles" : [
            {
                "role" : "root",
                "db" : "admin"
            }
        ]
    }
]

4.配置开启认证

[root@redis01 ~]# vim /server/mongo_27017/conf/mongodb.conf 
security:
  authorization: enabled

#重启
[mongo@redis01 ~]mongod -f /server/mongo_27017/conf/mongodb.conf --shutdown
[mongo@redis01 ~] mongod -f /server/mongo_27017/conf/mongodb.conf

5.配置认证以后查操作不了

> show databases;
2020-05-27T11:41:06.186+0800 E QUERY    [thread1] Error: listDatabases failed:{
    "ok" : 0,
    "errmsg" : "there are no users authenticated",
    "code" : 13,
    "codeName" : "Unauthorized"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:67:1
shellHelper.show@src/mongo/shell/utils.js:860:19
shellHelper@src/mongo/shell/utils.js:750:15
@(shellhelp2):1:1

6.验证用户密码连接

===== 方式一 =====
# 登录验证库 --authenticationDatabase admin (D必须大写)
[mongo@redis01 ~]mongo -uadmin -p --authenticationDatabase admin
MongoDB shell version v3.6.13
Enter password: 

===== 方式二 =====
[mongo@redis01 ~] mongo 
> use admin
> db.auth('root','123')
1

> show databases;
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
test2   0.000GB

7.创建普通用户

> use test
> db.createUser(
  {
    user: "test",
    pwd: "123456",
    roles: [ { role: "readWrite", db: "write" },
             { role: "read", db: "read" } ]
  }
)

8.创建测试数据

use write
db.write.insert({"name":"linhaoda","age":17,"ad":"上海浦东新区"})
db.write.insert({"name":"linhaoda","age":17,"ad":"上海浦东新区"})
db.write.insert({"name":"haoda","age":18,"ad":"上海浦东新区"})
db.write.insert({"name":"linda","age":18,"ad":"上海浦东新区"})
db.write.insert({"name":"linhao","age":18,"ad":"上海浦东新区","sex":"boy"})

use read
db.read.insert({"name":"linhaoda","age":17,"ad":"上海浦东新区"})
db.read.insert({"name":"linhaoda","age":17,"ad":"上海浦东新区"})
db.read.insert({"name":"haoda","age":18,"ad":"上海浦东新区"})
db.read.insert({"name":"linda","age":18,"ad":"上海浦东新区"})
db.read.insert({"name":"linhao","age":18,"ad":"上海浦东新区","sex":"boy"})

9.登录

# 登录mongoDB(与mysql相似,但必须加上--authenticationDatabase admin,认证库,一般认证库都可以用admin)
mongo -u 'root' -p '123' --authenticationDatabase 'admin' --host 127.0.0.0:27017
mongo -uroot -p123 --authenticationDatabase 'admin' --host 127.0.0.0:27017


mongo -utest -p --authenticationDatabase test
use write
db.write.find()
db.write.insert({"name":"linhaoda","age":17,"ad":"上海浦东新区"})

use read
db.read.find()
db.read.insert({"name":"linhaoda","age":17,"ad":"上海浦东新区"})

七、windows下安装mongdb

MongoDB 下载
MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community

注意:在 MongoDB 2.2 版本后已经不再支持 Windows XP 系统。最新版本也已经没有了 32 位系统的安装文件。

  • 1.使用默认安装选择Complete,可修改默认数据和log路径

  • 2.下一步安装 "install mongoDB compass" 不勾选(当然你也可以选择安装它,可能需要非常久的安装时间甚至卡死),MongoDB Compass 是一个图形界面管理工具,我们可以在后面自己到官网下载安装,下载地址:https://www.mongodb.com/download-center/compass

  • 3.正常情况下mongodb安装后就会自动启动。

  • 4.如下几种报错情况:

  • 5.有无法启动的情况检查配置文件中路径,并修改登录身份即可。

Copyright © 2009 - Now . XPBag.com . All rights Reserved.
夜心的小站 » Nosql特点 Mongo部署 报错 工具 用户登录及权限管理

提供最优质的资源集合

立即查看 了解详情