Exadata数据库一体机FlashCache缓存淘汰算法改进
2020-11-11亓薇薇
亓薇薇
(山东省莱芜职业技术学院<信息工程系>,山东 莱芜271100)
0 引言
最近几十年,我国IT及互联网产业发展迅速,信息量也以几何级倍数增长,这对存储系统的要求也不断提高,存储系统的性能、容量、与成本之间的矛盾也日益突出。
机械硬盘存储容量大且技术成熟,但是它的IO性能相对比较低下,无法满足那种对IO要求极高的业务系统。SSD固态硬盘[1]或者PCI-E闪存[2]这类IO设备能够提供极高的IO性能,但价格同样也非常高。如何利用这两种存储设备的优点并避开各自的缺点,发挥出存储设备的最大的优势是值得探讨的问题。
分层存储[3]作为一种能够有效解决上述矛盾的技术,在近年来成为热点。所谓分层存储,就是所有数据最终存储在机械硬盘中,但在进行IO访问时,通过分层存储管理软件自动实现热点数据自动存储在高性能的IO设备中,这样就能够充分利用SSD或者PCIE闪存这类容量小但IO性能极高的IO设备。分层存储管理软件目前有开源和闭源两种:开源的存储管理软件,例如:Facebook公司的FlashCache,Intel公司的Open-CAS;闭源的存储管理软件,例如:Oracle公司的Exadata FlashCache。
以下内容主要涉及Oracle的Exadata FlashCache的缓存算法改进,Exadata是Oracle公司的最先进的数据库一体机,底层的数据存储使用机械硬盘,上层用PCI-E闪存卡做成数据缓存[4],也即FlashCache。
1 Exadata FlashCache IO请求模式
Exadata FlashCache有write-through和writeback两种模式[5]可以选择,write-through模式,意味着计算节点数据库BufferCache中的脏数据块写回数据文件时,是绕开FlashCache,直接写回机械硬盘。而对于write-back模式,数据库BufferCache中的脏数据块写回数据文件时,是先写FlashCache,后期再慢慢刷回机械硬盘。
在讲解Exadata FlashCache的缓存算法之前,先介绍Exadata FlashCache的IO请求模式,也即哪些IO请求会经过PCI-E闪存设备。
当需要被访问的数据块没有被缓存在FlashCache中的情况下,IO读请求的整个处理流程如图1所示。
图1 write-through模式FlashCache数据未缓存时IO请求
数据库服务器向存储管理软件发起IO读请求,Exadata存储管理软件检测到存储节点的FlashCache中没有所需要的数据块,所以只能直接从磁盘的数据文件中访问这些IO数据块。从磁盘的数据文件中读取出的数据块被返回给数据库服务器。存储管理软件会决断这些被访问的数据块是否满足缓存到FlashCache的条件,如果满足(数据缓存算法),则这些数据块会被写入FlashCache中。
当需要被访问的数据块已经被缓存在FlashCache中的情况下,IO读请求的整个处理流程如图2所示。
数据库服务器向存储管理软件发起IO请求。存储管理软件检测到存储节点的FlashCache中有所需要的数据块,所以可以直接从FlashCache中访问这些IO数据块。将从FlashCache中读取出的数据块被返回给数据库服务器。
数据库服务器向存储节点发起IO写请求,整个处理流程如图3所示。
数据库服务器向存储管理软件发起IO写请求。存储管理软件将这些IO写请求直接写回磁盘上的数据文件中。数据库服务器BufferCache中的脏数据块完全写入存储节点磁盘的数据文件后,给数据库服务器发出一个IO写完成的响应,通过数据库服务器已经完成IO写入。存储管理软件会决断这些被写回数据文件的数据块是否满足缓存到FlashCache的条件,如果满足,则这些数据块会被缓存到FlashCache中。
图2 write-through模式FlashCache数据已缓存时IO请求
图3 write-through模式FlashCache写数据时IO请求
如果FlashCache在write-back模式下,它的IO读操作与write-through模式完全相同,但它的IO写操作与write-through模式则完全不同。
下面介绍FlashCache配置为write-back模式时,IO写操作的请求顺序如图4所示。
数据库服务器向存储管理软件发起IO写请求。存储管理软件将这些IO写请求直接写入FlashCache中,而不是数据文件。当数据库服务器的IO写请求完全写入FlashCache后,给数据库服务器一个IO写结束的响应。存储管理软件后期会将FlashCache中的脏数据块慢慢地刷回数据文件中。
图4 write-back模式FlashCache写数据时IO请求
2 Exadata FlashCache缓存淘汰算法
Exadata Smart FlashCache IO请求模式中可以看出:不同缓存配置模式,不同的IO请求模式,所涉及的数据块是否会进行缓存都不尽相同。
访问的数据块适不适合进行缓存,是由数据库服务器向存储软件发送的数据元信息决定的,这些数据元信息类似于:请求的IO的大小或IO类型、请求的IO所属的数据段关于cell_flash_cache属性的设置等。
FlashCache中数据块的管理工作是由Exadata存储管理软件来完成的,FlashCache中数据块的刷出和刷入机制使用的是最近最少使用(LRU)的算法进行自动管理。
由PCI-E闪存组成的FlashCache缓存毕竟容量有限,当FlashCache用满时,Exadata将FlashCache中最近很少使用的数据块刷出FlashCache。
FlashCache缓存淘汰算法具体如下:
(1)当有新的数据对象需要缓存到FlashCache时,先检查存储节点的FlashCache是否还有可用空间?
(2)如果存储节点的FlashCache已经完全使用,没有发现可用空间时,则检查FlashCache中的哪个数据对象的hitcount最少?
(3)将FlashCache中hitcount最少的数据对象刷出,并释放空间。
(4)将新的数据对象需要缓存到FlashCache。
3 当前缓存淘汰算法缺陷
Exadata的FlashCache使用LRU算法将数据块淘汰出缓存,但这种缓存淘汰算法存在一些缺陷。通过下面这则案例解析,可以清楚看出当前缓存淘汰算法的缺陷在哪。
案例概要:
一台Exadata上运行着A和B两套Oracle数据库,运行了一段时间后,A数据库从该Exadata上迁移出去并且完全停止使用,但是A数据库没有删除。某一天,发现运行的B数据库性能比较差,主要表现在单个IO读经常飙升到十几毫秒左右,同时B数据库的FlashCache的命中率比较低。
案例分析:
检查FlashCache的使用情况。由于Exadata每个存储节点都配置了5.8TB的PCI-E闪存卡,正常情况下,热点数据都应该缓存在这些基于PCI-E闪存卡的FlashCache中,如果SQL语句需要的数据块未缓存到FlashCache中,则需要读取物理的数据文件,如果大量访问物理的数据文件,则IO性能肯定会大幅下降。
下面,进一步检查存储节点FlashCache的使用情况。
从以上输出可以看出,A数据库还占用了4个多TB的FlashCache,而B数据库仅仅占用了1个多TB的FlashCache资源,这其实就是为什么B数据库单个IO读慢的原因。
跟客户进一步沟通得知,A数据库已经从Exadata上迁移出去将近2个月了,目前A数据库处于关闭状态。那么问题来了,既然A数据库已经处于关闭状态,并且永远也不会开启,那么为什么A数据库还有这么多的数据对象缓存在FlashCache中呢?并且也没有立即释放的迹象。
通过这个案例,可以看出FlashCache缓存淘汰算法存在的一些缺陷。存在的缺陷主要在于第2步,因为它只是简单地比较FlashCache中的哪个数据对象的hitcount最少,然后把hitcount最少的数据对象刷出FlashCache。
该缺陷主要表现为:A数据库已经关闭了2个多月,并且永远也不会开启,但A数据库中有些数据对象的hitcount非常非常大,则这些对象有可能永远缓存在FlashCache中。
4 Exadata FlashCache缓存淘汰算法改进
那么如何优化Exadata FlashCache的淘汰算法呢?当数据对象被缓存到FlashCache之后,相应的信息都会被统计到flashcachecontent指标中,可以分析flashcachecontent指标,来确认FlashCache中缓存了哪些数据对象。
查看flashcachecontent指标中包括哪些信息,具体命令如下。
flashcachecontent指标中dbUniqueName属性,是数据库的唯一识别名,等同于数据库名。objectNumber属性,对应数据库中dba_objects视图的data_object_id字段,可以通过它查找出具体的数据对象名称。
有了数据库名和数据对象ID这些信息,就可以与数据库实例进行关联查询出这些数据对象的当前状态。
可以在缓存淘汰算法代码中定期检查FlashCache中所涉及的数据库和数据对象的状态,如果发现FlashCache中某个数据库已经长时间未运行,比如一个星期或半个月,则将FlashCache中该数据库的所有对象的hitcount重置为0,同样,如果发现FlashCache中某个对象(objectNumber)在对应的数据库中没有匹配的数据对象,则间接地说明了FlashCache中缓存的对象在数据库层面已经被删除,这类对象同样可以将hitcount重置为0。如此一来,当需要从FlashCache中刷出数据,腾出空间给新的数据对象时,就可以优先刷出那些被删除的对象,或者是数据库已经长期关闭的对象。而不是简单地刷出hitcount最小的数据对象,因为谁也不能保证hitcount最小的数据对象在日后不会被再次访问。
5 结语
前面介绍了针对Oracle公司的Exadata存储管理软件中对FlashCache缓存的管理,以及Exadata FlashCache缓存淘汰算法中目前存在的缺陷,给出该淘汰算法的改进建议,这个建议将有效改进FlashCache的空间使用效率,提升使用性能。