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 | cat > /etc/yum.repos.d/mongodb-org.repo <<-EOF |
2.MongoDB运行控制
设置内核参数
1 |
|
启动和停止
1.启动MongoDB服务并设置开机自启动
1 | 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 | mongod -f /etc/mongod.conf --shutdown |
4.连接并访问MongoDB, 关闭数据库并退出.
1 | mongo |
注: 用Systemctl运行脚本文件来启动
1 | cat > /lib/systemd/system/mongod.service <<-EOF |
多实例启动
1.复制配置文件并更改
1 | cp /etc/mongod.conf /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 | mkdir /var/lib/mongo2 |
2.启动多实例
1 | mongod -f /etc/mongod2.conf |
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.文档
文档是一个键值对:
(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 | // 查看当前操作的库 |
创建、复制、删除数据库
1.创建数据库或切换数据库
1 | use db_name |
2.复制数据库
1 | db.copyDatabase("db_name","db_name2","localhost") |
3.删除数据库
1 | db.dropDatabase() |
集合和文档操作
1.集合中插入文档
1 | // 没有该集合时会自动创建 |
2.修改集合中的文档
1 | // 修改匹配的第一条数据 |
3.删除集合中符合条件的所有数据
1 | db.ct_name.remove({"字段名":"值"}) |
4.克隆集合
1 |
|
MongoDB日常维护
-d | 指明数据库的名字 |
-c | 指明集合的名字 |
-f | 指明要导出的列名 |
-o | 指明要导出的文件名 |
-q | 指明导出数据的过滤条件 |
-h | MongoDB所在服务器地址(可指定端口号) |
--authenticationDatabase | 授权用户的数据库角色 |
备份与恢复管理
1.导入与导出
(1).导出
1 | use info |
(2).导入
1 | \\ 删除集合 |
2.备份与恢复
(1)备份
1 | mongodump -h 127.0.0.1:27017 -d info -o /opt/ |
(2)恢复
1 | mongorestore -h 127.0.0.1:27017 -d info --dir=/opt/info/ |
安全管理
1.限定监听特定IP和端口
1 | vim /etc/mongod.conf |
2.授权启动
1 | # 重新连接MongoDB |
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 | // 查看当前正在运行的进程 |
{ "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 | vim mongod.conf |
2.查看集合统计信息的命令
查看集合统计信息: db.users.stats()
查看集合大小: db.users.dataSize()
3.第三方监控工具
在Nagios中配置使用MongoDB插件来监控MongoDB数据库