web-dev-qa-db-ja.com

perconaツールキットのpt-table-syncで実際に何ができるでしょうか?

2つの異なるデータベースのテーブルを同期するツールを探していましたが、 pt-table-sync が見つかりました。ドキュメントを読んで混乱しました。ほとんどの場合、レプリケートされた環境を参照する例を使用していますが、レプリケーションの全体的なポイントはデータの同期を処理することだと思ったので、私の質問は次のとおりです。

質問

  1. レプリケーションプロセスがデータの同期を処理することになっている場合、pt-table-syncを使用する意味は何ですか?

  2. 複製されていない環境でpt-table-syncを使用できますか(相互に関係のない2つ以上のホスト間で、与えられたpt-table-sync --execute Host1 Host2 Host3の例の役割ですか? )?

  3. レプリケートされた環境でpt-table-syncを使用する必要がある場合、masterbin-logsを付けずに使用できますか(違いの解決について説明している例があります) pt-table-checksumによって発見されたので、bin-logsが絶対に必要かどうか疑問に思います)?

3
Max

質問1への回答

MySQLレプリケーションには2つの大きな問題があります

  • MySQLレプリケーションは非同期です。これにより、レプリケーションの遅延が発生する可能性があります。これは、スレーブI/Oスレッドを介したマスターとスレーブ間の通信の問題で明らかになります。これは、論理的および数値的にSeconds_Behind_Masterで確認できます。

  • Data Drift。これは、MySQLレプリケーションの領域外の要因のために、マスターとスレーブが単に同期していない断続的な状態です。たとえば、レプリケーションをより適切に同期する1つの方法に注意してください。オプション sync-binlog を使用します。 sync-binlogを1に設定すると、mysqldは、バイナリログに記録するすべてのエントリに対して現在のバイナリログのフラッシュを実行します。それはとんでもなくマスターを遅くすることができます。デフォルトでは、sync-binlogは0です。

    • ここに質問があります:sync-binlog=0で、バイナリログをディスクにフラッシュする責任があるのは誰ですか?
    • 回答(これについては座ってください):オペレーティングシステム!!!
    • その答えでは、そのI/Oスレッドはマスターのオペレーティングシステムに翻弄されるため、スレーブはひどい不利な点になります。マスターのOSがバイナリログの変更をディスクにフラッシュし、スレーブのI/Oスレッドが次の着信SQLステートメントを検出できるようになると、ステートメントはI/Oスレッドを介してスレーブに送信されます。
    • Perconaには Nice PDFデータドリフトの処理について

質問2への回答

pt-table-sync は、--sync-to-masterオプションを使用してスレーブのI/Oスレッドを検出するように設計されているため、ここでの直接の答えはノーです。

質問3への回答

MySQLレプリケーションは知る必要があるため、ここでの直接の答えはノーです。

  • マスターの現在のバイナリログは何ですか? (これはMaster_Log_FileSHOW SLAVE STATUS\Gです)
  • スレーブがマスターの現在のバイナリログから読み取った最新の位置は何ですか? (これはRead_Master_Log_PosSHOW SLAVE STATUS\Gです)

バイナリログを邪魔にならないようにしたいだけの場合は、次の2つのいずれかを実行できます。

  • オプション1:マスターで expire-logs-days を3に設定して、過去3日間分のバイナリログを保持します
    • /etc/my.cnfにexpire-logs-days=3を追加します
    • 再起動は必要ありません:SET GLOBAL expire_logs_days = 3;を実行するだけです
  • オプション2:スレーブでSHOW SLAVE STATUS\Gを実行します。 Relay_Master_Log_Fileの値を取ります。それを使用して、マスターのバイナリログをクリアし、そのログファイルをアップします。
    • スレーブでSHOW SLAVE STATUS\Gを実行するとします。
    • あなたはこれを手に入れますRelay_Master_Log_File: mysql-bin.000035
    • マスターでこれを実行します:PURGE BINARY LOGS TO 'mysql-bin.000035';

提案

Pt-table-syncをより信頼したい場合は、--printオプションを使用して、--executeオプションの代わりにテキストファイルにリダイレクトしてみてください。これにより、通常はマスターで実行されるSQLが生成されます。その後、そのスレーブでSQLを直接実行できます。 --executeのドレスリハーサルと考えてください。

7
RolandoMySQLDBA

しかし、レプリケーションの全体的なポイントは、データの同期を処理することだと思いました

はい、MySQLレプリケーションはレプリケートされたデータベースの同期を試みます。ただし、MySQLレプリケーションには注意が必要であり、さまざまな理由でレプリケーションが失敗する可能性があります。私の経験ではレプリケーションエラーはまれですが、予期しないサーバークラッシュ、マスターの大きな挿入の途中でユーザーが「Control-C」を押した場合などに発生します。MySQL.comには、多くの処理に適したツールがありませんこれらの問題の。幸いなことに、Baron Schwartz(Percona Toolkit(旧称Maatkit)の元の作者)などの数人のエンジニアが、MySQLの管理を容易にするツールを開発しました。

たとえば、現在、5,000万行のテーブルがあります。数週間前にサーバーがクラッシュしたため、いくつかの行が同期していません。どの行が同期していないかを見つける必要がありますが、手動で行うのは面倒です。 pt-table-checksumを使用してレプリカのレプリケーションエラーをチェックし、pt-table-syncを使用してレプリカで欠落している行を検出します。

MySQLレプリケーションを検討している場合は、PerconaToolkitを調査して使用することを強くお勧めします。 Percona Toolkitから始めていたら、MySQLデータベースの管理ははるかに簡単だったでしょう。

ドキュメントを読んで混乱しました:

Percona Toolkitのドキュメントは、技術マニュアルのように書かれています。残念ながら、ツールの使用方法、ツールがどのように役立つかなどを説明するのはうまくいきません。 http://www.mysqlperformanceblog.com この情報の一部がありますが、主に焦点が当てられています。 MySQLのPerconaフォーク(これが彼らが生計を立てている方法です)で、読者が何らかの翻訳を行う必要があります。

3

質問1への回答

pt-table-syncpt-table-checksumと一緒に)を使用すると、データの破損、スレーブ上のデータを直接変更する人、サーバーのクラッシュ、スキーマの変更などのレプリケーションエラーを修正できます。

ただし、データがあまり変更されない場合は、pt-table-syncをレプリケーションなしで使用して、テーブルの同期をほぼリアルタイムで維持することもできます。

質問2の正解

もちろん、複製されていない環境でも使用できます。 manual にも記載されています。私はcronからそれを使用して、5分ごとに3つのmysqlサーバーを「同期」させます。それらは(最初のサーバーで)たまにしか変更されないデータの同じコピーを持っているので、この目的のための複製はやり過ぎでしょう。

同期する個々のデータベースまたは個々のテーブルを指定できます。複数の宛先サーバーを持つことができます。 pt-table-syncは、いくつかの効率的なアルゴリズムを使用して、データベーステーブルの変更を検出し、変更のみをコピーします(変更を、削除、置換、挿入、更新の4つのグループに分類します)。

2
Marki555