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

GaleraクラスターでSST操作を停止またはスロットルする方法

    状態スナップショット転送(SST)は、ノードが同期されて「プライマリコンポーネント」の一部として宣言されるまで、ノードがクラスターに参加しているときに初期同期を実行するためにGaleraが使用する2つの方法の1つです。データセットのサイズとワークロードに応じて、SSTは非常に高速になるか、データベースサービスを停止させる高価な操作になる可能性があります。

    SSTは、次の3つの方法で実行できます。

    • mysqldump
    • rsync(またはrsync_wan)
    • xtrabackup(またはxtrabackup-v2、mariabackup)

    ほとんどの場合、xtrabackup-v2とmariabackupが推奨されるオプションです。本番クラスターでrsyncまたはmysqldumpを実行している人はめったに見られません。

    問題

    SSTが開始されると、ジョイナーノードでトリガーされるいくつかのプロセスがあり、これらは「mysql」ユーザーによって実行されます。

    $ ps -fu mysql
    UID         PID   PPID  C STIME TTY          TIME CMD
    mysql    117814 129515  0 13:06 ?        00:00:00 /bin/bash -ue /usr//bin/wsrep_sst_xtrabackup-v2 --role donor --address 192.168.55.173:4444/xtrabackup_sst//1 --socket /var/lib/mysql/mysql.sock --datadir
    mysql    120036 117814 15 13:06 ?        00:00:06 innobackupex --no-version-check --tmpdir=/tmp/tmp.pMmzIlZJwa --user=backupuser --password=x xxxxxxxxxxxxxx --socket=/var/lib/mysql/mysql.sock --galera-inf
    mysql    120037 117814 19 13:06 ?        00:00:07 socat -u stdio TCP:192.168.55.173:4444
    mysql    129515      1  1 Oct27 ?        01:11:46 /usr/sbin/mysqld --wsrep_start_position=7ce0e31f-aa46-11e7-abda-56d6a5318485:4949331

    ドナーノードにいる間:

    mysql     43733      1 14 Oct16 ?        03:28:47 /usr/sbin/mysqld --wsrep-new-cluster --wsrep_start_position=7ce0e31f-aa46-11e7-abda-56d6a5318485:272891
    mysql     87092  43733  0 14:53 ?        00:00:00 /bin/bash -ue /usr//bin/wsrep_sst_xtrabackup-v2 --role donor --address 192.168.55.172:4444/xtrabackup_sst//1 --socket /var/lib/mysql/mysql.sock --datadir /var/lib/mysql/  --gtid 7ce0e31f-aa46-11e7-abda-56d6a5318485:2883115 --gtid-domain-id 0
    mysql     88826  87092 30 14:53 ?        00:00:05 innobackupex --no-version-check --tmpdir=/tmp/tmp.LDdWzbHkkW --user=backupuser --password=x xxxxxxxxxxxxxx --socket=/var/lib/mysql/mysql.sock --galera-info --stream=xbstream /tmp/tmp.oXDumYf392
    mysql     88827  87092 30 14:53 ?        00:00:05 socat -u stdio TCP:192.168.55.172:4444

    大規模なデータセット(数百Gバイト)に対するSSTは面白くありません。ハードウェア、ネットワーク、およびワークロードによっては、完了するまでに数時間かかる場合があります。運用中にサーバーリソースが飽和状態になる場合があります。 --rlimitおよび--use-memoryオプションを使用するSST(xtrabackupおよびmariabackupのみ)でスロットリングがサポートされているにもかかわらず、多数派のアクティブノードが不足している場合は、劣化したクラスターにさらされます。たとえば、運が悪ければ、3つのノードのうち1つしか実行されていないことに気付く場合です。したがって、静かな時間帯にSSTを実行することをお勧めします。ただし、このブログ投稿で説明されているように、手動の手順を実行することでSSTを回避できます。

    SSTの停止

    SSTの停止は、ドナーノードとジョイナーノードの両方で実行する必要があります。ジョイナーは、ローカルのGalera seqnoをクラスターのseqnoと比較するときに、ギャップの大きさを判別した後、SSTをトリガーします。 wsrep_sst_ {wsrep_sst_method}を実行します 指図。これは選択されたドナーによって選択され、ジョイナーへのデータのストリーミングが開始されます。ドナーノードには、Galeraグループ通信によって、または wsrep_sst_donor で定義された値によって選択されると、スナップショット転送の提供を拒否する機能がありません。 変数。同期が開始され、決定を元に戻したい場合、操作を停止する単一のコマンドはありません。

    SSTを停止するときの基本原則は、次のとおりです。

    • Galeraグループのコミュニケーションの観点から参加者を死んでいるように見せます(シャットダウン、フェンス、ブロック、リセット、ケーブルのプラグを抜く、ブラックリストなど)
    • ドナーのSSTプロセスを強制終了します

    ドナーでinnobackupexプロセス(kill -9 {innobackupex PID})を強制終了するだけで十分だと思われるかもしれませんが、そうではありません。ジョイナーをフェンシングせずにドナー(またはジョイナー)のSSTプロセスを強制終了した場合でも、Galeraはジョイナーをアクティブとして認識し、SSTプロセスを未完了としてマークします。これにより、新しいプロセスセットが再生成され、続行または最初からやり直します。正方形に戻ります。これは、タイムアウトに対して脆弱なSST操作を保護するための/ usr / bin / wsrep_sst_ {method}スクリプトの予想される動作です(たとえば、実行時間が長く、リソースを大量に消費する場合)。

    例を見てみましょう。クラスターに再参加したいクラッシュしたジョイナーノードがあります。まず、ジョイナーで次のコマンドを実行します。

    $ systemctl start mysql # or service mysql start

    1分後、その特定の瞬間に操作が重すぎることがわかり、交通量の少ない時間帯にそれを延期することにしました。エクストラバックアップベースのSSTメソッドを停止する最も簡単な方法は、ジョイナーノードをシャットダウンし、ドナーノードのSST関連プロセスを強制終了することです。または、ジョイナーで次のiptablesコマンドを実行して、ジョイナーの着信ポートをブロックすることもできます。

    $ iptables -A INPUT -p tcp --dport 4444 -j DROP
    $ iptables -A INPUT -p tcp --dport 4567:4568 -j DROP

    次に、ドナーで、SSTプロセスのPIDを取得します(「mysql」ユーザーが所有するプロセスをリストアップします):

    $ ps -u mysql
       PID TTY          TIME CMD
    117814 ?        00:00:00 wsrep_sst_xtrab
    120036 ?        00:00:06 innobackupex
    120037 ?        00:00:07 socat
    129515 ?        01:11:47 mysqld

    最後に、mysqldプロセスを除くすべてを強制終了します(ドナーのmysqldプロセスを強制終了しないように非常に注意する必要があります!):

    $ kill -9 117814 120036 120037

    次に、ドナーのMySQLエラーログで、約100秒後に次の行が表示されることに注意してください。

    2017-10-30 13:24:08 139722424837888 [Warning] WSREP: Could not find peer: 42b85e82-bd32-11e7-87ae-eff2b8dd2ea0
    2017-10-30 13:24:08 139722424837888 [Warning] WSREP: 1.0 (192.168.55.172): State transfer to -1.-1 (left the group) failed: -32 (Broken pipe)

    この時点で、ドナーは wsrep_local_state_commentによって報告された「同期」状態に戻る必要があります。 SSTプロセスは完全に停止します。ドナーは運用状態に戻り、クライアントにフル稼働でサービスを提供できるようになりました。

    ジョイナーのクリーンアッププロセスでは、iptablesチェーンをフラッシュするだけです。

    $ iptables -F

    または、-Dフラグを使用してルールを削除するだけです:

    $ iptables -D INPUT -p tcp --dport 4444 -j DROP
    $ iptables -D INPUT -p tcp --dport 4567:4568 -j DROP

    同様のアプローチは、rsync、mariabackup、mysqldumpなどの他のSSTメソッドでも使用できます。

    SSTの調整(エクストラバックアップ方式のみ)

    ドナーの忙しさにもよりますが、ドナーに大きな影響を与えないように、SSTプロセスを調整することをお勧めします。壊滅的な障害の際に、ユーザーが障害のあるクラスターを単一のブートストラップされたノードとして戻し、残りのメンバーが後で追いつくように必死になっているケースを数多く見てきました。この試みにより、アプリケーション側からのダウンタイムが削減されますが、残りのメンバーがダウンまたは回復している間、この「1ノードクラスター」に追加の負担がかかります。

    Xtrabackupは--throttle=で調整して、ディスクが飽和するのではないかと心配している場合にIO操作の数を制限できますが、このオプションは、xtrabackupをバックアッププロセスとして実行する場合にのみ適用できます。 SSTオペレーターとして。同様のオプションがrlimit(レート制限)で使用可能であり、-use-memoryと組み合わせてRAM使用量を制限できます。 MySQL構成ファイル内の[sst]ディレクティブの下に値を設定することにより、完了までに時間がかかる場合でも、SST操作がドナーに過度の負荷をかけないようにすることができます。ドナーノードで、次のように設定します。

    [sst]
    rlimit=128k
    inno-apply-opts="--use-memory=200M"

    詳細については、PerconaXtrabackupSSTのドキュメントページをご覧ください。

    ただし、落とし穴があります。プロセスが非常に遅いため、InnoDBが書き込んでいるトランザクションログに追いつかない可能性があるため、SSTが完了しない可能性があります。一般に、この状況は非常にまれです。ただし、実際に書き込みが非常に多いワークロードがある場合、またはSSTに非常に限られたリソースを割り当てる場合を除きます。

    結論

    SSTは重要ですが重いため、データセットのサイズとノード間のネットワークスループットによっては、長時間実行される可能性があります。結果に関係なく、運用を停止する可能性があります。これにより、より適切な時期に、より適切な復旧計画を立てることができます。


    1. テーブルをロックせずにMySQLDumpを実行する

    2. パフォーマンスに関するSQLServerのintとnvarcharの比較?

    3. MySQLリレーショナルデータベースをUbuntu12.04(Precise Pangolin)にデプロイする

    4. XMLをパラメータとしてOracleのストアドプロシージャに渡す方法