MongoDB数据库安装部署及优化使用

MongoDB简介

什么是MongoDB

MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引,如果用一句话来概括的话:MongoDB是一个高可用、分布式、灵活模式的文档数据库,用于大容量数据存储。

关系型与非关系型

NoSQL not only sql
NoSQL,指的是非关系型的数据库。
NoSQL有时也称作Not Only SQL的缩写是对不同于传统的关系型数据库的数据库管理系统的统称。
对NoSQL最普遍的解释是”非关联型的”,强调Key-Value Stores和文档数据库的优点,而不是单纯的RDBMS。
NoSQL用于超大规模数据的存储。
这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
今天我们可以通过第三方平台可以很容易的访问和抓取数据。
用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。
我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了
NoSQL数据库的发展也却能很好的处理这些大的数据。

Mongo和mysql数据对比

mysqlmongo
集合
字段key:value
文档

mysql里的数据:

nameagejobcity
wangxiansen25CEO
zhangsan23CTO
lisi24CFOBJ

mongo里的数据:

1
2
3
{name:'wangxiansen',age:'25',job:'CEO'},
{name:'zhangsan',age:'23',job:'CTO'},
{name:'lisi',age:'24',job:'CFO',city:'BJ'}

MongoDB特点

高性能:

  • Mongodb提供高性能的数据持久性
  • 尤其是支持嵌入式数据模型减少数据库系统上的I/O操作
  • 索引支持能快的查询,并且可以包括来嵌入式文档和数组中的键

丰富的语言查询:

  • Mongodb支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总,文本搜索和地理空间索引 ,使您可以按任意字段进行过滤和排序,无论它在文档中有多嵌套。

高可用性:

  • Mongodb的复制工具,成为副本集,提供自动故障转移和数据冗余

水平可扩展性:

  • Mongodb提供了可扩展性,作为其核心功能的一部分,分片是将数据分在一组计算机上
  • 关系型数据库很难做分布式的原因就是多节点海量数据关联有巨大的性能问题。如果不考虑关联,数据分区分库,水平扩展就比较简单;

支持多种存储引擎:

  • WiredTiger存储引擎和、MMAPv1存储引擎和InMemory存储引擎

mongo应用场景

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

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

社交场景:使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能

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

视频直播:使用 MongoDB 存储用户信息、礼物信息等,用户评论

电商场景:使用 MongoDB 商城上衣和裤子两种商品,除了有共同属性,如产地、价格、材质、颜色等外,还有各自有不同的属性集,如上衣的独有属性是肩宽、胸围、袖长等,裤子的独有属性是臀围、脚口和裤长等

安装部署MongoDB

规划目录

1
2
3
4
5
6
#软件所在目录
/opt/mongodb
#单节点目录
/opt/mongo_27017/{conf,log,pid}
#数据目录
/data/mongo_27017

下载并解压

1
2
3
4
5
yum install libcurl openssl-devel -y
#wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.14.tgz
tar zxf mongodb-linux-x86_64-rhel70-4.0.14.tgz -C /opt/
cd /opt/
ln -s mongodb-linux-x86_64-rhel70-4.0.14 mongodb

创建文件目录以及数据目录

1
2
mkdir -p /opt/mongo_27017/{conf,log,pid}
mkdir -p /data/mongo_27017

创建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
cat >/opt/mongo_27017/conf/mongodb.conf<<EOF
systemLog:
destination: file
logAppend: true
path: /opt/mongo_27017/log/mongodb.log

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

processManagement:
fork: true
pidFilePath: /opt/mongo_27017/pid/mongod.pid

net:
port: 27017
bindIp: 127.0.0.1,10.1.1.11
EOF

配置文件解释

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
配置文件注解:
systemLog:
destination: file #Mongodb 日志输出的目的地,指定一个file或者syslog,如果指定file,必须指定
logAppend: true #当实例重启时,不创建新的日志文件, 在老的日志文件末尾继续添加
path: /opt/mongo_27017/logs/mongodb.log #日志路径

