做过存储业务的同学都知道,有些数据块存取频率高("热"区块),有些数据存取频率低("冷区块")。如果不分冷热地一律使用高速的SSD存储是很不划算的。
小编也遇到了同样的问题。于是想到了ceph的自动分层存储的功能,既能保证"冷区块"可以访问,又能保证"热区块"可以应对并发必然是很好的。
分层存储的方式也分为write back、read forward、read proxy、write proxy、read only五种,具体采用哪中,接下来就要动手验证了。
1. 测试组网
设备信息
2. 测试方法及思路
基本思路:将设置缓存前和设置缓存后的测试结果进行比较
使用的工具:rados命令、dd命令
注:rados是ceph自带的压力测试工具;dd是linux自带的简单的读写测试工具;(由于小编常用cephfs,所以测试也用到此工具)
注意事项:
为了避免操作系统缓存对dd命令的影响,测试文件最好超过内存大小;
当读文件测试时,应先将内存sync到磁盘后再进行读操作;
为节省时间,应先用rados确定选型,然后用dd命令验证.
3. 测试前准备
3.1 osd分布结构
[root@ceph01 crush]# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-7 0.18999 rack vrack
3 0.18999 osd.3 up 1.00000 1.00000
-6 0.23799 rack r1
-5 0.23799 host ceph04
4 0.11899 osd.4 up 1.00000 1.00000
5 0.11899 osd.5 up 1.00000 1.00000
3.2 副本分布规则
#cephfs_data使用此规则
rule sata_ruleset {
ruleset 1
type replicated
min_size 1
max_size 10
step take r1
step take ceph04
step chooseleaf firstn 0 type osd
step emit
}
#cache_data使用此规则
rule ssd_ruleset {
ruleset 2
type replicated
min_size 1
max_size 10
step take vrack
step choose firstn 1 type osd
step emit
}
#cephfs_matadata使用此规则
rule meta_ruleset {
ruleset 3
type replicated
min_size 1
max_size 10
step take vrack
step chooseleaf firstn 1 type osd
step emit
step take r1
step take ceph04
step chooseleaf firstn -1 type osd
step emit
}
4. 测试场景及结果
1) 单盘不挂载云存的读写测试:
测试场景:
以4MB的块大小顺序写10240次;
以4MB的块大小顺序读10240次;
测试结果:
磁盘 |
写(MB/s) |
读(MB/s) |
STAT硬盘 |
116MB/s |
117MB/s |
SSD硬盘 |
355MB/s |
548MB/s |
2) ceph不启用缓存测试:
测试场景:
以4MB的块大小顺序写10240次;
以4MB的块大小顺序读10240次;
测试结果:
Cephfs磁盘 |
写(MB/s) |
读(MB/s) |
STAT硬盘 |
20.2 |
25.7 |
PS:结果经过多次测试,可以确保并非是偶然因素引起。可见cephfs对硬盘的读写速度损失很大,小编用的ceph版本为10.2.9,操作日志写磁盘、两个osd处于同一个磁盘的不同分区上、网络链路中有瓶颈、多osd和mds间的消息交互都有可能是造成此问题的原因。事实上,在长期操作的经验看,cephfs只会损失一半的读写速率。由于本次实验以验证分层缓存为主,此结果并不会影响测试。
3) 缓存模式筛选测试
测试场景:
使用rados bench对writeback、forward、readyonly、readforward、proxy、readproxy六种模式进行测试验证。
测试结果:
mode |
写 (MB/s) |
读 (MB/s) |
二次写 (MB/s) |
第二次读 (MB/s) |
释放内存 再读(MB/s) |
writeback |
19.301 |
96.201 |
19.344 |
94.432 |
97.513 |
forward |
20.042 |
97.392 |
20.118 |
92.051 |
97.045 |
readyonly |
20.641 |
97.175 |
18.889 |
96.971 |
97.332 |
readforward |
229.658 |
528.840 |
216.601 |
535.137 |
531.429 |
proxy |
19.666 |
97.306 |
20.181 |
93.732 |
97.401 |
readproxy |
230.313 |
531.249 |
158.207 |
540.413 |
547.318 |
注:所有模式的测试都是先写后读,命中率高,因此读的速率要偏高。切换模式测试时,用"rados -p poolname cleanup"命令清除测试数据,保证两个模式之间的测试不会相互影响。
4) 启用目标缓存模式测试
测试场景:
以4MB的块大小顺序写10240次;
以4MB的块大小顺序读10240次。
测试结果:(启用的缓存模式为readproxy)
Cephfs磁盘 |
写(MB/s) |
读(MB/s) |
SSD硬盘 |
147 |
296 |
同时dstat命令监控网卡,可以发现,当写完成后,在高速存储和低速存储的主机之间有持续的流量进行交互。
5. 测试结论
因为小编面对的场景是"先写再读,保证最终结果的可用性",因此测试方法也是先写再读。当缓存miss时,forward对应的是重定向,proxy会对应修改cache pool的操作。
从测试结果看,针对先写后读的场景,readforward和readproxy,是先写cache pool返回,然后将数据同步到basepool的,而其他模式都是先保证写到base pool,然后读取的。
当然,分层存储的功能还不止于做数据的冷热分离,社区中有人用分层存储来实现ceph的"两地三中心"的部署方式。既保证本地提供高质量的服务,又可以保证数据在异地有备份,你想到了么?
关注我们的公众号,获取更多有料的软硬件知识