1.1 Nosql概念
nosql means not only sql
1.2 为什么Nosql?
web架构历史了解一下orz
1.2.1 单机mysql的美好年代
90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付,在那个时候,更多的网页都是静态的,动态交互类型的网站不多。
APP(应用层)-> DAL() -> MysqlINSTANCE
架构缺陷
- 1.数据量的总大小,一个机器放不下时。单表500万预警优化分割。
- 2.数据的索引(B+Tree)一个机器内存放不下时,为了查询快速需要建立很多索引,这就需要很多磁盘空间。
- 3.访问量(读写混合)一个实例不能承受,真正的生产应该做到主从复制读写分离。
当遇到这些瓶颈时,我们就需要把我们的技术架构改变。
1.2.2 Memcached(缓存) + mysql + 垂直分离
随着访问量的提升,几乎大部分使用MySQL架构的网站在数据库上开始出现性能问题,web程序不再仅仅专注在功能上,同时也在追求性能,程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引。
开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带来了比较高的IO压力,在这个时候,Memcached/redis就自然的成了一个非常时尚的技术产品。
=============== business2 mysql instance
APP ->DAL ->cache business1 mysql instance
=============== userinfo mysql instance
1.memcached/redis在cache层为数据库缓解压力,频繁的查询固定的数据我们就可以把固定的数据宅出来放缓存里面,减轻数据库压力。
2.mysql垂直拆分,一个数据库装不住,买家和卖家分成两个数据库,数据库实例分担。
1.2.3 mysql主从复制读写分离
由于数据库写入压力的增加,Memcached只能缓解数据库的读取压力,读写集中在一个数据库上,让数据库不堪重负,大部分网站开始使用主从复制技术从而达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为了这个时代网站的标配。
除了之前的redis和垂直拆分,新增加了主从复制和读写分离,进一步缓解了mysql写和读的压力。
1.2.4 分库分表 + 水平拆分 + mysql集群
在Memcached的高速缓存,mysql的主从复制,读写分离的基础上,这时mysql主库的写压力开始出现瓶颈的时候,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁表问题,大量的高并发Mysql应用开始使用InnoDB引擎代MyISAM,同时,开始流行使用分表分库来缓解写压力和新数据增长的扩展问题,这个时候,分表分库成了一个热门技术,是面试的热门问题,也是业界的热门技术问题。就在这个时候,mysql推出了还不太稳定的表分区,这也给一般的公司带来了希望。虽然MySQL推出了MySQLCluster集群,但性能也不能很好的满足互联网的要求,只是在高可靠性上提供了非常大的保证。
尽量的仅耦合把业务相关的分在一个库,把业务其它不相关的单独放置
- 1.冷数据就单独放置。比如用户的其他注册信息,身份证号码没人天天换。
- 2.热数据跟业务相关的紧密的数据放在一起,(频繁)
- 3.分库分表比如1到3000万的数据进1号库,3000到6000万的数据进2号库
1.2.5 mysql瓶颈
即使是用到了各种技术,myql还是会有它的瓶颈,mysql数据库经常存储一些大文本字段,导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。比如1000万4KB大小的文本接近40GB大小,如果能够把这些数据从Mysql省去,mysql将变得非常的小,关系型数据库很强大,但它并不能很好的应付所有的应用场景,mysql的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前mysql的瓶颈所在。
比如说vcr,大的二进制数据,图片,文件,视屏,并不能放到mysql里面这样数据库会非常的慢
1.2.6 现今的时代
nginx代替appach做负载均衡反向代理的服务器
客户 -> 企业防火墙 -> 负载均衡的主机和备机nginx -> app应用服务器集群 -> mysql-oracle集群 -> hadoop集群(缓存服务器,通信服务器,流媒体服务器(专门存储视频这种流),电子邮件服务器,图片(文件)服务器,转发服务器)
1.2.7 为什么nosql?
1.传统关系型数据库难以解决一些多字段问题
2.传统关系型数据库难以解决大规模数据集合多重数据种类
3.性能问题,nosql具有极高的读写能力,因为内存存储
1.3 nosql概述
泛指非关系型数据库,随着互联网web2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系的数据库由于其本身特点得到了非常迅速的发展,Nosql数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括大规模数据的存储。
1.3.1 传统RDBMS vs NoSql
RDBMS:
- 1.高度组织化结构化数据
- 2.结构化查询语言(SQL)
- 3.数据和关系都存储在单独的表中
- 4.数据操纵语言,数据定义语言
- 5.严格的一致性
- 6.基础事务
2.NoSql
- 1.代表着不仅仅是SQL
- 2.没有声明性查询语言
- 3.没有预定义的模式
- 4.键值对存储,列存储,文档存储,图形数据库
- 5.最终一致性而非ACID属性
- 6.非结构化和不可预知的数据
- 7.CAP定理
- 8.高性能,高可用性和可伸缩性
1.4 nosql统称聚合模型
1.KV键值对
2.BSON
BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和json一样,支持内嵌的文档对象和数组对象
BSON模型1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16{
“customer”:{
“id”:1136,
“name”:”z3”,
“billingAddress”:[{“city”:”Beijing”}],
“order”:[
{
“id”:17,
“customerId”:1136,
“orderItem”:[{“productId”:27, “price”:77.5, “productName”:”thinging in java”}],
“shippingAddress”:[{“city”:”Beijing”}]
“orderPayment”:[{“ccinfo”:”11231”, “txniid”:”sfafa233”, “billingAddress”:{“city”:”Beijing”}}],
}
]
}
}3.列族
按列存储数据,存储结构化和半结构化数据,方便数据压缩,对针对某一列或某几列的查询有非常大的IO优势。4.图形
什么qq的共同好友,分组之类的。网状的数据模型介绍
1.5 nosql数据库四大分类
1.5.1 KV键值对
有些企业说他的项目用到了redis,可能只是加了这个技术,用了很小一块,可能只用到了KV键值对。
新浪:BerkeleyDB + redis
美团:redis + tair
阿里、百度:memcache + redis
- 1.典型类型
Tokyo Cabinet/Tyrant Redis Voldemort Oracle BOB - 2.应用场景
内容缓存、主要用于处理大量数据的高访问负载,也用于一些日志系统等 - 3.数据模型
通常用hash table来实现 - 4.优缺点
查找数据快,但数据无结构化,通常只能被当做字符串或二进制数据
1.5.2 文档型数据库(bson格式比较多)
- 1.典型类型
CouchDB
MongoDB
是一个基于分布式文件存储的数据库,由C++编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案
是一个介于关系型和非关系型数据库之间的产品,是非关系型数据库中功能最丰富,最像关系型数据库的。 - 2.应用场景
web应用(与KV类似)value是结构化的,不同的是数据库能够了解value的内容。 - 3.数据类型
KV对应的键值对,value为结构化数据 - 4.优缺点
数据结构要求不严,表结构可变,不需要像关系型数据库一样预先定义表结构。
查询性能不高,而且缺乏统一的查询语法。
1.5.3 列存储数据库
- 1.典型类型
Cassandra,HBase(hadoop) Rlak - 2.应用场景
分布式文件系统 - 3.数据类型
以列簇式存储将同一列数据存在一起 - 4.优缺点
功能相对局限
1.5.4 图关系数据库
它不是放图形的,放的关系比如:朋友圈社交网络、广告推荐系统社交网络、推荐系统等。专注于构建关系图谱。利用图结构相关算法,很多时候需要对整个图进行计算。
- 1.典型类型
Neo4J, InfoGrid - 2.应用场景
社交网络 推荐系统专注于构建 - 3.数据模型
图结构