2015-09-23 6 views
12

私はMySQLのレプリケーションのスキーマを次ていますslaveのリレーログとしてmasterのmysql binlogを使用できますか?

A(マスター) - > B(スレーブ/マスター) - > C(スレーブ)

  • Aは、BがAさんを読み込む
  • BINLOG書き込みbinlogはrelaylogを適用し、自身のbinlogを書き込みます
  • CはBから読み込んで適用します。何らかの理由(A-> B)によって破ら

複製になる場合は、私が最後に実行されたステートメントBに対応している位置を見つけると、それを再生、Aのバイナリログをコピーすることができます。 すべてのレプリケーションチェーンでbin/relayログのトランザクション/ステートメントの順序が同じですか? (それは同じ順序であるかもしれないので、レプリケーションは、1つのスレッドを使用します。)

更新:私はのように求めている必要があります。「すべてのレプリケーション・チェーン全体で同じバイナリログ内の文/トランザクションの順序です、我々はすべてのログを再生することはできますか?スレーブ(c)をマスター(A)に返す " 答えは"はい "と思われます。しかし、公式の確認やドキュメンテーション(ソースコード)のリンクはまだ投稿されていません。

アップデート2:公式ドキュメントからinnodb_support_xaへ:

は、二相のためのInnoDBサポートがトランザクションの準備のための余分なディスクフラッシュを引き起こし、XAトランザクションにコミットできます。 XAメカニズムは内部的に使用され、バイナリログがオンになっていて、複数のスレッドからのデータへの変更を受け入れるすべてのサーバーにとって不可欠です。 innodb_support_xaを無効にすると、ライブデータベースがコミットしているのとは異なる順序でバイナリログにトランザクションを書き込むことができ、ディザスタリカバリまたはレプリケーションスレーブでバイナリログを再生するときに異なるデータを生成する可能性があります。

答えて

0

通常のシナリオでは、あなたのレプリケーション(A> B)が壊れていたポインタが表示されている場合は、それを修正する必要があります。このようにしてスレーブBは正常になり、スレーブCにも正常に複製されました。

スレーブBを使用したくない場合は、スレーブBの複製が破損する前に、BのすべてのデータがCに複製されていて、レプリケーションが壊れていたポインタがわかっていればスレーブCで直接binlogsを実行できるようになりました.Bの代わりにマスターAのスレーブCスレーブを作ることができます。

問題が異なる場合は、詳しく説明してください。

+0

こんにちは、ザファール。 主な質問は、「レプリケーションチェーンに入っている別のサーバのbinlogを再生できますか? – Tamerlaha

+1

サーバBのレプリケーションが機能していないので、サーバはレプリケーションチェーンに属していません。あなたは私の答えで述べたように、AからCのbinlogを再生することができます。レプリケーションを続行するには、 BがCのデータをBから複製できるようにするか、Aから直接Cの複製を開始する必要がありますが、サーバBのデータを決定する必要があります。 –

+0

すべてのbin/relayログで、ステートメントとトランザクションの順序が同じであることを確実に確認していますか?私はこれについてどこで読むことができますか? – Tamerlaha

8

あなたの質問に直接答えるには、いいえ。

トポロジ:

