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节点
影响选举的因素:
- 心跳检测:复制集内成员每隔两秒向其他成员发送心跳检测信息,若10秒内无响应,则标记其为不可用
- 连接:在多个节点中,最少保证两个节点为活跃状态,如果集群中共三个节点,挂掉两个节点,那么剩余的节点无论状态是primary还是处于选举过程中,都会直接被降权为secondary
触发选举的情况:
- 初始化状态
- 从节点们无法与主节点进行通信
- 主节点辞职 主节点辞职的情况:
- 在接收到replSetStepDown命令后
- 在现有的环境中,其他secondary节点的数据落后于本身10s内,且拥有更高优先级
- 当主节点无法与群集中多数节点通信
注:当主节点辞职后,主节点将关闭自身所有的连接,避免出现客户端在从节点进行写入操作
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集成
- 引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
- 添加配置
spring:
data:
mongodb:
host: 127.0.0.1
port: 10008
database: test
- 在代码中引入MongoTemplate
@Autowired
private MongoTemplate mongoTemplate;
更多详情请参考项目https://github.com/xsj1987/mongodb-test
MongoDB监控
在安装目录/bin/下有两个命令可以用来监控
- mongostat:通过间隔固定时间获取mongodb的当前运行状态
- mongotop:用来跟踪一个MongoDB实例,提供每个集合的水平的统计数据