パーティションと命名規則

OSS は UTF-8 でエンコードされたファイル名により、ユーザーデータを自動的に分割して大量のデータを処理し、高い要求率に対するニーズを満たします。 ただし、多数のオブジェクトをアップロードするときに、名前の一部として連続するプレフィックス (タイムスタンプや連続番号など)を使用すると、1 つのパーティションに多数のファイルインデックスが格納されてしまう可能性があります。 このように、要求レートが 1 秒間に 2,000 操作を超えると 以下の結果が生じる可能性があります。(ダウンロード、アップロード、削除、コピー、およびメタデータの取得は、それぞれ 1 操作としてカウントされ、バッチ内の複数のファイルの一括削除または列挙は、複数の操作と見なされます) 。

  • このパーティションはホットスポットパーティションになり、システムにより、I / O 容量の枯渇および低い要求レートへの自動的制限が引き起こされてしまいます。
  • ホットスポットパーティションでは、パーティション化されたデータは常にリバランスされているため、処理時間が長くなる可能性があります。

そのため、OSS の水平方向のスケーリング機能が影響を受け、結果として要求レートが制限されます。

これらの問題に対処するには、ファイル名の中の連続するプレフィックスを削除する必要があります。 代わりに、ファイル名にランダムなプレフィックスを追加します。 このようにして、ファイルインデックス (および I / O 負荷) は異なるパーティションに均等に分散されます。

連続するプレフィックスをランダムなプレフィックスに変更する例を次に示します。

  • 例 1: ファイル名に 16 進数のハッシュプレフィックスを追加

    この例に示すように、ファイル名に日付と顧客 ID (連続したタイムスタンププレフィックスを含む) の組み合わせを使用できます。

    sample-bucket-01/2017-11-11/customer-1/file1
    sample-bucket-01/2017-11-11/customer-2/file2
    sample-bucket-01/2017-11-11/customer-3/file3
    ...
    sample-bucket-01/2017-11-12/customer-2/file4
    sample-bucket-01/2017-11-12/customer-5/file5
    sample-bucket-01/2017-11-12/customer-7/file6
    ...

    この場合、顧客 ID、つまり MD5 (customer-id) のハッシュ値を計算し、ファイル名のプレフィックスとして数文字のハッシュプレフィックスを組み合わせることができます。 4 文字のハッシュプレフィックスを使用する場合、ファイル名は次のとおりです。

    sample-bucket-01/2c99/2017-11-11/customer-1/file1
    sample-bucket-01/7a01/2017-11-11/customer-2/file2
    sample-bucket-01/1dbd/2017-11-11/customer-3/file3
    ...
    sample-bucket-01/7a01/2017-11-12/customer-2/file4
    sample-bucket-01/b1fc/2017-11-12/customer-5/file5
    sample-bucket-01/2bb7/2017-11-12/customer-7/file6
    ...

    この場合、4 文字の 16 進数ハッシュ値がプレフィックスとして使用され、各文字は 16 個の値 (0 から f) のいずれかになります。したがって、16 ^ 4 = 65,536 通りの可能な文字の組み合わせがあります。 技術的には、ストレージシステム内のデータは常に最大 65,536 のパーティションに分割されています。 パフォーマンスのボトルネック制限 (1 秒間に 2,000 操作) とサービスの要求レートを利用し、適切な数のハッシュバケットを決定できます。

    ファイル名に特定の日付を持つすべてのファイル、たとえば、"sample-bucket-01" 内の名前に "2017-11-11" を持つファイルを一覧表示する場合は、"sample-bucket-01" 内のファイルを列挙し (List Object API を複数回呼び出すことによって、"sample-bucket-01" 内のすべてのファイルをまとめて取得する)、ファイル名の中でこの日付のファイルを結合する必要があります。

  • 例2: ファイル名を逆にする

    この例では、ミリ秒の精度の UNIX タイムスタンプを使用してファイル名を生成することができます。これも連続するプレフィックスです。

    sample-bucket-02/1513160001245.log
    sample-bucket-02/1513160001722.log
    sample-bucket-02/1513160001836.log
    sample-bucket-02/1513160001956.log
    ...
    sample-bucket-02/1513160002153.log
    sample-bucket-02/1513160002556.log
    sample-bucket-02/1513160002859.log
    ...

    前の段落で説明したように、ファイル名に連続するプレフィックスを使用すると、要求レートが特定の制限を超えた場合、パフォーマンスに影響を与える可能性があります。 この問題に対処するには、タイムスタンププレフィックスを逆にして、連続するプレフィックスを除外します。 結果は次の通りです。

    sample-bucket-02/5421000613151.log
    sample-bucket-02/2271000613151.log
    sample-bucket-02/6381000613151.log
    sample-bucket-02/6591000613151.log
    ...
    sample-bucket-02/3512000613151.log
    sample-bucket-02/6552000613151.log
    sample-bucket-02/9582000613151.log
    ...

    ファイル名の最初の 3 桁はミリ秒を表し、1,000 の値のいずれかになります。 4 桁目は 1 秒ごとに変わります。 同様に、5 桁目は 10 秒ごとに変わります。 このように、プレフィックスはランダムに指定され、負荷は複数のパーティションに均等に分散されるため、パフォーマンスのボトルネックを回避できます。