インフラストラクチャは動的であるため、監視はコンテナの懸念事項です。コンテナは定期的に作成および破棄でき、一時的なものです。では、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を使用してアラートを構成する方法についても説明します。