MongoDB浅析

1,217 阅读8分钟

MongoDB简介

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB下载及安装

本文档基于MongoDB3.0.6的版本

下载

官网下载
如果下不了,可以去百度网盘 下载 ,提取码ikka

安装

  • 解压压缩文件
  • 修改/etc/profile文件,添加export PATH=<mongodb-install-directory>/bin:$PATH
  • 在根目录下添加目录/data/db,因为mongodb的数据存储默认在该目录下,如果不创建,则在启动的时候通过--dbpath来指定
  • 在解压目录/bin通过命令./mongod启动mongodb服务

将MongoDB配置为后台服务

  • 在安装目录下添加mongodb.conf文件,文件内容如下:
# 设置MongoDB端口
port=10008
# 设置数据存储目录路径
dbpath=/data/db/
# 设置日志路径
logpath=/data/log/mongodb.log
# 日志文件是否追加
logappend=true
  • 在/etc/init.d/目录下新建文件mongodb,文件内容如下
#!/bin/sh
#
# chkconfig:   2345 90 10
# description:  Redis is a persistent key-value database
# ### BEGIN INIT INFO
# Short-Description: mongodb
# Description: mongo db server
### END INIT INFO

# 将该路径设置为mongoDB安装路径
PROGRAM=<mongodb-install-directory\>/bin/mongod
MONGOPID=`ps -ef | grep 'mongod' | grep -v grep | awk '{print $2}'`

test -x $PROGRAM || exit 0

case "$1" in
  start)
     ulimit -n 3000
     echo "Starting MongoDB server"
     # 将该路径设置为mongoDB安装路径
     $PROGRAM --fork --quiet -f <mongodb-install-directory\>/mongodb.conf
     echo "Started MongoDB server"
     ;;
  stop)
     echo "Stopping MongoDB server"
     if [ ! -z "$MONGOPID" ]; then
        kill -15 $MONGOPID
     fi
     echo "Stopped MongoDB server"
     ;;
  status)
     ;;
  *)
     echo "Usage: mongodb {start|stop|status}"
     exit 1
esac

exit 0
  • 执行命令
chmod +x /etc/init.d/mongodb
chkconfig --add mongodb
chkconfig mongodb on
  • 执行完命令后,就可以通过service mongodb start/stop来启动/停止mongoDB了

MongoDB客户端

在mongoDB安装目录/bin下,执行./mongo即可打开mongoDB客户端shell,同时也可以下载图形客户端,这个网上搜索有很多,我使用的是Studio 3T。MongoDB默认连接的数据库是test

MongoDB概念解析

为了方便理解,我们拿SQL中的概念来做对比

SQL概念 MongoDB概念 说明
database database 数据库
table collection(集合)
row document(文档)
column field(字段)
index index 索引
table joins 不支持,只能嵌入 表连接
primary key primary key 主键,MongoDB自动将_id字段设置为主键

MongoDB数据类型

数据类型 说明
String 字符串
Integer 整型
Boolean 布尔值
Double 双精度浮点值
Min/Max keys 将一个值与BSON元素的最低值和最高值相对比
Array 用于将数组或列表或多个值存储为一个键
Timestamp 时间戳
Object 内嵌文档
Null 空值
Symbol 符号
Date 日期时间
Object ID 对象ID
Binary Data 二进制数据
Code 代码类型
Regular expression 正则表达式类型

MongoDB命令

  • show dbs:显示所有数据库的列表
  • db:显示当前数据库对象或集合
  • user [database name]:连接到数据库,如果数据库不存在则创建数据库,新创建的数据库不会显示,需要添加数据后才会显示
  • db.dropDatabase():删除当前数据库,即先切换到要删除的数据库
  • db.[collection.name].drop():删除集合
  • db.createCollection(name, options):创建集合,name-集合名称,options-可选参数,可选参数如下
字段 类型 说明
capped 布尔 true-固定集合,如果为true,则必须指定size参数,当达到最大值时,会自动覆盖最早的文档
autoIndexId 布尔 false-默认,true-自动在_id字段创建索引
size 数字 为固定集合指定一个最大值(按字节计算)
max 数字 指定固定集合中包含文档的最大数量
  • show collections|show tables:查看集合
  • db.[collection.name].insert(document):插入文档
  • db.collection.update(,,{upsert:,multi:,writeConcern:}):更新文档,可选参数如下:
    • query:update的查询条件
    • update:update的对象
    • upsert:这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi:mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern:抛出异常的级别

Mongo复制集

概述

