0%

MongoDB基础


MongoDB概述

简介

MongoDB是一款跨平台、面向文档的数据库.

可以实现高性能、高可用性, 并且能够轻松扩展. 是一个基于分布式文件存储的开源数据库系统, 在高负载的情况下, 添加更多的节点, 可以保证服务器性能.

MongoDB也是一个介于关系数据库和非关系数据库之间的产品, 是非关系数据库当中功能最丰富, 最像关系数据库的. 不采用关系模型主要是为了获得更好的扩展性, MongoDB不再有”行”(row)的概念, 其运行方式主要基于两个概念:集合(collection)与文档(document).

特点

MongoDB的特点包括面向集合存储、模式自由、丰富的查询语句和多级索引、复制集机制、易于水平扩展、可插入存储引擎、跨平台多语言支持等.

MongoDB安装简单, 提供了面向文档存储功能, 操作起来比较容易.

MongobB提供了复制、高可用性和自动分片功能.
如果负载增加(需要更多的存储空间和更强的处理能力), 它可以分布在计算机网络中的其他节点上, 这就是所谓的分片. Mongo支持丰富的查询表达式, 查询指令使用JSON形式的标记, 可轻易查询文档中内嵌的对象及数组.

MongoDB支持各种编程语言:Ruby、Python、Java、C++、PHP、C#等多种语言

适用领域

MongoDB可以为Web应用提供可扩展的高性能数据存储解决方案. MongoDB主要适用领域有网站数据、分布式场景、数据缓存和JSON文档格式存储. 适合大数据量、高并发、弱事务的互联网应用, 其内置的水平扩展机制提供了从几百万到十亿级别的数据处理能力, 可以很好地满足Web2.0和移动互联网应用数据存储的要求.

MongoDB安装

安装及运行控制

1.配置yum源进行安装MongoDB

1
2
3
4
5
6
7
8
cat > /etc/yum.repos.d/mongodb-org.repo <<-EOF
[mongodb-org]
name=MongoDB Repository
baseurl=http://mirrors.aliyun.com/mongodb/yum/redhat/7Server/mongodb-org/3.4/x86_64/
gpgcheck=0
enabled=1
EOF
yum install -y mongodb-org

2.MongoDB运行控制
设置内核参数

1
2
3
4
5
6
7
8
9
10
11
12
13
# 当某个节点可用内存不足时, 系统会从其他节点分配内存.
echo 0 > /proc/sys/vm/zone_reclaim_mode

# 关闭大页内存
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# 永久生效设置
vi /etc/rc.local
echo 0 > /proc/sys/vm/zone_reclaim_mode
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
sh /etc/rc.local

启动和停止

1.启动MongoDB服务并设置开机自启动

1
2
3
4
5
mongod -f /etc/mongod.conf

vim /etc/rc.local
rm -rf /var/lib/mongo/mongod.lock
mongod -f /etc/mongod.conf

2.测试是否安装成功

1
curl http://localhost:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.

3.停止MongoDB

1
2
3
4
5
mongod -f /etc/mongod.conf --shutdown
ps aux | grep mongod

# 当没有正常关闭成功时, 直接结束进程.
kill -2 pid号

4.连接并访问MongoDB, 关闭数据库并退出.

1
2
3
4
mongo
use admin
db.shutdownServer()
exit

注: 用Systemctl运行脚本文件来启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cat > /lib/systemd/system/mongod.service <<-EOF
[Unit]
Description=MongoDB
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/var/lib/mongo/mongod.lock
ExecStart=/usr/bin/mongod --auth -f /etc/mongod.conf
ExecReload=rm -rf /var/lib/mongo/mongod.lock &> /dev/null;/usr/bin/mongod -f /etc/mongod.conf --shutdown;/usr/bin/mongod -f /etc/mongod.conf
ExecStop=/usr/bin/mongod -f /etc/mongod.conf --shutdown
PrivateTmp=true

[Install]
WantedBy=multi-user.target
EOF

多实例启动

1.复制配置文件并更改

1
2
cp /etc/mongod.conf /etc/mongod2.conf
vim /etc/mongod2.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod2.log

storage:
  dbPath: /var/lib/mongo2
  journal:
    enabled: true

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

net:
  port: 27018
  bindIp: 127.0.0.1  

2.创建数据文件并赋予权限

1
2
3
mkdir /var/lib/mongo2
touch /var/log/mongodb/mongod2.log
chmod -R 777 /var/log/mongodb/mongod2.log

2.启动多实例

1
2
3
4
5
mongod -f /etc/mongod2.conf
mongo
use admin
db.shutdownServer()
exit

MongoDB存储结构

逻辑存储结构

MongoDB的逻辑结构主要由文档(document)、集合(collection)和数据库(database)三部分组成.

其中文档是MongoDB的核心概念, 它是MongoDB逻辑存储的最小单元, 相当于关系型数据库中的一行记录, 多个文档组成集合, 集合相当于关系型数据库中的表的概念, 多个集合组成数据库.

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocumen数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接, MongoDB不支持.
primary keyprimary key主键, MongoDB自动将_id字段设置为主键.

