This work is licensed under a Creative Commons Attribution 3.0
Unported License.
http://creativecommons.org/licenses/by/3.0/legalcode
假设客户端以每秒 1000 个对象的速度,将对象分布在 10 个容器中写入集群。首先,在 PUT 操作中,我们使用了集群双倍的容器资源,因为额外将 PUT 操作发送到了 .expiring_objects 账户。然后,当我们开始删除对象时,再次使容器层的压力增加一倍。客户的容器现在必须处理 100 个 PUT/秒和 100 个 DELETE/秒来自过期守护进程的操作。如果它无法跟上,守护进程就会开始落后。如果该系统没有改变,守护进程将永远无法赶上——此外,其他客户也会开始面临资源匮乏的问题。
需要进行两项更改才能解决上述问题。
1.) 允许容器数据库知道对象是否已过期。这将允许容器复制器保持对象计数的正确性。
2.) 允许审计器在其运行期间删除已过期的对象。这将允许删除对象过期守护进程。
实施包含多个部分。更新容器数据库以删除过期对象以及从磁盘上删除对象。
步骤 1:将在容器数据库中添加一个过期表。该表将包含一个 ‘obj_row_id’ 列和一个 ‘expired_at’ 列。‘obj_row_id’ 列将与对象表中的对象行 ID 相关联。‘expired_at’ 列将是一个整数时间戳,表示对象何时过期。
容器复制器将在其运行开始时间之前,从对象表中删除其在过期表中的 ‘expire_at’ 时间对应的对象行。将有一个触发器在从 ‘objects’ 表中删除行后,删除 ‘expired’ 表中的行。一旦完成过期对象的删除,容器数据库将被复制。
步骤 2:对象审计器在其运行期间将删除任何已过期的对象。当对象审计器检查对象的元数据时,如果 X-Delete-At 时间早于当前时间,审计器将删除该对象。由于审计器运行缓慢,集群将拥有额外的数据,直到对象被处理完毕。
部署此更改时,当前的过期守护进程可以继续运行,直到从 ‘.expiring_objects’ 账户中删除所有对象。完成此操作后,可以停止守护进程。
此外,将创建一个用于使用所有对象的 ‘expire_at’ 时间更新容器数据库的脚本。