Mongodb复制集(replica set)由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary通过oplog来同步Primary的数据,保证主从节点数据的一致性;复制集在完成主从复制的基础上,通过心跳机制,一旦Primary节点出现宕机,则触发选举一个新的主节点,剩下的secondary节点指向新的Primary,时间应该在10-30s内完成感知Primary节点故障,实现高可用数据库集群。特点如下:

  • Primary节点是唯一的,但不是固定的
  • 由大多数据原则保证数据的一致性
  • Secondary节点无法写入(默认情况下,不使用驱动连接时,也是不能查询的)
  • 相对于传统的主从结构,复制集可以自动容灾

选举机制

每个节点通过优先级定义出节点的类型(标准、被动、投票) 标准节点通过对比自身数据进行选举出primary节点或者secondary节点
影响选举的因素:

  1. 心跳检测:复制集内成员每隔两秒向其他成员发送心跳检测信息,若10秒内无响应,则标记其为不可用
  2. 连接:在多个节点中,最少保证两个节点为活跃状态,如果集群中共三个节点,挂掉两个节点,那么剩余的节点无论状态是primary还是处于选举过程中,都会直接被降权为secondary

触发选举的情况:

  1. 初始化状态
  2. 从节点们无法与主节点进行通信
  3. 主节点辞职 主节点辞职的情况:
  4. 在接收到replSetStepDown命令后
  5. 在现有的环境中,其他secondary节点的数据落后于本身10s内,且拥有更高优先级
  6. 当主节点无法与群集中多数节点通信

注:当主节点辞职后,主节点将关闭自身所有的连接,避免出现客户端在从节点进行写入操作

MongoDB分片

概述

分片是指将数据库拆分,将其分散在不同的机器上的过程。分片集群是一种水平扩展数据库系统性能的方法,能够将数据集分布式存储在不同的分片上,每个分片只保存数据集的一部分,MongoDB保证各个分片之间不会有重复的数据,所有分片保存的数据之和就是完整的数据集。分片集群将数据集分布式存储,能够将负载分摊到多个分片上,每个分片只负责读写一部分数据,充分利用了各个shard的系统资源,提高数据库系统的吞吐量。注:在3.2版本后,分片技术必须结合复制集完成

存储原理

  • Config Server:负责追踪数据块在shard上的分布信息,每个分片存储哪些数据块,叫做分片的元数据,保存在config server上的数据库config中,一般使用3台config server,所有config server中的config数据必须完全相同
  • Shard Server:数据块真正存放的单位
  • Mongos Server:数据库集群请求的入口,所有的请求都通过mongos进行协调,查看元数据,查找数据块的存放位置,相当于一个请求分发中心,在生产环境中通常有多个mongos作为请求的入口,提高可用性。
  • 请求示意图如下:

分片的片键

定义:片键是文档的一个属性字段或是一个复合索引字段,一旦建立后不可改变,片键是拆分数据的关键,决定了数据在分片过程中数据的存储位置。创建片键时,需要有一个支撑片键运行的索引。
片键的分类如下:

  • 递增片键:使用时间戳、日期、自增主键,ObjectID,_id等,此类片键的写入操作集中在一个分片服务器上,写入不具有分散性,分割容易,但比较容易导致单台服务器压力较大
mongos> use 库名
mongos> db.集合名.ensureIndex({"键名":1})                ##创建索引                
mongos> sh.enableSharding("库名")                        ##开启库的分片
mongos> sh.shardCollection("库名.集合名",{"键名":1})        ##开启集合的分片并指定片键
  • 哈希片键:使用一个哈希索引字段作为片键,使数据在各节点分布比较均匀,但是无法实现范围区分
mongos> use 库名
mongos> db.集合名.ensureIndex({"键名":"hashed"})                ##创建索引                
mongos> sh.enableSharding("库名")                        ##开启库的分片
mongos> sh.shardCollection("库名.集合名",{"键名":1})        ##开启集合的分片并指定片键
  • 组合片键:数据库中没有比较合适的键值供片键选择,可以选另一个字段使用组合片键,甚至可以添加冗余字段来组合
  • 标签片键:数据存储在指定的分片服务器上,可以为分片添加tag标签,然后指定相应的tag

MongoDB备份与恢复

mongodump -h dbhost -d dbname -o dbdirectory:

  • -h MongoDB所在服务器地址
  • -d 需要备份的数据库实例
  • -o 备份的数据存放位置

mongorestore -h <:port> -d dbname

  • -h MongoDB所在服务器地址
  • -d 需要恢复的数据库实例
  • path 设置备份数据所在位置

MongoDB与Spring Boot集成

  1. 引入jar包
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
  1. 添加配置
spring:
  data:
    mongodb:
      host: 127.0.0.1
      port: 10008
      database: test
  1. 在代码中引入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;

更多详情请参考项目https://github.com/xsj1987/mongodb-test

MongoDB监控

在安装目录/bin/下有两个命令可以用来监控

  • mongostat:通过间隔固定时间获取mongodb的当前运行状态
  • mongotop:用来跟踪一个MongoDB实例,提供每个集合的水平的统计数据