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

プロアクティブなMySQLモニタリング(Developer Studio / Advisors Angle)

    MySQLデータベースをプロアクティブに監視することは、今日では不可欠です。これは、特に本番環境グレードのクラスターのデータベースを管理および制御するために重要かつ重要な役割を果たします。データベースを改善するのに役立つ特定の情報が欠落している、または発生する可能性のある問題の根本原因を特定できないと、栄光の時代を修正または回復するのが非常に困難になる可能性があります。

    MySQLデータベースのプロアクティブな監視により、チームはデータベースサービスのパフォーマンスを理解できます。それは、それが運ぶと予想されるワークロードに基づいて機能し、提供しますか?サーバーが現在処理しているワークロードに基づいてパフォーマンスを発揮するのに十分なリソースがありますか?プロアクティブな監視は、災害を防止したり、データベースに損害を与えたりすることを防ぎ、事前に通知するものを適用します。したがって、DBAまたは管理者が重要なタスクを実行して、誤動作、データの破損、セキュリティの悪用と攻撃、またはデータベースクラスタ内の予期しないトラフィックのバウンスに遭遇しないようにすることができます。これらにすぐに参加することで、MySQLのプロアクティブな監視を自動化する必要があり、中断することなく24時間365日稼働する必要があります。タスクの優先度に基づいて、メンテナンスが必要かどうかを決定するのはDBA、Devops、管理者次第です。単なる典型的な日常業務です。

    ClusterControlによるプロアクティブな監視

    ClusterControlは、MySQLデータベースサーバーを監視するためのさまざまなスタイルを提供します。そのアプローチは、他のエンタープライズ監視ツールやエンタープライズグレードのクラウドソリューションに匹敵します。 ClusterControlは、データベースの管理と監視にすべてのベストプラクティスを適用する傾向がありますが、環境に基づいて目的のセットアップを実現するために柔軟に構成できます。

    アラームと通知に関しては、ClusterControlにはアラームが組み込まれている混合アプローチがあり、次にこのブログで詳しく説明するアドバイザがあります。

    >

    MySQLのClusterControlアラーム

    アラームは、クラスター全体に影響を与えたり、劣化させたりする可能性のある問題を示します。このインターフェイスは、問題の詳細な説明と、問題を解決するための推奨されるアクション(可能な場合)を提供します。各アラームは次のように分類されます:

    • クラスター

    • クラスターの回復

    • データベースの状態

    • データベースのパフォーマンス

    • ホスト

    • ノード

    • ネットワーク

    無視するかをチェックすることで、アラームを確認できますか?チェックボックス。無視すると、通知は電子メールで送信されません。アラームを削除または却下することはできませんが、[無視されたアラームを非表示]ボタンをクリックしてリストからアラームを非表示にすることはできます。

    下のスクリーンショットの例をご覧ください

    ClusterControlのプロアクティブ

    ClusterControlは、障害検出が発生するたびに反応する自動回復をサポートしています。 ClusterControlを使用した自動リカバリは、災害が発生した場合に重要な役割を果たす最も予防的な機能の1つです。

    このプロアクティブな監視には自動回復を有効にする必要があります。この監視は、プライマリMySQLノードに障害が発生した場合など、さまざまな状況で反応します。

    ClusterControlでは、これは接続をリッスンするときにすぐに検出されますデータベースサーバー、この場合はプライマリサーバーを使用します。 ClusterControlはできるだけ早く反応し、フェイルオーバーを適用します。

    フェイルオーバーは、有効なクラスターリカバリの一部です。 [クラスター]ボタンと[ノード]ボタンの両方が有効になっているため、以下に示すように、ノードの回復に従います。

    ノードの到達可能性に応じて、ClusterControlは継続的に試行しますSSH経由で接続し、ノードに到達して、sysvinitまたはsystemdの使用を開始して回復を試みます。明らかに、フェイルオーバーを適用し、ClusterControlが失敗したプライマリを開始しようとすると思うかもしれません。つまり、2つのデータベースノードが使用可能であるということですよね?真ですが、ClusterControlは、回復中に障害が発生したプライマリを読み取り専用状態にします。以下を参照してください

    フェイルオーバーメカニズムを管理するために設定できる特定のオプションがありますが、このブログの焦点では​​ないため、これについてはドキュメントを参照する必要があります。

    ClusterControlでのプロアクティブのためのアドバイザの使用

    ClusterControlで、→パフォーマンス→アドバイザに移動すると、アドバイザが検索されます。 ClusterControlアドバイザは、監視しようとしているクラスタに応じて適用されるように設定されています。たとえば、MySQLレプリケーションとPerconaまたはMariaDBのいずれかで実行されているGaleraClusterを使用したMySQLでは違いが生じる可能性があります。たとえば、MySQLReplicationAdvisorには次のものがあります。

    Galeraクラスターでは、以下に示すように、Galera固有のアドバイザーが追加されます。 、

    ClusterControlMySQLAdvisorのカスタマイズ

    アドバイザーはカスタマイズ可能で、必要に応じて変更できます。上のAdvisorsのスクリーンショットで、[編集]をクリックするだけで、ClusterControlに組み込まれているシンプルなIDEにリダイレクトされます。

    独自のClusterControlアドバイザを作成することもできます。 Write Your First Advisorを読んで作成の詳細を学ぶか、2部構成のシリーズを受講してMeltdown/Spectre検出スクリプトを使用して独自の作成を行うことができます。

    ClusterControl Advisorsはどのようにプロアクティブになっていますか?

    技術的には、ClusterControlアドバイザーは主に通知機能として機能し、文字通りアドバイザーとして機能します。 ClusterControl Advisorsは、ClusterControlによってデフォルトで設定されている基本しきい値を超えた場合に、異常な動作を検出した場合に通知します。通常、適用されるしきい値は一般的な値です。これらの一般的な値は、ベストプラクティスと、最も一般的で許容可能なワークロードまたは環境のセットアップに基づいています。アドバイザのデフォルトのほとんどは、ClusterControlUIにアラームまたはアラートメカニズムを提供していません。 UIを介して通知します(以下のBinlog Storage Location Advisorのサンプルスクリーンショットを参照してください)。

    前述のように、アドバイザは変更でき、シンプルなエディタまたはIDEを介して編集できます。たとえば、MySQLレプリケーションクラスタでは、ClusterControlはBinlogStorageLocationアドバイザを提供します。 binlogがデータディレクトリに保存されていることを検出し、データディレクトリの外にある必要があることを通知します。

    アドバイザーのリストから例を取り、現在使用されている接続アドバイザーを選択しましょう。以下のように編集してみましょう

    または、→ [管理]→[DeveloperStudio]を選択し、以下に示すようにconnections_used_pct.jsを選択します。

    アラームを送信してよりプロアクティブにすることで、変更して追加できます以下の機能は以下のようになります

    function myAlarm(title, message, recommendation)
    {
      return Alarm::alarmId(
            Node,
          true,
            title,
            message,
            recommendation
      );
    }

    一方、しきい値を20に設定してから、これらの行を、指定されたしきい値を超えてしきい値に達したif条件ステートメント内のすぐ下に追加します。

                     myAlarmId = myAlarm(TITLE, msg, ADVICE_WARNING);
                    // Let's raise an alarm.
                    host.raiseAlarm(myAlarmId, Warning);
    Here's the complete script with my modifications in bold,
    #include "common/mysql_helper.js"
    var DESCRIPTION="This advisor calculates the percentage of threads_connected over max_connections,"
                    " if the percentage is higher than 20% you will be notified,"
                    " preventing your database server from becoming unstable.";
    var WARNING_THRESHOLD=20;
    var TITLE="Connections currently used";
    var ADVICE_WARNING="You are using more than " + WARNING_THRESHOLD +
        "% of the max_connections."
        " Consider regulating load, e.g by using HAProxy. Using up all connections"
        " may render the database server unusable.";
    var ADVICE_OK="The percentage of currently used connections is satisfactory." ;
    
    function myAlarm(title, message, recommendation)
    {
      return Alarm::alarmId(
            Node,
          true,
            title,
            message,
            recommendation
      );
    }
    
    
    function main()
    {
        var hosts     = cluster::mySqlNodes();
        var advisorMap = {};
        for (idx = 0; idx < hosts.size(); ++idx)
        {
            host        = hosts[idx];
            map         = host.toMap();
            connected     = map["connected"];
            var advice = new CmonAdvice();
            print("   ");
            print(host);
            print("==========================");
            if (!connected)
            {
                print("Not connected");
                continue;
            }
            var Threads_connected = host.sqlStatusVariable("Threads_connected");
            var Max_connections   = host.sqlSystemVariable("Max_connections");
            if (Threads_connected.isError() || Max_connections.isError())
            {
                justification = "";
                msg = "Not enough data to calculate";
            }
            else
            {
                var used = round(100 * Threads_connected / Max_connections,1);
                if (used > WARNING_THRESHOLD)
                {
                    advice.setSeverity(1);
                    msg = ADVICE_WARNING;
                    justification = used + "% of the connections is currently used,"
                    " which is > " + WARNING_THRESHOLD + "% of max_connections.";
                     myAlarmId = myAlarm(TITLE, msg, ADVICE_WARNING);
                    // Let's raise an alarm.
                    host.raiseAlarm(myAlarmId, Warning);
                }
                else
                {
                    justification = used + "% of the connections is currently used,"
                    " which is < 90% of max_connections.";
                    advice.setSeverity(0);
                    msg = ADVICE_OK;
                }
            }
            advice.setHost(host);
            advice.setTitle(TITLE);
            advice.setJustification(justification);
            advice.setAdvice(msg);
            advisorMap[idx]= advice;
            print(advice.toString("%E"));
        }
        return advisorMap;
    }

    sysbenchを使用してテストできます。私のテストでは、アラームを送信することで事前に通知されます。これはまた、電子メールで私に送信されるか、サードパーティの通知を統合している場合は通知することができます。以下のスクリーンショットを参照してください

    ClusterControlのアドバイザーの警告

    ClusterControlの既存のアドバイザーの変更または編集は、すべてのクラスターに適用されます。つまり、既存のクラスター(MySQLまたはClusterControlでサポートされている他のデータベース)にのみ適用できる特定の条件があるかどうかをスクリプトでチェックインする必要があります。これは、ClusterControlアドバイザがcmonDBを介してのみ単一のソースに保存されるためです。これらは、ClusterControlで作成したすべてのクラスターによってプルまたは取得されます。

    たとえば、スクリプトでこれを行うことができます:

    var hosts =cluster ::mySqlNodes();

    var AdvisorMap ={};

    print(hosts [1] .clusterId());

    このスクリプトは、クラスターIDを出力します。値を取得したら、それを変数に割り当て、その変数を使用して、この特定のクラスターIDが受け入れ可能かどうか、アドバイザーが実行する目的のタスクに基づいていないかどうかを評価します。たとえば、

    function main()
    {
        var hosts     = cluster::mySqlNodes();
        var advisorMap = {};
        for (idx = 0; idx < hosts.size(); ++idx)
        {
            host        = hosts[idx];
            map         = host.toMap();
            connected     = map["connected"];
            var advice = new CmonAdvice();
            print("   ");
            print(host);
            print("==========================");
            if (host.clusterId() == 15)
            {
                print("Not applicable for cluster id == 15");
                continue;
            }
    …
    ….
    …..

    これは、cluster_id ==15の場合は、スキップするか、次のループに進むことを意味します。

    結論

    ClusterControl Advisorsを作成または変更することは、ClusterControlが提供できる隠された機能を活用する良い機会です。隠されているように見えるかもしれませんが、そこにあります。機能の使用量が少ないというだけです。 ClusterControlに欠けている非常に難しいタスクに使用できるClusterControlドメイン固有言語(CDSL)と呼ばれるシンプルで強力な機能を提供します。すべての注意事項を理解していることを確認し、最初にすべてをテストしてから、最終的に本番環境に適用してください。


    1. 通常のSQLServerサービスの事例を作成する

    2. SQLエラーの読み取りと解釈の方法

    3. カーソルを使用せずに各行のSQL呼び出しストアドプロシージャ

    4. OracleSQLDeveloperを使用したデータモデルのリバースエンジニアリング