首先应该说的是:所有天上飞的理念都会有落地实现。所以我觉得还是从数据存储处理的发展简史来引入NoSQL更为贴切,也能让自己有更细致的认识。
数据存储与处理技术的发展有这么几个时间跨度
1.单机MySQL的美好时代
2.Memcached(缓存)+MySQL+垂直分离
3.MySQL主从读写分离
4.分库分表+水平拆分+mysql集群
5.MySQL的扩展性瓶颈
6.今天的架构
7.为什么使用NoSQL
1.单机MySQL的美好时代
在90年代,一个网站的访问量并不大,用单个数据库完全可以轻松应对,那个时候,更多的都是静态网页,动态交互型的网站并不多。
网站的架构设计如下图所示:
大学期间我们大都用的是这个简单原始的架构来做网站,在数据量不是很大的情况下,是完全应付的来的。
那么上述架构能带来什么问题呢?
1.数据量太大,一个机器放不下时。
MySQL5.7单表500w数量已经很棒,但是300w时就应该优化了。
2.数据的索引(B+Tree)一个机器的内存放不下时。
索引是加速数据库访问效率的一种机制,但是索引是存储在内存当中的,如果数据量太大,那么意味着内存中存储的索引也会很大,在每一次加入数据的时候,数据库都需要维持索引,这样假设索引跟数据量同处一个机器,而不做优化,那么数据访问将非常之缓慢。
3.访问量(读写混合)一个实例并不能承受。
如果满足不了上述当中的1-3个,请演化。
2.Memcached(缓存)+MySQL+垂直分离
2.1 Memcached(缓存)
随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都出现了性能问题,web程序不再仅仅关注在功能上,同时也开始追求性能,程序员们开始大量的使用缓存技术来缓解数据库的压力,优化数据库的结构和索引,开始比较流行的是通过文件缓存来缓解数据库的压力,但是当访问量继续增大的时候,多台web服务器通过文件缓存不能共享,大量的小文件缓存也带来了比较高的IO压力,在这个时候,Memcached(缓存)自然成为一个非常时尚的技术产品。
缓存的实质是替数据库挡了一层。
频繁被访问的数据可以被放置于缓存当中,以供频繁访问。
架构图如下所示:
2.2 垂直拆分
什么是垂直拆分?
举个例子,淘宝的数据库服务器是要进行定性 的,比如说有四台数据库服务器,两台进行买家数据的存储,两台进行卖家数据的存储,将原本一台数据库实例需要做的事情,均摊给四台服务器。DB数据操作能力会有很大提升。
3. MySQL主从读写分离
1 什么是主从复制?
多搞几个数据库来存储数据,假设有三台数据库,一主二仆,即一台主服务器,两台从服务器,当新增数据至主数据库服务器的时候,那么同时复制此数据进入到从数据库服务器当中。数据复制是为了容灾备份,缓存备份,保证数据的完整性。
2 什么是读写分离?
增删改是写,查为读。
读就去职能为被查询的数据库服务器去读。
写就去职能为写数据的数据库服务器去写。
分工明确,结合缓存能实现性能的一大提升
架构图如下所示:
其中的M是master 即主DB Server ,S为slaver即从属DB Server,各有分工。
写操作在 M,读操作在S。S的数据是从master方复制的。
4.分库分表+水平拆分+MySQL集群
承接主从复制,读写分离,以及Memcached的使用,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MYISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MYISAM,由于数据量的指数级增长,只能继续对架构进行演变。
与此同时,开始流行使用分库分表来缓解写压力和数据增长的扩展问题。这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL cluster集群,单性能也不能很好的满足互联网的要求,知识在高可靠性上提供了非常大的保证。
1 基本思想之什么是分库分表?
从字面上简单理解,就是把原本存储于一个库的数据分块存储到多个库上,把原本存储于一个表的数据分块存储到多个表上。
2 基本思想之为什么要分库分表?
数据库中的数据量不一定是可控的,在未进行分库分表的情况下,随着时间和业务的发展,库中的表会越来越多,表中的数据量也会越来越大,相应地,数据操作,增删改查的开销也会越来越大;另外,由于无法进行分布式式部署,而一台服务器的资源(CPU、磁盘、内存、IO等)是有限的,最终数据库所能承载的数据量、数据处理能力都将遭遇瓶颈。
3 分库分表的实施策略。
分库分表有垂直切分和水平切分两种。
3.1 何谓垂直切分:
即将表按照功能模块、关系密切程度划分出来,部署到不同的库上。例如,我们会建立定义数据库workDB、商品数据库payDB、用户数据库userDB、日志数据库logDB等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表等。
3.2 何谓水平切分:
当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如userID散列,进行划分,然后存储到多个结构相同的表,和不同的库上。例如,我们的userDB中的用户数据表中,每一个表的数据量都很大,就可以把userDB切分为结构相同的多个userDB:part0DB、part1DB等,再将userDB上的用户数据表userTable,切分为很多userTable:userTable0、userTable1等,然后将这些表按照一定的规则存储到多个userDB上。
5.MySQL的扩展性瓶颈
视频、图片大数据量的数据时不能存储到数据库当中的,假设一个视频1.8G,MySQL中肯定是不能进行存储的。
下图是淘宝分享出来的一种架构方式:
6.今天的架构
答案就是NoSQL。
NoSQL(NoSQL = Not Only SQL),意为"不仅仅是SQL"。泛指非关系型数据库。随着互联网2.0网站的兴起,传统的关系型数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合以及多中数据带来的挑战,尤其是大数据应用难题,包括大规模数据的存储。
例如:谷歌活着Facebook每天为他们的用户收集万亿比特的数据。这些数据的存储不需要固定的模式,无需多余的操作就可以横向扩展。
下一节继续!
博客搬家:大坤的个人博客
欢迎评论哦~