鹏云DBS调研及对比测试

一、目的

  1.  调研体验鹏云块存储系统(开源版本) https://github.com/zettastor/dbs 并且进行相关性能测试和异常测试
  2. 对比Curve块存储,包括特性支持以及大小io的性能

二、鹏云存储系统(开源版本)流程体验

部署

按照鹏云提供的文档进行了操作系统的重装CentOS 7 (没有提供别的OS的支持,可能有售卖的产品形态有关)
问题:
  1. 无法完成多节点元数据库(高可靠)的安装部署,后续使用single模式元数据来运行
  2. 部署脚本存在错误,已有人提了issue,是同一个问题
  3. ssh要求使用用户名/账户来登录,不安全,并且解析的脚本存在问题,密码无法带空格,没有看到可以指定ssh port的地方
  4. 部署脚本无法正确的清理部署失败的环境,需要手动介入,无文档,全靠猜加运气
使用挂载
  1. web控制台使用体验不错,可以顺利完成添加节点(需要机器已有服务进程),添加硬盘,创建存储域/存储池/存储卷
  2. 只能使用控制台来进行操作,无法脱离控制台在terminel直接交互,效率很低,比方说挂载10个卷到机器上需要手点三十多次,一次挂载可能需要点三四次
  3. 可以使用提供的2种挂载方式挂载,包括iscsi和pyd内核ko,但是实际走的都还是需要走一个driver进程,内核的ko那个其实意义不大
  4. 挂载后在fio测试中遭遇过fio hang住,集群崩溃的情况,无法复现,原因未知
  5. 提供了基本的权限控制,qos等功能
一些运维和操作尝试
  1. 官网没有提供运维文档,基本的重启服务等操作都不知道如何完成
  2. 试图在页面缩容(从存储池删除一个盘),好像什么也没有发生,底下无io,不知道该如何触发数据的迁移
  3. 使用megacli删除硬盘,再添加回来会导致集群异常,不知道如何修复
关键feature提供情况(对比curve)
功能
鹏云开源
CurveBS
多os适配
不支持,需要修改,可能与产品售卖形态有关
支持
web页面访问和控制
无,在开发,监控可用普罗米修斯接入
命令行访问和控制
存储域、存储池、存储节点、存储盘的管理(增/减)
可以在保证三副本的情况下缩容,已有pool无法扩容盘和节点
支持的数据副本策略
两副本,三副本,三副本(可靠)
三副本
卷的创建删除
支持,可选择存储域和存储池位置(即物理节点和硬盘范围)
支持,不可选择存储池位置,条带卷需要额外设置参数
卷的扩缩容
支持扩容
支持
卷的快照及克隆
不支持
支持
卷的挂载协议支持
iscsi和私有pyd协议,支持多挂载,支持CHAP认证和用户认证
iscsi和私有curve协议,支持多挂载
卷的访问控制
CHAP认证;控制用户和节点
不支持
卷的QoS
可设置总iops和总带宽;
可以限定时间段进行设置
可以单独设置读写iops和读写带宽
web端操作日志审计
支持
web端用户管理
支持,并且支持细分权限的设置
整体感受
  1. 系统部署和清理体验糟糕
  2. web控制台基本功能体验良好
  3. 运维缺乏文档,开源版体验糟糕

三、性能对比测试

测试环境说明
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单卷写
0
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多卷写
0
4k多卷性能curve优于dbs,dbs在高压力下呈现出很奇怪的状态,性能会下降,多卷写测试是在单卷后紧跟着运行的,可能是单卷测试运行对java程序累积的压力,包括gc、缓存等,以及前面说的有的硬盘io为0的情况。
512k单卷写
0
512k多卷写
0
4k单卷读
0
4k多卷读
0
512k单卷读
0
512k多卷读
0
因为测试数据量比较有限,读测试跑的久一点之后基本就是读缓存了,大io顺序读下差不多,小io大iops下鹏云的性能较差,可能原因有直接管理裸盘和自身缓存大小/策略,鹏云datanode进程内存一般固定在47g左右。