(a)は、マスタ - >(b)のレプリカ - >(c)のレプリカ

  • A =マスター、ビン・ログが
  • Bの=レプリカを有効にする必要があります、log_slave_updatesは、各サーバーの各ビン・ログは、独自のビンを持っていますB

  • C =レプリカを有効にする必要があります-logファイルの名前と位置を指定すると、サーバー間でbin-logをコピーすることはできません。

    あなたがフォローのいずれかを使用して見なければならない、レプリケーショントポロジを管理したいの周りに奴隷を移動し、フェールオーバーされている場合は、次の

    1. MySQL 5.6 with GTID
    2. MHA
    3. Orchestrator

    更新:

    この問題を回避するためには、その根本的な理由がないとhow mysql replication got out of syncが発生し、その問題を解決してください。

  • +0

    こんにちは、デイブ。 私は異なる位置とファイル名を知っています。 スレーブ上で最後に実行されたステートメントの位置(mysqlbinlogを使用)とマスターのbinlog上の適切な位置を見つけることができたらどうなりますか?それは働くでしょうか? – Tamerlaha

    +1

    あなたのポストへのあなたのアップデートを読むことは、何もAからのレプリケーションの外でBサーバに書かれている限り、それはうまくいくはずです。 MHAは実際にこの方法で動作します(https://code.google.com/p/mysql-master-ha/wiki/Architectureを参照)。 – Dave

    1

    質問を明確にする。レプリケーションがA→Bの間で停止し、おそらく修復不可能な場合代わりにA - > Cから複製することは可能ですか?答えは「はい」です。あなたの例では

    両方& Bはバイナリログへの書き込みをしています。これらのログのステートメントの順序は同じですが、証明するためのドキュメントが見つかりませんが、複製の原則です。注文が異なっていた場合、データの同期がかなり簡単になる可能性があります。そしてあなたが正しいです、複製スレーブスレッドはシングルスレッドなので、ホストBは順番にステートメントを読み書きします。

    しかし、いくつかのデータがホスト 'B'に直接書き込まれた場合、もちろんB & Cは書き込まれた内容に応じて異なるデータを 'A'とします。

    変更する前に、サーバーをバックアップしてください。 B & Cで 'SHOW SLAVE STATUS'を実行し、出力を参照としてどこかにコピー&ペーストしてください。

    'A'から 'C'を複製するには、 'C'が現在 'B'を探している場所に対応する 'A'からbinlogの位置を見つける必要があります。これを行うにはいくつかの方法があります。たとえば、mysqlbinlogツールを使用してクエリを手動で検索し、その時点から開始する方法があります。

    迅速な方法は、最大100%「B」と「C」のキャッチをさせることです。レプリケーションが既に 'B'で停止していると仮定します。 Bで 'SHOW SLAVE STATUS'を使用して、 'C'で実行する次のクエリのパラメータを取得します。

    CHANGE MASTER TO MASTER_HOST = '[Master_Host]', MASTER_LOG_FILE='[Master_Log_File]', '[Exec_Master_Log_Pos]'; 
    

    あなたは他のオプションを追加する必要があります。

    MASTER_USER='__USER__', MASTER_PASS='__PASS__', 
    

    は、これは、「B」はに着いたところから始まるの複製です継続してホスト「C」を教えてくれます。あなたが良いdbadminのような悪魔的な人なら、mysqlbinlogを使ってホスト 'A'のbinlogをチェックし、 'C'の新しい位置でクエリ/タイムスタンプを確認し、そのポイントを中心に 'C'これがレプリケーションを再開するポイントであることを確認します。何かのように:

    mysqlbinlog --read-from-remote-server --host=HostA --user.. --password=.. --start-position=[Exec_Master_Log_Pos - 100] --stop-position=[Exec_Master_Log_Pos + 100] Master_Log_File 
    

    mysqlbinlogは程度の良いニュースは、それはまた、あなたが他のサーバからバイナリログのコピーを読んで、あなたがローカルで再生できるSQL文に変換してみましょうということです。これは災害復旧のシナリオで非常に便利です。

    +0

    こんにちは、 私はBがまったく死んでいる(AWSはインスタンスを終了しましたが)Cもbinlogを書いています。 AとCがログを検査した後、mysqlbinlogを使用してスレーブ(C)のマスター(A)からバイナリログを再生できますか? – Tamerlaha

    +0

    はい。 Cで 'CHANGE MASTER'を実行するとMySQL経由でA上のbinlogsを使うことができます。あるいは、mysqlbinlogツールを使ってbinlogファイルを読み込んでCに読み込むことができます。 –

    +0

    トランザクションの順序はすべて同じです複製鎖。しかし、それについてもいくつかの文書を持っていることも素晴らしいでしょう。 私たちは大きなDB(約900GB)を持っています。正式な確認なしに操作するのは本当に危険で、2つのDBを比較してデータの整合性をチェックするのは難しいです。 – Tamerlaha

    関連する問題