PureFlash是一个开源的分布式存储系统,项目起始于2016年。本文介绍将介绍PureFlash系统的主要特点,以及基于容器的快速上手体验。
PureFlash的开源项目位置:https://github.com/cocalele/PureFlash
一、PureFlash整体介绍
PureFlash是一个开源的ServeSAN实现,也就是通过大量的通用服务器,加上PureFlash的软件系统,构造出一套能满足企业各种业务需求的分布式SAN存储。
PureFlash是为全闪存时代而设计的存储系统。当前SSD盘的应用越来越广泛,大有全面取代HDD的趋势。SSD与HDD的显著区别就是性能差异,这也是用户体验最直接的差异,而且随着NVMe接口的普及性能差异越来大,这种近百倍的量变差异足以带来架构设计上的质变。举个例子,原来HDD的性能很低,远远低于CPU、网络的性能能力,因此系统设计的准则是追求HDD的性能最大化,为达到这个目标可以以消耗CPU等资源为代价。而到了NVMe时代,性能关系已经完全颠倒了,盘不再是瓶颈,反而CPU、网络成为系统的瓶颈。那种消耗CPU以优化IO的方法只能适得其反。
因此我们需要一套全新的存储系统架构,以充分发挥SSD的能力,提高系统的效率。PureFlash的设计思想以简化IO stack, 数据通路控制通路分离,快速路径优先为基本原则,确保高性能与高可靠性,提供云计算时代块存储核心能力。
二、功能特性
1. 单副本与多副本任意选择,允许每个volume使用不同的副本数,提供不同的可靠性等级
2. 精简置备,即thin provision。能够实现云计算时代需要的存储虚拟化,存储超卖等关键特性。而且可以提供超过单节点容量能力的超大容量Volume
3. 瞬时快照能力,PureFlash采用inplace 快照技术,能够瞬时完成快照且不占用额外的存储空间
4. Scale out能力,可以随时通过增加节点的方式扩展系统的总体容量,即便是运行期间也可以进行扩容。
5. 强一致性,使用强一致性,确保企业数据正确性、确保核心业务正确运行
6. 允许共享访问,同一个Volume允许从多个Client同时访问,可以用于支撑Oracle RAC类共享盘业务
7. 故障冗余,容忍各种单点故障,包括网络故障,网卡故障,SSD故障,节点整机故障
8. 可控数据恢复,当硬件故障恢复后,可以对数据进行恢复,并且可以控制恢复的时间与资源占用情况
9. 可控数据均衡,系统长时间使用后可能数据分布不均衡,可控均衡功能可以在节点间均衡数据分布。并且均衡的时间与资源占用率都可以控制,以减少对正常业务的冲击
10. 多网卡与多路径支持,每个节点可以有多个网卡,这些网卡都处于活动状态以提供更高的IO吞吐能力,并且在一个网卡故障时可以自动把IO迁移到其他网卡而不影响客户端访问。
11. 简化的io stack,PureFlash以提供块存储为目标,为将SSD性能毫无损失的发挥出来,避免使用任何多余的中间IO层级,因此既没有使用本地文件系统,也没有使用K-V系统进行本地数据管理。使用本地文件系统或者KV做本地数据管理在分布式存储系统中很常见,但同时也带来了性能损失,系统复杂度上升,bug概率增加。PureFlash则完全避免了这一点。
12. 扩容稳定性,PureFlash系统使用非hash设计,新节点加入集群后,不需要均衡就可以立即开始承载业务,保证既有业务稳定运行,避免均衡带来的冲击。
13. 最小资源消耗,适合超融合部署。PureFlash设计中没有使用SPDK这样的IO接口。SPDK虽然能带来一些IO性能收益,但是付出的代价是CPU资源的大量浪费,在没有IO时候也要处于忙等待状态中。这对超融合系统是致命的,存储任务一直占用CPU资源,而不能出让给计算任务使用,背离超融合的基本理念。PureFlash只消耗与IO能力成比例的CPU、内存、网络资源,并且可以通过参数配置最大资源消耗量,因而十分适合超融合系统。
三、安装运行
一个完整的PureFlash集群包括: zookeeper集群、MariaDB集群、jconductor集群、PureFlashStore集群。要想具备基本的高可用能力,需要至少3个物理节点,然后将这些服务融合部署在这3个节点上。如此多的功能模块,和如此多的节点,如果从0开始部署的话还是个比较繁重的任务。然而作为测试部署,这些模块都可以简化成单节点并且部署到单个容器里。我们从容器开始运行,读者可以快速对PureFlash有个体验。容器镜像位置:https://hub.docker.com/r/pureflash/pureflash
首先,让我们通过下面的命令拉取和启动容器:
# docker pull pureflash/pureflash:1.0
# docker run -it --rm pureflash/pureflash:1.0
容器启动的时候,会首先初始化一个约20G的数据文件代替SSD,整个初始化过程大概有1分钟左右。等看到命令提示符就说明初始化好了。
启动后就可以使用了,PureFlash提供了命令行工具,来查看管理集群,
# pfcli list_store
+----+---------------+--------+
| Id | Management IP | Status |
+----+---------------+--------+
| 1 | 127.0.0.1 | OK |
+----+---------------+--------+
# pfcli list_disk
+----------+--------------------------------------+--------+
| Store ID | uuid | Status |
+----------+--------------------------------------+--------+
| 1 | 9ae5b25f-a1b7-4b8d-9fd0-54b578578333 | OK |
+----------+--------------------------------------+--------+
作为测试,我们来创建一个单副本的volume(这个环境只有一个store节点,也只能创建单副本的Volume)。
# pfcli create_volume -v test_v1 -s 2G --rep 1
+------------+---------+------------+----------+--------+
| Id | Name | Size | RepCount | Status |
+------------+---------+------------+----------+--------+
| 1107296256 | test_v1 | 2147483648 | 1 | OK |
+------------+---------+------------+----------+--------+
同时容器里面还打包了两个测试工具:pfdd和fio. 前者就是像dd工具一样,可以向volume里面写入或者读出数据。而fio是著名的性能测试工具,大家可以试一试在容器里的性能如何。
# pfdd --rw write --if /dev/zero -v test_v1 --bs 4k --count 10
# fio -name=test -ioengine=pfbd -volume=test_v1 -iodepth=2 -rw=randwrite -size=2G -bs=4k -direct=1
最后,列出PureFlash系统相关的git库:
PureFlash存储服务pfs: https://github.com/cocalele/PureFlash.git
PureFlash控制服务jconductor: https://github.com/cocalele/jconductor.git
增加了pfbd engine的fio: https://gitee.com/cocalele/fio.git
增加了pfbd支持的qemu: https://gitee.com/cocalele/qemu.git
欢迎各位朋友参与此项目,创造全闪时代的云存储基石!本人V_X 号:vivenas ,欢迎联系。