存算分离集群 对象存储数据无法删除

为了更快的定位您的问题,请提供以下信息,谢谢
【详述】问题详细描述
对象存储(COS)的数据无法删除的问题,删除表的分区,SR能够逻辑删除,但是对象存储的数据文件一直在,可以排除是保留机制的问题,是国庆节前删除的
经过排查发现是SR调用这个接口语法的问题,starrocks存算分离集群,使用COS作为对象存储 底层删除是调用这个接口 DELETE Multiple Objects ,
SR发出的删除请求是,在这种情况下COS会返回200,但是没有删除,因为根据key找不到文件
POST https://COSID.cos.ap-guangzhou.myqcloud.com/starrocks?delete
请求体

<Delete xmlns=""http://s3.amazonaws.com/doc/2006-03-01/"">
    <Object>
        <Key>shared/0f2e43f6-d928-4841-9f9a-69720d985cc0/db13007/13122/13124/data/0000000000000006_ab37348b-c7d4-403d-b101-7ff65f95f273.dat</Key>
    </Object>
    <Quiet>true</Quiet>
</Delete>

按照腾讯云文档 https://cloud.tencent.com/document/product/436/8289 的说明
正确的应该是
POST https://COSID.cos.ap-guangzhou.myqcloud.com/?delete
请求体

<Delete xmlns=""http://s3.amazonaws.com/doc/2006-03-01/"">
    <Object>
        <Key>starrocks/shared/0f2e43f6-d928-4841-9f9a-69720d985cc0/db13007/13122/13124/data/0000000000000006_ab37348b-c7d4-403d-b101-7ff65f95f273.dat</Key>
    </Object>
    <Quiet>true</Quiet>
</Delete>

starrocks作为存储桶根目录,不应该在url中出现,应该在请求体中完整的显示要删除文件的key;
【背景】做过哪些操作?
【业务影响】对象存储数据无法删除,存储量只增不减
【是否存算分离】是
【StarRocks版本】例如:3.3.17
【集群规模】例如:5fe(3 follower+2observer)+4cn
【机器信息】CPU虚拟核/内存/网卡,例如:48C/64G/万兆
【联系方式】联系方式,社区群28-无痕
【附件】

应该是一直把提供的endpoint当作path style的endpoint使用, 所以会在URL上拼上一个bucket name. 你用的sr版本是哪个版本?

应该是COS这种URL的拼接方式是非aws标准的, 正常是<bucketname>.<serviceName>.<region>.<domain>

COS弄出了个<bucketName>-appid这种不兼容的方式, 会导致域名检查拼接有问题.

是3.3.17版本

目前还有这个 Key必须是完整的路径,这样COS才能成功删除。

能够成功删除的
<Key>starrocks/shared/0f2e43f6-d928-4841-9f9a-69720d985cc0/db13007/13122/13124/data/0000000000000006_ab37348b-c7d4-403d-b101-7ff65f95f273.dat</Key>

而 shared/… 开头的,会找不到文件,无法删除,但是也会返回200的响应

不能成功删除的
<Key>shared/0f2e43f6-d928-4841-9f9a-69720d985cc0/db13007/13122/13124/data/0000000000000006_ab37348b-c7d4-403d-b101-7ff65f95f273.dat</Key>

因为域名不规范, 整个bucket当作path style处理了. 所以路径里都带上了starrocks/前缀. delete时, 带上的starrocks是bucket的意思, 但这个endpoint是virtual host style, 所以是个错误的API请求, 被拦截了.

你这种情况, SR里的bucketName应该直接配置成<bucketName>-appid, 这样就能匹配上, 正常工作了.

可以重新创建一个storage volume, 用<bucketName>-appid 做为bucketName, 把原先库表里的数据导入到用这个storage volume创建的新的库表, 然后原先的数据全部手动清理掉.

大佬,意思是这样吗

CREATE STORAGE VOLUME <bucketName>-appid
TYPE = S3
LOCATIONS = ("s3://starrocks/<bucketName>-appid/")
PROPERTIES
{
}
LOCATIONS = ("s3://<bucketName-appid>/starrocks/")

大佬,这个我测试了下,好像也没删除成功

附上你的测试信息.

大佬,新storage volume的创建语句是这样的:

CREATE STORAGE VOLUME repaired_volume_new
TYPE = S3
LOCATIONS = ("s3://<bucketName-appid>/starrocks/")

COS那边拉取的DELETEMultipleObjects接口日志如下:

<?xml version="1.0"?>
<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Object>
        <Key>starrocks/af419ef9-5cc1-4c7c-bd7f-3ea3024dc505/db112319/112325/112337/log/000000000001B6D4_000000000001D6F3.log</Key>
    </Object>
    <Quiet>true</Quiet>
</Delete>
<?xml version="1.0"?>
<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Object>
        <Key>starrocks/af419ef9-5cc1-4c7c-bd7f-3ea3024dc505/db112319/129203/129205/log/000000000001F8B7_000000000001D74D.log</Key>
    </Object>
    <Quiet>true</Quiet>
</Delete>

看起来和之前那个命名是一样的

这个是对的了啊. 因为用的是s3://<bucketName-appid>/starrocks/, bucket name后加了starrocks路径前缀.

大佬,但是COS上文件的实际路径也会变化
现在COS上的绝对路径是这样

<bucketName-appid>/starrocks/af419ef9-5cc1-4c7c-bd7f-3ea3024dc505/db112319/129203/129205/log/000000000001F8B7_000000000001D74D.log

之前是这样

starrocks/shared/0f2e43f6-d928-4841-9f9a-69720d985cc0/db13007/13122/13124/data/0000000000000006_ab37348b-c7d4-403d-b101-7ff65f95f273.dat

看起来只是starrocks/shared换成了/starrocks
但是发起的请求还是缺少根目录bucketName-appid/。

看起来只是starrocks/shared换成了bucketName-appid/starrocks

你按新的路径对应就可以了.

大佬,这个怎么对应,SR发出的DELETEMultipleObjects请求还是对不上COS上的绝对路径

DELETEMultipleObjects请求body:
<?xml version="1.0"?>
<Delete xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <Object>
        <Key>starrocks/af419ef9-5cc1-4c7c-bd7f-3ea3024dc505/db112319/129203/129205/log/000000000001F8B7_000000000001D74D.log</Key>
    </Object>
    <Quiet>true</Quiet>
</Delete>

这个的000000000001F8B7_000000000001D74D.log绝对路径如下

bucketName-appid/starrocks/af419ef9-5cc1-4c7c-bd7f-3ea3024dc505/db112319/129203/129205/log/000000000001F8B7_000000000001D74D.log

所以还是会删除失败

我看了下好像是因为

LOCATIONS = ("s3://<bucketName-appid>/starrocks/")

在这个情况下,COS会在bucketName-appid桶下创建bucketName-appid/starrocks/这样的目录
所以实际可能是

<bucketName-appid>/<bucketName-appid>/starrocks/

大佬,这里应该是在COS桶bucketName-appid下创建starrocks文件夹吧,但是实际上会创建bucketName-appid/starrocks/

大佬,COS不再支持path-style格式
https://cloud.tencent.com/document/product/436/96243