Linux-------------MongoDB基础


转载https://www.cnblogs.com/FengGeBlog/p/9951319.html

本篇来介绍MongoDB的安装。安装版本是3.4.18
如果安装老版本的mongodb,你会发现安装比较顺利,但是新版本的mongo安装稍微麻烦一点 ,主要是多了安全机制认证等步骤。

一、简介

MongoDB是一个基于分布式文件存储 [1] 的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

二、常用命令及配置文件参数详解

2.1 命令参数详解

--logpath 日志文件路径
--master 指定为主机器
--slave 指定为从机器
--source 指定主机器的IP地址
--pologSize 指定日志文件大小不超过64M.因为resync是非常操作量大且耗时,最好通过设置一个足够大的oplogSize来避免resync(默认的 oplog大小是空闲磁盘大小的5%)。
--logappend 日志文件末尾添加
--port 启用端口号
--fork 在后台运行
--only 指定只复制哪一个数据库
--slavedelay 指从复制检测的时间间隔
--auth 是否需要验证权限登录(用户名和密码)

-h [ --help ]             show this usage information
--version                 show version information
-f [ --config ] arg       configuration file specifying additional options
--port arg                specify port number
--bind_ip arg             local ip address to bind listener - all local ips
                           bound by default
-v [ --verbose ]          be more verbose (include multiple times for more
                           verbosity e.g. -vvvvv)
--dbpath arg (=/data/db/) directory for datafiles    指定数据存放目录
--quiet                   quieter output   静默模式
--logpath arg             file to send all output to instead of stdout   指定日志存放目录
--logappend               appnd to logpath instead of over-writing 指定日志是以追加还是以覆盖的方式写入日志文件
--fork                    fork server process   以创建子进程的方式运行
--cpu                     periodically show cpu and iowait utilization 周期性的显示cpu和io的使用情况
--noauth                  run without security 无认证模式运行
--auth                    run with security 认证模式运行
--objcheck                inspect client data for validity on receipt 检查客户端输入数据的有效性检查
--quota                   enable db quota management   开始数据库配额的管理
--quotaFiles arg          number of files allower per db, requires --quota 规定每个数据库允许的文件数
--appsrvpath arg          root directory for the babble app server 
--nocursors               diagnostic/debugging option 调试诊断选项
--nohints                 ignore query hints 忽略查询命中率
--nohttpinterface         disable http interface 关闭http接口,默认是28017
--noscripting             disable scripting engine 关闭脚本引擎
--noprealloc              disable data file preallocation 关闭数据库文件大小预分配
--smallfiles              use a smaller default file size 使用较小的默认文件大小
--nssize arg (=16)        .ns file size (in MB) for new databases 新数据库ns文件的默认大小
--diaglog arg             0=off 1=W 2=R 3=both 7=W+some reads 提供的方式,是只读,只写,还是读写都行,还是主要写+部分的读模式
--sysinfo                 print some diagnostic system information 打印系统诊断信息
--upgrade                 upgrade db if needed 如果需要就更新数据库
--repair                  run repair on all dbs 修复所有的数据库
--notablescan             do not allow table scans 不运行表扫描
--syncdelay arg (=60)     seconds between disk syncs (0 for never) 系统同步刷新磁盘的时间,默认是60s
 
Replication options:
--master              master mode 主复制模式
--slave               slave mode 从复制模式
--source arg          when slave: specify master as <server:port> 当为从时,指定主的地址和端口
--only arg            when slave: specify a single database to replicate 当为从时,指定需要从主复制的单一库
--pairwith arg        address of server to pair with
--arbiter arg         address of arbiter server 仲裁服务器,在主主中和pair中用到
--autoresync          automatically resync if slave data is stale 自动同步从的数据
--oplogSize arg       size limit (in MB) for op log 指定操作日志的大小
--opIdMem arg         size limit (in bytes) for in memory storage of op ids指定存储操作日志的内存大小
 
Sharding options:
--configsvr           declare this is a config db of a cluster 指定shard中的配置服务器
--shardsvr            declare this is a shard db of a cluster 指定shard服务器

2.2 配置文件参数详解

##简单示例##
#数据库数据存放目录
dbpath=/usr/local/mongodb/data
#数据库日志存放目录
logpath=/usr/local/mongodb/logs/mongodb.log 
#以追加的方式记录日志
logappend = true
#端口号 默认为27017
port=27017 
#以后台方式运行进程
fork=true 
#开启用户认证
auth=true
#关闭http接口,默认关闭http端口访问
#nohttpinterface=true
#mongodb所绑定的ip地址
#bind_ip = 127.0.0.1 
#启用日志文件,默认启用
journal=true 
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true
其他配置参数含义
--quiet	# 安静输出
--port arg	# 指定服务端口号,默认端口27017
--bind_ip arg	# 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地所有IP
--logpath arg	# 指定MongoDB日志文件,注意是指定文件不是目录
--logappend	# 使用追加的方式写日志
--pidfilepath arg	# PID File 的完整路径,如果没有设置,则没有PID文件
--keyFile arg	# 集群的私钥的完整路径,只对于Replica Set 架构有效
--unixSocketPrefix arg	# UNIX域套接字替代目录,(默认为 /tmp)
--fork	# 以守护进程的方式运行MongoDB,创建服务器进程
--auth	# 启用验证
--cpu	# 定期显示CPU的CPU利用率和iowait
--dbpath arg	# 指定数据库路径
--diaglog arg	# diaglog选项 0=off 1=W 2=R 3=both 7=W+some reads
--directoryperdb	# 设置每个数据库将被保存在一个单独的目录
--journal	# 启用日志选项,MongoDB的数据操作将会写入到journal文件夹的文件里
--journalOptions arg	# 启用日志诊断选项
--ipv6	# 启用IPv6选项
--jsonp	# 允许JSONP形式通过HTTP访问(有安全影响)
--maxConns arg	# 最大同时连接数 默认2000
--noauth	# 不启用验证
--nohttpinterface	# 关闭http接口,默认关闭27018端口访问
--noprealloc	# 禁用数据文件预分配(往往影响性能)
--noscripting	# 禁用脚本引擎
--notablescan	# 不允许表扫描
--nounixsocket	# 禁用Unix套接字监听
--nssize arg (=16)	# 设置信数据库.ns文件大小(MB)
--objcheck	# 在收到客户数据,检查的有效性,
--profile arg	# 档案参数 0=off 1=slow, 2=all
--quota	# 限制每个数据库的文件数,设置默认为8
--quotaFiles arg	# number of files allower per db, requires --quota
--rest	# 开启简单的rest API
--repair	# 修复所有数据库run repair on all dbs
--repairpath arg	# 修复库生成的文件的目录,默认为目录名称dbpath
--slowms arg (=100)	# value of slow for profile and console log
--smallfiles	# 使用较小的默认文件
--syncdelay arg (=60)	# 数据写入磁盘的时间秒数(0=never,不推荐)
--sysinfo	# 打印一些诊断系统信息
--upgrade	# 如果需要升级数据库

#Replicaton 参数
--fastsync	# 从一个dbpath里启用从库复制服务,该dbpath的数据库是主库的快照,可用于快速启用同步
--autoresync	# 如果从库与主库同步数据差得多,自动重新同步,
--oplogSize arg	# 设置oplog的大小(MB)

#主/从参数
--master	# 主库模式
--slave	# 从库模式
--source arg	# 从库 端口号
--only arg	# 指定单一的数据库复制
--slavedelay arg	# 设置从库同步主库的延迟时间

#Replica set(副本集)选项:
--replSet arg	# 设置副本集名称

#Sharding(分片)选项
--configsvr	# 声明这是一个集群的config服务,默认端口27019,默认目录/data/configdb
--shardsvr	# 声明这是一个集群的分片,默认端口27018
--noMoveParanoia	# 关闭偏执为moveChunk数据保存

三、简单安装使用

3.1 下载源码

cd /usr/local/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.18.tgz

3.2 解压并创建日志和数据目录

注意:bin目录下的mongod是服务器指令,而mongo是客户端指令

tar -zxf mongodb-linux-x86_64-3.4.18.tgz
mv mongodb-linux-x86_64-3.4.18.tgz mongodb
mdkir /data/logs/mongodb
mdkri /data/mongodb

3.3 准备配置文件

vim /usr/local/mongdb/mongodb.conf
dbpath=/data/mongodb/
logpath=/data/logs/mongodb/mg.log   (原文为txt)  

3.4 启动服务端在后台运行

注意:如果是普通用户启动,修改所有文件属主属组,切换用户启动服务
/usr/local/mongodb/bin/mogod -f /usr/local/mongodb/mongodb.conf &

查询是否启动成功
ps aux|grep mongodb
ss -ntlp

3.5 启动客户端连接服务端

/usr/local/mongodb/bin/mogo 
>show dbs;

警告:WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'  和 WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
解决方法我们可以参考官方的解决方法: https://docs.mongodb.com/manual/tutorial/transparent-huge-pages/
如果官方的解决方法比较麻烦的话,我们还可以参考这位网友的方法:https://blog.csdn.net/u013075468/article/details/51471033

警告:WARNING: Access control is not enabled for the database
原因分析:新版本的MongDB增加了安全性设计,推荐用户创建使用数据库时进行验证。如果用户想建立简单连接,则会提示警示信息
解决方法:

#创建管理员账号并设置密码:
>use admin
switched to db admin
> db.createUser( {user: "firstadmin",pwd: "123456",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]});

