Ceph 和 Enhanceio

将近两年前,我正在撰写使用 Flashcache 的实验结果。今天,这篇博文成为精选文章,这个教程是由 Andrei Mikhailovsky 编写的。感谢他对本博客的贡献 :-)
这里有一个关于安装和使用 EnhanceIO 的教程,它又是另一个用于您的 OSD 服务器的块级别缓存解决方案。从描述页面来看,它是
EnhanceIO 是一个动态的块级别缓存,通过使用 SSD 作为缓存设备来提高旋转硬盘驱动器的性能。EnhanceIO 源自 Flashcache 项目,但它不使用设备映射器,并且可以在使用源卷(即挂载)时创建和删除缓存。EnhanceIO 支持三种缓存模式:只读、写入穿透和回写,以及三种缓存替换策略:随机、FIFO 和 LRU。
这使其成为您 Ceph OSD 旋转磁盘的理想解决方案。它以内核模块和用户端 CLI 工具的形式提供,用于创建、管理和删除缓存设备。它非常易于实现,并且可以在现有的包含文件系统和数据的块设备之上工作。无需准备后端设备并迁移数据。只需一个 CLI 命令,您就可以开始使用。
在本教程中,我使用的是带有最新更新和 Trusty 版本内核的 Ubuntu 12.04 LTS。所以,让我们开始吧。
要获取 EnhanceIO 内核模块,只需添加以下 Ubuntu 仓库
bash $ sudo apt-add-repository ppa:enhanceio/daily $ sudo apt-get update $ sudo apt-get install -y enhanceio-dkms
如果您遇到任何问题,可能需要安装一些依赖项,如下所示
bash $ sudo apt-get install build-essential dkms linux-headers-generic-lts-trusty
编译并安装模块后,使用以下命令加载它们
bash $ sudo modprobe enhanceio_lru
或者,如果您计划使用 FIFO 缓存策略,请使用
bash $ sudo modprobe enhanceio_fifo
接下来,您需要从 github 获取主分支并复制用户端 CLI 工具及其 man 页面
bash $ sudo mkdir /usr/src/enhanceio && cd /usr/src/enhanceio $ sudo wget https://github.com/stec-inc/EnhanceIO/archive/master.zip $ sudo unzip master.zip && cd EnhanceIO-master/CLI $ sudo cp eio_cli /sbin/ && chmod 700 /sbin/eio_cli $ sudo cp eio_cli.8 /usr/share/man/man8/
有关如何使用 eio_cli 工具的更多信息,请参阅 man eio_cli。
接下来的步骤将取决于您的需求和预算。如果您的基础设施允许,您可以使用单个 SSD 缓存磁盘来代替单个 OSD HDD 磁盘,但是,并非每个人都能做到这一点。对于我的测试设置,我正在使用单个 SSD 磁盘来代替 3 个 OSD HDD 磁盘。因此,我需要将 SSD 磁盘分区并创建三个分区,每个分区对应一个 OSD 设备。我还在留下一些可用空间(大约是 SSD 完整容量的 10%)以延长 SSD 磁盘的寿命。在我的测试中,我还发现 SSD 磁盘上的某些空闲未分区空间可以保持写入性能,因为某些 SSD 磁盘在没有额外空闲空间的情况下,性能会急剧下降。
因此,假设我的 Crucial 缓存 SSD 设备是 /dev/sdb,我的 Ceph OSD HDD 是 /dev/sdd、/dev/sde、/dev/sdf。
像这样对 SSD 磁盘进行分区
bash $ sudo parted -a optimal /dev/sdb $ (parted) mklabel gpt $ (parted) mkpart primary 0% 30% $ (parted) mkpart primary 30% 60% $ (parted) mkpart primary 60% 90% $ (parted) quit
确保根据您的需要调整百分比。对磁盘进行分区后,您应该看到类似以下内容,以指示您的分区已完成
bash $ ls -l /dev/sdb* brw-rw---- 1 root disk 8, 16 Oct 4 12:38 /dev/sdb brw-rw---- 1 root disk 8, 17 Oct 1 09:08 /dev/sdb1 brw-rw---- 1 root disk 8, 18 Oct 1 09:08 /dev/sdb2 brw-rw---- 1 root disk 8, 19 Oct 1 09:08 /dev/sdb3
注意:设置缓存后,CLI 工具会自动为每个缓存设备创建一个 udev 规则。为了避免服务器重新启动后块设备名称更改可能导致的问题,我强烈建议使用 /dev/disk/by-id/ 文件夹中的块设备名称,而不是在 /dev/ 中。因此,在 /dev/disk/by-id/ 中找到您的 SSD 和 OSD HDD 磁盘。我的 Crucial SSD 及其刚刚创建的分区显示为
/dev/disk/by-id/scsi-SATA_Crucial_CT512MX_14300CC4FF69 -> ../../sdb
/dev/disk/by-id/scsi-SATA_Crucial_CT512MX_14300CC4FF69-part1 -> ../../sdb1
/dev/disk/by-id/scsi-SATA_Crucial_CT512MX_14300CC4FF69-part2 -> ../../sdb2
/dev/disk/by-id/scsi-SATA_Crucial_CT512MX_14300CC4FF69-part3 -> ../../sdb3
以及 OSD HDD 磁盘显示为
/dev/disk/by-id/wwn-0x5000cca01a9acbac -> ../../sdd
/dev/disk/by-id/wwn-0x5000cca01a9acbac-part1 -> ../../sdd1
/dev/disk/by-id/wwn-0x5000cca01a9acbac-part2 -> ../../sdd2
/dev/disk/by-id/wwn-0x5000cca01a9b0150 -> ../../sde
/dev/disk/by-id/wwn-0x5000cca01a9b0150-part1 -> ../../sde1
/dev/disk/by-id/wwn-0x5000cca01a9b0150-part2 -> ../../sde2
/dev/disk/by-id/wwn-0x5000cca01a9b030c -> ../../sdf
/dev/disk/by-id/wwn-0x5000cca01a9b030c-part1 -> ../../sdf1
/dev/disk/by-id/wwn-0x5000cca01a9b030c-part2 -> ../../sdf2
好了,现在一切准备就绪。下一步将是添加您的第一个缓存设备。我正在使用写入穿透缓存模式,因为我为 Ceph 日志单独使用了一个 SSD,我认为这是推荐的方法。
运行以下命令以创建您的第一个 enhanceio 缓存策略
bash $ sudo eio_cli create -d /dev/disk/by-id/wwn-0x5000cca01a9acbac \ -s /dev/disk/by-id/scsi-SATA_Crucial_CT512MX_14300CC4FF69-part1 \ -m wt \ -c OSD_0_CACHE
其中
'-d' is the OSD HDD block device
'-s' is the SSD cache partition
'-m wt' is the writethrough cache mode
'-c' is just the cache name
您应该得到类似以下输出
Cache Name : OSD_0_CACHE
Source Device : /dev/disk/by-id/wwn-0x5000cca01a9acbac
SSD Device : /dev/disk/by-id/scsi-SATA_Crucial_CT512MX_14300CC4FF69-part1
Policy : lru
Mode : Write Through
Block Size : 4096
Associativity : 256
ENV{ID_SERIAL}=="35000cca01a9ae7f4", ATTR{partition}=="1"
ENV{ID_SERIAL}=="Crucial_CT512MX_14300CC4FF69", ATTR{partition}=="1"
重复上述 eio_cli 命令,为剩余的两个 OSD HDD 更改相应的 -d、-s 和 -c 标志。
您可以从 /proc/enhanceio/<cache name>/ 文件夹中找到缓存状态信息
bash $ ls -la /proc/enhanceio/OSD_0_CACHE/ total 0 dr-xr-xr-x 2 root root 0 Oct 4 12:59 . dr-xr-xr-x 3 root root 0 Oct 4 12:59 .. -r--r--r-- 1 root root 0 Oct 4 12:59 config -r--r--r-- 1 root root 0 Oct 4 12:59 errors -r--r--r-- 1 root root 0 Oct 4 12:59 io_hist -r--r--r-- 1 root root 0 Oct 4 12:59 stats
通过执行以下操作查看缓存统计信息
```bash $ sudo cat /proc/enhanceio/OSD_0_CACHE/stats
reads 324560 writes 178624 read_hits 152 read_hit_pct 0 write_hits 42936 write_hit_pct 24 dirty_write_hits 0 dirty_write_hit_pct 0 cached_blocks 57443 rd_replace 10 wr_replace 15 noroom 0 cleanings 0 md_write_dirty 0 md_write_clean 0 md_SSD_writes 0 do_clean 0 nr_blocks 26263808 nr_dirty 0 nr_sets 102593 clean_index 0 uncached_reads 1102 uncached_writes 3721 uncached_map_size 0 uncached_map_uncacheable 0 disk_reads 324408 disk_writes 178624 SSD_reads 152 SSD_writes 502680 SSD_readfills 324408 SSD_readfill_unplugs 1084 readdisk 1102 writedisk 1102 readcache 19 readfill 40551 writecache 62835 readcount 1117 writecount 3721 kb_reads 162280 kb_writes 89312 rdtime_ms 16284 wrtime_ms 465928 ```
您可能需要运行以下命令(在 screen 会话中)以跟踪缓存读取命中百分比
bash $ sudo watch -n60 "cat /proc/enhanceio/OSD_*_CACHE/stats |grep read_hit_pct"
现在,您可能需要运行一些基准测试来查看您的缓存性能以及使用它获得的性能提升。我使用了一个简单的 dd 测试,并同时在 20 个来宾虚拟机上运行它。我使用的命令从根卷读取 4GB
bash $ dd if=/dev/vda of=/dev/null bs=1M count=4000 iflag=direct
我确保读取的数据量大大超过 OSD 服务器上的总 RAM,否则您的测试中的很大一部分将来自 OSD 服务器的 RAM 而不是缓存磁盘。第一次运行基准测试时,您应该看到缓存 SSD 磁盘上的大量写入 IO。您的缓存磁盘正在被来宾虚拟机请求的数据填充。第二次、第三次、第四次运行基准测试应该显示大量的读取 IO 以及来自缓存磁盘的少量写入 IO。这表明数据正在从 SSD 磁盘提供,而不是您的慢速 HDD。在我的集群上,dd 测试获得了大约 4-5 倍于未使用缓存磁盘的吞吐量。读取命中百分比接近 75%。我对结果非常满意,但是,我意识到实际的性能数据不会像测试基准测试那样好。它们永远不会是。我在生产中使用集群大约两周的平均读取命中率约为 20%。总的来说,我注意到来宾虚拟机响应速度有所提高,我的 HDD 磁盘利用率也下降了。
所以,这就是了,无需大费周章,我们就有了一个使用快速 SSD 的 Ceph 集群的有效缓存解决方案。我建议您在将 EnhanceIO 用于生产环境之前进行长期测试。