avatar

Mongodb介绍安装

Mongodb介绍安装

第1章 NoSQL 介绍

1.1 NoSQL 简介

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。1970 年E.F.Codd’s 提出的
关系模型的论文“A relational model of data for large shared data banks”,这使得数据建模和应用程序
编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化
数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009 年趋势越发高涨。NoSQL
的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一
种全新的思维的注入。

1.2 什么是NoSQL

NoSQL,指的是非关系型的数据库。NoSQL 有时也称作Not Only SQL 的缩写,是对不同于传统的关
系型数据库的数据库管理系统的统称。
NoSQL最普遍的解释是”非关联型的”,强调Key-Value Stores 和文档数据库的优点,而不是单
纯的反对RDBMS。
NoSQL 用于超大规模数据的存储。(例如谷歌或Facebook 每天为他们的用户收集万亿比特的数据)。
这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

1.3 为什么使用NoSQL ?

今天我们可以通过第三方平台(如:Google,Facebook 等)可以很容易的访问和抓取数据。

用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果

要对这些用户数据进行挖掘,那SQL 数据库已经不适合这些应用了, NoSQL 数据库的发展也却能很好

的处理这些大的数据。

第2章 MongoDB 简介

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

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

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

2.1 MongoDB 数据格式

2.1.1 JSON

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。JSON 采用完全独立于语言的文本格
式,但是也使用了类似于C 语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python
等)。这些特性使JSON 成为理想的数据交换语言.易于人阅读和编写,同时也易于机器解析和生成(一
般用于提升网络传输速率)。JSON 的官方MIME 类型是application/json,文件扩展名是.json。
MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。
JSON 简单说就是JavaScript 中的对象和数组,通过对象和数组可以表示各种复杂的结构。
对象:
对象在js 中表示为“{}”括起来的内容,数据结构为{key: value,key: value,…}的键值对的
结构,在面向对象的语言中, key 为对象的属性, value 为对应的属性值,所以很容易理解,取值方
法为对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象几种。
例如: {“FirstName”:”ke”,”LastName”:”me”,”email”:”hikeme@aa”}
取值方式和所有语言中一样,使用key 获取,字段值的类型可以是数字、字符串、数组、对象几种。

2.1.2 BSON

BSON 是一种类JSON 的一种二进制形式的存储格式,简称Binary JSON,它和JSON 一样,支持内
嵌的文档对象和数组对象,但是BSON 有JSON 没有的一些数据类型,如Date 和BinData 类型。
它的优点是灵活性高,但它的缺点是空间利用率不是很理想。
BSON 有三个特点:轻量性、可遍历性、高效性。
对JSON 来说,数据存储是无类型的,比如你要修改基本一个值,从9 到10,由于从一个字符变成
了两个,所以可能其后面的所有内容都需要往后移一位才可以。而使用BSON,你可以指定这个列为
数字列,那么无论数字从9 长到10 还是100,我们都只是在存储数字的那一位上进行修改,不会导
致数据总长变大。当然,在MongoDB 中,如果数字从整形增大到长整型,还是会导致数据总长变大
的。
有时BSON 相对JSON 来说也并没有空间上的优势,比如对{“sex”:1},在JSON 的存储上1 只使用了一个字节,而如果用BSON,那就是至少4 个字节

2.2 MongoDB 特点

高性能:

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

丰富的语言查询:

Mongodb 支持丰富的查询语言来支持读写操作(CRUD)以及数据汇总,文本搜索和地理空间索引

高可用性:

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

水平可扩展性:

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

支持多种存储引擎:

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

2.3 MongoDB 包含的程序

MongoDB Drivers

官方MongoDB 客户端库提供C, C ++, C#, Java, Node.JS, Perl, PHP,Python, Ruby 和
Scala 驱动程序的参考指南。

MongoDB Stitch

为开发人员提供了一个API 到MongoDB 和其他后端服务。保持MongoDB 的全部功能和灵性,同时
受益于强大的系统来配置细粒度的数据访问控制。

MongoDB Atlas

MongoDB 在云中部署,操作和扩展的最佳方式。适用于AWS,Azure 和Google Cloud Platform。轻
松将数据迁移到MongoDB Atlas,零停机

MongoDB Cloud Manager

是一个用于管理MongoDB 部署的软件包。Ops Manager 提供Ops Manager 监控和Ops Manager 备份,可帮助用户优化群集并降低操作风险

MongoDB Charts

可以最快速最简单的创建Mongodb 可视化图表

MongoDB Connector for BI

MongoDB 商业智能连接器(BI)允许用户使用SQL 创建查询,并使用现有的关系商业智能工具(如
Tableau, MicroStrategy 和Qlik)对其MongoDB Enterprise 数据进行可视化,图形化和报告。

MongoDB Compass

通过从集合中随机抽样一个文档子集,为用户提供其MongoDB 模式的图形视图。采样文件可最大程
度地降低对数据库的影响,并能快速产生结果。有关抽样的更多信息

MongoDB Spark Connector

使用连接器,您可以访问所有使用MongoDB 数据集的Spark 库:用SQL 进行分析的数据集(受益于
自动模式推理),流式传输,机器学习和图形API。您也可以使用连接器与Spark Shell。

第3章 应用场景

1
https://www.zhihu.com/question/32071167

第4章 安装部署

4.1 官方文档

1
https://docs.mongodb.com/manual/

4.2 安装方式