1.数据库
MongoDB的默认数据库:test
admin: root数据库, 如果将一个用户添加到这个数据库, 这个用户将自动继承所有数据库的权限. 一些特定的服务器端命令也只能从这个数据库运行.

local: 这个数据永远不会被复制, 可以用来存储限于本地单台服务器的任意集合.

config: 当Mongo用于分片设置时, config数据库在内部使用, 用于保存分片的相关信息.

2.集合
集合存在于数据库中, 集合没有固定的结构, 这意味着在集合中可以插入不同格式和类型的数据, 但通常情况下插入集合的数据都会有一定的关联性.

当第一个文档插入时, 集合就会被创建.

合法的集合名不能是空字符串””, 不能含有\0字符(空字符), 这个字符表示集合名的结尾, 不能以”system.”开头, 这是为系统集合保留的前缀.

3.文档
文档是一个键值对:
(1)文档中的键值对是有序的
(2)文档中的值可以是双引号里面的字符串, 也可以是其他几种数据类型(甚至可以是整个嵌入的文档).
(3)MongoDB区分类型和大小写
(4)MongoDB的文档不能有重复的键
(5)文档的键是字符串. 除了少数例外情况, 键可以使用任意UTF-8字符.

文档键命名规范:
(1)键不能含有\0(空字符), 这个字符用来表示键的结尾.
(2).和$有特别的意义, 只有在特定环境下才能使用.
(3)以下划线”_”开头的键是保留的(不是严格要求的)

物理存储结构

MongoDB物理存储结构主要包括数据存储和日志存储

1.数据存储
MongoDB的数据目录由配置文件中的dbpath指定, 用来存储所有MongoDB的数据文件.

在MongoDB内部, 每个数据库都包含一个.ns文件和一些数据文件.

MongoDB内部有预分配空间的机制, 预分配的文件都用0进行填充, 这样MongoDB始终保持额外的空间和空余的数据文件. 数据文件每次新生成的一个文件, 大小都会是上一个文件的两倍.

文件使用MMAP进行内存映射, 会将所有数据文件映射到内存中, 但是只是虚拟内存, 只有访问到这块数据时才会交换到物理内存.

2.日志存储
结构:
(1)系统日志文件的存放由配置文件中的path指定
(2)Journal日志文件, 用于MongoDB崩溃恢复的保障.
(3)oplog复制操作日志文件在启动主从复制时出现
(4)慢查询日志文件, 需要在配置文件中指定profile=1(开启慢查询)与slowms
=200(记录毫秒数), 查看慢查询的命令:db.system.profile.find().

数据类型

常用数据类型
String字符串, 存储数据常用的数据类型. 在MongoDB中UTF-8编码的字符串才是合法的.
Integer整型数值, 用于存储数值. 根据用户的服务器, 可分为32位或64位.
Boolean布尔值, 用于存储布尔值(真/假).
Double双精度浮点值, 用于存储浮点值.
Arrays用于将数组或列表或多个值存储为一个键
Object用于内嵌文档
Null用于创建空值
Date日期时间, 用户可以指定自己的日期时间, 创建Date对象, 传入年月日信息.
Binary Data二进制数据, 用于存储二进制数据.

MongoDB基本操作

常用操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 查看当前操作的库
db

// 查看当前实例下的数据库列表
show dbs

// 切换到指定数据库, 如果数据库不存在, 则创建数据库.
use db_name

// 显示当前数据库中的集合
show collections

// 显示数据库操作命令
db.help()

// 显示集合操作命令
db.ct_name.help()

// 对当前数据库中指定的集合进行数据查找
db.ct_name.find()
db.ct_name.findOne()

创建、复制、删除数据库

1.创建数据库或切换数据库

1
2
use db_name
show dbs

2.复制数据库

1
2
db.copyDatabase("db_name","db_name2","localhost")
show dbs

3.删除数据库

1
2
db.dropDatabase()
show dbs

集合和文档操作

1.集合中插入文档

1
2
3
4
5
6
// 没有该集合时会自动创建
db.ct_name.insert({id:数字, '字段名':'值'})
db_ct_name.fint()

// 删除当前这个集合
db.ct.name.drop()

2.修改集合中的文档

1
2
// 修改匹配的第一条数据
db.ct_name.update({id:数字,"字段名":"值"}, {"字段名":"值",...})

3.删除集合中符合条件的所有数据

1
db.ct_name.remove({"字段名":"值"})

4.克隆集合

1
2
3
4
5
6
7
8
9
10
11
# 启动另一个实例
mongod -f /etc/mongod2.conf

# 查看实例端口是否存在
netstat -lnt

mongo --port 27018

// 从指定来源实例中克隆指定数据库下的指定集合到当前实例中
db.runCommand({"cloneCollection":"db_name.ct_name", "from":"127.0.0.1:27017"})
show dbs

MongoDB日常维护

-d指明数据库的名字
-c指明集合的名字
-f指明要导出的列名
-o指明要导出的文件名
-q指明导出数据的过滤条件
-hMongoDB所在服务器地址(可指定端口号)
--authenticationDatabase授权用户的数据库角色

