MySQLの自体、プライマリと遅延との間のレプリケーションの尺度をSeconds_Behind_Masterショースレーブのステータスを提供するが、今日は、シーンに出会い、Seconds_Behind_Masterが0で見つかった、ライブラリの表示IO / SQLスレッドによって調製ショースレーブの状態が正常である、MySQLのことでメインライブラリーの変化が、長い時間のためには、バックアップリポジトリに同期させることはできません。人間の介入なしに、時間後まで、MySQLは自動的にメイン図書館、中央図書館が変更を複製し続ける再接続されます。
影響力の球:MySQLの、Percona、MariaDBのすべてのバージョン。
このシーンではあるが非常に特別な出会いの確率が高くありませんが、個人的にMySQLのDBAを使用するためにそれらを思い出させる必要性を感じています。このシーンの分析を通じて、だけでなく、私たちのMySQLのレプリケーションの再試行メカニズムのより深い理解を助けます。
まず、再現手順
スタンバイコピーを構築し、一時的にメイン図書館ネットワークを切断し、MySQLのバイナリログダンプ・スレッドのメインリポジトリを殺します。
レプリケーションライブラリがスレーブ状態でを示し、この時点で観察準備します:
Slave_IO_Running:はい
Slave_SQL_Running:はい
Seconds_Behind_Master:0
あなたがメインのライブラリ内のすべての変更を行うために、復元この時点でネットワークを入れた後、しかし、ライブラリ装置が更新されたデータを取得することはできません。そして、スタンバイ・データベース上のスレーブステータス表示を示していますIOスレッドがいつものようにSQLスレッドで、延期されたコピーは0です。
すべてが正常であり、通常の監視ソフトウェアは、遅れたライブラリデータによって発見されることはありません。
第二に、原則として分析
MySQLデータベースの複製は、他の重要な領域は異なっています。拡張性と可用性の高い基礎があります。それ自体は非常に知的されている、我々は唯一のファイル名とオフセットコピーを指定変更マスターBINLOGを呼び出す必要がバックアップライブラリへのメインライブラリーから関係を構築することができます。
MySQLのレプリケーションスレッドは自動的にプライマリの中断時に記録現在位置をコピーして、メインのライブラリに接続を自動的に複製し、それが中断したところからコピーを開始します。これらの操作は完全にノー人間の介入で、自動化されています。これは、MySQL DBAは、利便性の多くをもたらした与えるが、それはまた、多くの詳細を隠します。
実際には問題の前で真実を理解するにしてこの問題を解決する方法を、私たちは本当にMySQLのレプリケーションの原理を理解する必要があります。
2.1「プッシュ」または「プル」
まず、MySQLのレプリケーションは、むしろ「プル」よりも「プッシュ」です。MySQLライブラリの機器を指し、「プル」は常にメインライブラリ循環データ更新するかどうかを尋ね、さらにこのように資源の消費、および非効率的。「プッシュ」メインMySQLデータベースのプッシュに発生するデータの相互作用の変化、資源の少ない消費量がある場合にのみ、彼らはこのように更新されたデータを持ってスタンバイ・データベースにこの変更を指します。あなたがプログラマの背景であれば、あなたは「プッシュ」アプローチを選択します。
MySQLのだから、特に「プッシュ」欄、実際には、マスター・データベース・アプリケーション・データへの記録の変更の時にライブラリによって調製、あなたはファイルを指定する必要がどのようにそこからオフセット特定のバイト数の主な図書館BINLOG(MASTER_LOG_FILE)(MASTER_LOG_POS) 。BINLOGダンプスレッドを開始しますメインライブラリに対応し、ライブラリによって送られた作品によって、この開始位置片からレコードを変更します。ライブラリ装置は、メインライブラリの変更の上に耳を傾けてきた、1を受け、ローカルにデータの変更を使用します。
2.2の理由
:ショースレーブステータス表示、すべてが正常であるが、実際にデータベースがバックアップリポジトリまで同期させることはできませんマスターを変更する理由は上記の分析から、我々はおおよそ推測することができます
何かがうまくいかない、バイナリログ・ダンプ・プログラムは、私たちが殺すということです。ライブラリによって調製聞くために当事者は、すべての変更を受信していないとして、それはデータがオーバー押し変更なしで、その結果、メインライブラリーで変更することなく、長い時間のためだと思います。ライブラリ装置は、最終的には、スレッドダンプに対応するメインライブラリBINLOGを決定することができない予期せず終了し、または任意のデータを変更することなく、長い時間のためにされています。だから、これらの2つの場合は、スタンバイ・データベースは、通常のように表示されます。
もちろん、MySQLはこのような状況を回避しようとします。例えば:
BINLOGが殺しダンプ殺すライブラリのスレッドによってリットル通知。だから我々は、再現するために、ライブラリによって調製していないときに、この通知が送信されていることを確認する必要があり、それが問題を再現するための鍵は、バイナリログがスタンバイ・データベースに送信することができないため、ネットワークの輻輳やその他の理由にキルメッセージをダンプ嘘です。
受け取っていないが、メインライブラリーの変化から来た場合、Lは長い時間のためのライブラリで用意し、それは定期的に主要なライブラリを再接続します。
2.3の問題を回避
上記の分析に基づいて、我々は、MySQLが、この場合に行いますが、避けることができないことを知っているし、我々は何の列を回避する方法を持つことができます。
1.パッシブ対策:時間内に問題を特定、監視・レイテンシの方法を変更します。
2.イニシアチブは防ぐために:正しい設定--master-retry-countに、--master-接続リトライ、--slave-netのタイムアウトコピーretryパラメータを。
L受動的治療
ほとんどのMySQLの遅延監視Seconds_Behind_Masterで直接コレクションショーの奴隷状態。この場合、Seconds_Behind_Masterは、マスタとスレーブとの間の遅延の真の尺度を複製することはできません。私たちは、ポーリング時間情報を挿入することにより、マスターライブラリーであることをお勧めしますし、プライマリを取得し、ライブラリで用意されたプログラムをコピーすることで、時間差を遅らせます。Perconaは、同様のソリューションのPT-ハートビートを提供します。
この問題の発見後、私たちは奴隷を停止する必要があり、スレーブを起動し、再起動の複製は、この問題を解決することができます。
L防止構想
MySQLのレプリケーションスレッドの再接続のために、メインライブラリーを3つのパラメータを指定することができます。--master-retry-countに、--master-接続リトライ、--slave-netのタイムアウト。
コピースタンバイ変更マスターを構築する際に、マスターコネクト・リトライとマスターリトライ回数が指定され、スレーブ・ネットタイムアウトがオンラインMySQLのランタイムを提供するグローバル変数、です。
特定の再試行戦略:スレーブネットタイムアウト秒を超えるライブラリ装置が初めて開始し、再試行しますメインライブラリにデータを受け取っていません。そして、すべてのマスター・コネクト・リトライ秒、スタンバイ・データベースは再びマスターライブラリを再接続しようとします。マスターリトライ回数のリトライ回数までは、それはあきらめて、再試行します。リトライ処理であれば、でもメイン図書館で、現在の主なライブラリは、待っているのスレーブネットタイムアウト秒を開始すること、それは良いですので。
スレーブネットタイムアウトのデフォルト値は3600秒です(MySQLバージョン<= 5.7.6)、マスター・接続再試行のデフォルトは60秒、86400倍にマスターリトライ回数のデフォルト値。ライブラリによってオーバー送信されたデータを変更することなく、メインのライブラリ時間は、メインのライブラリを再接続しようとする場合それは、です。それが私たちのシミュレーションシナリオでは、時間後、スタンバイ・データベースは、データの変更を同期させるために継続する理由をメインライブラリを再接続します理由です。
あなたがメインのライブラリにより頻繁に変更する場合は、この場合には、バイナリログは、スレッドの終了をダンプメインライブラリーを回避するために、ポイントを設定するには、小さなスレーブネットタイムアウトを考慮し、最新の更新が上に押されることはありません。
スタンバイ・データベースが頻繁にメイン図書館、資源の無駄を再接続すると、当然のことながら、小さすぎスレーブネット・タイムアウト設定は問題もあり、これは主なライブラリは、実際に比較的小さい場合変更につながるだろう。
查看设置情况:show variables
like
'slave_net_timeout'
;
デフォルトの設定の公式ウェブサイト:
プロパティ | 値 |
---|---|
コマンドラインのフォーマット | --slave-net-timeout=# |
システム変数 | slave_net_timeout |
範囲 | グローバル |
動的 | はい |
タイプ | 整数 |
デフォルト値(> = 5.7.7) | 60 |
デフォルト値(<= 5.7.6) | 3600 |
最小値 | 1 |