1
https://www.mongodb.com/download-center/enterprise

这里选用tar 包的安装方式

1
mongodb-linux-x86_64-3.6.13.tgz

4.3 目录规划

1
2
3
4
5
6
7
8
9
#下载并解压
yum install libcurl openssl -y
cd /opt/
tar xf mongodb-linux-x86_64-3.6.13.tgz
ln -s mongodb-linux-x86_64-3.6.13 mongodb

#创建文件目录以及数据目录
mkdir /opt/mongo_27017/{conf,logs,pid} -p
mkdir /data/mongo_27017 -p

第5章 配置文件

5.1 创建配置文件

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/logs/mongodb.log

storage:
journal:
enabled: true
dbPath: /data/mongo_27017
directoryPerDB: true
wiredTiger:
engineConfig:
cacheSizeGB: 1
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.0.1.51
EOF

5.2 启动关闭mongo

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

5.3 检查是否启动

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

第6章 登录mongo

6.1 写入环境变量

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

6.2 创建hosts 解析

1
2
[root@db01 ~]# cat > /etc/hosts <<EOF
10.0.1.51 172.16.1.51 db01

6.3 登录mongo

1
2
/opt/mongodb/bin/mongo
mongo db01:27017

6.4 关闭命令

2 种关闭方式,建议使用mongo 自带的命令

方法1:登陆mongo 使用内置shutdown 命令

1
2
3
4
5
6
7
8
9
[root@db01 ~]# mongo localhost:27017

> use admin
switched to db admin
> db.shutdownServer()
server should be down...
2019-11-05T03:26:54.171+0800 I NETWORK [thread1] trying reconnect to localhost:27017 (127.0.0.1) failed
2019-11-05T03:26:54.171+0800 W NETWORK [thread1] Failed to connect to 127.0.0.1:27017, in(checking socket for error after poll), reason: Connection refused
2019-11-05T03:26:54.171+0800 I NETWORK [thread1] reconnect localhost:27017 (127.0.0.1) failed failed

方法2:启动命令添加–shutdown 命令

1
[mongo@db01 ~]$ mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown

第7章 警告优化

7.1 内存不足

1
2
3
4
5
6
7
8
#报警内容1:内存不足
2019-11-05T00:24:56.345+0800 I STORAGE [initandlisten] ** WARNING: The configured WiredTiger cache size is more than 80% of available RAM.

#解决方法:
1.添加内存
2.调整配置文件里的cache大小
[root@db01 ~]# grep "cacheSizeGB" /opt/mongo_27017/conf/monogdb.conf
cacheSizeGB: 1

7.2 配置访问控制参数

1
2
3
4
#报警内容2:配置访问控制参数
2019-11-05T00:24:56.345+0800 I STORAGE [initandlisten] ** See http://dochub.mongodb.org/core/faq-memory-diagnostics-wt
2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.
2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.

7.3 普通用户启动

1
2
3
4
5
6
7
8
9
10
11
12
#报警内容3:不是以普通用户启动
2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended.

#解决方法:
mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown
useradd mongo
echo "123456"|passwd --stdin mongo
chown -R mongo:mongo /opt/
chown -R mongo:mongo /data/
su - mongo
mongod -f /opt/mongo_27017/conf/mongodb.conf
mongo db01:27017

7.4 never

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#报警内容4:We suggest setting it to 'never'
2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'

2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2019-11-05T00:24:57.129+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'

#解决方法:
1.临时解决
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

2.官方脚本 ##推荐
[root@db01 ~]# cat /etc/init.d/disable-transparent-hugepages
#!/bin/bash
### BEGIN INIT INFO
# Provides: disable-transparent-hugepages
# Required-Start: $local_fs
# Required-Stop:
# X-Start-Before: mongod mongodb-mms-automation-agent
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description: Disable Linux transparent huge pages, to improve
# database performance.
### END INIT INFO

case $1 in
start)
if [ -d /sys/kernel/mm/transparent_hugepage ]; then
thp_path=/sys/kernel/mm/transparent_hugepage
elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
thp_path=/sys/kernel/mm/redhat_transparent_hugepage
else
return 0
fi

echo 'never' > ${thp_path}/enabled
echo 'never' > ${thp_path}/defrag

re='^[0-1]+$'
if [[ $(cat ${thp_path}/khugepaged/defrag) =~ $re ]]
then
# RHEL 7
echo 0 > ${thp_path}/khugepaged/defrag
else
# RHEL 6
echo 'no' > ${thp_path}/khugepaged/defrag
fi

unset re
unset thp_path
;;
esac

赋予脚本权限

1
chmod 755 /etc/init.d/disable-transparent-hugepages

加入开机自启动

1
2
chkconfig --add disable-transparent-hugepages
chkconfig --list|grep disable

7.5 用户访问控制

配置文件增加用户认证的配置参数

1
2
security:
authorization: enabled

第8章 mongodb 默认存在的库

1
2
3
4
> show dbs
admin 0.000GB ----->系统预留库,MongoDB 系统管理库
config 0.000GB ----->MongoDB 配置信息库
local 0.000GB ----->本地预留库,存储关键日志

操作命令:

1
2
3
4
show databases/show dbs
show tables/show collections
use admin
db/select database()
文章作者: Wu Fei
文章链接: http://linuxwf.com/2020/04/15/Mongodb%E4%BB%8B%E7%BB%8D%E5%AE%89%E8%A3%85/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WF's Blog
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论