四、异常测试

主要测试了常见的坏盘和节点异常场景
  • 坏盘:使用megacli直接删除vd来模拟的
    • 鹏云:抖动1s
    • curve:抖动1s
  • 机器hang住:使用给进程发SIGSTOP来模拟
    • 鹏云:抖动1s
    • curve:抖动1s

基于ChatGPT的code review机器人试用体验

经组内同学孙中夏 推荐,今天在Curve代码库试用了一个基于ChatGPT的代码review机器人,github地址:https://github.com/anc95/ChatGPT-CodeReview

 

具体的执行流程和算法原理我没研究,应该也研究不明白,这里就讲讲怎么在GitHub仓库上配置这个bot,以及实际的review效果如何。

 

ps. OpenAI的key是杭研AI团队提供的,感谢支持~

 

部署配置

参考https://github.com/anc95/ChatGPT-CodeReview#usage这里的描述即可:

  1. 安装这个bot的GitHub APP

  2. 安装好之后,在这个APP页面点“Configure”

  3. 选择你要应用到的账号及代码仓库,注意你要有代码库的管理员权限

  4. 之后进入到代码库的主页,进入“Settings”标签

  5. 进入“Secrets and variables” — “Actions”

  6. 注意切换到“variables” tab项,再点“New repository variable”

  7. 填入name和value,name是“OPENAI_API_KEY”,value就是openai的key了

 

ps. 我用的是GitHub app方案,不是GitHub action,试了action方案没跑起来,有懂行的可以给点指导。

试用效果

尝试创建一个pull request,比如:

PR创建完成后,稍等片刻,就可以看到cr-bot开始review代码了。

 

单就review效率来说,比人工评审代码要快太多倍了,我上面两个提交都是直接从一个分支合并到另外一个,代码改动量很大,但是cr-bot还是几分钟就搞定了,人工的话估计得好几天还不一定review的很细致。

 

review效果感受

大家可以自行去查看上面两个测试PR的review效果,我这里截图几个我觉得有代表意义的代码review结果。

 

上面这个pr,是我去年提交的(golang我只看过基本语法,第一次写实际代码,所以请忽略我粗鄙的编码),这次重新提交一下看看ChatGPT code review bot的效果,可以看出,他指出了我代码里很多问题,其中第3条,是有一个外部curve用户实际遇到过的偶发问题(执行命令卡很久才返回),我自己怎么测都跑不出来,用户那边几乎必现,后来还是组内golang高手小伙伴重构了这段代码才解决。其他几点问题也都是非常有参考价值的。

 

这个评审意见不需要解释,还是比较有效的。

 

 

  • 配置项也能review:

 

 

 

 

增加简单功能的commit可以理解代码意图,这一点还是很不错的。

 

总体来说,还是有不少帮助作用的,至少可以让人工评审节省不少时间,比如bot可以辅助解释新提交代码的作用,指出常见错误,给出改进建议等。

 

如果配合ChatGPT的交流窗口,把有问题的代码片段再次单独交给他评审,可能会有更多的收获:

 

更多细节可以翻阅上面给到的两个测试PR的review记录。

 

不足之处

  1. 多次提交同样的代码,每次给出的review结果是不相同的,可能某次的评审建议是相对更合理且全面的,其他的几次不一定,或许需要多给他review几次,然后再综合几次的评审意见进行代码评估

  2. 无法完整的理解某个大的功能特性的设计方案和实现思路,打个形象的比方,就是组内A同学从来没有参加过功能点X的方案设计和评审工作(主要由B同学负责),然后让A同学直接去review B同学提交的代码,就有类似的效果,只能理解函数或代码片段,没有全局意识

  3. 个别review建议可能不一定正确,需要再进行人工判断,这一点也类似人工review,代码评审人提的建议也不一定是正确的

  4. 太长的新增的源文件,好像会无法评审

  5. 如果没有别的建议,bot会给出一堆通用建议,比如增加UT用例、lint检查、注释、log等等,这一点其实也不能说是不足吧

 

