MySQL高可用性大殺器のMHA

4588 ワード

MySQLの高可用性といえば、多くの人がMySQL Cluster、またはHeartbeat+DRBDを思い浮かべるが、これらのスキームの複雑さは往々にして望ましくないが、それに対して、MySQLレプリケーションを利用して高可用性を実現するのは容易で、現在はMMM、MHAなどのスキームがあり、MMMは最も一般的なスキームである.残念ながら問題が多すぎる(What’s wrong with MMM,Problems with MMM for MySQL);それに比べて、MHAはより良い選択であり、DeNAの大規模な実践応用を経て、それが信頼できるツールであることを証明した.
インストール:
前提条件として、まずMySQLレプリケーションを構成し、SSH公開鍵のパスワードフリーログインを設定します.以下、CentOSを例に説明しますが、EPELをインストールしたほうがいいです.そうしないと、YUMにはパッケージが見つからない可能性があります.
MHAはNodeとManagerで構成され、Nodeは各MySQLサーバ上で実行されます.つまり、MySQLマスターサーバでもMySQLスレーブサーバでもNodeをインストールします.マネージャは通常独立したサーバ上で実行されますが、ハードウェアリソースが厳しい場合は、1台のMySQLスレーブサーバでマネージャの役割を兼任することもできます.
インストールノード:
shell> yum install perl-DBD-MySQL
shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm

インストールマネージャ:
shell> yum install perl-DBD-MySQL
shell> yum install perl-Config-Tiny
shell> yum install perl-Log-Dispatch
shell> yum install perl-Parallel-ForkManager
shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-node-0.52-0.noarch.rpm
shell> rpm -Uvh http://mysql-master-ha.googlecode.com/files/mha4mysql-manager-0.52-0.noarch.rpm

構成:
グローバル設定の設定:
shell> cat /etc/masterha_default.cnf
[server default]
user=...
password=...
ssh_user=...

アプリケーション設定の設定:
shell> cat /etc/masterha_application.cnf
[server_1]
hostname=...

[server_2]
hostname=...

注意:MHAプロファイルのパラメータの詳細は、公式ドキュメントを参照してください.
けんさ
MySQLレプリケーションの確認:
shell> masterha_check_repl --conf=/etc/masterha_application.cnf

SSH公開鍵のパスワードなしログインを確認する:
shell> masterha_check_ssh --conf=/etc/masterha_application.cnf

実戦
まず、MHAプロセスを開始します.
shell> masterha_manager --conf=/etc/masterha_application.cnf

注意:構成によってはread_を求める場合があります.only,relay_log_purgeなどの警告メッセージ.
次に、MHAのステータスを確認します.
shell> masterha_check_status --conf=/etc/masterha_application.cnf

注:正常であれば『PING_OK』、そうでなければ『NOT_RUNNING』と表示されます.
ここまで、基本的なMHAの例では正常に動作していましたが、現在のMySQLプライマリサーバに障害が発生した場合、MHAはあるMySQLをサーバから新しいMySQLプライマリサーバにアップグレードした後、どのようにアプリケーションに通知しますか?プロファイルに次の2つのパラメータを追加する必要があります.
  • master_ip_failover_script
  • master_ip_online_change_script

  • Failoverといえば、仮想IPアドレスとグローバルプロファイルの2つの方法があります.MHAはどの方式を使用するかを限定するのではなく、ユーザーに自分で選択させ、仮想IPアドレスの方式が他のソフトウェアにかかわるので、ここでは言うまでもなく、以下にグローバルプロファイルを簡単に述べ、PHPを実現言語とし、コードは以下の通りである.
    #!/usr/bin/env php
    <?php
    $longopts = array(
        'command:',
        'ssh_user:',
        'orig_master_host:',
        'orig_master_ip:',
        'orig_master_port:',
        'new_master_host::',
        'new_master_ip::',
        'new_master_port::',
    );
    
    $options = getopt(null, $longopts);
    
    if ($options['command'] == 'start') {
        $params = array(
            'ip'   => $options['new_master_ip'],
            'port' => $options['new_master_port'],
        );
    
        $string = '<?php return ' . var_export($params, true) . '; ?>';
    
        file_put_contents('config.php', $string, LOCK_EX);
    }
    
    exit(0);
    ?>

    注:このスクリプトを他の言語で実装してもOKですが、最後にスクリプトに実行可能なプロパティを付けることを忘れないでください.
    もし効果をテストするならば、killは現在のMySQLのメインサーバーを落とすことができて、少し待って、MHAはあるMySQLをサーバーから新しいMySQLのメインサーバーに昇格して、そしてmaster_を呼び出しますip_failover_scriptスクリプトは、上記のようにmaster_ip_failover_scriptスクリプトでは、新しいMySQLプライマリサーバのipとport情報をプロファイルに永続化でき、アプリケーションが新しい構成を使用できるようになります.
    MySQLマスターサーバを手動で切り替える必要がある場合があります.http://www.gwdang.commasterha_を使用できます.master_switchコマンドですがmasterではありませんip_failover_scriptスクリプトではなくmaster_ip_online_change_scriptスクリプトですが、呼び出しパラメータは類似しており、スクリプトは相互に使用できます.
    shell> masterha_master_switch --conf=/etc/masterha_application.cnf --master_state=dead --dead_master_host=...
    shell> masterha_master_switch --conf=/etc/masterha_application.cnf --master_state=alive --new_master_host=...

    注意:元のMySQLプライマリサーバがダウンタイムしているかどうかについては、コマンドを実行するために必要なパラメータが異なります.
    説明する必要があるのは、デフォルトです.http://www.gwdang.com/app/extension以下、MHAが連続してダウンタイムが発生し、かつ2回のダウンタイム間隔が8時間未満であることを検出した場合、Failoverは行われない.このような制限はping-pong効果を回避するためである.しかし、自動化のために、この制限を取り消すことを望んでいます.この場合、Managerを次のように起動できます.
    shell> nohup masterha_manager --conf=/etc/masterha_application.cnf --ignore_last_failover --remove_dead_master_conf &

    注意:マネージャーの実行ユーザーがmasterhaに対してapplication.cnfには書き込み権限があります.

    本文はただMHAの1つの簡単な紹介で、詳しい説明については、公式のドキュメントを読むことをお勧めします.