MongoDB

Posted byebai

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB相关的知识,希望对你有一定的参考价值。

关系型数据库

关系型数据库遵循如下四个特性

  1. A (Atomicity) 原子性
  2. C (Consistency) 一致性
  3. I (Isolation) 独立性
  4. D (Durability) 持久性

什么是NoSql 

NoSql 是指非关系型的数据库,有时也称 Not Only Sql,是对不同于传统数据库管理系统的统称,NoSql 用于超大规模数据的存储,关系型数据库不适应这些大量数据,而NoSql 数据库能很好的处理这些数据。

两种数据库的差异

关系型数据库

  1. 高度组织结构化数据
  2. 结构化查询语言
  3. 数据和关系都存储在单独的表中
  4. 数据操作语言,数据定义语言
  5. 严格的一致性
  6. 基础事务

NoSql

  1. 代表着不仅仅是SQL
  2. 没有声明性查询语言
  3. 没有预定义的模式
  4. 键值对存储,文档存储,图形数据库
  5. 最终一致性,而非ACID
  6. 非结构化和不可预知的数据
  7. CAP 定义

 科普CAP 原则

  CAP 原则又称 CAP 定理/布鲁尔定理,指的是在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partitiontolerance(分区容错性),三者不可兼得

CAP 原则要么 AP、CP、AC ,但是不存在CAP, 所以在进行分布式架构时,必须做出取舍

NoSql 数据库分类

列存储

  • Hbase
  • Hypertable

文档存储

  • Mongodb
  • ClouchDB

key-value 存储

  • Redis
  • MemcacheDB
  • Berkeley DB

图存储

  • Neo4J
  • FlockDB

对象存储

  • db4o
  • versant

XML 数据库

  • Berkeley DB XML
  • BaseX

MongoBD

mongodb 是由c++ 编写,基于分布式文件存储的开源数据库系统,将数据存储为一个文档,数据结构由键值对组成,文档类似于JSON 对象

MongoDB 与 普通数据库结构比对

 数据库-集合-文档

一、Window 下安装mongoDB

官网:https://www.mongodb.com/download-center/community

安装好后,在C盘建立data 目录

data 目录下建立 db、log 目录

在bin目录下执行

mongod --dbpath c:\\data\\db

链接mongodb

mongo.exe

创建配置文件 c:\\data\\config.cfg

systemLog:
    destination: file
    path: c:\\data\\log\\mongod.log
storage:
    dbPath: c:\\data\\db

安装服务

mongod.exe --config "c:\\mongodb\\config.cfg" --install

启动mongodb 服务

net start MongoDB

关闭服务

net stop MongoDB

二、使用数据库

show dbs 显示所有的数据库
use  数据库名   选择某个数据库
db  显示当前数据库
db.集合名.insert({"name":"李四"})  插入数据
db.dropDatabase()  删除数据库
db.createCollection("集合名")   创建集合
show collections  显示DB下所有的集合
db.集合名.drop()  删除集合
db.集合名.find()  查询集合的数据
db.集合名.update({"主键":"旧值"},$set:({"主键":"新值"}))  更新文档的值
db.集合名.remove({"键":"值"})   删除文档

文档查询操作

#版本3.2 以后
db.集合.insertOne()
db.集合.insertMany()

文档查询

db.集合.find()  查询所有的文档
db.集合.find({_id:123}) 查询 _id =123 的文档
db.集合.findOne() 返回一个对象
db.集合.find()[0] 找第一个
db.集合.find().count() 统计集合的个数

 文档更新

db.集合.update({name:"zhangsan"},{name:"lisi"})     后一个字段会覆盖掉前面的其他字段
#db.集合.updateOne() 修改一个符合条件的文档
db.集合.update({name:"zhangsan"},{$set:{"name":"liis",ip:"127.0.1"}}) 修改字段,如果不存在即新增
db.集合.drop() 删除集合
db.集合.remove({_id:123}) 删除符合条件的文档 ,默认删除多个 ,删除一个需要加参数 true 
db.集合.remove({}) 清空集合
db.dropDatabase()  删除当前数据库

 三、MongoDB 高可用集群