storage:
journal: #回滚日志
enabled: true
dbPath: /data/mongo_27017 #数据存储目录
directoryPerDB: true #默认,false不适用inmemoryengine
wiredTiger:
engineConfig:
cacheSizeGB: 1 #将用于所有数据缓存的最大小
directoryForIndexes: true #默认false索引集合storage.dbPath存储在数据单独子目录
collectionConfig:
blockCompressor: zlib
indexConfig:
prefixCompression: true

processManagement: #使用处理系统守护进程的控制处理
fork: true #后台运行
pidFilePath: /opt/mongo_27017/pid/mongod.pid #创建 pid 文件

net:
port: 27017 #监听端口
bindIp: 127.0.0.1,10.1.1.11 #绑定ip

启动mongo

1
/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf

检查是否启动

1
2
ps -ef|grep mongo
netstat -lntp|grep 27017

进入mongo

1
/opt/mongodb/bin/mongo

配置登录mongo

写入环境变量

1
2
echo 'export PATH=/opt/mongodb/bin:$PATH' >> /etc/profile
source /etc/profile

关闭mongo

1
2
3
4
5
6
7
8
9
10
方法1:推荐
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

方法2: 只能是使用localhost方式登陆
mongo
use admin
db.shutdownServer()

方法3: system管理
https://www.boysec.cn/boy/5a2618fa.html#不建议以root身份运行

优化告警

内存不足

1
2
** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.
See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt

解决方法:

1
2
方法1: 加大机器内存
方法2: 调小配置文件里的缓存大小 cacheSizeGB: 0.5

没有开启访问控制

1
2
** WARNING: Access control is not enabled for the database.
Read and write access to data and configuration is unrestricted.

解决方法:

1
开启安全账户功能,见用户认证章节

不建议以root身份运行

1
** WARNING: You are running this process as the root user, which is not recommended.

解决方法:

1
2
方法1: 创建普通用户mongo,然后切换到mongo用户启动
方法2: 使用system方式登陆,指定运行用户为普通用户mongo

mongo的system启动文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
cat >/usr/lib/systemd/system/mongod.service<<EOF
[Unit]
Description=MongoDB Database Server
Documentation=https://docs.mongodb.org/manual
After=network.target

[Service]
User=mongo
Group=mongo
ExecStart=/opt/mongodb/bin/mongod -f /opt/mongo_27017/conf/mongodb.conf
ExecStartPre=/usr/bin/chown -R mongo:mongo /opt/mongo_27017/
ExecStartPre=/usr/bin/chown -R mongo:mongo /data/mongo_27017/

PermissionsStartOnly=true
PIDFile=/opt/mongo_27017/pid/mongod.pid
Type=forking
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=64000
# processes/threads
LimitNPROC=64000
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
# Recommended limits for for mongod as specified in
# http://docs.mongodb.org/manual/reference/ulimit/#recommended-settings

[Install]
WantedBy=multi-user.target
EOF

创建普通用户mongo

1
2
3
4
pkill mongo
groupadd mongo -g 777
useradd mongo -g 777 -u 777 -M -s /sbin/nologin
id mongo

重新启动mongo

1
2
3
4
systemctl daemon-reload 
systemctl start mongod.service
ps -ef|grep mongo
mongo

关闭大内存页

1
2
3
4
** 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'

解决方法:改完要重启

1
2
echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
echo "never" > /sys/kernel/mm/transparent_hugepage/defrag

数据目录磁盘不是XFS格式

1
** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine

解决方法:

1
把磁盘格式转成XFS

rlimits低

1
** WARNING: soft rlimits too low. rlimits set to 7266 processes, 100001 files. Number of processes should be at least 50000.5 : 0.5 times number of files.

解决方法:

1
2
3
4
5
6
7
8
cat > /etc/profile<<EOF
ulimit -f unlimited
ulimit -t unlimited
ulimit -v unlimited
ulimit -n 64000
ulimit -m unlimited
ulimit -u 64000
EOF

生效配置:

1
source /etc/profile

验证:

1
2
3
systemctl stop mongod
systemctl start mongod
mongo

关闭监控服务体验

1
2
3
4
5
6
7
8
9
10
11
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

解决方法:

1
db.disableFreeMonitoring()