超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》
目录
开始了!!!不废话了
前言
目前我们常用的MS SQL数据库、ACCESS数据库、MongoDB、My SQL数据库等等。
之前我讲过My SQL数据库,有兴趣的朋友可以去看看。今天我们主要讲讲MongoDB。
1、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和移动互联网应用数据存储的要求。
2、MongoDB安装
安装及运行控制
1、配置yum源进行安装MongoDB
你们也可以再官网下载,就是下载有点慢,我在这里不跟你细讲。你们可以看这篇文章
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运行控制
设置内核参数
# 当某个节点可用内存不足时, 系统会从其他节点分配内存.
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服务并设置开机自启动
mongod -f /etc/mongod.conf
vim /etc/rc.local
rm -rf /var/lib/mongo/mongod.lock
mongod -f /etc/mongod.conf
2、测试是否安装成功
curl http://localhost:27017
It looks like you are trying to access MongoDB over HTTP on the native driver port.
3、停止MongoDB
mongod -f /etc/mongod.conf --shutdown
ps aux | grep mongod
# 当没有正常关闭成功时, 直接结束进程.
kill -2 pid号
4、连接并访问MongoDB, 关闭数据库并退出。
mongo
use admin
db.shutdownServer()
exit
注: 用Systemctl运行脚本文件来启动
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、复制配置文件并更改
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、创建数据文件并赋予权限
mkdir /var/lib/mongo2
touch /var/log/mongodb/mongod2.log
chmod -R 777 /var/log/mongodb/mongod2.log
3、启动多实例
mongod -f /etc/mongod2.conf
mongo
use admin
db.shutdownServer()
exit
3、MongoDB存储结构
逻辑存储结构
MongoDB的逻辑结构主要由文档(document)、集合(collection)和数据库(database)三部分组成。
其中文档是MongoDB的核心概念, 它是MongoDB逻辑存储的最小单元, 相当于关系型数据库中的一行记录, 多个文档组成集合, 集合相当于关系型数据库中的表的概念, 多个集合组成数据库。
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | documen | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接, MongoDB不支持. | |
primary key | primary key | 主键, MongoDB自动将_id字段设置为主键 |
1、数据库
MongoDB的默认数据库: test
admin: root数据库, 如果将一个用户添加到这个数据库, 这个用户将自动继承所有数据库的权限. 一些特定的服务器端命令也只能从这个数据库运行。
local: 这个数据永远不会被复制, 可以用来存储限于本地单台服务器的任意集合。
config: 当Mongo用于分片设置时, config数据库在内部使用, 用于保存分片的相关信息。
2、集合
集合存在于数据库中, 集合没有固定的结构, 这意味着在集合中可以插入不同格式和类型的数据, 但通常情况下插入集合的数据都会有一定的关联性。
当第一个文档插入时, 集合就会被创建。
合法的集合名不能是空字符串””, 不能含有\0字符(空字符), 这个字符表示集合名的结尾, 不能以”system.”开头, 这是为系统集合保留的前缀。
3、文档
文档是一个键值对:
-
文档中的键值对是有序的。
-
文档中的值可以是双引号里面的字符串, 也可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
-
MongoDB区分类型和大小写。
-
MongoDB的文档不能有重复的键。
-
文档的键是字符串. 除了少数例外情况, 键可以使用任意UTF-8字符。
文档键命名规范:
-
键不能含有\0(空字符), 这个字符用来表示键的结尾。
-
.和$有特别的意义, 只有在特定环境下才能使用。
-
以下划线”_”开头的键是保留的(不是严格要求的)。
物理存储结构
MongoDB物理存储结构主要包括数据存储和日志存储。
1、数据存储
MongoDB的数据目录由配置文件中的dbpath指定, 用来存储所有MongoDB的数据文件。
在MongoDB内部, 每个数据库都包含一个.ns文件和一些数据文件。
MongoDB内部有预分配空间的机制, 预分配的文件都用0进行填充, 这样MongoDB始终保持额外的空间和空余的数据文件. 数据文件每次新生成的一个文件, 大小都会是上一个文件的两倍。
文件使用MMAP进行内存映射, 会将所有数据文件映射到内存中, 但是只是虚拟内存, 只有访问到这块数据时才会交换到物理内存。
2、日志存储
结构:
- 系统日志文件的存放由配置文件中的path指定。
- Journal日志文件, 用于MongoDB崩溃恢复的保障。
- oplog复制操作日志文件在启动主从复制时出现。
- 慢查询日志文件, 需要在配置文件中指定profile=1(开启慢查询)与slowms=200(记录毫秒数), 查看慢查询的命令:db.system.profile.find()。
数据类型
常用数据类型
String | 字符串, 存储数据常用的数据类型. 在MongoDB中UTF-8编码的字符串才是合法的 |
---|---|
Integer | 整型数值, 用于存储数值. 根据用户的服务器, 可分为32位或64位 |
Boolean | 布尔值, 用于存储布尔值(真/假) |
Double | 双精度浮点值, 用于存储浮点值 |
Arrays | 用于将数组或列表或多个值存储为一个键 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Date | 日期时间, 用户可以指定自己的日期时间, 创建Date对象, 传入年月日信息 |
Binary Data | 二进制数据, 用于存储二进制数据. |
4、MongoDB基本操作
常用操作
// 查看当前操作的库
db
// 查看当前实例下的数据库列表
show dbs
// 切换到指定数据库, 如果数据库不存在, 则创建数据库.
use db_name
// 显示当前数据库中的集合
show collections
// 显示数据库操作命令
db.help()
// 显示集合操作命令
db.ct_name.help()
// 对当前数据库中指定的集合进行数据查找
db.ct_name.find()
db.ct_name.findOne()
创建、复制、删除数据库
1、创建数据库或切换数据库
use db_name
show dbs
2、复制数据库
db.copyDatabase("db_name","db_name2","localhost")
show dbs
3、删除数据库
db.dropDatabase()
show dbs
集合和文档操作
1、集合中插入文档
// 没有该集合时会自动创建
db.ct_name.insert({id:数字, '字段名':'值'})
db_ct_name.fint()
// 删除当前这个集合
db.ct.name.drop()
2、修改集合中的文档
// 修改匹配的第一条数据
db.ct_name.update({id:数字,"字段名":"值"}, {"字段名":"值",...})
3、删除集合中符合条件的所有数据
db.ct_name.remove({"字段名":"值"})
4、克隆集合
# 启动另一个实例
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
5、MongoDB日常维护
-d | 指明数据库的名字 |
---|---|
-c | 指明集合的名字 |
-f | 指明要导出的列名 |
-o | 指明要导出的文件名 |
-q | 指明导出数据的过滤条件 |
-h | MongoDB所在服务器地址(可指定端口号) |
–authenticationDatabase | 授权用户的数据库角色 |
备份与恢复管理
1、导入与导出
- 导出
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
- 导入
\\ 删除集合
db.test.drop()
exit
# 导入数据
mongoimport -d info -c test --file /opt/info.json
# 查看数据
mongo
use info
show collections
2、备份与恢复
- 备份
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
- 恢复
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和端口
vim /etc/mongod.conf
port: 27017
bindIp: 192.168.100.10
netstat -antp | grep 27017
# 连接MongoDB
mongo --host 192.168.100.10:27017
2、授权启动
# 重新连接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、进程管理
// 查看当前正在运行的进程
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界面查看系统监控信息
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数据库。
后面我的文章会细讲Nagios中配置使用MongoDB插件来监控MongoDB数据库
关注苏州程序大白,持续更新技术分享。谢谢大家支持
为了证明博客为本人所有,请将以下声明添加至原博客最新一篇博文的底部(他人点击你的专属邀请链接申请成功,你可以获得额外代金券):
我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=2z2c79yfmpmow