空心|Aurora,万字详文:腾讯数据库专家深度探索Amazon( 四 )


另外 , 如果“Caching”确实存在两层(另外一个证据 , 参加图1-4[⑤]) , 而如2.1节所述 , 存储层也在处理日志、并依据日志生成页数据 , 则存储节点也存在处理数据的能力 , 就类似于Oracle的ExaData 。 这样导致的一个可能是 , 两层的“Caching”还是可能存在差别的 。 存储层的“Caching”能够帮助做谓词下推的工作 , 然后把较少的数据传回计算层的“Caching” , 由此实现类似Oracle的ExaData的智能扫描(SmartScan)的功能 。 是否如此 , 或者Aorora的体系结构和功能模块在未来继续演变的时候 , 是否会在存储层内的“Caching”做足文章 , 可以拭目以待 。 不过 , 目前制约存储层内的“Caching”起更大作用的因素 , 主要在于分布式事务的机制的选取和InnoDB自身的事务实现机制 。 详细讨论参见3.2节 。
第二部分:Logging+Storage
第二部分是“Logging+Storage” , 日志和持久化存储 。 日志与传统数据库对于预写日志(WAL)的利用方式与MySQL不同 , 这点是Aurora实现计算与存储分离的核心(下一节详述存储层实现细节) 。
如图1-5所示 , 对于日志数据 , 从PrimaryRWDB写出到一个存储节点 , 每个AZ至少有2份数据 , 写出的日志数据会自动复制到3个AZ中的6个存储节点 , 当其中的多数节点回应写日志成功 , 则向上层返回写成功的ACK 。 这表明写日志信息采用了多数派协议(quorum) 。
MySQL的事务模型符合SS2PL协议[⑥] , 当日志成功写出 , 就可以在内存中标识事务提交成功[⑦] , 而写日志信息是一个批量的、有序的IO操作 , 再加上Aurora去除了大量的缓冲区脏数据的随机写操作 , 因此Aurora的整体性能得到大幅提升 。
借用官方论文的一组对比数据 , 可以感性认识存储和计算分离的所带来的巨大好处 , 如图1-6所示 , MySQL的每个事务的IO花费是Aurora的7.79倍 , 而事务处理量Aurora是MySQL的35倍 , 相差明显 。
对于主备系统之间 , 如图1-5所示 , 主备之间有事务日志(LOG)和元数据(FRMFILES)的传递 。 也就是说备机的数据是源自主机的 。 如图1-5所示的主备之间的紫色箭头 , 表示主机向备机传输的是更新了的元数据 , 绿色箭头表示日志作为数据流被发送给了备机(这个复制 , 应该是异步的 , 相关内容请参考2.1节) 。 所以备机的数据更新 , 应该是应用了主机传输来的事务日志所致 。 这是论文中表述的内容 , 原文如下:
Inthismodel,theprimaryonlywriteslogrecordstothestorageserviceandstreamsthoselogrecordsaswellasmetadataupdatestothereplicainstances.
但是 , 日志的应用功能是被放到了存储层实现的 , 如原文描述:
Instead,thelogapplicatorispushedtothestoragetierwhereitcanbeusedtogeneratedatabasepagesinbackgroundorondemand.
而官方的网站[⑧]用图1-7描述了备机的数据 , 是从存储节点读入的 。


推荐阅读