1. MongoDB简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB是开源、高性能、易扩展的文档数据库,一个介于关系数据库和非关系数据库之间的NoSQL数据库产品。
2. MongoDB单机部署
2.1安装前准备
安装环境:
操作系统:CentOS Linux release 7.4.1708 (Core)
安装包下载地址:https://www.mongodb.com/download-center/community
2.2安装步骤:
2.2.1. 解压安装包,和设置软件接
tar -xf mongodb-linux-x86_64-rhel70-4.0.4.tgz -C /opt
ln -s mongodb-linux-x86_64-rhel70-4.0.4 mongodb
2.2.2.配置数据目录和日志目录
cd /opt/mongodb
mkdir -p /opt/mongodb/data #创建存放数据的目录
mkdir -p /opt/mongodb/log #创建存放日志的目录
vim /opt/mongodb/conf/config.conf #添加一下内容
systemLog:
logAppend: true
path: "/opt/mongodb/log/mongodb.log" #存放日志的地方
destination: file
processManagement:
fork: true #允许后台运行
pidFilePath: "/opt/mongodb/mongod.pid"
net:
port: 27017 #端口,为安全起见,可以使用其他端口
bindIp: "0.0.0.0" #生产环境使用127.0.0.1
storage:
dbPath: "/opt/mongodb/data" #存放数据的地方
journal:
enabled: true
2.2.3. 配置环境变量
vim /etc/profile
export MONGODB_HOME=/opt/mongodb
export PATH=${MONGODB_HOME}/bin:$PATH
#生效
source /etc/profile
2.2.4 启动MongoDB
[root@bgsbtsp0006-dqf:opt]# mongod -f /opt/mongodb/conf/config.conf
[root@bgsbtsp0006-dqf:opt]# mongo --port 27017
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" :
UUID("9e9885c2-8799-47b2-b10e-94251ad8b6df") }
MongoDB server version: 4.0.3
Server has startup warnings:
2018-11-27T17:09:50.933+0800 I STORAGE [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-11-27T17:09:50.933+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-11-27T17:09:52.145+0800 I CONTROL [initandlisten]
2018-11-27T17:09:52.145+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2018-11-27T17:09:52.145+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.
2018-11-27T17:09:52.145+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.
2018-11-27T17:09:52.145+0800 I CONTROL [initandlisten]
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten]
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine.
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** We suggest launching mongod like this to avoid performance problems:
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** numactl --interleave=all mongod [other options]
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten]
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten]
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-11-27T17:09:52.147+0800 I CONTROL [initandlisten]
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
3.MongoDB的启动优化
根据上面启动后的warning的警告对mongodb数据库进行优化,每个情况可能不太一样。
- 第一个警告是文件系统格式,这个可以不用管。
- 第二个警告是新版本的MongDB为了让我们创建一个安全的数据库,解决方案:后面我们会创建用户,进行权限验证,该警告就没有了。
- 第三个警告是说不建议使用root用户,解决方案:可以创建一个普通用,普通用户启动,进入即可。
- 第四个警告是,解决方案:在原启动命令前面加numactl –interleave=all,即numactl --interleave=all mongod -f /opt/mongodb/conf/config.conf
- 第5个警告和第6个警告,解决方案:关闭大内存页面的transparent_hugepage。
echo 'never' >/sys/kernel/mm/transparent_hugepage/enabled
echo 'never'>/sys/kernel/mm/transparent_hugepage/defrag
上述是mongodb数据库的单机安装。
4、FAQ
- 配置文件启动后,如果关闭掉,再启动必须要把mongod.lock文件给删了,该文件一般是在存放数据的目录dbpath下,否则后台启动不成功。
- 配置文件内容不正确也会启动不起了,这个一般在启动的时候会给出提示,自己检查或者看官网yaml格式的配置文件即可,最坑人的是日志文件如果你没有指定,只是给一个目录,那么启动时也不会提示错误,也起不起来,还不好排错(浪费了大半天时间)。
- 如果是普通用户启动,关闭后,再启动的时候,如果不小心用来root启动,那么也会启动起来,当你发现后,再准备有用普通用户起的时候,发现启动不了。原因是除了删除mongod.lock文件,还要看看当前dbpath目录下其他文件是否被篡改了属组权限,其次/tmp/mongodb-*.sock文件的属组属性。
about to fork child process, waiting until server is ready for connections.
forked process: 38050
ERROR: child process failed, exited with error number 1
这是集群部署的截图,意思明白就行了,这个文件会被改成root。集群部署的时候,日志中好像还没有日志,最后单独再部署一台,按照之前的错误操作重做一遍,才在日志中发现了这个文件的权限问题。