MySQLは、レプリケーショントポロジでマスターサーバーに接続できるスレーブの数を制限しません。ただし、スレーブの数が増えると、バイナリログをさまざまな速度で動作するさまざまなスレーブに提供する必要があるため、マスターリソースに負担がかかります。マスターでのデータチャーンが多い場合、バイナリログの提供だけで、マスターのネットワークインターフェイスが飽和状態になる可能性があります。
この問題の古典的な解決策は、マスターとそのスレーブの間にある中間プロキシサーバーであるbinlogサーバーをデプロイすることです。 binlogサーバーは、マスターのスレーブとしてセットアップされ、次に、元のスレーブのセットのマスターとして機能します。マスターからバイナリログイベントを受信し、これらのイベントを適用しませんが、他のすべてのスレーブに提供します。このようにして、マスターの負荷が大幅に軽減されると同時に、binlogサーバーは、他のデータベースサーバー処理を行う必要がないため、binlogをより効率的にスレーブに提供します。
Rippleは、PavelIvanovによって開発されたオープンソースのbinlogサーバーです。 Perconaのブログ投稿「MySQLRipple:MySQL Binlogサーバーの第一印象」では、Rippleのデプロイと使用について非常に優れた紹介をしています。リップルをもう少し詳しく調べる機会があり、この投稿を通じて自分の観察結果を共有したいと思いました。
1。 GTIDベースのレプリケーションのサポート
リップルはGTIDモードのみをサポートし、ファイルおよび位置ベースのレプリケーションはサポートしません。マスターが非GTIDモードで実行されている場合、リップルから次のエラーが発生します:
パケットの読み取りに失敗しました:サーバーからのパケットの読み取りエラーが発生しました:レプリケーション送信者スレッドをAUTO_POSITIONモードで開始できません:このサーバーのGTID_MODE=OFFではなくONです。
コマンドラインオプションを使用して、リップルサーバーのServer_idとUUIDを指定できます:-ripple_server_idと-ripple_server_uuid
どちらもオプションのパラメーターです。指定しない場合、Rippleはデフォルトのserver_id =112211を使用し、uuidが自動生成されます。
2。レプリケーションユーザーとパスワードを使用してマスターに接続する
マスターに接続しているときに、コマンドラインオプションを使用してレプリケーションユーザーとパスワードを指定できます。
-ripple_master_userおよび-ripple_master_password
3。 Rippleサーバーの接続エンドポイント
コマンドラインオプション-ripple_server_portsおよび-ripple_server_addressを使用して、Rippleサーバーの接続エンドポイントを指定できます。 Rippleサーバーのネットワークアクセス可能なホスト名またはIPアドレスを-rippple_server_addressとして指定してください。そうしないと、デフォルトでRippleがローカルホストにバインドされるため、リモートホストに接続できなくなります。
4。 Rippleサーバーへのスレーブのセットアップ
CHANGE MASTER TOコマンドを使用して、Rippleサーバーから複製するスレーブを接続できます。
Rippleが接続に使用するパスワードを認証できるようにするには、オプション-ripple_server_password_hash
を指定してRippleを起動する必要があります。たとえば、次のコマンドでリップルサーバーを起動した場合:
rippled -ripple_datadir =./ binlog_server -ripple_master_address =
次のCHANGE MASTER TOコマンドを使用して、スレーブから接続できます。
CHANGE MASTER TO master_host ='172.31.23.201'、master_port =15000、master_password =’XpKWeZRNH5#satCI’、master_user =’rep’
Rippleサーバーに指定されたパスワードハッシュは、CHANGEMASTERTOコマンドで使用されたテキストパスワードに対応していることに注意してください。現在、Rippleはユーザー名に基づいて認証を行わず、パスワードが一致する限り、空でないユーザー名を受け入れます。
MySQLBinlogサーバーの探索-RippleClickToTweet5。リップルサーバー管理
標準のMySQLクライアントからMySQLプロトコルを使用して、Rippleサーバーを監視および管理することができます。サポートされているコマンドのセットは限られており、mysql-rippleGitHubページのソースコードで直接確認できます。
便利なコマンドのいくつかは次のとおりです。
-
SELECT @@ global.gtid_executed;
–ダウンロードしたバイナリログに基づいてRippleサーバーのGTIDセットを確認します。 -
STOP SLAVE;
–Rippleサーバーをマスターから切断します。 -
START SLAVE;
–Rippleサーバーをマスターに接続します。
既知の問題と改善のための提案
1。 RippleサーバーからマスターへのSSLレプリケーションチャネルを設定するオプションが表示されませんでした
この結果、Rippleサーバーは暗号化された接続を義務付けるマスターに接続できなくなります。接続しようとすると、エラーが発生します:
0322 09:01:36.555124 14942 mysql_master_session.cc:164]ホストへの接続に失敗しました:
2。 Rippleサーバーをsemi-syncオプションで動作させることができませんでした
オプション-ripple_semi_sync_slave_enabled=trueを使用してRippleサーバーを起動しました
接続時に、マスターはRippleサーバーをセミシンク対応のスレーブとして検出できました。
mysql> show status like'rpl%';
--------------------------------- ---------------------
| Variable_name |値|
-------------------------------------------- ----------
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_status |オン|
| Rpl_semi_sync_slave_status |オフ|
-------------------------------------------- ----------
ただし、半同期モードでトランザクションを実行しようとすると、180000であるrpl_semi_sync_master_timeoutが待機しました
mysql> create database d12;
Query OK、1行が影響を受ける(3分0.01秒)
マスターで半同期がオフになっていることがわかりました:
mysql> show status like'rpl%';
+ -------------------------------- ------------ + ------- +
| Variable_name |値|
+ ------------------------------------------- -+ ------- +
| Rpl_semi_sync_master_clients | 1 |
| Rpl_semi_sync_master_status |オフ|
| Rpl_semi_sync_slave_status |オフ|
+ ------------------------------------------- -+ ------- +
mysqlエラーログからの対応するスニペット:
2020-03-21T10:05:56.000612Z 52[注]binlog_dumpをmaster_thread_id(52)slave_server(112211)、pos(、4)に開始します
>
2020-03-21T10:05:56.000627Z 52 [注]スレーブへの半同期binlog_dumpを開始します(server_id:112211)、pos(、4)
20020-03-21T10:08:55.873990Z 2 [警告]binlogの応答を待機するタイムアウト(ファイル:mysql-bin .000010、位置:350)、ファイルまでの半同期、位置4。
2020-03-21T10:08:55.874044Z2[注]半同期レプリケーションがオフになりました。
MySQLRippleGithubページの同様の行に沿って報告された問題があります。
3。 Rippleサーバーのスレーブに並列レプリケーションを使用する場合の問題
スレーブ上のSQLスレッドがエラーで停止することがよくあることがわかりました:
Last_SQL_Error:現在のイベントグループを並列モードで実行できません。発生したイベントGtid、リレーログ名/mysql_data/relaylogs/relay-log.000005、位置27023962。これにより、このイベントグループを並列モードで実行できなくなります。理由:マスターイベントのタイムスタンプが論理的に正しくありません。
上記のリレーログと位置を分析すると、この時点でのトランザクションの「シーケンス番号」が1にリセットされたことがわかりました。元のマスター。通常、直接スレーブの場合、ローテーションイベントが発生します。これにより、リレーログもマスターバイナリログローテーションに基づいてローテーションされます。私の評価では、そのような状態を検出でき、シーケンス番号のリセットは並列スレッドで処理できます。ただし、リレーログをローテーションせずにシーケンス番号を変更すると、並列スレッドが失敗することがわかります。
この観察結果は問題として報告されています:binlogサーバー#26からの同期中のスレーブ並列スレッドの失敗
4。 mysqlbinlogユーティリティは、Rippleサーバーによって生成されたバイナリログでは機能しません
バイナリログでmysqlbinlogユーティリティを実行しようとすると、エラーが発生しました:
エラー:Log_event ::read_log_event()のエラー:'バイナリログで無効なイベントが見つかりました'、data_len:43、event_type:-106
この問題はここで発生します:mysqlbinlogユーティリティを使用してバイナリログファイルを開くことができません。 #25
これは、既知の問題として作成者によって認識されています。このユーティリティをデバッグ目的でサポートすると便利だと思います。
これが私のクイックテストからの今のところのレポートです。 Rippleでさらに多くの発見があったときに、このブログ投稿を更新する予定です。全体として、使い方はシンプルでわかりやすく、MySQL環境のbinlogサーバーの標準になる可能性があることがわかりました。
|