01.Master-Slave 主从结构

 

 

主从架构一般用于备分或者读写分离。一般有一主一从设计和一主多从设计。

Master(主): 可读可写,当数据有修改时,会将 oplog 同步到所有连接的 slave 上

Slave(从):只读不可写,自动从 Master 同步数据

注意: 对于 Mongodb 来说,并不推介使用 Master -Slave 架构,因为 Master-Slave 其中 Master 宕机后不能自动恢复,推介使用 Replica Set 。除非 Replica 节点数超过 50,才需要使用 Master -Slave 架构。正常清空不会那么多节点。

此外,Master-Slave 不支持链式架构,Slave 只能直接连接 Master.Redis 的 Master-Slave 支持链式结构。Slave 可以连接Slave.

02.Relica-Set 副本集方式

Mongodb 的Replica Set 即副本集方式主要有两个目的,一个是数据冗余做故障恢复使用,当发生硬件故障或者其他原因造成的宕机时,可以使用副本进行恢复。

另一个是做读写分离,读的请求分流到副本上,减轻主的读压力。

Primary - Seconary 搭建的 Replica Set

 

 

  Replica Set 是 mongo 的实例集合,他们有着相同的数据内容

Primary(主节点):

接收所有的写请求,然后把修改同步到所有Secondary。一个Replica Set只能有一个Primary节点,当Primary挂掉后,其他Secondary或者Arbiter节点会重新选举出来一个主节点。

默认读请求也是发到Primary节点处理的,需要转发到Secondary需要客户端修改一下连接配置。

Secondary(副本节点):

与主节点保持同样的数据集。当主节点挂掉的时候,参与选主。

Arbiter(仲裁者)

不保有数据,不参与选主,只进行选主投票。使用Arbiter可以减轻数据存储的硬件需求,Arbiter跑起来几乎没什么大的硬件资源需求,但重要的一点是,在生产环境下它和其他数据节点不要部署在同一台机器上。

注意,一个自动failover的Replica Set节点数必须为奇数,目的是选主投票的时候要有一个大多数才能进行选主决策。

使用Arbiter搭建Replica Set

选主过程: 若 Secodary 宕机,不受影响,但是 Primary 宕机,会重新选取主节点。

03.Sharding 分片技术

 当数据两比较大时候,我们需要把数据分片运行在不同的机器,降低 cpu、内存和 IO 的压力, Sharding 就是数据库分片技术。

MongoDB 分片技术类似 mysql 的水平切分和垂直切分,数据库主要由两种方式做Sharding :垂直扩展和横向切分

垂直扩展的方式就是进行集群扩展,添加更多的 cup,内存,磁盘空间等

横向切分则是通过数据分片的方式,通过集群统一提供服务

 

 

 (1)MongoDB的Sharding架构

 

 (2)MongoDB分片架构中的角色

 数据片头(Shards)

用来保存数据,保证数据的高可用性和一致性,可以是单独的 mongo 实例,也可以是一个副本集。

在生产环境下 Shard  一般是一个 Replica Set ,以防止改数据片的单点故障。所有Shard 种有一个 PrimaryShard,里面包含未进行画分的数据集合

 

 查询路由:(Query Routers)

路由就是 mongos 的实例,客户端直接连接 mongos ,由 mongos 把读写请求路由到指定的 Shard 上去

一个 Sharding 集群,可以有一个 mongos,也可以有多个 mongos 以减轻客户端的压力。

配置服务器:(Config Servers)

保存集群的元数据(metadata),包含各个 Shard 的路由规则。

 参考:https://www.cnblogs.com/binyue/p/5901328.html

以上是关于MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项

mongodb关联查询

无法在 MongoDB(猫鼬)文档中追加数组

在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects

如何创建一个查询来查找 2 个数字之间的值,这些数字是 MongoDB 中的字符串类型

MongoDB GridFS