持续学习&持续更新中…
守破离
【周阳-Redis】【01】
NoSQL引入
1、为什么用NoSQL
单机MySQL的美好年代:
-
在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。
-
在那个时候,更多的都是静态网页,动态交互类型的网站不多。
-
上述架构下,我们来看看数据存储的瓶颈是什么?
- 数据量的大小总有一个机器放不下时
- 数据的索引(B+ Tree)也总有一个机器的内存放不下时
- 访问量(读写混合)一个数据库实例不能承受
- …
-
如果满足了上述任意一个,就应该升级进化我们的架构了…
Memcached(缓存)+MySQL+垂直拆分:
-
后来,随着访问量的上升,几乎大部分使用MySQL架构的网站在数据库上都开始出现了性能问题,WEB程序不再仅仅专注在功能上,同时也在追求性能。
-
程序员们开始大量的使用缓存技术来缓解数据库的压力,并且优化数据库的结构和索引。
-
开始比较流行的是通过文件缓存来缓解数据库压力,但是当访问量继续增大的时候,多台web机器通过文件缓存不能共享,大量的小文件缓存也带了了比较高的IO压力。
-
于是,在这个时候,Memcached就自然的成为一个非常时尚的技术产品。
-
Memcached作为一个独立的分布式的缓存服务器,为多个WEB服务器提供了一个共享的高性能缓存服务。
-
在Memcached服务器上,又发展了根据HASH算法来进行多台Memcached缓存服务的扩展,然后又出现了一致性HASH来解决增加或减少缓存服务器导致重新HASH带来的大量缓存失效的弊端
MySQL主从复制读写分离:
- 由于数据库的写入压力增加并且Memcached只能缓解数据库的读取压力。
- 读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。
- Mysql的master-slave模式成为这个时候的网站标配了。
分表分库+水平拆分+MySQL集群:
-
在Memcached的高速缓存、MySQL的主从复制、读写分离的基础之上,MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。
-
同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。(分库:比如将用户的身份证、用户性别等相对较“冷”的、不经常修改读取的数据可以放到一些数据库;将那些频繁读写的、较“热”的数据放到一些数据库;将各个业务的数据放到各自的数据库等等…)(分表:一张表并不适合存放大量数据、…)
-
这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然MySQL推出了MySQL Cluster集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证。
MySQL的扩展性瓶颈:
- MySQL数据库也经常存储一些大文本字段(大文件、…),导致数据库表非常的大,在做数据库恢复的时候就导致非常的慢,不容易快速恢复数据库。
- 比如1000万4KB大小的文本就接近40GB的大小,如果能把这些数据从MySQL省去,MySQL将变得非常的小。
- 显然,MySQL是不适合存储大文本(图片、视频、…)数据的
- 关系数据库很强大,但是它并不能很好的应付所有的应用场景。MySQL的扩展性差(需要复杂的技术来实现),大数据下IO压力大,表结构更改困难,正是当前使用MySQL的开发人员面临的问题。
今天是什么样子?
为什么用NoSQL?
-
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。
-
用户的个人信息、社交网络、地理位置、…,这些用户生成的数据(这些数据并不适合二维表存储)已经成倍的、爆炸般的增加增长。
-
我们如果要对这些用户数据进行挖掘、处理,使用传统的SQL数据库已经不合适了。
-
而NoSQL数据库的发展却能很好的处理这些大的数据。
2、NoSQL是什么
- NoSQL最常见的解释是“Non-Relational SQL”(非关系型的数据库)、 “Not Only SQL”(不仅仅是SQL)。
- NoSQL仅仅是一个概念,泛指非关系型的数据库,区别于关系数据库,它们不保证ACID特性。
- 随着互联网WEB2.0网站的兴起,传统的关系型数据库在应付WEB2.0网站,特别是超大规模和高并发的SNS(社交网络服务:Social Networking Service)类型的WEB2.0动态网站时已经显得力不从心,暴露了很多难以克服的问题。传统的关系型数据库难以支撑类似于SNS之类的业务(社交网络、亲戚关系、…)。
- 而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。
- NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题,也包括超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。
- 这些类型的数据存储不需要固定的模式(注意:RDBMS中一张表的字段是固定的),无需多余操作就可以横向扩展。
3、NoSQL特点
易扩展:
- NoSQL数据库种类繁多,但是一个共同的特点就是:去掉关系型数据库的关系特性。
- 数据之间无关系,这样就非常容易扩展。也无形之间,在架构的层面上带来了可扩展的能力。
多样灵活的数据模型:
- NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。
- 而在关系数据库里,增删字段是一件非常麻烦的事情。如果是非常大数据量的表,增加字段简直就是一个噩梦。
大数据量高性能:
- NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。
- 这得益于它的无关系性,数据库的结构简单。
- 一般MySQL使用Query Cache,每次表的更新Cache就失效,是一种大粒度的Cache,
- 在针对WEB2.0的交互频繁的应用,Cache性能不高。而NoSQL的Cache是记录级的,是一种细粒度的Cache,所以NoSQL在这个层面上来说就要性能高很多了。
传统RDBMS VS NOSQL:
RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
- 键值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
3V + 3高
1、大数据时代的3V
- 海量Volume
- 多样Variety
- 实时Velocity
2、互联网需求的3高(高可用)
- 高并发
- 高可扩
- 高性能
当下NoSQL的经典应用—阿里巴巴中文站商品信息如何存放
当下的应用是SQL和NoSQL一起使用
1、以阿里巴巴中文网站首页女装为例
2、多数据源、多数据类型的存储问题:
3、商品基本信息(较冷数据):
- 名称、出厂日期、性别等较“冷”的、格式较为固定的数据,采用关系型数据库,比如MySQL
- 关系型数据库:MySQL/Oracle目前淘宝在去O化,也即拿掉Oracle;
- PS:“去IOE”:在IT建设过程中,去除IBM小型机、Oracle数据库及EMC存储设备
- 淘宝内部用的MySQL是里面的大牛自己改造过的
4、商品描述、详情、评价信息(多文字类):
- 多文字信息描述类,IO读写性能变差
- 存储在文档数据库MongDB中
5、商品的图片:
- 存放在分布式的文件系统中:淘宝自己的TFS、Google的GFS、Hadoop的HDFS
6、商品的关键字:
- 搜索引擎,淘宝内用:ISearch
7、商品的波段性的热点高频信息:
- 内存数据库
- Tair、Redis、Memcache
8、商品的交易、价格计算、积分累计:
- 外部系统,外部第三方支付接口
- 支付宝
9、总结大型互联网应用(大数据、高并发、多样数据类型)的难点和解决方案:
难点:
- 数据类型多样性
- 数据源多样性和变化重构
- 数据源改造而数据服务平台不需要大面积重构
解决办法:UDSL
-
UDSL是什么(映射、API、热点缓存、…)
-
UDSL怎么样
NoSQL数据模型简介
1、以一个电商项目为例,请你根据客户、订单、订购、地址这几种信息来设计并对比下关系型数据库和非关系型数据库
传统的关系型数据库:ER图(1:1/1:N/N:N、主外键等)
NoSQL你如何设计(以BSON为例):
- BSON是一种类JSON的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象,一般用于MongoDB中。
{
"customer":{
"id":1136,
"name":"Z3",
"billingAddress":[{"city":"beijing"}],
"orders":[
{
"id":17,
"customerId":1136,
"orderItems":[{"productId":27,"price":77.5,"productName":"thinking in java"}],
"shippingAddress":[{"city":"beijing"}]
"orderPayment":[{"ccinfo":"111-222-333","txnid":"asdfadcd334","billingAddress":{"city":"beijing"}}],
}
]
}
}
2、对比SQL与NoSQL设计
- 高并发的操作是不太建议有关联查询的,互联网公司一般用冗余数据来避免关联查询。
- 分布式数据库也不好关联查询;分布式事务也是支持不了太多的并发的。
- 因此单一的采用关系型数据库并不合适,在特定的场景下还需要采用NoSQL来配合,以便更好的完成业务需求。
3、聚合模型
-
KV键值
-
BSON
-
列族:顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
-
图形
NoSQL数据库的四大分类
1、KV键值:典型介绍
- 新浪:redis+BerkeleyDB
- 美团:redis+tair
- 阿里、百度:redis+memcache
2、文档型数据库(bson格式比较多):典型介绍
- CouchDB、MongoDB:
- MongoDB是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系型数据库的。
3、列存储数据库
- 分布式文件系统
- HBase
4、图关系数据库
- 它不是放图片的,放的是关系比如:朋友圈社交网络、广告推荐系统、社交网络,推荐系统等。专注于构建关系图谱。
- Neo4J, InfoGrid
分布式数据库中CAP+BASE
阮一峰:CAP定理的含义:http://www.ruanyifeng.com/blog/2018/07/cap.html
1、传统关系型数据库的ACID分别是什么
-
事务在英文中是transaction,和现实世界中的交易很类似:
-
关系型数据库的事务遵循ACID四大特性(这四大特性简单来说就是确保了数据的实时性和正确性):
-
A (Atomicity) 原子性
原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。 -
C (Consistency) 一致性
一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。 -
I (Isolation) 独立性
所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的 -
D (Durability) 持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
2、NoSQL的CAP
- C:Consistency(强一致性)
- A:Availability(高可用性)
- P:Partition tolerance(分区容错性/分区容忍性/分布式容忍性)
3、CAP的3选2
- CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性、分区容错性这三个需求,最多只能同时较好的满足两个。
- 因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
- CA:满足一致性、可用性的系统(单节点服务器/单点集群),通常在可扩展性上不太强大。
- CP:满足一致性、分区容忍性的系统,通常性能不是特别高。
- AP:满足可用性、分区容忍性的系统,通常可能对一致性要求低一些。
4、C与A的抉择
- CAP理论就是说在分布式存储系统中,最多只能实现上面的两点。
- 而由于当前的网络硬件肯定会出现延迟丢包等问题,所以分区容忍性是我们必须需要实现的。
- 所以我们只能在强一致性和高可用性之间进行权衡,没有NoSQL系统能同时保证这三点。
- C:强一致性;A:高可用性;P:分布式容忍性
- CA:传统关系型数据库
- AP:大多数网站架构的选择
- CP:Redis、Mongodb
- 也就是说:分布式架构的时候必须做出取舍。一致性和可用性之间取一个平衡。多余大多数WEB应用,其实并不需要强一致性。因此牺牲C换取P,这是目前分布式数据库产品的方向。
-
一致性与可用性的决择:
-
对于WEB2.0网站来说,关系数据库的很多(确保一致性的)主要特性却往往无用武之地:
-
比如说,数据库事务一致性需求。很多WEB实时系统并不要求严格的数据库事务,对读一致性的要求很低, 有些场合对写一致性要求并不高。不过允许最终一致性罢了。
-
比如说,数据库的写实时性和读实时性需求。对关系数据库来说,插入一条数据之后立刻查询,是肯定可以读出来这条数据的,但是对于很多WEB应用来说,并不要求这么高的实时性,比方说发一条消息之 后,过几秒乃至十几秒之后,我的订阅者才看到这条动态是完全可以接受的。
-
再比如说,对复杂的SQL查询,特别是多表关联查询的需求。任何大数据量的WEB系统,都非常忌讳多个大表的关联查询,以及复杂的数据分析类型的报表查询,特别是SNS类型的网站,从需求以及产品设计角度,就避免了这种情况的产生。往往更多的只是单表的主键查询,以及单表的简单条件分页查询,SQL的功能被极大的弱化了。
-
因此一般选择使用A,即高可用性,来确保系统的正常运转。
5、BASE
-
BASE是为了解决关系型数据库强一致性引起的可用性降低而提出的解决方案。
-
BASE其实是下面三个术语的缩写:
- 基本可用(Basically Available)
- 软状态(Soft state)
- 最终一致(Eventually consistent)
-
它的思想是通过让系统放松对某一时刻数据一致性的要求来换取系统整体伸缩性和性能上改观。
-
为什么这么说呢,缘由就在于大型系统往往由于地域分布和极高性能的要求,不可能采用分布式事务来完成这些指标,要想获得这些指标,我们必须采用另外一种方式来完成,这里BASE就是解决这个问题的办法。
6、分布式+集群简介
分布式系统(distributed system):
- 分布式系统是由多台计算机和通信软件,通过计算机网络连接(本地网络或广域网)组成的。
- 分布式系统是建立在网络之上的软件系统。
- 正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
- 分布式系统可以应用在在不同的平台上如:PC、工作站、局域网和广域网上等。
简单来讲:
- 分布式:不同的多台服务器上面部署不同的服务模块(工程),它们之间通过RPC/RMI之间通信和调用,对外提供服务和组内协作。
- 集群:不同的多台服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提供服务和访问。
注意
- 技术没有高低之分,不过使用技术的人有强弱之别。
参考
尚硅谷-周阳: 尚硅谷超经典Redis教程.
本文完,感谢您的关注支持!