随着大数据技术和人工智能技术的发展,各种框架应运而生,比如大数据领域中的MapReduce和Spark,人工智能领域中的TensorFlow和PyTorch等。为了给不同的计算框架提供存储服务,存储的服务类型也是很多,常见的如AWS的S3存储、NFS文件系统和Ceph分布式系统等。

业务的多样化和存储系统的多样化导致计算与存储之间的关系异常复杂,如下是一个计算存储关系的示意图。企业为了维护这种复杂的关系会消耗大流量的精力。有人可能会想,有没有一种方法屏蔽存储之间的差异,为计算提供统一的接口?

想到这里,大家可能会想到我们前面介绍的Linux虚拟文件系统的概念。虚拟文件系统是应用程序和具体文件系统(如Ext4)之间的一个抽象层,为应用程序提供了统一的接口。我们是不是可以在计算和存储系统之间也构建一个这样的抽象层,为不同的计算平台提供统一的接口呢?

Alluxio就是这样一种实现,它实现了多多种存储平台的聚合,为计算平台提供统一的接口。如下是Alluxio在计算和存储系统中的关系图,可以看到Alluxio以存储系统为后端,可以管理S3、HDFS和文件系统等多种类型的存储系统,进而为计算平台提供目前市面上常见协议的接口。

其实Alluxio的功能可不仅仅是实现存储的整合和提供统一的接口,还有很多其他的功能特性。这些特性包括无拷贝的数据管理、基于缓存的数据移动和加速以及基于云的多层数据策略。

Alluxio的基本原理非常简单,首先是Alluxio节点会对后端多种存储系统的资源进行聚合,提供统一的命名空间;其次是其利用Alluxio节点的本地内存和持久化存储将计算平台需要访问的数据缓存起来,提供数据访问加速。

由于Alluxio节点处于计算与存储系统中间,很容想到Alluxio节点可能会成为性能瓶颈。为了避免Alluxio成为性能瓶颈,Alluxio设计时就采用了分布式架构,通过节点的横向扩展可以实现近似线性的性能扩展。

如下图所示是Alluxio的整体架构示意图,Alluxio的节点分为两中不同的角色,一种称为master节点,负责管理元数据和工作流;另外一种称为worker节点,负责本地数据缓存和后端数据交互。可以看出这个架构与HDFS的架构非常类似。这里Master节点采用主从架构,并借助ZooKeeper实现选主。

Alluxio的使用也比较简单,我们可以通过虚拟机部署一个单Master,单Worker的环境。在使用Alluxio需要安装JDK,大家可以自行安装,本文不再赘述这部分的内容。

二进制的安装非常简单,我们只需要从官网下载二级制包,然后解压到本地就可以。具体可以通过如下命令完成。

$tar-xzf alluxio-2.9.2-bin.tar.gz$cd alluxio-2.9.2

下一步可以进行一些基本的配置。压缩包里面有个配置文件的模板,我们可以先拷贝到conf目录下,具体执行如下命令。

$cp conf/alluxio-site.properties.template conf/alluxio-site.properties

设置hostname项,具体方法如下。需要知道的是,这里的localhost也可以替换为本机的IP地址,这样访问会更加方便。

$echo"alluxio.master.hostname=localhost">> conf/alluxio-site.properties

到这里配置就算完成了,是不是很简单!可以运行一下下面的命令,检查一下是否具备了运行Alluxio的条件。

$./bin/alluxio validateEnv local

一切就绪后我们就可以启动Alluxio了。在启动Alluxio服务之前需要先进行格式化,具体命令如下所示。

$./bin/alluxio format

格式化主要是格式化日志目录和Worker的存储目录。完成上述格式化后就可以运行Alluxio服务了。Alluxio提供了一个脚本来启动服务,如下命令可以启动一个Master服务和一个Worker服务。

$./bin/alluxio-start.sh local SudoMount

执行上述命令后可以到如下所示的启动过程。可以看到启动的服务包括Master、Worker、job_master和Proxy等服务。

服务启动成功后可以通过http://localhost:19999查看 Alluxio master 的运行状态,通过访问http://localhost:30000查看 Alluxio worker 的运行状态。如果在配置时localhost是具体的IP地址,那么可以通过具体的IP地址访问上述服务。

如下图所示是登录Master后的控制面板,里面包含服务的状态、日志和配置信息等内容。同时,我们可以通过该GUI浏览存储系统中的资源。

服务起来后我们就能访问其中的存储资源。当然,目前Alluxio并没有任何资源,因此如果想浏览其中的内容,其实什么也看不到。可以通过如下命令浏览其中的内容。

$./bin/alluxio fs ls /

执行上述命令后可以看到什么也没有。我们可以向其中拷贝一些文件,然后再观察一下其中的内容有什么变化。通过如下命令可以将本地文件拷贝到Alluxio中。

$./bin/alluxio fs copyFromLocal /root/test.conf /test.conf_remote

再次执行一下ls命令可以看到我们拷贝的内容。

在上述配置中,我们并没有配置后端存储。Alluxio利用的是本地存储空间,我们可以在Alluxio目录下找到一个名称为underFSStorage的目录,刚才我们拷贝的文件都在这里。

前文我们说了,Alluxio可以是对S3、HDFS、Ceph和Minio等市面上大多数存储系统的对接。实际上Alluxio对接后端存储也非常简单,以对接Minio为例,在配置文件alluxio-site.properties中添加如下内容就可以实现对Minio的对接。

alluxio.master.mount.table.root.ufs=s3:///alluxio.underfs.s3.endpoint=http:///alluxio.underfs.s3.disable.dns.buckets=truealluxio.underfs.s3.inherit.acl=falses3a.accessKeyId=s3a.secretKey=

上面有些配置项需要根据实际情况做更改。比如MINIO_ENDPOINT是IP地址加端口号,比如http://192.168.2.100:9000。