备份与恢复管理

1.导入与导出
(1).导出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use info

\\ 创建测试数据
for(var i=1;i<=1000;i++){db.test.insert({'id':i,'name':'Alice'});}
exit

# 导出数据
mongoexport -d info -c test -o /opt/info.json
# 带用户认证的导出数据
mongoexport -h 192.168.100.10:27017 -uroot -p123456 -d info -c test -o /opt/info.json --authenticationDatabase admin

# 导出id>500的数据
mongoexport -d info -c test -q '{ "id":{ "$gt":500} }' -o /opt/info_gt500.json
# 带用户认证导出id>500的数据
mongoexport -h 192.168.100.10:27017 -uroot -p123456 -d info -c test -q '{ "id":{ "$gt":500} }' -o /opt/info_gt500.json --authenticationDatabase admin

head -10 /opt/info_gt500.json

(2).导入

1
2
3
4
5
6
7
8
9
10
11
\\ 删除集合
db.test.drop()
exit

# 导入数据
mongoimport -d info -c test --file /opt/info.json

# 查看数据
mongo
use info
show collections

2.备份与恢复
(1)备份

1
2
3
4
mongodump -h 127.0.0.1:27017 -d info -o /opt/

# 带用户认证
mongodump -h 192.168.100.10:27017 -uroot -p123456 -d info -o /opt/ --authenticationDatabase admin

(2)恢复

1
2
3
4
mongorestore -h 127.0.0.1:27017 -d info --dir=/opt/info/

# 带用户认证
mongorestore -h 192.168.100.10:27017 -uroot -p123456 -d info --dir=/opt/info/ --authenticationDatabase admin

安全管理

1.限定监听特定IP和端口

1
2
3
4
5
6
7
8
vim /etc/mongod.conf
port: 27017
bindIp: 192.168.100.10

netstat -antp | grep 27017

# 连接MongoDB
mongo --host 192.168.100.10:27017

2.授权启动

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
# 重新连接MongoDB
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf

mongo --host 192.168.100.10:27017
use admin
// 创建用户
db.createUser(
{
user:"root",
pwd:"123456",
roles:[{role:"root", db:"admin"}]
}
)

// 删除用户
db.dropUser('用户名')

// 授权验证
db.auth('root','123456')

// 查看用户
db.system.users.find().pretty()
exit

# 开启MongoDB的授权
vim /etc/mongod.conf
security:
authorization: enabled

# 重新连接MongoDB
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf

# 连接验证
mongo -uroot -p123456 192.168.100.10/admin
1: 表示验证成功

db.createUser({
    user: "用户名",
    pwd: "密码",
    roles: [ { role: "角色", db: "作用数据库" } ]
})

数据库用户角色: read、readWrite
数据库管理角色: dbAdmin、dbOwner、userAdmin
集群管理角色: clusterAdmin、clusterManager、clusterMonitor、hostManager
备份恢复角色: backup、restore
所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
超级用户角色: root

3.进程管理

1
2
3
4
5
// 查看当前正在运行的进程
db.currentOp()

// 根据PID结束进程
db.killOp(4988)
{
    "inprog" : [
        {
            "desc" : "conn2",
            "threadId" : "140116274083584",
            "connectionId" : 2,
            "client" : "192.168.100.10:51702",
            "appName" : "MongoDB Shell",
            "clientMetadata" : {
                "application" : {
                    "name" : "MongoDB Shell"
                },
                "driver" : {
                    "name" : "MongoDB Internal Client",
                    "version" : "3.4.24"
                },
                "os" : {
                    "type" : "Linux",
                    "name" : "CentOS Linux release 7.5.1804 (Core) ",
                    "architecture" : "x86_64",
                    "version" : "Kernel 3.10.0-862.el7.x86_64"
                }
            },
            "active" : true,
            "opid" : 4988,
            "secs_running" : 0,
            "microsecs_running" : NumberLong(47),
            "op" : "command",
            "ns" : "admin.$cmd",
            "query" : {
                "currentOp" : 1
            },
            "numYields" : 0,
            "locks" : {

            },
            "waitingForLock" : false,
            "lockStats" : {

            }
        }
    ],
    "ok" : 1
}

MongoDB监控

1.查看数据库统计信息的命令
查看数据库实例的状态信息: db.serverStatus()
查看当前数据库的统计信息: db.stats()

用Web界面查看系统监控信息
官方文档资料参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /etc/mongod.conf
net:
...

http:
enabled: true

#security:
#authorization: enabled

# 重新连接MongoDB
mongod -f /etc/mongod.conf --shutdown
mongod -f /etc/mongod.conf

# 访问HTTP状态界面
curl http://192.168.100.10:28017

2.查看集合统计信息的命令
查看集合统计信息: db.users.stats()
查看集合大小: db.users.dataSize()

3.第三方监控工具
在Nagios中配置使用MongoDB插件来监控MongoDB数据库

-------------------本文结束 感谢阅读-------------------