导航菜单
首页 >  » 正文

智汇华云 _ flashcache原理及实践

flashcache是由Facebook的技术团队开发的一个新的开源项目,主要目的是使用SSD来加速MySQL内核模块。正如您所看到的,它最初是为了数据库加速,但它也被设计为一个通用缓存模块,可以用于构建在块设备上的任何应用程序。1、工作原理基于Device Mapper,将高速SSD硬盘和普通硬盘映射到带有缓存的逻辑块设备上,作为用户操作的接口。用户直接对这个逻辑设备执行读写操作,而不是底层SSD或普通硬盘驱动器。操作这些块设备会导致整个提供的缓存功能丢失。内核级闪存缓存缓存是通过在文件系统和块设备驱动层之间添加一个缓存层来实现的,应该提到DM层的映射机制。由于DM在内核中注册为虚拟块设备驱动程序,它不是一个真正的设备驱动程序,不能完成对bio的处理,所以主要是基于映射表对bio进行分解、克隆和重新映射,bio到达底层的实际设备驱动程序,然后开始数据传输。Device Mapper引入了target_driver,其中每个target_driver都以target_type类型编写,表示用于实现块设备映射过程的映射类。调用target_driver的map方法来映射来自上层的分布bio。这意味着找到正确的目标设备,并将生物信息转发到目标设备的请求队列中。flashcache_target是模块化到DM层的新target_driver(需要target_type作为新的映射类类型)从源代码层面分析,闪存缓存可分为这四个模块:调度模块(也称为“读写模块”)、逻辑处理模块(也称为“读写后处理模块”)、底层存储模块和后台清理模块。所有这些都是基于SSD布局实现的,并建立在SSD布局之上(我们稍后会分析)其中,调度模块对应于代码中的flashcache_map映射函数,该函数是flashcache高速缓存层次结构中的数据项,因此对逻辑设备的读写请求最终将通过DM层处理并通过flashcache_map进入调度模块。这就是所谓的“调度”,主要是指在接收到数据后,根据BIO请求的读写类型、缓存是否命中等,选择不同的处理分支,如flashcache_read/write或flashcache_uncached_io,然后选择flashcache_read_hit/miss或flashcache_write_hit/miss来进行read和write。在读取和写入不同的分支之后,底层外壳被调用以完成向磁盘或缓存读取数据的过程。逻辑处理模块在代码中对应于flashcache_io_callback,因为它是在调度模块通过下级存储模块执行数据的读写操作之后执行回调的,所以它是“读写后处理模块”,它是采用状态机来实现的。根据调度模块的读写类型进行后续处理。例如,在读取错误的情况下,在磁盘读取完成后,它负责回调逻辑处理模块,将从磁盘读取的数据写入SSD。或者,在写入错误的情况下,在SSD的写入完成后,它将被回调到逻辑处理模块以执行元数据更新。底层存储模块主要提供了两种方式来完成对实际数据的读写。一个是DM提供的dm_io功能,最后通过submit_bio的方法,将调度模块处理的bio提交到通用块层,然后转发到实际的设备驱动程序,完成数据的读写。此外,kcopyd是内核提供的低级复制函数,主要负责脏块的写回(从SSD到磁盘),从而导致元数据更新。后台清理模块对每组数据进行清理,并根据两种策略收集脏块。(1)组内内脏阻塞超过阈值;(2)脏块已超过设定的空闲时间(falllow_delay)通常是15分钟。如果在15分钟内没有进行操作,将优先回收。没有单独的线程在后台进行周期性的空闲块回收,必须由IO操作触发,如果设置操作长时间不进行,脏数据会被保留很长时间,很容易危及数据安全。源代码布局了两个工作队列。当与device mapper代码(特别是dm. c)结合使用时,调用flashcache_create工具以创建flashcache设备时,将调用flashcache_ctl函数并运行create工具。该函数主要负责清除整个缓存设备的脏块,在特定条件下由flashcache_clean_set调用(参见代码),并创建一个工作队列_delay_clean,该工作队列对所有的集合执行扫描和清理。 另一个工作队列,_kq_xxx,由flashcache_init中的闪存缓存模块加载时运行,负责处理五个作业列表,执行元数据更新和完成处理功能,读取磁盘后SSD写入,处理等待队列。读写后的处理主要属于逻辑处理模块,即“读写后处理模块”,读写后由磁盘或SSD调度。调度的定时可以在flashcache_map函数中看到,处理逻辑主要在函数flashcache_io_callback内部确定,如果同一块的队列不为空,则调用flashcache_do_handler来处理队列。数据计划读取,接收BIO,首先,根据BIO-> BI_sector,即硬盘扇区号,在SSD上获取一组。然后,在set内查找是否命中,如果命中,将硬盘的扇区编号转换为SSD的扇区编号,然后将该bio提交给SSD进行读取;如果失败,首先将bio发送到硬盘驱动器,从硬盘读取数据,读取完成后,通过回调函数启动对SSD的回写操作,将bio的扇区号转换为SSD的=扇区号,然后发送到SSD驱动器,将从硬盘读取的数据写入SSD。写入不是直接写入硬盘,而是写入SSD,类似于文件系统的页缓冲区,保持阈值(一般为20%),当脏块数达到这个值时写入磁盘。6、高速缓存模式flashcache支持三种高速缓存模式。在Writeback写入的情况下,它首先写入Cache,然后将块元数据写入脏位,但不会立即写入。备份设备Writethrough当写入时,它将写入缓存,并将数据写入backing设备。如果您知道已经写了backing device,那么对于Writearound写入,它将绕过Cache直接写入backing device。这意味着SSD读取缓存。

安装内核1,升级内核#rpm-ivhkernel-4.4.199-1.x86_64.rpm #rpm-ivhkernel-4.4.199-1.x86_64.rpm2,grub#grub2-set-default0& grub2-mkconfig-o/etc/grub2.cfg3,重新启动#reboot3,安装flashcache1,安装依赖项#yuminstall-y make gcc2,flashcache下载源代码# git clone3,编译安装# cd flashcache/# make# make install4,加载内核模块# modprobe flashcache检查# lsmod| grep flashcacheflashcache1064961dm_mod11059211dm_log,dm_mirror,flashcache5和automload内核模块的新文件/etc/sysconfig/modules/flashcache. modules的内容如下#! /bin/sh/sbin/modinfo-F filename flashcache > /dev/null2>&1if [$nsr-eq0];然后/sbin/modprobe flashcachefi使用权限# chmod +x /等等/sysconfig/modules/flashcache.modules6,创建高速缓存设备#flashcache_create-p back-b4k cachedev /dev/sdc /dev/sdbcachedev ssd_devname/dev/sdc disk_devname/dev/sdbcachemodeWRITE_BACKblock_size8md_block_size8cache_size0Flashcache metadata willuse440MBofyour32172MBmainmemory参数说明-p高速缓存模式有三种类型:writeback、writethrough和writearound。- s缓存大小,可选,如果未指定,则整个SSD设备用于缓存,默认计数单位为扇区扇区,但可以接受k/m/g单位。- b:指定块大小。这是可选的。默认值为4KB。该指数必须是2。默认单位是扇区。你也可以使用K作为单位。