web-dev-qa-db-ja.com

複数のディスクが1つのファイルシステムとして機能し、各ディスクに単独でアクセスできるようにします

かなり大きなデータセット(〜160TB)があり、クライアントに頻繁に配信する必要があります。このデータセットはかなり大きなファイルで構成されており、通常はそれぞれ2Gbから20Gbの間です。これらは、合計容量1.1TbのRAIDクラスターで実行されているBeeGFSファイルシステムに存在します。現在、データを配信するときは、次の方法で実行されます。

  1. ファイルとそのサイズのメインインデックスを作成します
  2. 4Tbまでファイルサイズを集計し、メインインデックスから上記ファイルのサブインデックスを作成します
  3. ファイルを4TbUSBドライブにコピーします
  4. データセット全体がコピーされるまで、手順2と3を繰り返します。
  5. USBドライブの段ボール箱をクライアントに渡す

私がやりたいのは、これをマウントされたファイルシステムにrsyncするだけなので、ストレージスペースを複数のディスクに分散できるファイルシステムが利用できるかどうか疑問に思いました。明らかな候補はLVMとRAIDですが、問題は、クライアントが各ディスクを独自に読み取ることができる必要があることです。これは、(少なくとも私が知る限り)これを無効にします。 LVMまたは同様のものをエミュレートする方法はありますが、個々のディスクをかなり標準的な方法で読み取ることができますか?事実上、複数の個別のディスク/ファイルシステムにデータを分散させる単一のrsync操作を実行できるようにします

データはRedHatマシンからのものであるため、これまでUSBドライブでext4を使用してきました。ただし、可能であれば、Windows10でうまく機能するファイルシステムを使用できれば、(厳密には必要ではありませんが)すべての人にとって非常に有益です。

PS:同時に接続されるUSBドライブの数に関しては制限はありません。私が持っている唯一の本当の制約は、データが一度に1つのディスク/ファイルシステムにアクセス可能でなければならないということです。

1
Jarmund
  1. 次のようなファイルとサイズの完全なリストを作成します。

    / path -type f -printf "%s%h%f\n"> all_files.txtを検索します

  2. 各パーツの合計サイズに基づいて、all_files.txtをパーツに分割するawkを実行します(ここでのMAXSIZEは、バイト単位の最大サイズのプレースホルダーです)

    BEGIN {total=0;part=0;}
            {total += $1;
            if (total > MAXSIZE) {part++;total=0;}
            $1="";print substr($0,2) >> "partial-"part}
  1. これで、各ディスクに必要なファイルシステムを使用して、すべてのディスクを異なるマウントポイント(/mnt/send/partial-1/mnt/send/partial-2、...など)にマウントできます。

  2. ループ内で、rsync--files-from=FILEを正しいマウントポイントに移動します。これらの線に沿った何か:

    for f in partial*
    do
        rsync --files-from=$f / /mnt/$f/
    done
1