Successfully added user: {
    "user" : "firstadmin",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

3.6 修改配置文件,重启MongoDB服务

vim mongodb.conf
#数据库数据存放目录
dbpath=/data/mongodb/
#数据库日志存放目录
logpath=/data/logs/mongodb/mongodb.log 
#以追加的方式记录日志
logappend = true
#端口号 默认为27017
port=27017 
#以后台方式运行进程
fork=true 
#开启用户认证
auth=true
#关闭http接口,默认关闭http端口访问
#nohttpinterface=true
#mongodb所绑定的ip地址,默认是任何IP都能访问
#bind_ip = 127.0.0.1 
#启用日志文件,默认启用
journal=true 
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true

重启MongoDB服务
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf 

客户端连接
/usr/local/mongodb/bin/mongo -u "firstadmin" -p "123456" --authenticationDatabase "admin"

3.7 配置service管理和环境变量

#准备自启脚本
vim /etc/init.d/mongodb
#!/bin/bash
# chkconfig: 2345 10 90  
#服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10。
# description: Start and Stop xxx

start() {  
/usr/local/mongodb/bin/mongod  --config /usr/local/mongodb/mongodb.conf 
}  
  
stop() {  
/usr/local/mongodb/bin/mongod --config /usr/local/mongodb/mongodb.conf --shutdown  
}  
case "$1" in  
  start)  
 start  
 ;;  
  
stop)  
 stop  
 ;;  
  
restart)  
 stop  
 start  
 ;;  
  *)  
 echo  
$"Usage: $0 {start|stop|restart}"  
 exit 1  
esac 

#配置service管理
chmod +x /etc/init.d/mongodb
chkconfig --add mongodb
chkconfig mongodb on 

#配置环境变量
echo 'export PATH=/usr/local/mongodb/bin:$PATH' > /etc/profile.d/mongodb.sh
. /etc/profile.d/mongodb.sh

四、启动常见报错

注意:修复模式运行能显示具体报错。mongod --config /usr/local/mongodb/mongodb.conf --repair

4.1 示例

## 示例1
2015-05-12T09:30:26.313+0800 I STORAGE [initandlisten] exception in initAndListen: 28574 Cannot start server. Detected data files in /root/Desktop/mongodb/data created by storage engine 'mmapv1'. The configured storage engine is 'wiredTiger'., terminating
2015-05-12T09:30:26.313+0800 I CONTROL [initandlisten] dbexit: rc: 100
2015-05-12T09:31:53.043+0800 I CONTROL ***** SERVER RESTARTED *****
2015-05-12T09:31:53.049+0800 I STORAGE [initandlisten] exception in initAndListen: 28574 Cannot start server. Detected data files in /root/Desktop/mongodb/data created by storage engine 'mmapv1'. The configured storage engine is 'wiredTiger'., terminating
2015-05-12T09:31:53.050+0800 I CONTROL [initandlisten] dbexit: rc: 100

补充一下:如果存储空间满了的话也会出现 rc:100错误。总线一下:rc:100是系统文件错误
错误原因: 之前使用mmapv1创建的数据库不能使用wiredTiger打开,需要重新指定dbpath

## 示例2
[root@localhost Desktop]# Python mongodb.py
about to fork child process, waiting until server is ready for connections.
about to fork child process, waiting until server is ready for connections.
forked process: 36411
forked process: 36412
about to fork child process, waiting until server is ready for connections.
forked process: 36414
ERROR: child process failed, exited with error number 100
ERROR: child process failed, exited with error number 100
ERROR: child process failed, exited with error number 100
错误原因: mongodb非正常关闭 删除mongod.lock文件即可.

## 示例3
ERROR: child process failed ,exited with error number 1
错误原因: dbpath文件的权限问题,增加写权限即可

## 示例4
mongodb.conf bind 不能写127.0.0.1否则其它主机连接不了
情况不唯一,这边只能当参考,大致就是这么几种解决思路
child process failed, exited with error number 1
mongod --config /usr/local/mongodb/mongodb.conf --repair 
发现日志文件错误,logs指定的是目录,重新创建即可

## 示例5
child process failed, exited with error number 48
启动成功了但是报错,mongob --shutdown无法停止服务,需要kill -15 进程,重新启动即正常

4.2 关闭服务注意事项

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

2.killall或kill -15 进程ID

3.mongod --config /usr/local/mongodb/mongodb.conf --shutdown

4.请不要 kill -9 ,会造成文件数据混乱丢失 repair 也无力回天。
ctrl+c 可以退出mongo的界面 或是ext

五、配置参考

配置参考:
MongoDB数据库的用户权限控制权限还是比较多的,有系统自带的,已经定义好的角色,也可以自己定义角色权限,需要根据业务需要进行权限分配:
自带角色的说明(一般内置的角色基本上就可以满足生产环境需求了):
https://docs.mongodb.org/manual/core/security-built-in-roles/

用户自行定义角色的说明:
https://docs.mongodb.org/manual/core/security-user-defined-roles/

用户管理配置的说明
https://docs.mongodb.org/manual/reference/method/#user-management-methods

posted @ 2020-04-08 19:30  A学无止境A  阅读(228)  评论(0编辑  收藏  举报