超硬核的MongoDB基础讲解。《记得收藏,不然看着看着就找不到了》
目录
前言
1、MongoDB概述
简介
2、MongoDB安装
安装及运行控制
启动和停止
多实例启动
3、MongoDB存储结构
逻辑存储结构
物理存储结构
4、MongoDB基本操作
常用操作
集合和文档操作
5、MongoDB日常维护
备份与恢复管理
安全管理
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 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数据库