拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Alluxio 集成 Amazon S3 作为底层存储:挂载、认证、加密与权限管控全指南

Alluxio 集成 Amazon S3 作为底层存储:挂载、认证、加密与权限管控全指南 存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载本指南以 Alluxio 官方中文文档 docs/cn/ufs/S3.md 为骨架结合仓库内underfs/s3a模块源码与PropertyKey配置定义展开系统讲解如何将 Amazon S3以及兼容 S3 API 的对象存储挂载为 Alluxio 的底层文件系统涵盖根挂载/嵌套挂载、AWS 凭证解析优先级、服务器端加密、代理与自定义 Endpoint、S3 签名算法、访问控制与故障排查等完整实战内容。读完本文你将能独立完成从环境准备、配置到本地验证的 S3-UFS 接入全流程并理解底层实现的原理与关键参数。概述Alluxio 与 S3 的集成方式Alluxio 通过s3://scheme 访问 Amazon S3底层使用 AWS Java SDKaws-java-sdk-s3实现与 S3 的通信。在仓库源码中这一能力由underfs/s3a模块提供核心实现类为 S3AUnderFileSystem.java其工厂类 S3AUnderFileSystemFactory.java 通过检查路径前缀来决定是否接管该 UFS// S3AUnderFileSystemFactory.supportsPath return path ! null (path.startsWith(Constants.HEADER_S3A) || path.startsWith(Constants.HEADER_S3));其中 Constants.java 定义了s3://与s3a://两个可识别的 header也就是说 Alluxio 同时支持s3://bucket/path与s3a://bucket/path两种写法二者均会被路由到 S3A UFS 实现。S3 本质上是一个键值对象存储而非 POSIX 文件系统因此 Alluxio 将 S3 bucket 视作对象存储型 UFSObjectUnderFileSystem目录在 S3 中以零字节对象 目录后缀的方式表示默认后缀为/对应配置alluxio.underfs.s3.directory.suffix默认值/这一细节在后文零字节文件的故障排查中还会再次出现。初始步骤使用 S3 作为底层存储前需要完成两项准备获取 Alluxio 二进制包可以按照 编译 Alluxio 指南 自行编译或参考 本地运行 Alluxio 下载并解压二进制发行包。准备 S3 bucket 与目录创建一个 bucket或使用已有 bucket并在其中确定一个目录作为 Alluxio 数据的存放位置。下文统一用S3_BUCKET表示 bucket 名称、S3_DIRECTORY表示 bucket 内的目录名。挂载 S3 到 Alluxio 命名空间Alluxio 通过**统一命名空间Unified Namespace**机制屏蔽底层存储系统的差异一个 S3 位置既可以挂载到 Alluxio 命名空间的根目录也可以挂载到任意嵌套目录下从而实现多底层存储的统一访问。根挂载Root Mount使用根挂载时需要编辑conf/alluxio-site.properties配置文件。如果该文件不存在先从模板创建$ cp conf/alluxio-site.properties.template conf/alluxio-site.properties然后在配置文件中指定一个已存在的 S3 bucket 及其中的目录作为根底层文件系统alluxio.master.mount.table.root.ufss3n://S3_BUCKET/S3_DIRECTORY注意文档中的示例使用了s3n://scheme但从 S3AUnderFileSystemFactory 的supportsPath判断来看当前仓库实际可识别的是s3://与s3a://推荐使用这两个 scheme 之一例如s3://S3_BUCKET/S3_DIRECTORY。指定 AWS 凭证Credentials要访问 S3必须提供 AWS 凭证。Alluxio 按从高到低的优先级依次尝试以下凭证来源优先级凭证来源说明1最高挂载选项中的s3a.accessKeyId与s3a.secretKey通过fs mount --option传入仅对该挂载点生效2Java 系统属性中的s3a.accessKeyId与s3a.secretKey通过-D传入 JVM3Alluxio site 属性conf/alluxio-site.properties中的s3a.accessKeyId与s3a.secretKey全局生效4Alluxio 服务器端环境变量AWS_ACCESS_KEY_ID/AWS_ACCESS_KEY二者均可与AWS_SECRET_ACCESS_KEY/AWS_SECRET_KEY二者均可5~/.aws/credentials配置文件标准 AWS CLI 凭证文件6最低AWS 实例配置文件Instance Profile凭证仅当运行在 EC2 实例上时可用这一优先级行为可以在源码中得到印证。S3AUnderFileSystem.createAwsCredentialsProvider 首先检查 Alluxio 配置中是否设置了S3A_ACCESS_KEY即s3a.accessKeyId定义于 PropertyKey.java与S3A_SECRET_KEY即s3a.secretKey定义于 PropertyKey.java若二者均已设置则使用AWSStaticCredentialsProvider直接构造静态凭证否则回退到DefaultAWSCredentialsProviderChain由 AWS SDK 依次检查环境变量、系统属性、配置文件与实例配置文件。// S3AUnderFileSystem.createAwsCredentialsProvider if (conf.isSet(PropertyKey.S3A_ACCESS_KEY) conf.isSet(PropertyKey.S3A_SECRET_KEY)) { return new AWSStaticCredentialsProvider(new BasicAWSCredentials( conf.getString(PropertyKey.S3A_ACCESS_KEY), conf.getString(PropertyKey.S3A_SECRET_KEY))); } // Checks, in order, env variables, system properties, profile file, and instance profile. return new DefaultAWSCredentialsProviderChain();当使用 AWS 实例配置文件作为凭证提供者时需要按以下步骤准备通过访问被挂载的 bucket 创建一个 IAM Role创建一个 Instance Profile作为该 IAM Role 的容器使用创建好的 Instance Profile 启动 EC2 实例。配置完成后Alluxio 即可将 S3 作为底层文件系统运行可参考下文使用 S3 在本地运行 Alluxio小节进行验证。嵌套挂载Nested Mount通过嵌套挂载可以将多个底层存储系统统一挂载到 Alluxio 命名空间的不同目录下。使用 Alluxio 用户 CLI 的fs mount命令并在挂载选项中直接携带凭证$ ./bin/alluxio fs mount \ --option s3a.accessKeyIdAWS_ACCESS_KEY_ID \ --option s3a.secretKeyAWS_SECRET_KEY_ID \ /mnt/s3 s3://S3_BUCKET/S3_DIRECTORY该命令将s3://S3_BUCKET/S3_DIRECTORY挂载到 Alluxio 命名空间的/mnt/s3目录。由于凭证以挂载选项形式指定其优先级高于 site 属性中的凭证配置适合在多租户、多 bucket 场景下按挂载点隔离访问身份。服务器端加密Server-Side EncryptionAlluxio 支持对存储在 S3 中的数据启用服务器端加密。加密仅作用于 S3 上的静态数据当客户端读取时数据以解密后的明文形式传输对上层应用完全透明。在conf/alluxio-site.properties中启用alluxio.underfs.s3.server.side.encryption.enabledtrue对应配置项定义于 PropertyKey.java默认值为false。从源码看该开关有两个层面的影响传输协议在 S3AUnderFileSystem.createInstance 中只要开启了服务器端加密或显式开启alluxio.underfs.s3.secure.http.enabled客户端与 S3 之间的通信协议就会被强制切换为 HTTPS对象写入写对象时S3AUnderFileSystem.java会对ObjectMetadata设置AES_256_SERVER_SIDE_ENCRYPTION即使用 SSE-S3AES-256算法对对象进行服务端加密。DNS-Buckets路径式访问默认情况下访问名为mybucket的 bucket 时请求会被发送到mybucket.s3.amazonaws.com这一虚拟主机风格Virtual-hosted style的地址。若需要改用路径式Path style访问即http://s3.amazonaws.com/mybucket这种形式可设置alluxio.underfs.s3.disable.dns.bucketstrue对应配置项定义于 PropertyKey.java默认值为false描述为使所有 S3 请求采用路径式访问。这一选项在对接某些不兼容虚拟主机风格的 S3 兼容服务尤其是私有部署的对象存储时非常有用。通过代理访问 S3若网络环境要求经过 HTTP 代理访问 S3可在conf/alluxio-site.properties中配置代理主机与端口alluxio.underfs.s3.proxy.hostPROXY_HOST alluxio.underfs.s3.proxy.portPROXY_PORT其中PROXY_HOST与PROXY_PORT分别为代理的主机名和端口。源码层面S3AUnderFileSystem.createInstance 会将这两个配置写入 AWS SDK 的ClientConfigurationsetProxyHost/setProxyPort从而让所有 S3 请求经由代理发出。对应的配置键定义于 PropertyKey.java。配置应用依赖Application Dependency当使用 Alluxio 构建应用程序时应用需要引入对应的 client 模块使用Alluxio file system interface引入alluxio-core-client-fs模块使用Hadoop file system interface引入alluxio-core-client-hdfs模块。以 Maven 为例!-- Alluxio file system interface -- dependency groupIdorg.alluxio/groupId artifactIdalluxio-core-client-fs/artifactId version${alluxio.version}/version /dependency !-- HDFS file system interface -- dependency groupIdorg.alluxio/groupId artifactIdalluxio-core-client-hdfs/artifactId version${alluxio.version}/version /dependency此外也可以将包含凭证配置的conf/alluxio-site.properties拷贝到应用运行时的 classpath 中例如 Spark 场景下的$SPARK_CLASSPATH或将配置文件所在目录追加到 classpath 末尾这样应用侧的 Alluxio client 即可读取到 S3 凭证与相关配置。使用非亚马逊服务提供商自定义 Endpoint如需对接非s3.amazonaws.com的 S3 兼容服务如 MinIO、Ceph RGW、阿里云 OSS 的 S3 兼容端点等需要在conf/alluxio-site.properties中指定自定义端点alluxio.underfs.s3.endpointS3_ENDPOINT将S3_ENDPOINT替换为你的 S3 服务的主机名和端口例如http://localhost:9000。该配置仅在服务提供商不是s3.amazonaws.com时需要设置。对应配置项定义于 PropertyKey.java其描述中还给出了区域端点的示例如北京区域的s3.cn-north-1.amazonaws.com.cn。同族的alluxio.underfs.s3.endpoint.region与alluxio.underfs.s3.region可以进一步指定端点或 bucket 所在区域以降低数据访问延迟。使用 v2 的 S3 签名部分 S3 兼容服务提供商仅支持 v2 签名Signature Version 2。对这类提供商可以通过将签名算法强制指定为S3SignerType来使用 v2 签名alluxio.underfs.s3.signer.algorithmS3SignerType对应配置项定义于 PropertyKey.java。从源码看该值会被写入ClientConfiguration.setSignerOverride(...)见 S3AUnderFileSystem.java从而覆盖 AWS SDK 的默认签名算法。若未设置SDK 会自动协商签名版本。使用 S3 在本地运行 Alluxio配置完成后可以在本地启动 Alluxio 验证集成是否正常$ ./bin/alluxio format $ ./bin/alluxio-start.sh local该命令会启动一个 Alluxio master 和一个 Alluxio worker。启动后可在浏览器中访问http://localhost:19999查看 master Web UI。随后运行内置的测试程序$ ./bin/alluxio runTests运行成功后访问 S3 目录S3_BUCKET/S3_DIRECTORY确认其中已包含由 Alluxio 创建的文件和目录。测试创建的文件名形如S3_BUCKET/S3_DIRECTORY/alluxio/data/default_tests_files/Basic_CACHE_THROUGH验证完毕后停止 Alluxio$ ./bin/alluxio-stop.sh localS3 访问控制当 Alluxio 的安全认证Security功能启用时Alluxio 会遵循底层对象存储的访问权限控制。Alluxio 配置中指定的 S3 凭证代表一个 S3 用户S3 服务端在用户访问 bucket 和对象时会检查该用户的权限若权限不足则抛出权限错误。当 Alluxio 安全认证启用时Alluxio 在第一次将元数据从底层 S3 加载到 Alluxio 命名空间时会同时将 bucket 的 ACL 加载到 Alluxio 的访问权限元数据中。S3 用户到 Alluxio 文件所有者的映射默认情况下Alluxio 会尝试从 S3 凭证中解析对应的 S3 用户名。此外也可以显式配置 S3 规范编号Canonical ID到 Alluxio 用户名的静态映射alluxio.underfs.s3.owner.id.to.username.mappingid1user1;id2user2配置形式为id1user1;id2user2的映射列表。AWS S3 规范编号可以在 AWS 控制台的 IAM 安全凭证页面中展开Account Identifiers选项卡参考Canonical User ID获取。该配置项定义于 PropertyKey.java在 getPermissionsInternal 中通过CommonUtils.getValueFromStaticMapping将 owner id 映射为 Alluxio 用户名未指定映射的 owner id 会回退到默认空用户名。S3 ACL 到 Alluxio 权限的映射Alluxio 通过检查 S3 bucket 的读/写 ACL 来确定文件所有者对 Alluxio 文件的权限模式。举例来说若某 S3 用户对底层 bucket 只有只读权限则挂载目录及其文件的权限模式为0500若该用户拥有**完全控制Full Control**权限则权限模式为0700。这一翻译逻辑在 S3AUtils.translateBucketAcl 中有清晰实现if (perm.equals(Permission.Read)) { // 可读 - 所有者模式加 r-xmode | 0500 } else if (perm.equals(Permission.Write)) { // 可写 - 所有者模式加 -w-mode | 0200 } else if (perm.equals(Permission.FullControl)) { // 完全控制 - 所有者模式加 rwxmode | 0700 }对应的单元测试 S3AUtilsTest.java 验证了这些映射关系例如 Read 权限翻译为0500、FullControl 翻译为0700、其他用户无权限时为0000。需要特别注意的是Alluxio 仅在确定挂载点的文件系统权限时继承 bucket 级 ACL并忽略单个对象的 ACL 设置。此外由于 S3 ACL 中没有组的概念S3A UFS 将文件 owner 同时复用为 group见 getPermissionsInternal 的注释。文件默认权限与多用户访问问题0500或0700只是文件的默认权限非文件所有者的 Alluxio 用户将无法访问该挂载点下的文件。这可能给不同用户读取挂载数据带来实际问题。例如以用户presto运行的 Presto 作业在访问 owner 为john、权限为0700的挂载点时可能报错Query failed: Failed to list directory。在 Alluxio master 日志master.log中可以找到类似如下的错误Erroralluxio.exception.AccessControlException: Permission denied: userpresto, access--x, path/mnt/s3/myobject: failed at s3, inode ownerjohn, inode groupjohn, inode moderwx------这是因为挂载目录权限为0700应用用户presto无法访问。要与 Alluxio 命名空间中的其他用户共享 S3 挂载点可以选择以下两种方案之一方案一将挂载点设为共享。对根挂载在alluxio-site.properties中设置alluxio.master.mount.table.root.sharedtrue对嵌套挂载在fs mount命令中传递--shared参数。共享后所有用户获得rwx权限。注意在 PropertyKey.java 中该配置已被标记为Deprecated根挂载默认值即为true新版建议优先采用方案二。方案二禁用 ACL 继承并调整默认权限。设置alluxio.underfs.s3.inherit.aclfalse alluxio.underfs.s3.default.mode新的非0700默认值其中alluxio.underfs.s3.inherit.acl默认值为true定义于 PropertyKey.java置为false后 Alluxio 不再尝试从 bucket ACL 翻译权限而是统一采用alluxio.underfs.s3.default.mode指定的默认权限该配置默认值为0700定义于 PropertyKey.java也支持别名alluxio.underfs.s3a.default.mode。将其改为如0777之类的宽松值即可允许其他用户访问。补充还有一处与共享相关的配置alluxio.underfs.object.store.mount.shared.publicly默认false定义于 PropertyKey.java用于决定是否将对象存储挂载点向所有 Alluxio 用户公开共享该配置仅对对象存储类 UFS 生效对 HDFS 与本地 UFS 无影响。权限更改chown / chgrp / chmod对 Alluxio 目录或文件执行chown、chgrp、chmod操作不会修改底层 S3 bucket 或对象的权限。这是因为对象存储本身没有 POSIX 意义上的 owner/group/权限位这些操作仅更新 Alluxio 命名空间内的元数据视图。故障排查Troubleshooting启用 AWS-SDK Debug 级别日志如果在特定 S3 后端上运行时遇到问题可以开启额外日志以跟踪 HTTP 网络流量。修改conf/log4j.properties添加以下属性log4j.logger.com.amazonawsWARN log4j.logger.com.amazonaws.requestDEBUG log4j.logger.org.apache.http.wireDEBUG其中com.amazonaws.requestDEBUG会输出每次 S3 请求的详细行org.apache.http.wireDEBUG则记录 HTTP 层的原始网络报文便于定位请求签名、超时或响应异常等问题。防止创建零字节文件Alluxio 为优化性能会在 S3 中创建零字节文件目录标记对象。对于挂载的具有读写访问权限的 bucket零字节文件的创建S3 PUT 操作不仅发生在 Alluxio 写入时也会在列出底层存储内容时发生。若希望完全禁用这类 PUT 操作可以在挂载 bucket 时使用--readonly标记或为根挂载设置alluxio.master.mount.table.root.readonlytrue该配置定义于 PropertyKey.java默认值为false。以只读方式挂载后Alluxio 不会向 S3 发起任何写操作从而避免产生额外的零字节对象。进阶与 S3 通信相关的调优参数在 PropertyKey.java 中S3 UFS 还暴露了一批连接与性能相关的配置可在conf/alluxio-site.properties中按需调整源码中均在 S3AUnderFileSystem.createInstance 内被写入 AWS SDKClientConfiguration配置项默认值说明alluxio.underfs.s3.connections.max1024与 S3 通信的最大并发连接数应不小于管理线程与上传线程之和alluxio.underfs.s3.admin.threads.max20元数据操作Admin线程上限alluxio.underfs.s3.upload.threads.max20数据上传multipart upload线程上限alluxio.underfs.s3.request.timeout1min单个 S3 请求的超时时间设为0表示不超时alluxio.underfs.s3.socket.timeout50sec与 S3 通信的 socket 超时alluxio.underfs.s3.max.error.retrySDK 默认可重试请求的最大重试次数设置后将覆盖 AWS SDK 默认值alluxio.underfs.s3.secure.http.enabledfalse是否使用 HTTPS 协议与 S3 通信alluxio.underfs.s3.connection.ttl-1永不过期连接存活时间alluxio.underfs.s3.streaming.upload.enabledfalse实验特性是否启用流式上传alluxio.underfs.s3.streaming.upload.partition.size64MB流式上传时单个缓冲文件的最大尺寸达到该值即上传并切换缓冲文件alluxio.underfs.s3.bulk.delete.enabledtrue是否启用批量删除对象alluxio.underfs.s3.list.objects.v1关闭是否强制使用 ListObjects V1 API 列举对象例如在带宽受限或 S3 响应偏慢的网络环境中可适当调大alluxio.underfs.s3.request.timeout与alluxio.underfs.s3.socket.timeout而在高并发读写场景下则需保证alluxio.underfs.s3.connections.max不小于admin.threads.max与upload.threads.max之和源码中对此有显式校验与告警日志见 S3AUnderFileSystem.java。小结将 S3 作为 Alluxio 底层存储是构建数据编排 云端对象存储架构的常见组合。核心要点可归纳为四条主线挂载方式根挂载alluxio.master.mount.table.root.ufs适合单一底层存储嵌套挂载alluxio fs mount --option ...适合统一管理多个存储系统凭证管理按挂载选项 → Java 系统属性 → site 属性 → 环境变量 → 凭证文件 → 实例配置文件的优先级提供 AWS 凭证具体解析逻辑在S3AUnderFileSystem.createAwsCredentialsProvider中实现访问安全服务器端加密SSE-S3、HTTPS、代理、自定义 Endpoint、v2 签名等配置覆盖了从 AWS 官方 S3 到私有兼容服务的各种部署场景权限模型S3 ACL 到 Alluxio POSIX 权限的翻译、owner 映射、挂载点共享与默认权限调整是解决多用户访问如 Presto、Spark 作业问题的关键。如需进一步查阅配置项的完整定义与源码细节可分别浏览 PropertyKey.java、S3AUnderFileSystem.java 以及对应的单元测试 S3AUtilsTest.java。赞分享存储分布式文件系统缓存大数据【免费下载链接】alluxioAlluxio, data orchestration for analytics and machine learning in the cloud项目地址https://gitcode.com/gh_mirrors/al/alluxio点击查看免费下载相关推荐Alluxio S3 API 使用指南兼容Amazon S3的分布式存储接口Alluxio S3 API 使用指南兼容Amazon S3的分布式存储接口 概述 Alluxio作为内存加速的虚拟分布式文件系统提供了兼容Amazon S存储分布式文件系统缓存大数据如何5分钟掌握Mermaid Live Editor免费在线图表编辑器的终极指南如何5分钟掌握Mermaid Live Editor免费在线图表编辑器的终极指南 你是否曾为创建流程图、时序图或甘特图而烦恼Mermaid Live Edi前端开发者工具数据可视化Proxmox VE Helper-ScriptsNFS存储挂载与权限管理Proxmox VE Helper ScriptsNFS存储挂载与权限管理 在Proxmox VEVirtual Environment虚拟环境中NF运维虚拟化DevOps上一篇CUAV-7-Nano 飞控板硬件详解接口映射、PWM 输出与 ArduPilot 固件适配指南下一篇mastra/opencode为 OpenCode 编码助手接入 Mastra 观察记忆Observational Memory创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表