S3 API
Alluxio 提供 S3 兼容 REST API,允许基于 Amazon S3 构建的应用无需修改代码即可读写数据。本页介绍端点配置、身份验证、负载均衡和客户端兼容性。
需要低延迟写入? 如果您的工作负载要求毫秒级
PUT延迟或异步持久化,请参见 S3-API 写入优化。
前提条件
开始前请先完成 Kubernetes 安装指南中的第 5 步(挂载存储)。S3 API 需要:
正在运行的 Alluxio 集群(
CLUSTERPHASE=Ready)至少一个 UFS 挂载点——挂载点将作为 API 暴露的 S3 存储桶
快速入门
本节通过三个步骤使用默认配置(代理模式,模式 B)启动一个可用的 S3 端点。绝大多数客户端——包括 AWS CLI、boto3 和 PyTorch S3 Connector——均可开箱即用。
第一步:启用 S3 API
将以下内容添加到 alluxio-cluster.yaml 的 spec.properties 并应用:
spec:
properties:
alluxio.worker.s3.api.enabled: "true"kubectl apply -f alluxio-cluster.yamlS3 API 在每个 worker 上通过以下端口暴露:29998(HTTP)和 29996(HTTPS,需要 TLS 配置)。
第二步:暴露端点
使用负载均衡器(生产环境推荐)
在 alluxio-cluster.yaml 中添加 worker service:
等待外部 IP 分配:
✅ 成功标志: EXTERNAL-IP 已填充。将该地址用作下方的 <ENDPOINT>。
无负载均衡器(评估/单节点)
使用 port-forward 直接访问 worker:
将 http://localhost:29998 用作 <ENDPOINT>。
第三步:使用 AWS CLI 验证
配置路径样式请求(必须——不支持虚拟托管样式):
使用 SIMPLE 认证(默认),任意非空凭证均可接受:
快速 boto3 示例:
想要更高吞吐量? 默认代理模式跨 worker 读取需经过两次网络传输,相比重定向模式吞吐量约减半。如果您的客户端能正确跟随指向非 AWS endpoint 的 HTTP 307 重定向,请参见模式 A,可实现近似线性扩展。
部署模式
工作原理
每个 Alluxio worker 在端口 29998 上暴露 S3 端点,并通过一致性哈希负责命名空间的一个分片。当请求落在非数据所有者的 worker 上时,该 worker 必须将请求路由到数据所有者。有两种策略:
背景:HTTP 307 在此意味着什么。 HTTP 307 是一个重定向状态码——服务器返回一个新 URL 而不是数据。客户端随即直接向该 URL 发起新的连接。关键在于:原始 worker 上不传输任何数据负载:重定向响应只是一条很小的 HTTP 消息,完整的读取操作在 worker 与客户端之间直接进行,无需代理中转。唯一的代价是多了一次重定向本身的往返延迟。
代理模式(
alluxio.worker.s3.redirect.enabled=false,默认值):接收请求的 worker 从数据所有者获取数据并流式返回给客户端。所有客户端均可正常使用。代价:跨 worker 读取需两次网络传输(约为重定向模式的 50% 吞吐量)。重定向模式(
alluxio.worker.s3.redirect.enabled=true):接收请求的 worker 发出 HTTP 307,引导客户端直连数据所有者——零代理开销,吞吐量随 worker 线性扩展。约束:AWS SDK 不跟随指向非 AWS endpoint 的 307 重定向。基于 AWS SDK 的客户端(AWS CLI、boto3、PyTorch S3 Connector)无法使用此模式。节点本地代理(S3 Proxy DaemonSet):每个 worker 节点上运行一个 OpenResty sidecar,通过一致性哈希环直接解析数据所有者并单跳转发——无跨 worker 传输。兼具代理模式的客户端兼容性和接近重定向模式的吞吐量。
选择部署模式
模式 A:负载均衡 + 重定向
适用于:COSBench、minio-py 以及任何能正确跟随指向非 AWS endpoint 的 HTTP 307 重定向的客户端。
工作原理:负载均衡器将请求分发到各 worker。设置 alluxio.worker.s3.redirect.enabled=true 后,接收请求的 worker 通过一致性哈希检查数据归属,仅在必要时发出 307——如果请求恰好落在数据所有者上,则不触发重定向。客户端直连数据所有者——零拷贝,无代理开销,吞吐量随 worker 线性扩展。吞吐量基线数据请参见 S3 API 性能基准测试。
等待 NLB 完成配置(AWS 上通常需要 1–2 分钟):
✅ 成功标志: EXTERNAL-IP 已填充。将该 hostname 用作 S3 端点。
使用 Nginx、HAProxy 或 DNS 轮询将请求分发到各 worker 节点的 29998 端口。
模式 B:负载均衡 + 代理模式
适用于:AWS SDK (AWS CLI)、boto3、PyTorch S3 Connector (AWS CRT)、MinIO Warp——不跟随指向非 AWS endpoint 的 HTTP 307 重定向的客户端。
alluxio.worker.s3.redirect.enabled=false(默认值)。所有客户端无需修改代码即可正常工作。
使用与模式 A 相同的负载均衡器配置,但保持 alluxio.worker.s3.redirect.enabled 默认值(false)不变。负载均衡器将请求分发到各 worker,跨 worker 读取在集群内部代理转发。
权衡:跨 worker 读取时,数据在集群网络上传输两次(数据所有者 → 代理 worker → 客户端),集群整体吞吐量约为模式 A 的一半。
将应用的 S3 端点指向负载均衡器地址:
单 worker 部署:307 重定向仅在接收请求的 worker 不是数据所有者时触发。单 worker 时重定向不会触发,所有客户端无需任何配置即可正常工作。
模式 C:节点本地 S3 Proxy
适用于:需要接近模式 A 吞吐量的 AWS SDK 客户端(boto3、AWS CLI、PyTorch S3 Connector)。与模式 B 不同——模式 B 中任意 worker 都可能接收请求,再跨集群代理到数据所有者——S3 Proxy DaemonSet 在每个 worker 节点上运行,在转发前通过一致性哈希环直接解析正确的数据所有者。客户端连接到本地节点的 http://127.0.0.1:8080,无需额外的跨 worker 跳转。
前提条件:alluxio.worker.s3.api.enabled: "true",且 worker 节点上端口 8080 未被占用。
先查找 Alluxio 命名空间中的 etcd Service 名称:
将以下内容保存为 alluxio-s3-proxy.yaml 并应用:
ALLUXIO_ETCD_URLS
http://<etcd-service>:2379
http://alluxio-cluster-etcd:2379
ALLUXIO_CLUSTER_NAME
<namespace>-<clusterName>
alx-ns-alluxio-cluster
ALLUXIO_WORKER_S3_PORT
Worker S3 端口
29998(默认值)
ALLUXIO_CLUSTER_NAME 必须遵循 <namespace>-<clusterName> 格式。例如,命名空间 alx-ns 中名为 alluxio-cluster 的集群,对应值为 alx-ns-alluxio-cluster。格式不正确将导致所有代理请求失败。
✅ 验证:
身份验证
Alluxio 的 S3 API 支持两种身份验证方式:
SIMPLE(默认) — Alluxio 解析 AWS Signature V4 Authorization 标头以提取用户名,但不验证签名。
Access Key:执行操作时使用的 Alluxio 用户名。如果省略,操作将以启动 worker 进程的用户身份执行。
Secret Key:任意非空值。客户端需要它来生成签名,但 Alluxio 会忽略此值。
OIDC — 如需使用 OpenID Connect 令牌进行集中身份管理,请参阅身份验证指南。
性能
关键 Alluxio 参数
以下参数控制 S3 API 性能。建议在高吞吐量工作负载中使用推荐值。
alluxio.worker.s3.redirect.enabled— 默认值:false;模式 A 需设为true。false时所有跨 worker 读取均走代理,增加额外网络跳转,吞吐量约为重定向模式的一半。仅在使用能正确跟随指向非 AWS endpoint 的 HTTP 307 重定向的客户端时启用(参见部署模式)。alluxio.worker.s3.connection.keep.alive.enabled— 默认值:false;推荐值:true。跨请求复用 TCP 连接,减少握手开销,提高高并发下的吞吐量。alluxio.worker.s3.connection.idle.max.time— 默认值:0sec。Keep-alive 连接的空闲超时时间;0表示无超时。alluxio.worker.s3.access.logging.enabled— 默认值:false;推荐值:生产环境中设为true。设为false时仅记录失败请求;设为true时记录所有请求。用于审计和调试;基准测试时建议禁用以避免 I/O 开销。alluxio.worker.s3.only.https.access— 默认值:false。启用后,拒绝非 HTTPS 请求。alluxio.worker.s3.redirect.health.check.enabled— 默认值:true;推荐值:基准测试时设为false。禁用重定向前的逐请求 RPC 健康检查,减少开销并提高吞吐量;生产环境建议保持启用以确保安全。
Linux 内核参数
对于高 TCP 连接频率的高强度 S3 基准测试,调优内核参数可改善连接复用并降低延迟。
net.ipv4.tcp_tw_reuse
复用处于 TIME_WAIT 状态的套接字,防止高频请求下的端口耗尽。
net.ipv4.tcp_tw_recycle
加速 TIME_WAIT 清理。在 Linux 4.12+ 中已移除——此参数仅存在于旧版内核(如使用 kernel 3.10 的 CentOS 7)。在新版内核上此 sysctl 键不存在,命令将失败。
net.ipv4.tcp_fin_timeout
缩短空闲连接关闭时间,更快释放资源。默认值:60s,推荐值:30s。
警告:修改内核参数可能影响系统稳定性。在应用这些设置前请确保您了解其含义,尤其是在生产环境中。
NAT 兼容性:在
tcp_tw_recycle可用的旧版内核上,启用该参数可能导致 NAT 设备后的客户端出现连接失败(时间戳验证问题)。请勿在 NAT 环境中使用。
高级功能
MultiPartUpload (MPU)
对于直通到底层存储的大对象上传,以下参数控制分片上传行为:
alluxio.underfs.object.store.multipart.upload.async
false
true
启用到 UFS 的异步分片上传,提高写入吞吐量。
alluxio.underfs.s3.upload.threads.max
20
高吞吐量场景下设为 256
每个 worker 用于 S3 UFS 写入的最大并发上传线程数。
alluxio.underfs.s3.multipart.upload.buffer.number
64
高吞吐量场景下设为 256
分片上传缓冲区数量,应与 upload.threads.max 同步增加。
默认情况下,分片上传为直通模式——每个分片直接上传到底层存储,在 CompleteMultipartUpload 时在底层存储提交对象。Alluxio 不在本地缓冲分片数据。
如需先将分片写入 Alluxio 缓存层再异步持久化到底层存储,请参阅 S3-API 写入优化。
标签和元数据
启用标签:需要为 UFS 启用扩展属性支持:
标签限制:根据 S3 标签限制,用户自定义标签限制为每个对象/存储桶 10 个。可通过
alluxio.worker.s3.tagging.restrictions.enabled=false禁用。元数据大小:根据 S3 元数据限制,用户自定义元数据限制为 2KB。可通过
alluxio.worker.s3.header.metadata.max.size调整。
限制
在采用 Alluxio 的 S3 API 之前,请注意以下限制:
仅支持路径样式 — 不支持虚拟托管样式请求(
http://<bucket>.<endpoint>/...)。所有客户端必须使用路径样式(http://<endpoint>/<bucket>/<key>)。存储桶:仅 Alluxio 命名空间中的顶级目录被视为 S3 存储桶。根目录(
/)不是存储桶。为保留现有的 S3 URI,请使用存储桶名称作为挂载路径:无版本控制或锁定:多个客户端同时写入同一对象时,最后写入者获胜。
不支持的字符:对象键不得包含
?、\、./或../;//可能导致未定义行为。对于分片上传(MPU),受实现方式限制,对象键仅支持字母、数字、空格以及字符_ . : / = + - @,不支持该字符集以外的字符,例如&、#、%、!、^、*、|、<、>、(、)、[、]、{、}、"、'和~。文件夹对象:子目录在
ListObjects(V2)响应中作为 0 字节文件夹对象返回,与 AWS S3 控制台行为一致。无原子性:GetObject 和 PutObject 中不支持
If-Match和If-None-Match标头。签名不被验证 — Alluxio 从
Authorization标头提取用户名,但不验证加密签名。Secret Key 可以是任意非空字符串。无虚拟托管 DNS — 不存在
<bucket>.endpoint的 DNS 通配符解析;这是仅支持路径样式的必然结果。
支持的 S3 操作
下表列出了支持的 S3 API 操作。有关详细用法,请参阅官方 S3 API 文档。
Content-Type, x-amz-copy-source, x-amz-metadata-directive, x-amz-tagging-directive, x-amz-tagging
N/A
用法示例
minio-py — 模式 A(支持重定向)
minio-py 是能正确跟随 HTTP 307 重定向到非 AWS 端点的 Python SDK。使用负载均衡器端点。
安装方式:pip install minio
boto3 — 模式 B(代理模式)
boto3 不跟随指向非 AWS endpoint 的 HTTP 307 重定向。请使用模式 B(代理模式)配合负载均衡器端点。
安装方式:pip install boto3
PyTorch S3 Connector — 模式 B(代理模式)
PyTorch S3 Connector 基于 AWS CRT 构建,不跟随指向非 AWS endpoint 的 HTTP 307 重定向。请使用模式 B(代理模式)配合负载均衡器端点。
安装方式:
故障排查
AWS CLI、boto3 或 PyTorch 返回错误或数据异常
症状:操作报连接错误,或返回意外结果。
原因:这些客户端基于 AWS SDK(或 AWS CRT)构建,不跟随指向非 AWS endpoint 的 HTTP 307 重定向,需使用模式 B:负载均衡 + 代理模式。详见部署模式中的配置步骤。
NoSuchBucket 错误,但存储桶在 S3 中存在
NoSuchBucket 错误,但存储桶在 S3 中存在症状:aws s3 ls s3://<bucket> 或 GetObject 返回 NoSuchBucket。
原因:在 Alluxio 的 S3 API 中,存储桶是 Alluxio 挂载点名称,而非 UFS 存储桶名称。S3 请求中的存储桶名称必须与 Alluxio 中的挂载路径一致(例如 /s3 对应存储桶名 s3),而非底层 S3 存储桶名称。
诊断:列出 Alluxio 实际暴露的存储桶名称:
在后续请求中使用输出中显示的名称,而非 UFS 存储桶名称。
29998 端口连接被拒绝
症状:aws s3 ls 返回 Could not connect to the endpoint URL。
原因:worker 上未启用 S3 API,或 worker service 不可达。
解决方案:
确认 S3 API 已启用:
预期输出:
true。若不是,请将alluxio.worker.s3.api.enabled: "true"添加到alluxio-cluster.yaml的spec.properties并应用。如果在 Kubernetes 上未配置负载均衡器,请使用 port-forward:
InvalidAccessKeyId 或签名错误
InvalidAccessKeyId 或签名错误原因:Alluxio 的 SIMPLE 认证模式不验证签名,但 Authorization 标头仍需存在且格式正确。部分客户端在未配置凭证时会省略该标头。
解决方案:传入任意非空的 access key 和 secret key。使用 AWS CLI:
另请参阅
S3-API 写入优化 — 低延迟写入与异步持久化(需要 FoundationDB)
S3 API 性能基准测试 — 参考基线、工具选型(COSBench / Warp / httpbench)和 Linux 内核调优
S3 UFS 集成 — 分片上传调优、高并发设置和 S3 region 配置
Last updated