専用サーバー間でダウンタイムおよびデータ損失なしでサイトを転送

サイトを別のサーバーに転送するのは難しいように思われますか? おそらく私たちの多くは、学校や大学の最初のコースにいる間に、最高のものを求めて最初のホームページをホスティングからホスティングにコピーしました。 または、経営者に麺の耳を垂らして、彼らはこのタスクが即座に解決されず、DNSがそのようなものであるため、サイトが1日動作しないと説明しました...



一般的に、でたらめなタスクなら、そうですか? しかし、すべてを完璧にする方法は? そのため、ダウンタイムがなく、データベースに矛盾がありません。そのため、DNSレコードIN Aが更新され、ユーザーの半分が古いサイトを持ち、半分が新しいサイトを持っている場合、一部のファイル、アバター、写真は失われません。 高負荷の場合はどうなりますか? または、サイトは数世代の「最高の」プログラマーを作り、サイトの「モジュール」に新しいデータベース接続を作成することを義務付けています。 最後に、そのようなサイトが10個以上ある場合は?





どれくらい時間がかかりますか? サイトが機能しない\貴重な時間は何分ですか?



何らかの理由でハブに関する記事を見つけられなかったため、上司がサイトの安定した運用に満足できるように、不器用なプロジェクトを一度に転送する方法についていくつかのトリックを書くことにしました。



これはすべて、PHPで記述されたWebサイト、フレームワーク、cms、およびheadがコードの作成時に使用されなかったプロジェクトに遭遇した管理者にとってより関連性があります。



1.ファイル転送


rsyncを使用したsshの最適な方法:



rsync -avz -e ssh @.:/// ///
      
      





そのため、rsyncはフォルダーを段階的に同期します。つまり、欠落しているものだけをコピーし、新しいものには触れません。 たとえば、DNSの更新時に古いサーバーのすべてのフォルダーを新しいサーバーに同期する小さなbashスクリプトを作成できますが、それでも最良のオプションは、不一致を確認するために数日後に-n(--dry-run)スイッチでフォルダーを同期することです。 rsyncのドキュメントには、ファイルの同期に関する問題の解決策があると思います。 プログラムは両方のサーバーにインストールする必要があります。



RsyncはFTPプロトコルの使用方法を知らないため、lftpを使用します。



 lftp -e 'mirror -- -; bye;' -u :@.
      
      







2. MySQLの例を使用したデータベース転送


両方のマシンで、MySQLサーバーのポートを世界中に開きます。

 [mysqld] ... bind-address = * #127.0.0.1 ...
      
      







logrotate.dから切り取って、毎日バックアップを行う方法の例を作成します。

 #!/bin/bash CMD="mysqldump --defaults-file=/root/my.cnf --no-create-info=FALSE --order-by-primary=FALSE --force=FALSE --no-data=FALSE --tz-utc=TRUE --flush-privileges=FALSE --compress=TRUE --replace=FALSE --host=localhost --insert-ignore=FALSE --extended-insert=TRUE --quote-names=TRUE --hex-blob=FALSE --complete-insert=FALSE --add-locks=TRUE --port=3306 --disable-keys=TRUE --delayed-insert=FALSE --create-options=TRUE --delete-master-logs=FALSE --comments=TRUE --default-character-set=utf8 --max_allowed_packet=1G --flush-logs=FALSE --dump-date=TRUE --lock-tables=TRUE --allow-keyw ords=FALSE --events=FALSE --databases --routines" for i in $(mysql --defaults-file=/root/my.cnf --batch --skip-column-names -e 'SHOW DATABASES' | grep -v '^information_schema$'); do if [ ! -e /srv/dumps/$i ]; then mkdir -m 700 /srv/dumps/$i; fi $CMD $i | gzip -c > /srv/dumps/$i/$i.sql.gz done
      
      





/root/my.cnf

 [client] user = root password = passw
      
      





古典的な「mysqldump -u root -p database> dump.sql」はなぜですか? その後、ビューとストアドプロシージャは保存されません。 MySQL Workbenchは正しくダンプし、そこからこのコマンドを受け取りました。



次に、$ CMD変数に-h ip_old_serverを追加し、行$ CMD $ i |を変更します。 gzip -c> /srv/dumps/$i/$i.sql.gz:

 $CMD $i | mysql -u root -ppasswod $i
      
      





もちろん、最初にすべてのデータベースを作成する必要があります。

 mysql --defaults-file=/root/my.cnf --batch --skip-column-names -e 'SHOW DATABASES' | grep -v '^information_schema$'
      
      





3.すべての接続をローカルホストにリダイレクト:3306-古いサーバーを新しいサーバーに


かなり簡単です。sshトンネルを使用します(最初にmysqlを停止します)。

 ssh -Nf -L 3306:REMOTE_IP:3306 user@localhost
      
      





さらに、sshはローカルマシンでのみ必要です。 私たちはチェックします:

 netstat -lnpt | grep 3306 telnet 127.0.0.1 3306
      
      





ローカルマシンでリモートMySQLサーバーを取得します。 すべては問題ありませんが、MySQLクライアントが接続がlocalhostに向かうことを確認した場合、ローカルソケットを介してサーバーに接続し、設定から離脱することはできません。 つまり

 telnet localhost 3306
      
      





または、いつものようにスクリプトで記述します。

 $resource = new mysqli('localhost', 'user', 'password');
      
      





動作しません、なぜなら このような接続もローカルソケットを介して処理されます。 もちろん、サイト上のすべての接続を調べて、localhostを127.0.0.1または外部IPサーバーに置き換えることができますが、動作しますが、より良い方法があります。



16進エディターでファイルを編集する必要があります。

 libmysqlclient.so.15.0.0 libmysqlclient_r.so.15.0.0  (   mysql) libmysqlclient.so.16.0.0 libmysqlclient_r.so.16.0.0
      
      





テキストlocalhostで一致するものだけを見つけて、両方のファイルでそれをlacalhostなどの別のものに置き換えます。 ローカル接続がTCP / IPを介して機能するようになりました! 唯一のMySQLは、リモートホストが特権でlocalhostにしかなれないユーザーを許可しません。 これは、転送中に%で修正する必要があります。



Webサーバーの設定をスキップしてみましょう。このトピックには多くの資料があります。

その結果、1台のデータベースサーバーを備えた2台の作業マシンがあります。 DNSを静かに再構成し、スリープ状態になります!



psまた、古いサーバーからのリクエストをnginxを介して新しいサーバーにプロキシするというアイデアも思いつきました。 誰もこれをしましたか?



upd:

また、私は最善の解決策のふりをするのではなく、探しています。 何て言うの?



All Articles