S3 上传大文件 InvalidRange

问题

  • s3流式上传大文件,报错:416 InvalidRange
  • tar -cP data_150G | s3cmd put - s3://wuyan_test/data_150G
  • 经过多次测试,得到结论: 文件大小从150GB~1TB 都会导致416错误

问题表现

  • s3cmd output:

  • rgw log:

2018-08-22 21:26:12.854078 7f25e1f7b700 1 civetweb: 0x7f263ee7e000: 172.16.130.156 - - [22/Aug/2018:21:25:55 +0800] "PUT /do-not-delete/1534912813.tar?partNumber=56025&uploadId=2~fTCpM3WICVoCZkISuom-uGhXIvGQ3zg HTTP/1.1" 200 0 - -
2018-08-22 21:26:12.937465 7f25e1f7b700 1 ====== starting new request req=0x7f25e1f75110 =====
2018-08-22 21:26:12.940063 7f25e1f7b700 1 ====== req done req=0x7f25e1f75110 op status=-34 http_status=416 ======
2018-08-22 21:26:12.944497 7f25e1f7b700 1 civetweb: 0x7f263ee7e000: 172.16.130.156 - - [22/Aug/2018:21:25:55 +0800] "POST /do-not-delete/1534912813.tar?uploadId=2~fTCpM3WICVoCZkISuom-uGhXIvGQ3zg HTTP/1.1" 416 0 - -

问题解决

  • 配置 rgw_multipart_part_upload_limit = 100000值.
  • s3cmd 配置 --multipart-chunk-size-mb=250
  • rgw_max_put_param_size = 104857600

问题分析

1. Multipart(分片) 数量限制

1.1. Multipart 原理
  • Ceph 默认对于单一文件的限制为5GB
  • S3在上传大文件时,采用了multipart机制,将大文件进行分片。以下是s3cmd上的两个配置:
    • --multipart-chunk-size-mb 配置分片的大小,默认是15MB
    • multipart_max_chunks 配置最大分片数量,默认是10000
  • Ceph端同样有一个配置,可以限制最大分片数量
    • rgw_multipart_part_upload_limit 配置最大分片数量,默认10000
1.2 s3cmd:multipart_max_chunks 和 ceph:multipart_max_chunks区别
  • 这两个配置,一个是针对客户端,一个是针对服务端,建议两边配置值保持一致
  • 在使用s3cmd命令正常上传时,会根据文件大小、分片大小计算出分片数量,与multipart_max_chunks比较,如果超过,则报错
  • 但在使用s3cmd 流式上传时,会跳过multipart_max_chunks的限制,这个时候,会等所有分片上传完成后,再将分片数量与multipart_max_chunks比较,超出则报错
1.3. 问题分析
  1. 在我们的测试环境中,我们使用的是tar流式上传的方式,所以会绕过客户端multipart_max_chunks的检查
  2. 我们测试环境中, 默认multipart-chunk-size-mb 15MB,默认rgw_multipart_part_upload_limit 10000
  3. 在这种配置下,最大文件大小为 15MB * 10000 = 146.5GB, 超过该大小的文件上传,都会失败
1.4. 问题修复
  • 根据上面的信息,可以发现,要提升上传的文件大小限制,可以修改multipart-chunk-size-mb或者rgw_multipart_part_upload_limit
1.5. 涉及代码
rgw_http_errors rgw_http_s3_errors({
...
{ ERANGE, {
  416, "InvalidRange" }},
...
}

void RGWCompleteMultipart::execute()
{
...

if ((int)parts->parts.size() >
    s->cct->_conf->rgw_multipart_part_upload_limit) {
  op_ret = -ERANGE;
  return;
}

...
}

2. Put param size 限制

在修改默认配置解决了分片数量限制的问题后,我们测试了150GB、250GB都成功了。但发现上传1TB大文件时,任然失败,报错信息居然都一样,ERANGE 416.

2.1 Multipart Complete Info
  • 如果对S3的协议有所了解,会发现,在分片上传完成之后,还会再发起一次CompleteMultipartUpload 的http post请求, 具体的请求信息,如下所示
  • 在这次请求信息中,会描述所有的分片的ETag 和 number 信息
  • 所以分片的数量越多,这次post请求的长度就越长
  • ceph rgw在处理这个post请求的时候,需要有一个buffer来解析这个信息,这个buffer的长度是有限的,可以通过rgw_max_put_param_size参数来配置,默认值:1MB
2.2. CompleteMultipartUpload HTTP POST
  • content-length: 11725
POST /wuyan_test/data_1G.tar?uploadId=2~NGeN4ZWO4UvVBSgOX8pz3F7JAy6o5am HTTP/1.1
Host: 10.10.40.111:7480
Accept-Encoding: identity
content-length: 11725
Authorization: AWS VL8X4318L7QBFGQ3W3WB:HD34DLe4Gd2RGkDFWmrWUgiGT5c=
x-amz-date: Wed, 22 Aug 2018 15:18:37 +0000

<CompleteMultipartUpload><Part><PartNumber>1</PartNumber><ETag>d98cbda43b8d12e08db9e38804eb7397</ETag></Part><Part><PartNumber>2</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>3</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>4</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>5</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>6</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>7</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>8</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>9</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>10</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>11</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>12</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>13</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>14</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>15</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>16</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>17</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>18</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>19</PartNumber><ETag>14b17234e237505421b6492b8d757507</ETag></Part><Part><PartNumber>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值