何がボトルネックになるのかは環境によりけりで一概に言えません。必ずしもディスクI/Oだけが問題になるわけではなく、CPUやメモリ容量、ネットワーク速度なども要因になります。そのため、どんな場合でもうまくいくという方法は存在しません。基本的には移行のリハーサルを行い、本番での時間を予測し、予定時間を超えるようであれば、手法の変更を試みると言うことの繰り返しになります。
それらを踏まえて、いくつかの指針を書きます。
1. rsyncやrobocopyはシングルスレッドなので、処理するディレクトリをわける。
こんな感じのツリー構成になっていたとしましょう。
sample
├── a
│ ├── a0
│ └── a1
├── b
│ └── b0
└── c
実際はa
ディレクトリの中にもより多くのファイルやディレクトリがあるとします。rsyncやデフォルトオプションでのrubocopyはシングルスレッドであるため、これらを一つ一つ辿っていくことになります。つまり、a
を見て、一覧を出して、a0
をコピーして、次にa1
をコピーしてと一つ一つです。しかし、これらの処理は、ディスクIOの処理とリストの比較と言った処理、また、ファイルを転送したり、それに伴って圧縮・展開や暗号化・復号化(設定している場合)等の処理があります。ディスクIOの処理中はCPUはほとんど使いませんし、逆に他の処理中はCPUばかり使ってディスクIOを使いません。つまり、一つ一つのリソースを見ると使ったり、使わなかったりを繰り返し、非常に無駄が多いことになります。そこで、もし、ディスクIOを行っていない処理の間に他のディレクトリやファイルを読みに行っていたらどうでしょうか?そうすれば、リソースを無駄なく限界まで使って、これ以上は無理と言うこと頃まで出来るはずです。
ということで、処理を分散させることで全体の速度を上がる場合があります。例えば、一番上のトップだけを対象にするのではなく、トップ配下のディレクトリそれぞれわけてrsyncやrobocopyを走らせると言うことです。もし、とても大きなディレクトリがあるのであれば、そのサブディレクトリをさらに分けると言うことも必要になるでしょう。ただ、余りに分けすぎると逆に重くなる場合があります。一度に走らせる数を限定する、小さい物は順番に実行する、等の工夫が必要です。
また、最新のWindowsでのrobocopyでは/MTというマルチスレッドオプションがあります。これは上記のような分散処理をrobocopyが自動的に行ってくれるという物です。ただ、旧Windowsのバージョンには不具合があるようですので、Windows 10やWindows Server 2016以外では使用しない方が良いでしょう。
2. ネットワークがネックならデータを圧縮する。
コピー先が遠隔地にあって、回線が細いVPN経由になるといった場合に有効です。ただし、CPUを多く使いますので、遅いマシンでは必ずしも速くなるとは限りません。
3. マシンを分ける。
ファイルサーバー同士の移行であれば、ファイルサーバー上で実行するのではなく、同期用のマシンを別に用意します。1.の分散処理と合わせて、それらマシン一つ一つでそれぞれ別のディレクトリについて同期を行うという手法です。ファイルサーバーはSMBやNFSの処理に専念できるため、ほぼディスクIOに従った速度が出ることになります。ネックはネットワークですが、1Gpbsのそれなりのスイッチで接続していれば、十分なことが多いです。
4. CPUの負荷が高い処理は新しいマシンで行う。
同期のメインはディレクトリ内のエントリーを比較し、どれをコピーをするのかという処理になります。単純な処理ではありますが、ディレクトリ数が多い場合はバカに出来ないほどの高負荷です。ですので、rsyncやrobocopyの本体は新しいマシンで行う方が良いでしょう。ただ、そこそこの速度のマシンをベット用意できるのであれば、3.の選択肢も考慮に入れるべきです。
5. ファイルサーバーの機能が速いとは限らない。
NetAppのDataOnTapですとsnapmirrorというボリューム間をコピーする専用の機能があるのですが、ぶっちゃけ、バージョンが違うと制限があったり、最初の同期に数日かかると出たり、分割して出来なかったり、ダメだったら初めからだったりと、計画的に使わないと使える物ではありませんでした。事実、私は一度、急遽サーバーを5台作ってrsyncでコピーするに切り替えたことがあります。
選択肢の一つとして利用するのはありでも、絶対大丈夫だと思ってはいけません。
6. リトライを繰り返さない。
robocopyでよくあるのはアクセス権やファイル名が壊れたためにコピーできないファイルが存在すると言うことです。間隔をあけて何度かリトライして諦めるのですが、このデファルト値が30秒間隔で100万回です。たいていの場合、翌朝来たら終わっていると思ったら、リトライを繰り返していただけだったと言うがオチです。/R:nと/W:nは必ず変更してください。本番でこれを忘れると確実に間に合いません。
なお、コピーできないデータは利用者と相談し、削除するなり、リネームするなりして、事前に正常なデータにしておきます。
7. ダウンタイム0を目指す。
現在のファイルシステムにもよりますが、リアルタイム同期という機能がある物もあります。うまく使いこなせばダウンタイム0で移行できます。
8. ACLのコピー忘れに注意。
リハーサルで、適当なファイルについてACLを確認しておくことをお勧めします。オプションの指定漏れは洒落になりません。
9. スナップショットまでコピーしてしまう。
ファイルシステムの設定によってはスナップショット領域が見えてしまって、そのままコピーしてしまう場合があります。除外するようにしましょう。
10. 大事なのは全てがコピーされたことをどうやって保証するか。
rsyncやrobocopyがエラー無く終わったというログを残すことが第一です。しかし、rsyncやrobocopyにバグがないという保証はありません。また、よくあるのは、オプションミスでコピー漏れが発生していたと言うことです。
そのため、別の方法で確実にコピーされたことを担保する必要があります。
- ディレクトリやファイル数。
Windowsであれば簡単に確認できます。
- ファイルの合計サイズ
こちらもWindowsであれば簡単に確認できます。ディスク上のサイズは必ずしも一致しないことに注意してください。
- ls -lなどの結果
カレントディレクトリやオプションをうまく調整すればdiffで単純比較できます。ただ、OSのバージョンによって微妙に異なる場合があり、ある程度加工してから比較となる場合もあります。加工する技術が無ければ、Excelに貼り付けて比較している人もいました。
- caclesなどの結果
上と同じです。
とりあえず、これぐらいでしょうか。他にも細かいことがたくさんあったような気がします。
ぶっちゃけ、2TB級のデータ移行となると少なくない工数を見積もり、経験がある人間を配置します。何も知らさない新人に任せるような仕事ではありません。不安であるなら、お金がかかってもインフラ専門のSEを別途用意すべきです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/06/27 23:13
2018/06/28 14:15
2018/07/03 00:38
2018/07/03 01:01
2018/07/03 11:55
2018/07/03 23:57 編集
2018/07/04 04:40
2018/07/05 11:30
2018/07/05 23:56
2018/07/06 00:25
2018/07/06 01:14 編集
2018/07/06 01:52
2018/07/06 03:02
2020/05/16 05:34 編集