使用Python+selenium抓取职位和公司信息

做这个事情的目的是,想看下全国和江浙沪宁,招聘ceph、块存储相关职位的公司有哪些,再分析下其中哪些公司可以尝试联系起来,看看是否有兴趣用curve。

一开始想着用requests或者更专业的scrapy写爬虫脚本,但是试了requests库之后,发现啥也抓不到,被网站反爬虫了。。。

只能试着用selenium来弄,好几年没用它了,有点生了,折腾了大半天才算能凑合用。

selenium需要自己pip安装,chromedriver需要自己下载:https://sites.google.com/chromium.org/driver/home

输出结果大概长这样:

 

 

本博客访问域名开启HTTPS

使用certbot进行免费域名SSL证书的申请和更新。

因为我的os版本比较低,所以是用snap进行安装,高版本的Ubuntu系统可以直接apt install certbot就能安装了。

最后配置定时任务crontab,定期执行certbot renew操作即可定期更新域名证书。

然后就可以使用https访问域名了,http也会默认跳转到https。

100. 相同的树

题目链接:https://leetcode.cn/problems/same-tree/

自己写了一个,用递归遍历,同步记录遍历的节点到vector,空节点用比较大的负数表示,但是会重复遍历一些子节点(虽然也能正确判断两棵树是否相同)。下面这个是官方答案。另外我也尝试用循环遍历,但是记错了,用了stack,而不是queue。空了试下queue。

 

98. 验证二叉搜索树

题目链接:https://leetcode.cn/problems/validate-binary-search-tree/

没能把中序遍历和搜索二叉树联系起来,看的评论区题解。

 

谁是最亲近的人?

记不清从啥时候开始,只有我老婆记得我的生日。农历生日,真是记不住,连我自己也都不知道农历是什么日子。

犹记得18周岁生日那天在大学宿舍听收音机(是的,收音机,暴露年龄了),广播里的主播说今天是光棍节(11.11,也就是现在的双11),那是我第一次知道还有光棍节这个说法,本来以为4个1,好兆头啊。当时也正被感情困扰(不过单相思罢了),以为这辈子就是光棍命了。

幸好老天眷顾,在研究生快毕业的时候遇到了现在的老婆,还算顺利的过了11年。这几年聚少离多,但感情还算不错,日子也能过得下去(除了俩儿子有点气人)。

希望以后的日子全家人也平平安安,健健康康,顺顺利利。

我老婆常说,孩子长大了就不是自己的了,是他们自己一家子的,只有夫妻才是同路人。

95. 不同的二叉搜索树 II

题目链接:https://leetcode.cn/problems/unique-binary-search-trees-ii/

这题不会,直接看的题解。

 

立个flag

感觉不把flag立起来就一直不能静下心来动手写代码,先立起来,看看啥时候能搞定:

  • 先写一个brpc的服务,学一学brpc怎么玩的,最简单的实现一个http服务(get、post)
  • 再写一个braft应用,在多个节点上实现一个分布式的id查询和自增服务

 

2022-11-09

下载brpc代码库,v1.3版本分支,Ubuntu 22.04上完成编译,完成echo_c++ example代码编译和运行。下一步适当修改,改造成一个http的服务。

2022-11-11

简单改了下Echo示例代码,加了个rpc参数,表示消息长度,改成了http协议:

运行结果:

curl请求:

 

HTTP service,读文件内容:

运行结果:

 

 

 

236. 二叉树的最近公共祖先

题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/

不会做,看的答案。

原理是先遍历二叉树,用hash map记录所有节点的父节点,然后分别遍历p、q节点的父节点并染色(用hash map记录节点是否染色过),遇到重复染色的节点即为二者的共同祖先节点。