为什么要使用nosql
- 单机mysql
- 在一个网站的访问量不是很大,更多的是静态的网页,动态交互的不多的情况下,使用单个数据库完全可以轻松应付
- 缺点:
- 数据量的总大小有限制
- 数据的索引一个机器的内不能放不下
- 访问量(读写混合)一个实例不能承受
- Memcached(缓存)+mysql+垂直拆分
- 后来随着访问量的上升,开始使用缓存技术来缓解数据库的压力,优化数据 库的结构和索引,开始比较流行的是使用文件缓存来缓解数据库的压力,但是当访问量继续增大的时候,多台web服务器通过文件缓存不能共享,大量的小文件也带来了比较高高的io压力,Memcached就自然成为了一个非常时尚的技术产品
- MySQL主从读写分离
- 由于数据库写入的压力的增加,缓存只能解决 数据库的读取压力,读写集中到一个数据库上,让数据库不堪重负,大部分网站开始使用==主从复制==技术来达到读写 分离,以提高读写性能和读库的可扩展性,mysql的master-slave模式成为了这个时候的标配
- 主库master用来写数据
- 从库slave用来读取数据
- 由于数据库写入的压力的增加,缓存只能解决 数据库的读取压力,读写集中到一个数据库上,让数据库不堪重负,大部分网站开始使用==主从复制==技术来达到读写 分离,以提高读写性能和读库的可扩展性,mysql的master-slave模式成为了这个时候的标配
- 分库分表+水平拆分+MySQL集群
- 但是这个时候,主库的写的压力开始出现瓶颈,而数据库量的猛增,由于MyISAM引擎使用表锁,在高并发的情况下会出现严重的锁问题,大量的高并发Mysql应用开始使用InnoDB引擎
- 同时,开始流行使用==分库分表==来缓解写的压力和数据增长的问题
- 分库:将与业务相关的放在一个库中,将冷数据放在一个库中
- 分表:保证一张表中不要有太多条的记录,数据量大的可以将数据分布到多张表中
- Mysql扩展的瓶颈
- MySQL数据库也经常需要存放一个大文本字段导致数据库表非常的大,在做数据库表恢复的时候就会非常的慢,不容易快速恢复数据库,如果可以将这些数据从MySQL中提取出来,那么MySQL讲变得非常小
- 为什么 要使用nosql
- 传统的关系型数据库不能处理网状信息
什么是NoSQL
- NoSQL(not only sql) 不仅仅是sql
- ==泛指非关系型数据库==,随着web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的 sns类型的web2.0纯动态网站已经力不从心,暴露了很多难以克服的问题,而非关系型数据库则由于其本身的特点,得到了非常迅速的发展,NoSql数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,包括超大规模数据的存储
nosql可以做什么
- 易扩展
- nosql数据库种类繁多,但是一个共同的特点都是去掉了 关系数据库的关系特性,数据库之间无关系,这样就非常容易扩展,也无形之间在架构的层面上带来了可扩展的潜力
- 大数据量高性能
- no数据库都具有非常高的读写性能,尤其是在大数据量下,同样表现优秀,这得益于它的无关系型,数据库的结构简单,nosql的cache是记录级的,是一种细粒度的cache,所以nosql在这个层面上来说就要性能高很多了
- 多样灵活的数据模型
- nosql无需事先为要存储的数据建立字段,可以随时存储自定义的格式,而在关系型的数据库里,增删字段是一件很麻烦的事情,如果数据量很多,增加字段显然是不可取的
- RDBMS和NoSQL
- RDBMS:
- 高度组织化结构数据
- 结构化查询语言
- 数据和关系都存储在单独的表中
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
- NoSQL
- 没有声明性的查询语言
- 没有预定义的模式
- 键值对存储
- 最终一致性
- 非结构化和不可预知的数据
- RDBMS:
3v和3高
- 3v
- 海量volume
- 多样variety
- 实时velocity
- 3高
- 高并发
- 高可扩
- 高性能
nosql数据库的四大分类
- kv键值
- 文档型数据库(bson格式)
- MongoDB是一个机遇分布式文件按存储的数据库,由c++语言编写,为web应用提供可扩展的高性能的数据存储解决方案
- MongoDB是一个结余关系数据库和非关系数据库之间的产品,是非关系库中功能最丰富,最像关系数据库的
- 列存储数据库
- 分布式文件系统
- Hbase,Cassandra
- 图关系数据库
- 社交网络,推荐系统等,专注于构建关系图谱
- Neo4j,InfoGrid
CAP+BASE
- 传统的ACID
- 事务在英文中的翻译是transaction,和现实世界中的交易很类似,它有如下几个特性:
- A(Atomicity)原子性
- 事务操作要么成功,要么失败,如果失败就需要回滚
- C(Consistency)一致性
- 数据库要一直处于一致的状态, 事务的操作不会改变数据库原本的一致性约束
- I(Isolation)独立性
- 多个事务操作之间保持独立性,当一个事务没有提交,另一个事务的数据是不受影响的
- D(Durability)持久性
- 持久性是一旦事务提交之后,他所做的修改会永久的保存在数据库上,即使出现宕机也不会丢失
- CAP
- C:Consistency(强一致性)
- A:Availability(可用性)
- P:Partition tolerance(分区容错性)
- ==CAP理论核心==:一个分布式系统不可能同时 很好的满足一致性,可用性,和分区容错性着三个要求,最多只能满足两个
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不是太强大
- CP满足一致性,分区容错性的系统,通常性能不是很好
- AP满足可用性,分区 容错性的系统,通常可能对一致性要求低一些
- CAP核心理论就是说在分布式存储系统中最多只能实现上面的两点,而由于当前的网络硬件会出现延迟丢包等问题
- ==分区容错性是必须要有的==
- 可以在一致性和可用性之间进行权衡,没有nosql系统可以同时满足这三点
- ==分布式架构的时候必须做出取舍==
- 大多数的网站使用ap +弱一致性
- BASE就是为了解决 关系型数据库强一致性引起的问题而引起的可用性降低而提出的方案
- BASE其实包含下面三个术语的缩写
- 基本可用(Basically Avaliable)
- 软状态(Soft state)
- 最终一致(Eventually consistent)
- 它的思想就是通过让系统放松对某一个时刻的数据的一致性的要求,来换取系统整体伸缩性和性能上的改观。
- BASE其实包含下面三个术语的缩写
分布式和集群简介
- 分布式系统(distributed system)有 多台计算机和通讯的软件通过计算机网络连接(b本地网络或者广域网)组成,分布式系统是建立在网络之上的软件系统,正式因为软件的特性,所以分布式系统具有高度的内聚性和透明性,因此,网络和分布式系统之间的区别更多的在于高层软件(特别是 操作系统),而不是硬件,分布式系统可以应用在不同的平台上如:pc,工作站,局域网,和广域网上等。
- 分布式:不同的服务器上面部署不同到的服务模块,他们之间通过rpc/rmi之间通信和调用,对外提供服务和组内协作
- 集群:不同的服务器上部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供 服务和访问