这篇文章是我一直想写的一篇,由于“计算和存储分离”最近几年在你们的视野中出现得愈来愈多,但其实不少对于其到底表明着什么也是模糊不清,这里我查阅了不少的资料再结合平时本身的理解,聊聊到底什么是“计算和存储分离”sql
要了解计算和存储分离究竟是什么,那么咱们就须要理解什么是计算,什么是存储。 计算这个单词有运算之义,和数学的关系密不可分。你们回想一下之前数学考试的时候,那一道道的数学题怎么得出结果的,这一过程其实称之为计算。那咱们这里谈论的实际上是计算机计算,因此咱们能够得出经过计算机获得问题的结果这个就叫作计算机计算,也就是咱们这里所谈论的"计算"。数据库
对于存储来讲,这个概念比较难以定义,不少人都简单的认为这个是硬盘,U盘等。但其实在咱们的计算机计算过程当中和存储是密不可分的,咱们知道CPU是由控制器、运算器和寄存器组成的,咱们在运行一段程序的时候咱们的指令是存储在咱们的存储器的,咱们所执行的每个步骤都和存储分离不开。好比咱们之前考试的时候选择题,你们关心的只是你选择是否正确,不会关心你的运算过程,你的运算结果能够看作是硬盘,须要持久化给评卷人看,而你的计算过程相似草稿纸,虽然不须要给评卷人看,可是同样的是实实在在的写在了纸上。服务器
上面咱们说了在计算机中计算和存储实际上是分离不开的,咱们想一想若是将计算和存储分离开来,经过高速网络进行交互,那么咱们的CPU的每一条指令都须要经过网络传输,而咱们的网络传输和咱们当前的CPU速度彻底不匹配,因此咱们的计算和存储分离实际上是一个伪需求,固然在将来的某一天若是咱们的网络传输的时间能够忽略不计,计算和存储分离也就能真正的实现了。网络
计算和存储分离既然是一个伪需求,那为何这么多人还在说起呢?那就须要从新再定义一下他们的含义,咱们将计算过程当中的存储概括为计算,只关注问题和结果,这就是咱们新的“存储”的定义,就相似咱们考试的时候草稿纸不须要存放,能够任意撕毁同样。架构
那这里咱们来作一个最终的定义,咱们后面所讲的“存储”都是须要持久化的,能够是U盘,硬盘,网盘等等,咱们所讲的“计算”其实就是咱们的计算过程所须要的CPU和内存等。并发
计算和存储分离并非如今才出现的一个新名词,在20年前就有NAS-网络附加存储这个东西,本质上也就是使用TCP/IP协议的以太网文件服务器。当时若是想要大规模的存储,就会让服务器将数据保存到NAS这个上面,可是NAS价格及其昂贵,而且扩展比较困难,NAS也就不适用于高速发展的互联网应用。负载均衡
这个时候谷歌摒弃了以前的观念“移动存储到计算”,采起了“移动计算到存储的观念”,将计算和存储耦合了,由于当时的网络速度对比如今来讲慢了几百倍,网络速度跟不上咱们的须要。在在典型的MapReduce部署中计算和存储都在同一个集群中进行,好比后续的hadoop。这里其实也就是用本地IO速度来替换网络传输速度。oop
随着技术的进步,咱们的网络速度也愈来愈快,咱们的瓶颈再也不是网络速度,可是咱们的磁盘I/O速度却没有明显的速度增加,计算和存储融合的架构缺点也再逐渐暴露:性能
因为计算和存储耦合的缺点愈来愈多,而且网络速度愈来愈快,如今架构又在从新向计算和存储分离这一方向从新开始发展。优化
上面咱们讲了不少理论相关的知识,相信你们已经对“计算和存储分离”已经有必定的认识了,那么其到底在哪些地方作了使用呢?其影响比较大的有两块,一个是数据库,另一个是消息队列,接下来我会具体讲下这两块究竟是怎么利用“计算和存储分离”的。
一谈到数据库咱们不得不想到MySql,这个应该也是你们最熟悉的数据库,下面是Mysql的一个主从架构图:
能够看见咱们的master接收数据的变动,咱们的从数据库读取binlog信息,重放binlog从而达到数据复制。 在Mysql的主从架构中有不少问题:
这一切的问题好像都在指引着咱们走向计算和存储分离的道路,让全部的节点都共享一个存储。在2014年,在AWS大会上,AWS就宣布推出Aurora。这是一个面向亚马逊关系数据库服务(RDS)的兼容MySQL的数据库引擎,Aurora完美契合了企业级数据库系统对高可用性、性能和扩展性、云服务托管的需求。目前的Aurora可跨3个可用区的6-路复制、30秒内即可完成故障转移、同时具有快速的crash recovery能力。在性能方面,Aurora如今比RDS MySQL5.6和5.7版本快5倍。
Aurora将MySQL存储层变为为独立的存储节点,在Aurora中认为日志即数据,将日志完全从Mysql计算节点中抽离出来,都由存储节点进行保存,而且也取消了undolog用于减少计算存储之间的交互和传输数据带宽。
一样的在阿里的团队中,也借鉴了Aurora的思想,并在其上面作了不少优化,因为Aurora对于Mysql-Innodb的存储引擎修改较大,后续的Mysql的更新,必然成本很大,因此阿里的团队在保有了原有的MySQL IO路径的基础之上推出了PolarDB。其设计架构图以下:
固然PolarDB还有不少其余的细节,你们有兴趣能够阅读阿里云的官方文档,经过这种共享存储的方式,咱们就能够根据本身的业务来进行不一样的配置申请,好比咱们的对并发要求不高,对数据量要求很大,那么咱们就能够申请大量的存储空间,计算资源相对来讲就能够较小,若是咱们对并发要求很高,尤为是读请求,那么咱们就能够申请多台读机器直到知足咱们要求为止。
其实不止是这些,如今不少的数据库都在逐渐向“计算和存储分离”靠拢,包括如今的OceanBase ,TiDB等等。因此“计算和存储分离”应该是将来数据库的主要发展方向。
我在以前写过不少关于消息队列的文章,有Kafka的,也有RocketMQ的,不管是Kafka仍是RocketMQ其设计思想都是利用本地机器的磁盘来进行保存消息队列,这样实际上是由必定的弊端的:
针对这些问题ApachePulsar出现了,pulsar最初由Yahoo开发,在18年的时候一举将kafka连续两年InfoWorld最佳开源数据平台奖夺了过来。
在Pulsar的架构中,数据计算和数据存储是单独的两个结构:
Pulsar理论上来讲存储是无限的,咱们的消息能够永久保存,有人会说难道硬盘不要钱吗?固然不是咱们依然要钱,在Pulsar能够进行分层存储,咱们将旧的消息移到便宜的存储方案中,好比AWS的s3存储,而咱们当前最新的消息依然在咱们比较贵的SSD上。在这个模式下不只是存储是无限,咱们的计算资源扩展也是无限的,由于咱们的计算资源基本上是无状态的,扩展是没有任何成本的,因此Pulsar也搞出了一个多租户的功能,而不用每一个团队单独去创建一个集群,以前在美团的确也是这样的,比较重要的BG基本上都有本身的Mafka集群,防止互相影响。
Kafka最新的一些提议,也在向这些方面靠拢,好比也在讨论是否支持分层存储,固然是否采用“计算和存储分离”架构这个也是不必定的,可是我认为“计算和存储分离”的方向也是消息队列将来发展的主要方向。
“计算和存储分离”随着云原生的发展,在各类系统中出现的次数愈来愈多,但愿你们读完这篇文章能对其有个简单的认识。同时若是你们将来在设计系统的时候,这个方案也能够做为选择方案之一进行考虑。
若是你们以为这篇文章对你有帮助,你的关注和转发是对我最大的支持,O(∩_∩)O: