LogstashでnginxアクセスログをClickHouseへデータ連携する方法
本記事では、nginxアクセスログをLogstash - ApsaraDB for ClickHouse へデータ送信する方法をご紹介します。
ClickHouseとは
ClickHouseは非集計データを含む大量のデータを安定的かつ継続しながら集計といったリアルタイム分析を支える列指向の分散型データベースサービスです。 トラフィック分析、広告およびマーケティング分析、行動分析、リアルタイム監視などのビジネスシナリオで幅広く 使用されています。
LogStashとは
Elastic社が管理するオープンソースのデータ収集ツールです。データを収集しつつ、ETLもできるため、Elasticsearchサービスと連携することが多いです。
本記事では、nginxアクセスログをLogStash - ClickHouseへデータ連携してみます。構成図で次の通りです。
利用環境:
ECS・・・CentOS 7.8 64-bit
Java・・・1.8.0_144
Nginx・・・v1.20.1
Logstash・・・v7.0.0
filebeats・・・v6.2.4
Clickhouse・・・v20.8.7.15
Logstash Plugin・・・logstash-output-clickhouse、logstash-filter-prune、logstash-filter-multiline
1. ClickHouseClientの準備
1-1.ClickHouseインスタンスを準備します
この手法は過去の記事でも記載していますが、再掲として記載します。
https://pangsen.github.io/help/usecase-ClickHouse/ACH_002_clickhouse-quick-start
1)まずはApsaraDB for ClickHouseインスタンスを作成します。
①VPCを作成
②ClickHouseインスタンスを作成
著者は以下のインスタンススペックでインスタンスを作成しています。
ClickHouse version:20.8.7.15 Edition:Single-replica Edition
2)ClickHouseの登録アカウントを作成
インスタンスをクリックし、左側にアカウント管理画面で、アカウントを作成します
3)ClickHouseクラスターにDMSで接続
①ClickHouseのインスタンスをクリックし、トップメニューの「Log On to Database」をクリックします
② DBアカウントとパスワードを入力し、ClickHouseへログイン
③DMS画面でClickHouseのインスタンスが表示されます
2.ECSでNginxのインストール
2-1.ECS作成
1)Nginx導入のためのECSを作成します
①ECSコンソール画面でECS作成ボタンをクリックし、ECSを作成します
④VPCを選択します(ちなみに上記1 で作成したApsaraDB for Clickhouseと同じVPCを選定すると、Intranet経由で相互接続することができます)
2-2 Nginxインストール
1)Nginxをインストールします
①ECSへログインします(この時、ECSで設定しているSecurity GroupのインバウンドPortとして、Port22と80を設定します)
②下記コマンドでnginxをインストールします
# yum install nginx -y
2)下記コマンドでNginxを起動します
# systemctl start nginx# systemctl status nginx
3)テストとして、Nginxサーバーへアクセスします(数回)
4)nginx.configファイルにlog_formatを確認します
cat /etc/nginx/nginx.conf
log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';
5)Nginx logを確認します
# tail -f /var/log/nginx/access.log
3.ECSでfilebeatをインストール
3-1.ECSでfilebeatをインストールします
# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.4-linux-x86_64.tar.gz
1)filebeatをECSにダウンロードします
2)filebeatを解凍します
# tar -zvxf filebeat-6.2.4-linux-x86_64.tar.gz
3)filebeatのフォルダ名を変更します
# mv filebeat-6.2.4-linux-x86_64 filebeat# ll
3-2.filebeat設定
1)filebeat.ymlを設定します
# cd /usr/local/logstash/filebeat# vim filebeat.yml
filebeat.prospectorとLogstashのoutputを設定します
filebeat.prospectors:input_type: logenabled: truepaths:- /var/log/nginx/acc*.logexclude_files: ['.gz$']output.logstash:hosts: ["localhost:5044"]
※LogstashはPort5044を使用するため、ECSのSecurityGroupでPort 5044を許可する必要があります
※outputはLogstashのみを設定します
4.ECSでLogstashをインストール
4-1.Java1.8をインストールします
1)jdk1.8を用意します
①jdk-8u144-linux-x64.tar.gzをダウンロードします
(下記リンクからでもjdkダウンロードができます)
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html
②jdk-8u144-linux-x64.tar.gzをjavaフォルダへ解凍します
# mkdir /usr/local/java/# tar -zxvf jdk-8u144-linux-x64.tar.gz -C /usr/local/java/# cd /usr/local/java/# ll
2)Java環境を設定します
①Java環境パスを設定します
# vim /etc/profileexport JAVA_HOME=/usr/local/java/jdk1.8.0_144export PATH=${JAVA_HOME}/bin:$PATHexport CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/libexport JRE_HOME=$JAVA_HOME/jre
②Java環境パスを有効化します
# source /etc/profile# ln -s /usr/local/java/jdk1.8.0_144/bin/java /usr/bin/java
③Javaバージョンを確認します
java -version
4-2.ECSでLogstashインストール
1)ECSでLogstashをインストールします
# cd /usr/local# mkdir logstash# cd logstash# wget https://artifacts.elastic.co/downloads/logstash/logstash-7.0.0.tar.gz# ll
①logstashをECSにダウンロードします
②logstashを解凍します
# tar -xzvf logstash-7.0.0.tar.gz# cd logstash-7.0.0# ll
4-3.LogstashのClickHouseプラグインをインストール
1)ClickHouseプラグインをインストールします
①logstash-output-clickhouseプラグインをインストールします
# cd /usr/local/logstash/logstash-7.0.0# ll# ./bin/logstash-plugin install logstash-output-clickhouse
2)filterのプラグインをインストールします
②logstash-filter-pruneとlogstash-filter-multilineのプラグインをインストールします
# ./bin/logstash-plugin install logstash-filter-prune# ./bin/logstash-plugin install logstash-filter-multiline
4-4.Logstashを設定
1)logstash-sample.confを開きます
# cd /usr/local/logstash/# ll# cd logstash-7.0.0/# cd config/# ll# vim logstash-sample.conf
2)logstash-sample.confを編集します
input {beats {port => 5044host => "127.0.0.1"client_inactivity_timeout => 36000}}filter {grok {match =>["message",'%{IPORHOST:remote_addr} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:nginx_timestamp}\] %{HOSTNAME:http_host} %{WORD:request_method} %{URIPATH:uri} %{BASE10NUM:http_status} %{BASE10NUM:body_bytes_sent} (%{BASE10NUM:upstream_status}|-) (?:%{HOSTPORT:upstream_addr}|-) (%{BASE16FLOAT:request_time}|-) (%{BASE16FLOAT:upstream_response_time}|-) (?<http_user_agent>[^"]*)']}date {locale => "en"match =>["nginx_timestamp" , "dd/MMM/YYYY:HH:mm:ss Z"]}mutate {convert => ["request_time","float","body_bytes_sent","integer","upstream_response_time","float","http_status","integer"]remove_field => ["message", "@timestamp", "source", "@version", "beat", "offset", "tags", "prospector"]}}output {clickhouse {http_hosts =>["http://172.16.0.74:8123"]headers => ["Authorization", "Basic c2J0ZXN0OlRlc3QxMjM0"]table => "nginx_logstash_local"request_tolerance => 1flush_size => 32pool_max => 128}stdout {codec => json}}
上記設定内容として、、
- input・・・デフォルトのBeats
- Filter・・・matchはNginxログと一致していること
- output:・・・output先として次の設定通り
>http_hosts:ClickHouseのVPCエンドポイントのIPを設定する(今回はECSとClickHouseが同じVPC内であるため、Intranetで接続)>headers:c2J0ZXN0OlRlc3QxMjM0の形式は admin:password のBase64コードとなります>table:ターゲットテーブルです。ターゲットテーブルのパラメータがNginxログとmatchと一致していること
5.LogstashでデータをClickHouseに格納
5-1.ClickHouseでターゲットテーブルを作成します
1)ローカルテーブルを作成します
①DMSでClickHouseをログインし、デフォルトDBで下記のテーブルを作成します
CREATE TABLE default.nginx_logstash_local(remote_addr String,remote_user String,nginx_timestamp String,http_host String,request_method String,uri String,http_status UInt32,body_bytes_sent UInt32,upstream_status UInt32,upstream_addr String,request_time Float32,upstream_response_time Float32,http_user_agent String)ENGINE = MergeTree() ORDER BY remote_addr SETTINGS index_granularity = 8192
2)分散テーブルを作成します
CREATE TABLE nginx_logstash_distributed ON CLUSTER default as nginx_logstash_local ENGINE = Distributed(default, default, nginx_logstash_local, rand());
5-2.Logstashとfilebeatを実行し、NginxのアクセスログをClickhouseへ格納
1)nginxがすでに起動されていることを確認します
# systemctl status nginx
2)logstashを起動します
①下記コマンドでlogstashを起動します
# cd /usr/local/logstash/logstash-7.0.0# ll# nohup ./bin/logstash -f ./config/logstash-sample.conf &
②logstashを確認します
# ps aux|grep logstash
3)下記コマンドでfilebeatを起動します
①下記コマンドでfilebeatを起動します
# cd /usr/local/logstash/filebeat# ll# nohup ./filebeat -e -c filebeat.yml &
②filebeatを確認します
# ps aux|grep filebeat
4)テストとして、nginx web page を10回アクセスします
5)nginxアクセスログを確認します
# cd /var/log/nginx# ll# tail -f -n 10 ./access.log
6)logstashログを確認します
# cd /usr/local/logstash/logstash-7.0.0# ll# cat nohup.out
6)filebeatログを確認します
# cd /usr/local/logstash/filebeat# ll# cat nohup.out
5-3.ClickhouseでNginxのアクセスログデータを確認します
1)nginx_logstash_localを確認します
①データを確認します
select * from nginx_logstash_local;
②データ件数を確認します
select count(*) from nginx_logstash_local;
2)nginx_logstash_distributedを確認します
①データを確認します
select * from nginx_logstash_distributed
②データ件数を確認します
select count(*) from nginx_logstash_distributed
最後に
ここまで、nginxアクセスログを Logstash(filebeat)- ApsaraDB for ClickHouseへ連携する方法を紹介しました。
ApsaraDB for ClickHouseはLogstash(filebeat)とスムーズに連携できるので、例えば、WebサーバーのデータをLogstash(filebeat)で収集し、 ApsaraDB for ClickHouseへリアルタイムデータ連携しながら、ClickHouseでリアルタイム可視化、といったソリューションを構築することもできます。