什么是NoSql:
Not Only SQL,本质也是数据库,相对于传统的数据库,不会遵循一些约束:sql标准,ACID属性,表结构等。
CAP理论:
C:Consistency(强一致性)数据库的一致性
A:Availability(可用性)服务没挂。
P:Partition tolerance(分区容错性)
分布式系统不能很好的同时满足CAP三个特性,最多只能同时满足两个。
由于网络硬件的原因,一定会出现延迟丢包的等问题。所以分区容错性,是必须要实现的。
因此,根据CAP原理,将数据库分为若干阵营:
- CA - 单点集群,满足一致性,可用性的系统,通常在可拓展性上不是很强。
- CP - 满足一致性,分区容忍的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,同城对一致性要求低一些。
例如:
传统关系型数据库:CA,保证了一致性,一致性要求最高!性能瓶颈
MongoDB、Redis、HBase:CP
大多数网站:AP
NoSql优点:
- 高并发读写:2000-3000+QPS
- 海量数据高效存储访问:TB、PB+
- 数据库高拓展、高可用:数据库水平拓展
- 数据结构灵活:满足不固定场景,需求一直在变,数据模型无法确定,快速迭代开发。
NoSql缺点:
- 一般不支持事务
- 实现复杂SQL查询,比较复杂
- 运维人员数据维护门槛高
NoSql分类:
序号 | 类型 | 典型产品 | 应用场景 |
---|---|---|---|
1 | Key-Value | Redis、memcached | 缓存,处理高并发访问 |
2 | 列式数据库 | Cassandra、Hbase | 分布式文件系统,列阵式,同一列数据存在一起 |
3 | 文档型数据库 | MongoDB | Web应用、并发能力较强,表结构可变。类似K-V,Value为结构化数据 |
4 | 图结构数据库 | infoGrid、Neo4j | 社交网络、推荐系统 |
MongoDB和传统关系型数据库的区别
MongoDB | RDBMS | ||
---|---|---|---|
数据模型 | 文档模型 | 关系模型 | |
数据库类型 | OLTP | OLTP | OLTP(业务)覆盖了OLAP(日志) |
CURD操作 | MQL/SQL | SQL | MQL不好写,如果mongoDB使用SQL,需要一套SQL解析引擎,用的不多 |
高可用 | 复制集 | 集群分布 | |
横向扩展能力 | 通过原生分片完善支持 | 数据分区或者应用侵入式(分区、分表) | 分表需要调整项目,数据库连接层需要做特殊配置 |
索引支持 | B+树,全文,地理位置,多键,TTL(带缓存过期日期) | B树 | |
开发难度 | 容易,API少 | 困难 | |
数据容量 | 理论没上线,PB之上 | 千万、亿 | |
扩展方式 | 垂直拓展+水平拓展 | 垂直拓展 |
拓展与数据库存储能力,当数据库大到一定程度后,解决方案:
- 数据结转,例如,单表数据量1-2kw,短期内业务数据不会很大的时候。或者数据可以通过时间区分开,历史数据的查询量不会很大,归档,结转历史数据。活跃数据不超过2kw。
MongoDB
C++开发。高性能、无模式、文档性。功能最丰富,最像关系型数据库。Bson。
两大特性:
- 开发效率显著提升,
- 卓越的横向拓展能力。
实例:系统上运行库的进程及节点集,一个实例下可以又多个库。
库:多个集合组成的数据库,每个数据库都是完全独立的,有自己的用户,权限信息,独立的存储文件集。
集合:一组文档,文档相当于行的话,集合相当于表。集合内的文档格式可以不同。
文档:MongoDB数据库中的最小数据集单位。基本概念为,多个K-V有序组合在一起的数据单元。
SQL术语 / 概念 | MongoDB术语 / 概念 | 备注说明 |
---|---|---|
database | database | 数据库 |
table | collection | 表 / 集合 |
row | document | 让 / 文档 |
column | field | 字段 / 域 |
index | index | 索引 |
table joins | 表连接 / MongoDB不支持 | |
嵌入文档 | 通过嵌入文档的方式替代多表连接 | |
primary key | primary key | 主键,MonogoDB自动将_id作为主键 |
MongoDB版本变迁
- 0.x 2008 - 起步
- 1.x 2010 - 支持复制集和分片集
- 2.x 2012 - 更丰富的数据库功能
- 3.x 2014 - WiredTiger和周边生态环境,从此有了自己的存储引擎,重要结点
- 4.x 2018 - 分布式事务支持
MongoDB使用场景
不需要【事务】和复杂的【Join支持】
- 游戏场景:用户信息、装备、积分等。内嵌文档的形式存储,方便查询,更新。
- 物流场景:存储订单信息,订单随着运送状态不断更新。MongoDB内嵌数组的形式存储。
- 社交场景:存储用户信息、用户朋友圈、地图索引实现的附近的人等。
- 物联网场景:接入智能设备的信息,以及设备的日志信息,并对信息进行多维度分析。
- 视频直播:用户信息,礼物信息。
不能使用的场景:
- 银行财务信息:对事务要求非常高。
- 商业智能应用:对特定的问题进行数据分析,建立多个数据实体的关联,涉及到高度复杂的高度优化的查询。
- SQL方便,数据结构相对固定。
MongoDB的结构灵活:
多形性:同一个集合中可以包含不同字段(类型的文档对象)--文档嵌套
动态性:线上修改数据模式,修改时应用与数据均无需下线
数据治理:支持使用JSON Schema规范数据模式。在保证模式灵活前提下,提供数据治理能力。