一、目的
- 调研体验鹏云块存储系统(开源版本) https://github.com/zettastor/dbs 并且进行相关性能测试和异常测试
- 对比Curve块存储,包括特性支持以及大小io的性能
二、鹏云存储系统(开源版本)流程体验
部署
按照鹏云提供的文档进行了操作系统的重装CentOS 7 (没有提供别的OS的支持,可能有售卖的产品形态有关)
问题:
- 无法完成多节点元数据库(高可靠)的安装部署,后续使用single模式元数据来运行
- 部署脚本存在错误,已有人提了issue,是同一个问题
- ssh要求使用用户名/账户来登录,不安全,并且解析的脚本存在问题,密码无法带空格,没有看到可以指定ssh port的地方
- 部署脚本无法正确的清理部署失败的环境,需要手动介入,无文档,全靠猜加运气
使用挂载
- web控制台使用体验不错,可以顺利完成添加节点(需要机器已有服务进程),添加硬盘,创建存储域/存储池/存储卷
- 只能使用控制台来进行操作,无法脱离控制台在terminel直接交互,效率很低,比方说挂载10个卷到机器上需要手点三十多次,一次挂载可能需要点三四次
- 可以使用提供的2种挂载方式挂载,包括iscsi和pyd内核ko,但是实际走的都还是需要走一个driver进程,内核的ko那个其实意义不大
- 挂载后在fio测试中遭遇过fio hang住,集群崩溃的情况,无法复现,原因未知
- 提供了基本的权限控制,qos等功能
一些运维和操作尝试
- 官网没有提供运维文档,基本的重启服务等操作都不知道如何完成
- 试图在页面缩容(从存储池删除一个盘),好像什么也没有发生,底下无io,不知道该如何触发数据的迁移
- 使用megacli删除硬盘,再添加回来会导致集群异常,不知道如何修复
关键feature提供情况(对比curve)
功能
|
鹏云开源
|
CurveBS
|
多os适配
|
不支持,需要修改,可能与产品售卖形态有关
|
支持
|
web页面访问和控制
|
有
|
无,在开发,监控可用普罗米修斯接入
|
命令行访问和控制
|
无
|
有
|
存储域、存储池、存储节点、存储盘的管理(增/减)
|
有
|
可以在保证三副本的情况下缩容,已有pool无法扩容盘和节点
|
支持的数据副本策略
|
两副本,三副本,三副本(可靠)
|
三副本
|
卷的创建删除
|
支持,可选择存储域和存储池位置(即物理节点和硬盘范围)
|
支持,不可选择存储池位置,条带卷需要额外设置参数
|
卷的扩缩容
|
支持扩容
|
支持
|
卷的快照及克隆
|
不支持
|
支持
|
卷的挂载协议支持
|
iscsi和私有pyd协议,支持多挂载,支持CHAP认证和用户认证
|
iscsi和私有curve协议,支持多挂载
|
卷的访问控制
|
CHAP认证;控制用户和节点
|
不支持
|
卷的QoS
|
可设置总iops和总带宽;
可以限定时间段进行设置
|
可以单独设置读写iops和读写带宽
|
web端操作日志审计
|
支持
|
无
|
web端用户管理
|
支持,并且支持细分权限的设置
|
无
|
整体感受
- 系统部署和清理体验糟糕
- web控制台基本功能体验良好
- 运维缺乏文档,开源版体验糟糕
三、性能对比测试
测试环境说明
3台服务器,配置如下:
- DELL PowerEdge R730xd 处理器:Intel(R) Xeon(R) CPU E5-2670 v3 @ 2.30GHz *2 (24c48t)
- RAID控制器:DELL PERC H730 Mini
- 内存:256G
- 网卡:20G
- 硬盘:INTEL S3510 1.6T SATA SSD (SSDSC2BB016T6) *10
- 测试硬盘使用相同的单盘RAID0,WRITE THROUGH,ADRA模式,关闭磁盘缓存
操作系统信息如下:
# cat /etc/redhat-release CentOS Linux release 7.7.1908 (Core) # uname -a Linux server041 3.10.0-1062.el7.x86_64 #1 SMP Wed Aug 7 18:08:02 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
测试方案说明
创建5个105G的卷,先完整写入100G,然后以下几组测试:
- 4k单卷:不同iodepth(1,4,16,64,128,256)的随机读写
- 4k多卷:固定iodepth为128时的2,3,4,5卷的随机读写
- 512k单卷:不同iodepth(1,4,16,64,128,256)的顺序读写
- 512k多卷:固定iodepth为128时的2,3,4,5卷的顺序读写
鹏云dbs使用fio libaio+iscsi挂载,curvebs使用fio的cbd引擎
每组测试的每个case运行10分钟,进行下一个测试,测试连续运行,一轮大约8小时
curve为4MB*8的条带卷
提示1:读性能的数据受到测试数据量和缓存的影响,相比正常值会偏高,仅供参考
提示2:单盘RAID0,WRITE THROUGH,ADRA模式磁盘整体性能不是最佳设定,这里
由于测试时间关系和前后保持一致,沿用这个设置,具体情况可以参考文章 #todo
测试中主要关注以下指标:
- 4k随机读写的iops最小/最大/平均值以及时延的平均值/99th值/90th值
- 512k顺序读写的带宽最小/最大/平均值
测试结果
4k单卷写
curve性能略优于dbs
software
|
iodepth
|
iops_min
|
iops_max
|
iops_avg
|
clat_avg_us
|
clat90th
|
clat99th
|
dbs
|
1
|
933
|
1809
|
1400
|
596
|
717
|
873
|
curve
|
1
|
515
|
1188
|
1115
|
887
|
930
|
1237
|
dbs
|
4
|
5823
|
9419
|
7898
|
429
|
469
|
693
|
curve
|
4
|
4890
|
5866
|
5591
|
709
|
717
|
963
|
dbs
|
16
|
16430
|
26731
|
21126
|
607
|
701
|
1418
|
curve
|
16
|
19390
|
21796
|
20763
|
764
|
766
|
1090
|
dbs
|
64
|
26217
|
50000
|
35714
|
1394
|
1827
|
3425
|
curve
|
64
|
19114
|
46822
|
45283
|
1403
|
1418
|
4752
|
dbs
|
128
|
14158
|
58067
|
34047
|
3010
|
10945
|
20841
|
curve
|
128
|
34914
|
48262
|
47416
|
2689
|
2704
|
7832
|
dbs
|
256
|
16906
|
60712
|
42719
|
5970
|
7000
|
30000
|
curve
|
256
|
36462
|
48314
|
47678
|
5358
|
5342
|
10683
|
dbs直接管理裸盘,单深度的io延迟比较低,但是压力增大后呈现出了延迟波动大的状况,可能与一个节点一个datanode管理所有的硬盘,以及java代码的gc(观察日志,有时候gc会到几百毫秒甚至秒级)有一定关联。
并且在测试中发现,dbs的segment的分配不均匀,会出现有的硬盘io为0的情况,不知道如何改善,多卷也存在这样的情况。看控制台能看到有的盘分配较少,有的较多,在集群大规模下可能情况会有一定的改善。
4k多卷写
4k多卷性能curve优于dbs,dbs在高压力下呈现出很奇怪的状态,性能会下降,多卷写测试是在单卷后紧跟着运行的,可能是单卷测试运行对java程序累积的压力,包括gc、缓存等,以及前面说的有的硬盘io为0的情况。
512k单卷写
512k多卷写
4k单卷读
4k多卷读
512k单卷读
512k多卷读
因为测试数据量比较有限,读测试跑的久一点之后基本就是读缓存了,大io顺序读下差不多,小io大iops下鹏云的性能较差,可能原因有直接管理裸盘和自身缓存大小/策略,鹏云datanode进程内存一般固定在47g左右。
四、异常测试
主要测试了常见的坏盘和节点异常场景
- 坏盘:使用megacli直接删除vd来模拟的
- 鹏云:抖动1s
- curve:抖动1s
- 机器hang住:使用给进程发SIGSTOP来模拟
- 鹏云:抖动1s
- curve:抖动1s