将某邮件发送给多个收件人时,该邮件将被置于每个收件人的邮箱中。某些邮件服务系统将同一邮件的副本分别存储在每个收件人的邮箱中。相反地,Sun Java System Messaging Server 力求保留一个邮件副本,而不考虑该邮件所在的邮箱数。通过在包含该邮件的邮箱中创建指向该邮件的硬链接即可实现此目的。
在将其他邮件服务系统迁移到 Sun Java Messaging Server 时,可能会在迁移过程中将这些多个邮件副本复制到 Sun Java Messaging Server 中。消息存储会很大,这意味着不必要地重复了很多邮件。此外,在正常的服务器操作中也可能会积累同一邮件的多个副本,例如,从 IMAP append操作或其他来源中。
Messaging Server 提供了一个名为 relinker 的新命令,该命令用于删除过量的邮件副本,并使用指向单个副本的硬链接替换这些邮件副本。
重链接功能可在命令模式或实时模式下运行。当 relinker 命令运行时,它将扫描整个消息存储分区,创建或更新 MD5 邮件摘要系统信息库(以硬链接形式),删除过量的邮件文件,并创建必要的硬链接。
摘要系统信息库由指向消息存储中的邮件的硬链接组成。它存储在目录分层结构 partition_path/=md5 中。此目录与用户邮箱分层结构 partition_path/=user 并行(请参见图 20–1)。摘要系统信息库中的邮件可由其 MD5 摘要唯一标识。例如,如果 fredb/00/1.msg 的摘要为 4F92E5673E091B43415FFFA05D2E47,则 partition/=user/hashdir/hashdir/=fredb/00/1.msg 将被链接到 partition/=md5/hashdir/hashdir/4F92E5673E091B43415FFFA05D2E47EA.msg。如果另一个邮箱中也有这封相同邮件(例如 partition_path/=user/hashdir/hashdir/gregk/00/17.msg),则该邮件也将被硬链接到 partition_path/=md5/4F/92/4F92E5673E091B43415FFFA05D2E47EA.msg。如图 20–4 中所示。
对于这封邮件,链接计数为三。如果从 fredb 和 gregk 邮箱中删除了这两封相同邮件,则链接计数为一并且可以清除此邮件。
还可以在实时模式下运行 relinker 进程以实现类似的功能。有关详细信息,请参见20.11.7.3 在实时模式下使用 relinker。
relinker 将扫描整个消息存储分区,创建或更新 MD5 邮件系统信息库(以硬链接形式)并删除过量的邮件文件。relinker 扫描完存储分区后,它将输出唯一邮件数和重链接前后分区大小的统计信息。为了在已散列的存储上更快速地运行,relinker 将只计算尚未存在于 =md5 中的邮件摘要。它还具有可以删除整个摘要系统信息库(此操作不会影响用户邮箱)的选项。
命令的语法如下所示:
relinker [-P. partitionname] [-d]
其中 partitionname 指定要处理的分区(默认值:所有分区),-d 指定将删除摘要系统信息库。以下显示了输出样例:
# relinker Processing partition: primary Scanning digest repository... Processing user directories.............................. --------------------------------------------------------- Partition statistics Before After --------------------------------------------------------- Total messages 4531898 4531898 Unique messages 4327531 3847029 Message digests in repository 0 3847029 Space used 99210Mb 90481Mb Space savings from single-copy 3911Mb 12640Mb --------------------------------------------------------- # relinker -d Processing partition: primary Purging digest repository... --------------------------------------------------------- Partition statistics Before After --------------------------------------------------------- Message digests in repository 3847029 0 --------------------------------------------------------- |
运行 relinker 可能需要花费很长时间,尤其是在系统信息库中没有邮件的情况下首次运行。这是因为如果将 relinker 条件配置为包含所有邮件,则 relinker 必须计算每封邮件的摘要—有关配置 relinker 条件的信息,请参见20.11.7.4 配置 relinker。例如,处理 100 千兆字节的消息存储可能需要花费六个小时。但是,如果启用了运行时重链接,请参见20.11.7.3 在实时模式下使用 relinker。
如果单独使用 relinker 命令行模式,而不使用运行时选项,则必须清除摘要系统信息库 (=md5),否则存储 (=user) 中清除的邮件所占用的空间将不能成为可用磁盘空间,因为在摘要系统信息库中仍有这些邮件的链接(它们将成为孤立邮件)。如果只执行存储的一次性优化(例如,在迁移后),您可以运行一次 relinker,然后使用 relinker -d 删除整个系统信息库。对于迁移过程中进行的重复清除,只要重复运行 relinker 命令就可以了,因为每次运行该命令时,还会从系统信息库中清除过期的或孤立的邮件。
并行运行 relinker 的多个实例来使每个实例分别处理不同分区(使用 -p 选项),这样做是最安全的。仅在同一分区内重链接邮件。
通过将 configutil 参数 local.store.relinker.enabled 设置为 yes 可以在实时模式下启用 relinker 函数。在实时模式下使用 relinker 将计算符合配置的 relinker 条件(20.11.7.4 配置 relinker)的每封已传送(或已恢复、IMAP 已附加等)邮件的摘要,然后查找系统信息库以查看该摘要是否已存在。如果摘要存在,relinker 将在目标邮箱中创建一个指向该摘要的链接而不创建该邮件的新副本。如果摘要不存在,relinker 将创建该邮件,然后在系统信息库中添加指向该邮件的链接。
stored 将扫描每个分区的摘要系统信息库,并清除链接计数为 1 或不符合 relinker 条件的邮件。在可配置的时间段内,扫描一次将扫描完一个目录。这样可以平均分布 I/O 负载而不会对其他服务器操作造成明显影响。默认情况下,清除周期为 24 小时,这意味着从存储中删除了邮件或者邮件超过了配置的最大生存期后,这些邮件最多还可在磁盘上保存 24 小时。如果启用了 relinker 实时模式,将启用此任务。
表 20–11 显示了用于设置 relinker 条件的参数。
表 20–11 relinker configutil 参数
参数 |
说明 |
---|---|
在附加代码中启用实时重链接邮件并启用 stored 清除。即使禁用此选项,relinker 命令行工具也可能运行。但是,由于 stored 不清除系统信息库,因此必须将 relinker -d 用于此任务。启用此选项将影响邮件传送性能但可以节省磁盘空间。 默认值:no |
|
保存在系统信息库中或由 relinker 命令行考虑的邮件最大生存期(以小时为单位)。-1 表示无生存期限制,即仅从系统信息库中清除孤立邮件。对于 relinker,它表示处理现有邮件而不考虑生存期。值越小保留的系统信息库也就越小,从而允许 relinker 或 stored 清除可以更快地运行并更快地收回磁盘空间;而值越大允许重复邮件重链接的时间就越长,例如,用户分几天将同一邮件复制到存储中,或在几天或几星期内运行迁移等情况。 默认值:24 |
|
邮件的最小大小(以千字节为单位)由运行时或命令行 relinker 考虑。设置为非零值将失去 relinker 用于较小邮件的优点,但可以获得较小的系统信息库。 默认值:0 |
|
整个 stored 清除周期的近似持续时间(以小时为单位)。实际持续时间取决于扫描系统信息库中的每个目录所花费的时间。值越小使用的 I/O 就越多;值越大收回磁盘空间的速度就越慢。0 表示连续运行清除而不在目录之间有任何暂停。-1 表示不使用 stored 而必须使用 relinker -d 命令执行清除。 默认值:24 |