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

Prometheusを使用してMySQLコンテナを監視する方法-スタンドアロンおよびSwarmでのデプロイ::パート1

    インフラストラクチャは動的であるため、監視はコンテナの懸念事項です。コンテナは定期的に作成および破棄でき、一時的なものです。では、Dockerで実行されているMySQLインスタンスをどのように追跡しますか?

    他のソフトウェアコンポーネントと同様に、使用できるオプションはたくさんあります。 Prometheusは、分散インフラストラクチャ向けに構築されたソリューションであり、Dockerと非常にうまく連携します。

    これは2部構成のブログです。このパート1のブログでは、スタンドアロンのDockerコンテナーおよびDocker Swarmサービスとして実行される、Prometheusとそのコンポーネントを使用したMySQLコンテナーのデプロイメントの側面について説明します。パート2では、MySQLコンテナから監視する重要な指標と、ページングおよび通知システムとの統合について説明します。

    プロメテウスの紹介

    Prometheusは、時系列データに基づく組み込みのアクティブなスクレイピング、保存、クエリ、グラフ化、およびアラートを含む、完全な監視およびトレンド分析システムです。 Prometheusは、設定されたターゲットから所定の間隔でプルメカニズムを介してメトリックを収集し、ルール式を評価し、結果を表示し、何らかの条件が真であることが観察された場合にアラートをトリガーできます。 MySQLをDockerコンテナとして実行する場合に測定するすべてのターゲットメトリックをサポートします。これらのメトリックには、物理​​ホストメトリック、Dockerコンテナメトリック、およびMySQLサーバーメトリックが含まれます。

    Prometheusアーキテクチャを示す次の図を見てください(Prometheusの公式ドキュメントから取得):

    Prometheusサーバー、MySQLエクスポーター(つまり、MySQLメトリックを公開するためのPrometheusエージェント、Prometheusサーバーによってスクレイプできる)、およびアラートベースを処理するためのAlertmanagerを備えたいくつかのMySQLコンテナー(スタンドアロンおよびDocker Swarm)をデプロイします。収集された指標について。

    詳細については、Prometheusのドキュメントをご覧ください。この例では、Prometheusチームから提供された公式のDockerイメージを使用します。

    スタンドアロンDocker

    MySQLコンテナの導入

    デプロイのウォークスルーを簡素化するために、Dockerで2つのスタンドアロンMySQLサーバーを実行してみましょう。 1つのコンテナは最新のMySQL8.0を使用し、もう1つはMySQL5.7です。両方のコンテナは、「db_network」と呼ばれる同じDockerネットワーク内にあります:

    $ docker network create db_network
    $ docker run -d \
    --name mysql80 \
    --publish 3306 \
    --network db_network \
    --restart unless-stopped \
    --env MYSQL_ROOT_PASSWORD=mypassword \
    --volume mysql80-datadir:/var/lib/mysql \
    mysql:8 \
    --default-authentication-plugin=mysql_native_password

    MySQL8のデフォルトはcaching_sha2_passwordという新しい認証プラグインです。 。 Prometheus MySQLエクスポーターコンテナとの互換性のために、広く使用されている mysql_native_passwordを使用しましょう。 このサーバーで新しいMySQLユーザーを作成するときはいつでもプラグイン。

    5.7を実行している2番目のMySQLコンテナに対して、以下を実行します。

    $ docker run -d \
    --name mysql57 \
    --publish 3306 \
    --network db_network \
    --restart unless-stopped \
    --env MYSQL_ROOT_PASSWORD=mypassword \
    --volume mysql57-datadir:/var/lib/mysql \
    mysql:5.7

    MySQLサーバーが正常に実行されているかどうかを確認します:

    [[email protected] mysql]# docker ps | grep mysql
    cc3cd3c4022a        mysql:5.7           "docker-entrypoint.s…"   12 minutes ago      Up 12 minutes       0.0.0.0:32770->3306/tcp   mysql57
    9b7857c5b6a1        mysql:8             "docker-entrypoint.s…"   14 minutes ago      Up 14 minutes       0.0.0.0:32769->3306/tcp   mysql80

    この時点で、私たちのアーキテクチャは次のようになっています。

    それらの監視を始めましょう。

    DockerメトリックをPrometheusに公開する

    Dockerには、Prometheusターゲットとして組み込みのサポートがあり、Dockerエンジンの統計を監視するために使用できます。 Dockerホスト内に「daemon.json」というテキストファイルを作成するだけで有効にできます:

    $ vim /etc/docker/daemon.json

    そして、次の行を追加します:

    {
      "metrics-addr" : "12.168.55.161:9323",
      "experimental" : true
    }

    ここで、192.168.55.161はDockerホストのプライマリIPアドレスです。次に、Dockerデーモンを再起動して変更をロードします。

    $ systemctl restart docker

    MySQLコンテナのrunコマンドで--restart=unless-stoppedを定義しているため、Dockerの実行後にコンテナが自動的に開始されます。

    MySQLエクスポーターの導入

    先に進む前に、mysqldエクスポータではMySQLユーザーを監視目的で使用する必要があります。 MySQLコンテナで、監視ユーザーを作成します:

    $ docker exec -it mysql80 mysql -uroot -p
    Enter password:
    mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3;
    mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

    重い負荷の下でスクレイプを監視してサーバーに過負荷をかけないように、ユーザーの最大接続制限を設定することをお勧めします。上記のステートメントを2番目のコンテナーmysql57に対して繰り返します。

    $ docker exec -it mysql57 mysql -uroot -p
    Enter password:
    mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3;
    mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

    「mysql8-exporter」というmysqldエクスポーターコンテナを実行して、MySQL8.0インスタンスのメトリックを次のように公開しましょう。

    $ docker run -d \
    --name mysql80-exporter \
    --publish 9104 \
    --network db_network \
    --restart always \
    --env DATA_SOURCE_NAME="exporter:[email protected](mysql80:3306)/" \
    prom/mysqld-exporter:latest \
    --collect.info_schema.processlist \
    --collect.info_schema.innodb_metrics \
    --collect.info_schema.tablestats \
    --collect.info_schema.tables \
    --collect.info_schema.userstats \
    --collect.engine_innodb_status

    また、MySQL 5.7インスタンス用の別のエクスポーターコンテナ:

    $ docker run -d \
    --name mysql57-exporter \
    --publish 9104 \
    --network db_network \
    --restart always \
    -e DATA_SOURCE_NAME="exporter:[email protected](mysql57:3306)/" \
    prom/mysqld-exporter:latest \
    --collect.info_schema.processlist \
    --collect.info_schema.innodb_metrics \
    --collect.info_schema.tablestats \
    --collect.info_schema.tables \
    --collect.info_schema.userstats \
    --collect.engine_innodb_status

    MySQLメトリックを公開するために、コンテナーのコレクターフラグの束を有効にしました。コンテナでMySQLレプリケーションを実行している場合は、-collect.slave_status、-collect.slave_hostsを有効にすることもできます。

    Dockerホストからcurlを介してMySQLメトリックを直接取得できるはずです(ポート32771は、Dockerによってコンテナーmysql80-exporterに自動的に割り当てられた公開ポートです):

    $ curl 127.0.0.1:32771/metrics
    ...
    mysql_info_schema_threads_seconds{state="waiting for lock"} 0
    mysql_info_schema_threads_seconds{state="waiting for table flush"} 0
    mysql_info_schema_threads_seconds{state="waiting for tables"} 0
    mysql_info_schema_threads_seconds{state="waiting on cond"} 0
    mysql_info_schema_threads_seconds{state="writing to net"} 0
    ...
    process_virtual_memory_bytes 1.9390464e+07

    この時点で、私たちのアーキテクチャは次のようになっています。

    これで、Prometheusサーバーをセットアップできました。

    Prometheusサーバーの導入

    まず、〜/ prometheus.ymlにPrometheus構成ファイルを作成し、次の行を追加します。

    $ vim ~/prometheus.yml
    global:
      scrape_interval:     5s
      scrape_timeout:      3s
      evaluation_interval: 5s
    
    # Our alerting rule files
    rule_files:
      - "alert.rules"
    
    # Scrape endpoints
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
    
      - job_name: 'mysql'
        static_configs:
          - targets: ['mysql57-exporter:9104','mysql80-exporter:9104']
    
      - job_name: 'docker'
        static_configs:
          - targets: ['192.168.55.161:9323']

    Prometheus構成ファイルから、「prometheus」、「mysql」、「docker」の3つのジョブを定義しました。 1つ目は、Prometheusサーバー自体を監視する作業です。次は、「mysql」という名前のMySQLコンテナを監視するジョブです。ポート9104のMySQLエクスポーターでエンドポイントを定義します。これにより、MySQL8.0および5.7インスタンスからそれぞれPrometheus互換のメトリックが公開されます。 「alert.rules」は、アラートの目的で次のブログ投稿に後で含めるルールファイルです。

    次に、Prometheusコンテナを使用して構成をマップできます。また、永続性のためにPrometheusデータ用のDockerボリュームを作成し、ポート9090を公開する必要があります:

    $ docker run -d \
    --name prometheus-server \
    --publish 9090:9090 \
    --network db_network \
    --restart unless-stopped \
    --mount type=volume,src=prometheus-data,target=/prometheus \
    --mount type=bind,src="$(pwd)"/prometheus.yml,target=/etc/prometheus/prometheus.yml \
    --mount type=bind,src="$(pwd)
    prom/prometheus

    これで、Prometheusサーバーはすでに実行されており、Dockerホストのポート9090から直接アクセスできます。 Webブラウザーを開き、http://192.168.55.161:9090/にアクセスしてPrometheusWebUIにアクセスします。 [ステータス]->[ターゲット]でターゲットのステータスを確認し、すべて緑色であることを確認します。

    この時点で、コンテナアーキテクチャは次のようになっています。

    これで、スタンドアロンMySQLコンテナ用のPrometheusモニタリングシステムが導入されました。

    Docker Swarm

    3ノードのGaleraクラスターの導入

    DockerSwarmに3ノードのGaleraClusterをデプロイする場合、3つの異なるサービスを作成する必要があります。各サービスは1つのGaleraノードを表します。このアプローチを使用すると、Galeraコンテナーの静的に解決可能なホスト名を、それぞれに付随するMySQLエクスポーターコンテナーとともに保持できます。 Dockerチームによって維持されているMariaDB10.2イメージを使用して、Galeraクラスターを実行します。

    まず、Swarmサービスで使用するMySQL構成ファイルを作成します。

    $ vim ~/my.cnf
    [mysqld]
    
    default_storage_engine          = InnoDB
    binlog_format                   = ROW
    
    innodb_flush_log_at_trx_commit  = 0
    innodb_flush_method             = O_DIRECT
    innodb_file_per_table           = 1
    innodb_autoinc_lock_mode        = 2
    innodb_lock_schedule_algorithm  = FCFS # MariaDB >10.1.19 and >10.2.3 only
    
    wsrep_on                        = ON
    wsrep_provider                  = /usr/lib/galera/libgalera_smm.so
    wsrep_sst_method                = mariabackup

    Swarmに「db_swarm」という専用のデータベースネットワークを作成します。

    $ docker network create --driver overlay db_swarm

    MySQL構成ファイルをDocker構成にインポートして、後で作成するときにSwarmサービスにロードできるようにします。

    $ cat ~/my.cnf | docker config create my-cnf -

    「galera0」と呼ばれるクラスターアドレスとして「gcomm://」を使用して、最初のGaleraブートストラップサービスを作成します。これは、ブートストラッププロセス専用の一時的なサービスです。他に3つのGaleraサービスが実行されたら、このサービスを削除します:

    $ docker service create \
    --name galera0 \
    --replicas 1 \
    --hostname galera0 \
    --network db_swarm \
    --publish 3306 \
    --publish 4444 \
    --publish 4567 \
    --publish 4568 \
    --config src=my-cnf,target=/etc/mysql/mariadb.conf.d/my.cnf \
    --env MYSQL_ROOT_PASSWORD=mypassword \
    --mount type=volume,src=galera0-datadir,dst=/var/lib/mysql \
    mariadb:10.2 \
    --wsrep_cluster_address=gcomm:// \
    --wsrep_sst_auth="root:mypassword" \
    --wsrep_node_address=galera0

    この時点で、データベースアーキテクチャは次のように説明できます。

    次に、次のコマンドを3回繰り返して、3つの異なるGaleraサービスを作成します。 {name}をそれぞれgalera1、galera2、galera3に置き換えます:

    $ docker service create \
    --name {name} \
    --replicas 1 \
    --hostname {name} \
    --network db_swarm \
    --publish 3306 \
    --publish 4444 \
    --publish 4567 \
    --publish 4568 \
    --config src=my-cnf,target=/etc/mysql/mariadb.conf.d/my.cnf \
    --env MYSQL_ROOT_PASSWORD=mypassword \
    --mount type=volume,src={name}-datadir,dst=/var/lib/mysql \
    mariadb:10.2 \
    --wsrep_cluster_address=gcomm://galera0,galera1,galera2,galera3 \
    --wsrep_sst_auth="root:mypassword" \
    --wsrep_node_address={name}

    現在のDockerサービスを確認します:

    $ docker service ls 
    ID                  NAME                MODE                REPLICAS            IMAGE               PORTS
    wpcxye3c4e9d        galera0             replicated          1/1                 mariadb:10.2        *:30022->3306/tcp, *:30023->4444/tcp, *:30024-30025->4567-4568/tcp
    jsamvxw9tqpw        galera1             replicated          1/1                 mariadb:10.2        *:30026->3306/tcp, *:30027->4444/tcp, *:30028-30029->4567-4568/tcp
    otbwnb3ridg0        galera2             replicated          1/1                 mariadb:10.2        *:30030->3306/tcp, *:30031->4444/tcp, *:30032-30033->4567-4568/tcp
    5jp9dpv5twy3        galera3             replicated          1/1                 mariadb:10.2        *:30034->3306/tcp, *:30035->4444/tcp, *:30036-30037->4567-4568/tcp

    現在、アーキテクチャは次のようになっています。

    コンテナーがDockerSwarmによって再スケジュールされている場合、新しいレプリカが新しい新しいボリュームで開始されるため、GaleraブートストラップSwarmサービスgalera0を削除して、実行を停止する必要があります。 -wsrep_cluster_address が原因で、データが失われるリスクがあります。 他のGaleraノード(またはSwarmサービス)に「galera0」が含まれています。それでは、削除しましょう:

    $ docker service rm galera0

    この時点で、3ノードのGaleraクラスターができました:

    これで、MySQLエクスポーターとPrometheusサーバーをデプロイする準備が整いました。

    MySQLExporterSwarmサービス

    いずれかのGaleraノードにログインし、適切な権限を持つエクスポーターユーザーを作成します。

    $ docker exec -it {galera1} mysql -uroot -p
    Enter password:
    mysql> CREATE USER 'exporter'@'%' IDENTIFIED BY 'exporterpassword' WITH MAX_USER_CONNECTIONS 3;
    mysql> GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO 'exporter'@'%';

    次に、Galeraサービスごとにエクスポーターサービスを作成します({name}をそれぞれgalera1、galera2、galera3に置き換えます):

    $ docker service create \
    --name {name}-exporter \
    --network db_swarm \
    --replicas 1 \
    -p 9104 \
    -e DATA_SOURCE_NAME="exporter:[email protected]({name}:3306)/" \
    prom/mysqld-exporter:latest \
    --collect.info_schema.processlist \
    --collect.info_schema.innodb_metrics \
    --collect.info_schema.tablestats \
    --collect.info_schema.tables \
    --collect.info_schema.userstats \
    --collect.engine_innodb_status

    この時点で、私たちのアーキテクチャは、写真のエクスポーターサービスで次のようになっています。

    PrometheusServerSwarmサービス

    最後に、Prometheusサーバーをデプロイしましょう。 Galeraのデプロイと同様に、Docker configコマンドを使用してSwarmにインポートする前に、まずPrometheus構成ファイルを準備する必要があります。

    $ vim ~/prometheus.yml
    global:
      scrape_interval:     5s
      scrape_timeout:      3s
      evaluation_interval: 5s
    
    # Our alerting rule files
    rule_files:
      - "alert.rules"
    
    # Scrape endpoints
    scrape_configs:
      - job_name: 'prometheus'
        static_configs:
          - targets: ['localhost:9090']
    
      - job_name: 'galera'
        static_configs:
          - targets: ['galera1-exporter:9104','galera2-exporter:9104', 'galera3-exporter:9104']

    Prometheus構成ファイルから、「prometheus」と「galera」の3つのジョブを定義しました。 1つ目は、Prometheusサーバー自体を監視する作業です。次は、「galera」という名前のMySQLコンテナを監視する作業です。ポート9104のMySQLエクスポーターでエンドポイントを定義します。これにより、3つのGaleraノードからそれぞれPrometheus互換のメトリックが公開されます。 「alert.rules」は、アラートの目的で次のブログ投稿に後で含めるルールファイルです。

    構成ファイルをDocker構成にインポートして、後でPrometheusコンテナーで使用できるようにします。

    $ cat ~/prometheus.yml | docker config create prometheus-yml -

    Prometheusサーバーコンテナを実行して、PrometheusWebUIサービスのすべてのDockerホストのポート9090を公開しましょう。

    $ docker service create \
    --name prometheus-server \
    --publish 9090:9090 \
    --network db_swarm \
    --replicas 1 \    
    --config src=prometheus-yml,target=/etc/prometheus/prometheus.yml \
    --mount type=volume,src=prometheus-data,dst=/prometheus \
    prom/prometheus

    Docker serviceコマンドを使用して、3つのGaleraサービス、3つのエクスポーターサービス、1つのPrometheusサービスがあることを確認します。

    $ docker service ls
    ID                  NAME                MODE                REPLICAS            IMAGE                         PORTS
    jsamvxw9tqpw        galera1             replicated          1/1                 mariadb:10.2                  *:30026->3306/tcp, *:30027->4444/tcp, *:30028-30029->4567-4568/tcp
    hbh1dtljn535        galera1-exporter    replicated          1/1                 prom/mysqld-exporter:latest   *:30038->9104/tcp
    otbwnb3ridg0        galera2             replicated          1/1                 mariadb:10.2                  *:30030->3306/tcp, *:30031->4444/tcp, *:30032-30033->4567-4568/tcp
    jq8i77ch5oi3        galera2-exporter    replicated          1/1                 prom/mysqld-exporter:latest   *:30039->9104/tcp
    5jp9dpv5twy3        galera3             replicated          1/1                 mariadb:10.2                  *:30034->3306/tcp, *:30035->4444/tcp, *:30036-30037->4567-4568/tcp
    10gdkm1ypkav        galera3-exporter    replicated          1/1                 prom/mysqld-exporter:latest   *:30040->9104/tcp
    gv9llxrig30e        prometheus-server   replicated          1/1                 prom/prometheus:latest        *:9090->9090/tcp

    これで、Prometheusサーバーはすでに実行されており、任意のDockerノードからポート9090で直接アクセスできます。 Webブラウザーを開き、http://192.168.55.161:9090/にアクセスしてPrometheusWebUIにアクセスします。 [ステータス]->[ターゲット]でターゲットのステータスを確認し、すべて緑色であることを確認します。

    この時点で、Swarmアーキテクチャは次のようになっています。

    続く..

    これで、データベースと監視スタックがDockerにデプロイされました。ブログのパート2では、監視するためにさまざまなMySQLメトリックを調べます。また、Prometheusを使用してアラートを構成する方法についても説明します。


    1. SQLServerに200万行をすばやく挿入する

    2. null許容列でのハッシュ結合

    3. Access2016でテーブルからサブフォームを作成する方法

    4. MVC4:UserIsInRole-SQLServerデータベースに接続できません