Linuxサーバーを移行する方法パート2-コアデータを転送する
序章
データと運用要件をあるサーバーから別のサーバーに移動しなければならないシナリオはたくさんあります。 ソリューションを新しいデータセンターに実装するか、より大きなマシンにアップグレードするか、新しいハードウェアまたは新しいVPSプロバイダーに移行する必要がある場合があります。
理由が何であれ、あるシステムから別のシステムに移行する際には、さまざまな考慮事項を考慮する必要があります。 Chef、Puppet、Ansibleなどの構成管理ソリューションを使用していない場合、機能的に同等の構成を取得するのは難しい場合があります。 データを転送するだけでなく、新しいマシンでも同じように動作するようにサービスを構成する必要があります。
前回の記事では、サーバーをデータ移行用に準備しました。 この時点で、ターゲットシステムとソースシステムは通信できるはずです(ターゲットシステムはソースシステムへのSSHアクセスを持っている必要があります)。 また、転送する必要のあるソフトウェアとサービスのリストと、最も重要なコンポーネントのバージョン番号を用意する必要があります。
このガイドでは、中断したところから続行し、新しいサーバーへの実際の移行を開始します。
一般的な戦略
始める前に、ソースからターゲットシステムにデータを移行するための一般的な戦略の概要を説明する必要があります。
一般的な考え方は、ターゲットシステムを可能な限りクリーンに保ちながら、関連するすべての情報を転送することです。
一部の移行戦略では、rsyncをソースマシンのルートにポイントし、除外行を渡して、競合が発生することがわかっているファイルを含めないようにプロセスに指示します。 このアプローチは採用しません。 大量のシステムデータを稼働中のオペレーティングシステムに移行すると、予測できない結果が生じる可能性があり、最終的には安定したシステムになりたいと考えています。
それだけでなく、運用要件に関連しなくなったファイルで新しいシステムを不必要に乱雑にしたくありません。 これにはさらに手間がかかりますが、終了すると、より使いやすく、使いやすい構成になります。
したがって、競合しない可能性のあるすべてのファイルを、達成したいことと関連性がない場合は、新しいシステムに移行するだけではありません。 代わりに、目的の機能要件として、どのデータを移動する必要があるかを正確に決定します。 これには、データと構成の詳細、ユーザー、ジョブなどが含まれます。
移行スクリプトの作成
これらの決定は、進行中に行い、移行スクリプトに追加します。
これはあなたに多くの重要な利点を与えるでしょう。 これにより、問題が発生した場合、または最初の実行後にソースシステムでデータの変更をキャプチャするために、コマンドを簡単に再実行できます。 データの転送に使用したコマンドを自己文書化します。 また、ソースサーバーは、ユーザーの操作なしでデータ転送の次の項目に進むことができます。
スクリプトを作成するときは、スクリプトを複数回実行して、実行しながら改良できるはずです。 ほとんどのファイルはrsync
を介して転送され、ファイルの変更のみが転送されます。 他のデータ転送部分に時間がかかる場合は、スクリプトが最終状態であることがかなり確実になるまで、安全にコメントアウトできます。
この記事は主に、移行を成功させるために移行スクリプトに何を追加するかについてのガイドになります。 詳細よりも一般的なガイドラインを頻繁に提供します。
ターゲットシステムのrootユーザーのホームディレクトリに簡単な移行スクリプトを作成できます。 これを使用して、データ移行操作の大部分を自動化します。
nano /root/sync.sh
ファイル内で、標準のスクリプト見出しから始めます(これをより移植性の高いものにするために「sh」を使用しますが、提供される拡張機能を使用して両方のシステムで使用できるようにする場合は、「bash」を使用できます)。
#!/bin/sh
続けて、これに追加します。 ただし、今のところ、ファイルを実行可能にするために、ファイルをすばやく終了しましょう。
コマンドラインに戻り、次のように入力してスクリプトを実行可能にします。
chmod 700 /root/sync.sh
スクリプトをいつでも実行するために、絶対パスを使用してスクリプトを呼び出すことができます。
/root/sync.sh
またはその相対パス:
cd /root ./sync.sh
問題が発生するかどうかを確認するために、スクリプトを定期的にテストする必要があります。
必要なプログラムとサービスをインストールする
自動化の前に実行する必要がある最初のステップは、これらのサービスを稼働させるために必要なパッケージを取得することです。 これをスクリプトに追加することもできますが、この部分を手動で実行してスクリプトに文書化する方が簡単です。
構成の詳細は後で説明します。 今のところ、これらのアプリケーションをインストールし、基本的なアクセスを構成して、作業を開始できるようにする必要があります。 ソースマシンから必要なパッケージとバージョンのリストが必要です。
必要に応じてリポジトリを追加します
パッケージマネージャーからこれらのバージョンを取得する前に、ソースシステムを調べて、追加のリポジトリが追加されているかどうかを確認する必要があります。
Ubuntu / Debianマシンでは、いくつかの場所を調査することで、ソースシステムに代替ソフトウェアソースが存在するかどうかを確認できます。
nano /etc/apt/sources.list
これがメインのソースリストです。 追加のソースリストは、sources.list.d
ディレクトリに含めることができます。
ls /etc/apt/sources.list.d
必要に応じて、同じソースをターゲットマシンに追加して、同じパッケージバージョンを使用できるようにします。
RHELベースのシステムでは、yum
を使用して、サーバー用に構成されたリポジトリーを一覧表示できます。
yum repolist enabled
次に、次のように入力して、ターゲットシステムにリポジトリを追加できます。
yum-config-manager --add-repo repo_url
ソースリストに変更を加えた場合は、移行スクリプトの上部にコメントとして追加します。 このように、新規インストールから開始する必要がある場合は、新しい移行を試行する前に、どのような手順を実行する必要があるかがわかります。
nano /root/sync.sh
#!/bin/sh ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free
ファイルを保存して閉じます。
バージョン制約の指定とインストール
これで、ソースマシンに一致するようにリポジトリが更新されました。
Ubuntu / Debianマシンでは、次のように入力して、ターゲットマシンに必要なバージョンのソフトウェアをインストールすることができます。
apt-get update apt-get install package_name=version_number
多くの場合、パッケージのバージョンが古い場合は、公式リポジトリから削除されています。 この場合、古いバージョンの.debファイルとその依存関係を手動で探し出し、次のコマンドを使用して手動でインストールする必要があります。
dpkg -i package.deb
これは、ソフトウェアバージョンの一致がアプリケーションにとって重要である場合に必要です。 それ以外の場合は、パッケージマネージャーを使用して定期的にインストールできます。
RHELベースのシステムの場合、次のように入力して特定のバージョンのソフトウェアをインストールできます。
yum install package_name-version_number
新しいバージョンを優先してリポジトリから削除されたrpmファイルを探す必要がある場合は、次のように見つけた後、yumを使用してインストールできます。
yum install package_name.rpm
パッケージマネージャーから利用できる関連ソフトウェアを新しいシステムにインストールします。 必要なソフトウェアがリポジトリやその他の簡単な手段で利用できず、ソースによってインストールされているか、プロジェクトのWebサイトからバイナリとして取り込まれている場合は、このプロセスをターゲットシステムに複製する必要があります。
ここでも、実行している操作を追跡します。 作成するスクリプトにコメントとしてそれらを含めます。
nano /root/sync.sh
#!/bin/sh ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1
もう一度、ファイルを保存して閉じます。
データの転送を開始します
データの実際の転送は、移行の中で最も時間のかかる部分になる可能性があります。 大量のデータを含むサーバーを移行する場合は、後でではなく、より早くデータの転送を開始することをお勧めします。 後でコマンドを改良することができ、rsyncはファイル間の違いのみを転送するので、これは問題にはならないはずです。
転送する必要のあるユーザーデータの大きなチャンクのrsyncを開始することから始めることができます。 このコンテキストでは、「ユーザー」データを使用して、データベースデータを除くサーバーに必要な重要なデータを参照しています。 これには、サイトデータ、ユーザーホームディレクトリ、構成ファイルなどが含まれます。
Screenのインストールと使用
これを効果的に行うために、ターゲットシステムでscreen
セッションを開始します。このセッションは、作業を継続している間も実行を続けることができます。
ディストリビューションのパッケージマネージャーを使用してscreen
をインストールできます。 UbuntuまたはDebianでは、次のように入力できます。
apt-get update apt-get install screen
このリンクをチェックすると、画面の操作方法を見つけることができます。
基本的に、ターゲットサーバーで次のような新しい画面セッションを開始する必要があります。
screen
スクリーンセッションが開始され、コマンドラインに戻ります。 おそらく何も起こらなかったように見えますが、現在、画面プログラムに含まれている端末を操作しています。
移行中に行うすべての作業は、スクリーンセッション内で行われます。 これにより、複数のターミナルセッション間を簡単にジャンプでき、ローカルターミナルを離れる必要がある場合や切断された場合に、中断したところから再開できます。
ここでコマンドを発行してから端末を切断し、端末を実行し続けることができます。 次のように入力すると、いつでも切断できます。
CTRL-a d
次のように入力すると、後で再接続できます。
screen -r
スクリーンセッション内に別のターミナルウィンドウを作成する必要がある場合は、次のように入力します。
CTRL-a c
ウィンドウを切り替えるには、次の2つを入力して、ウィンドウをいずれかの方向に循環させます。
CTRL-a n CTRL-a p
次のように入力してウィンドウを破棄します。
CTRL-a k
早期にファイル転送を開始する
スクリーンセッション内で、完了するのに長い時間がかかると予想されるrsyncタスクを開始します。 ここでの時間スケールは、転送する必要のある重要な(データベース以外の)データの量によって異なります。
使用する一般的なコマンドは次のとおりです。
rsync -avz --progress source_server:/path/to/directory/to/transfer /path/to/local/directory
この記事を読むと、適切なrsyncコマンドを作成する方法の詳細を知ることができます。 コマンドを正しく実行するために、宛先につながるディレクトリを作成する必要がある場合があります。
rsyncセッションを実行しているときに、新しい画面ウィンドウを作成し、次のように入力して切り替えます。
CTRL-a c
定期的にチェックして、同期が完了しているかどうかを確認し、次のように入力して後続の同期を開始します。
CTRL-a p
データとファイルを同期するためのスクリプトの調整
ここで、実行したのと同じrsyncコマンドを作成中のスクリプトに追加する必要があります。 重要なユーザーとアプリケーションのすべてのデータをターゲットサーバーに取得するために必要な追加のrsyncコマンドを追加します。
これらのファイルを転送するより良い方法があるので、この時点ではデータベースファイルについて心配する必要はありません。 これらについては、後のセクションで説明します。
#!/bin/sh ############# # Prep Steps ############# # Add additional repositories to /etc/apt/source.list # deb http://example.repo.com/linux/deb stable main non-free # Install necessary software and versions # apt-get update # apt-get install apache2=2.2.22-1ubuntu1.4 mysql-server=5.5.35-0ubuntu0.12.04.2 libapache2-mod-auth-mysql=4.3.9-13ubuntu3 php5-mysql=5.3.10-1ubuntu3.9 php5=5.3.10-1ubuntu3.9 libapache2-mod-php5=5.3.10-1ubuntu3.9 php5-mcrypt=5.3.5-0ubuntu1 ############# # File Transfer ############# # Rsync web root rsync -avz --progress 111.222.333.444:/var/www/site1 /var/www/ # Rsync the apache configuration files rsync -avz --progress 111.222.333.444:/etc/apache2/* /etc/apache2/ # Rsync php configuration rsync -avz --progress 111.222.333.444:/etc/php5/* /etc/php5/ # Rsync mysql config files rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ # Rsync home directories . . .
ソースシステムからデータと構成を転送するために必要なrsyncコマンドを追加する必要があります。
いつでも戻って調整できるので、これは完璧である必要はありません。最善を尽くしてください。 今すぐ何かが必要かどうかわからない場合は、当面は省略して、代わりにコメントを追加してください。
スクリプトは複数回実行されるため、必要になった場合に追加のファイルを取得するようにスクリプトを変更できます。 転送する内容を慎重に扱うことで、ターゲットシステムから不要なファイルを取り除くことができます。
元のシステムの機能とデータを複製しようとしていますが、必ずしも混乱しているわけではありません。
構成ファイルの変更
関連する構成の詳細とデータを元のサーバーから転送した後、多くのソフトウェアはまったく同じように機能しますが、一部の構成は変更する必要がある可能性があります。
これにより、同期スクリプトにわずかな問題が発生します。 スクリプトを実行してデータを同期し、新しいホームの正しい情報を反映するように値を変更すると、次にスクリプトを実行したときにこれらの変更が消去されます。
移行を開始してからソースシステムで発生した変更に追いつくために、rsyncスクリプトを複数回実行する可能性があることを忘れないでください。 ソースシステムは、新しいサーバーの移行とテストの過程で大幅に変更される可能性があります。
変更を一掃することを避けるために取ることができる2つの一般的なパスがあります。 最初に、簡単な方法について説明し、より堅牢なソリューションと私が考えるものをフォローアップします。
迅速で汚い方法
これに対処する簡単な方法は、最初の同期操作の後に、ターゲットシステムで必要に応じてファイルを変更することです。 その後、スクリプト内のrsyncコマンドを変更して、調整したファイルを除外できます。
これにより、rsyncは後続の実行でこれらのファイルを同期しませんします。これにより、変更が元のファイルで再度上書きされます。
これは、前のsyncコマンドをコメントアウトし、次のようないくつかのexcludeステートメントを使用して新しいコマンドを追加することで実現できます。
# rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/
変更されたrsyncディレクトリ仕様のファイルには除外行を追加する必要があります。 また、実際にファイルを再作成する必要がある場合に備えて、ファイルで何が変更されたかについてコメントを追加することもお勧めします。
# Adding exclude rule. Changed socket to '/mysqld/mysqld.sock' # rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ rsync -avz --progress --exclude='my.cnf' 111.222.333.444:/etc/mysql/* /etc/mysql/
堅牢で推奨される方法
上記の方法はいくつかの方法で問題に対処しますが、実際には問題を解決するのではなく、問題を回避するだけです。 私たちはもっとうまくやることができます。
Linuxシステムには、スクリプト作成に非常に役立つさまざまなテキストマニピュレータが含まれています。 実際、これらのプログラムのほとんどは、スクリプト環境での使用を可能にするために特別に作成されています。
このタスクに最も役立つ2つのユーティリティは、sed
とawk
です。 ここをクリックしてsedストリームエディターの使用方法を学び、このリンクをチェックしてawkを使用してテキストを操作する方法を確認してください。
基本的な考え方は、手動で行う変更をスクリプト化して、スクリプト自体が必要な変更を実行できるようにすることです。
したがって、前の例では、事後に変更したファイルの除外を追加する代わりに、そのrsyncコマンドを保持し、sedコマンドを使用してその変更を自動的に行うことができます。
rsync -avz --progress 111.222.333.444:/etc/mysql/* /etc/mysql/ # Change socket to '/mysqld/mysqld.sock' sed -i 's_/var/run/mysqld/mysqld.sock_/mysqld/mysqld.sock_g' /etc/mysql/my.cnf
これにより、ファイルが転送されるたびに、ファイルのすべてのインスタンスのソケットの場所が変更されます。 テキスト操作行が、操作するファイルを同期する行の後に来ることを確認してください。
同様の方法で、awkを使用して表形式のデータファイルに加えられた変更を簡単にスクリプト化できます。 たとえば、/etc/shadow
ファイルは、コロン(:)文字で区切られたタブに分割されます。 次のように、awkを使用して2番目の列からハッシュされたルートパスワードを削除できます。
awk 'BEGIN { OFS=FS=":"; } $1=="root" { $2=""; } { print; }' /etc/shadow > shadow.tmp && mv shadow.tmp /etc/shadow && rm shadow.tmp
このコマンドは、元の区切り文字と出力区切り文字の両方をデフォルトのスペースではなく「:」にする必要があることをawkに通知しています。 次に、列1が「ルート」に等しい場合、列2を空の文字列に設定する必要があることを指定します。
かなり新しいバージョンのawkまでは、その場で編集するオプションがなかったため、ここでは、このファイルを一時ファイルに書き込み、元のファイルを上書きしてから、一時ファイルを削除します。
ファイルに必要なすべての変更をスクリプト化するために最善を尽くす必要があります。 このように、いくつかの簡単な変更を加えて、移行スクリプトの一部の行を他の移行に簡単に再利用できます。
これを行う簡単な方法は、スクリプトを調べて、変更が必要なファイルごとにスクリプトにコメントを追加することです。 要件がわかったら、戻って必要な操作を実行するコマンドを追加します。
これらの変更をスクリプトに追加して、次に進みましょう。
データベースファイルをダンプして転送する
システムでデータベース管理システムを使用している場合は、システムで使用可能な方法を使用してデータベースをダンプする必要があります。 これは、使用するDBMS(MySQL、MariaDB、PostgreSQLなど)によって異なります。
通常のMySQLシステムの場合、次のようなものを使用してデータベースをエクスポートできます。
mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db
MySQLダンプオプションはコンテキストに大きく依存するため、決定する前に、システムに適したオプションを検討する必要があります。 これはこの記事の範囲を超えています。
これらのオプションがデータベースダンプに対して何をするかを見てみましょう。
- -Q :このオプションはデフォルトで有効になっていますが、安全性を高めるためにここに追加されています。 誤解を避けるために、データベース名などの識別子を引用符で囲みます。
- -q :これはクイックの略で、大きなテーブルダンプを高速化するのに役立ちます。 実際には、テーブル全体を一度に処理しようとするのではなく、行ごとに動作するようにMySQLに指示しています。
- -e :これは、ダンプファイルのロード時に挿入ステートメントを個別に処理するのではなく、グループ化することにより、より小さなダンプファイルを作成します。
- -R :これにより、MySQLは残りのデータとともに保存されたルーチンもダンプできます。
- –add-drop-table :このオプションは、テーブルがすでに存在する場合にエラーが発生しないように、MySQLが各CREATETABLEの前にDROPTABLEコマンドを発行する必要があることを指定します。
- -A :このオプションは、MySQLがすべてのデータベースをダンプする必要があることを指定します。
- -u :これは接続に使用するMySQLユーザーの詳細です。 これはルートである必要があります。
- -p :これはMySQLルートアカウントに必要なパスワードです。
これにより、元のシステムにソースシステムのMySQLデータのMySQLダンプが作成されます。 これをSSHコマンドでラップして、リモートで実行することができます。
ssh [email protected] 'mysqldump -Q -q -e -R --add-drop-table -A -u root -proot_password > /root/database_name.db'
次に、通常のrsyncコマンドを使用して、ファイルが終了したときにファイルを取得できます。
rsync -avz --progress 111.222.333.444:/root/database_name.db /root/
その後、ダンプをターゲットシステムのMySQLインスタンスにインポートできます。
mysql -u root -proot_password < /root/database_name.db
もう1つのオプションは、元のデータベースとターゲットシステムのデータベース間のレプリケーション設定を構成することです。 これにより、データベースの移行を完了するために、終了時にマスターとスレーブを簡単に交換できます。
これもこの記事の範囲を超えていますが、マスター/スレーブレプリケーションの構成方法の詳細については、こちらをご覧ください。
このルートを使用する場合は、構成を指定するコメントをスクリプトに追加してください。 大きな問題がある場合は、2回目の試行でそれを回避できるように、自分が行ったことに関する適切な情報を入手できるようにする必要があります。
次のステップ
これで、ほとんどのデータがターゲットシステムにあるか、転送中です。 これにより、実際のデータ転送の大部分が実行されますが、以前のマシンと一致させるために、システムでかなりの構成を行う必要があります。