sql >> データベース >  >> RDS >> Mysql

MySQL Binlogサーバーの探索–リップル

    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 = -ripple_master_port =3306 -ripple_master_user =repl -ripple_master_password ='password' -ripple_server_ports =15000 -ripple_server_address ='172.31.23.201' -ripple_server_password_ / code>

    次の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サーバーの探索-RippleClickToTweet

    5。リップルサーバー管理

    標準の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]ホストへの接続に失敗しました:、ポート:3306、err:接続に失敗しました:--require_secure_transport =ONの間、安全でないトランスポートを使用した接続は禁止されています。

    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サーバーの標準になる可能性があることがわかりました。

    その他のヒント

    MySQLServerヘルスチェック

    MySQLマスタースレーブ高可用性(HA)セットアップでは、潜在的な問題を検出して修正アクションを実行できるように、マスターサーバーとスレーブサーバーの状態を継続的に監視することが重要です。 。詳細

    MySQLローリングインデックスビルド

    通常のワークロードに影響を与えないようにMySQLインデックス作成プロセスを最適化する方法。 MySQLマスタースレーブレプリカセットがある場合は、一度に1ノードずつローリング方式でインデックスを作成できます。詳細

    MySQLの高可用性

    システムの可用性は、そのサービスが一定期間稼働している時間の割合です。通常、一連の9として表されます。 1年間に測定された可用性と対応するダウンタイムを確認してください。詳細


    1. SQLでLIKEを使用する方法

    2. MySQLとMariaDBのスキーマ管理のヒント

    3. oraclesqlplusでテーブルデータをより明確に表示する方法

    4. MySQLクエリでLIMITを指定してSELECTを使用するときにすべての行をカウントするにはどうすればよいですか?