FluentdでnginxアクセスログをClickHouseへデータ連携する方法
本記事では、nginxアクセスログをFluentd(td-agent)- ApsaraDB for ClickHouse へデータ送信する方法をご紹介します。
ClickHouseとは
ClickHouseは非集計データを含む大量のデータを安定的かつ継続しながら集計といったリアルタイム分析を支える列指向の分散型データベースサービスです。
トラフィック分析、広告およびマーケティング分析、行動分析、リアルタイム監視などのビジネスシナリオで幅広く 使用されています。
Fluentdとは
一言でいうとオープンソースのデータ収集ツールです。2011年にTreasure Data, Inc.の共同創業者である古橋氏によって開発されたOSSで、現在Cloud Native Computing Foundation (CNCF® http://cncf.io/ ) で6番目の卒業プロジェクトとして発表されるほど市場を大きく広げたツールです。Cloud Native Computing Foundationでこれまでの卒業プロジェクトとしてKubernetes、Prometheus、Envoy、CoreDNS、containerdなどがあり、Fluentdはその一員として選ばれたわけです。選ばれるためには、市場の豊富な採用実績、コミュニティの持続可能性、体系化されたガバナンスプロセスなどを証明する必要があるため、これは日本発OSSとして快挙です。
Fluentdは元々Treasure Data, Incが開発したOSSですが、今後は株式会社クリアコードが担当し継続開発することになっています。
https://www.clear-code.com/press-releases/20210729-maintaining-fluentd.html
本記事では、nginxアクセスログをFluentd(td-agent)- ClickHouseへデータ連携してみます。構成図は次の通りです。
利用環境:
ECS・・・CentOS 7.8 64-bit
Nginx・・・v1.20.1
td-agent・・・v4.2.0
Clickhouse・・・v20.8.7.15
td-agent Plugin・・・fluent-plugin-clickhouse
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でFluentd(td-agent)インストール
3-1.fluentd前提条件を確認します
1)下記のリンクでfluentd前提条件を確認します
①ECSのLinuxにてulimitを確認します(65535が必要)
# ulimit -n
②上記もしulimitが足りない場合、limits.confを設定します(今回のECSは65535であるため、設定しないでおきます)
/etc/security/limits.conf
③ Network Kernelを設定します
/etc/sysctl.confを開き、下記内容をsysctl.confに追加します
net.core.somaxconn = 1024net.core.netdev_max_backlog = 5000net.core.rmem_max = 16777216net.core.wmem_max = 16777216net.ipv4.tcp_wmem = 4096 12582912 16777216net.ipv4.tcp_rmem = 4096 12582912 16777216net.ipv4.tcp_max_syn_backlog = 8096net.ipv4.tcp_slow_start_after_idle = 0net.ipv4.tcp_tw_reuse = 1net.ipv4.ip_local_port_range = 10240 65535
3-2.fluentd(td-agent)をインストール
1)下記コマンドでtd-agentをインストールします
# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh
2)下記コマンドでtd-agentを起動し、ステータスを確認します
# systemctl start td-agent# systemctl status td-agent
3-3.fluentd(td-agent)のClickhouseプラグインをインストールします
1)下記コマンドでClickhouseプラグインをインストールします
td-agent-gem install fluent-plugin-clickhouse
4.Fluentd(td-agent)でデータをClickHouseへ格納
4-1.fluentd(td-agent) の configファイルを設定します
1)td-agent.confのsourceとmatchを設定します
①td-agent.confを開きます
# cd /etc/td-agent# vim td-agent.conf
②sourceとmatchを正しく設定します
※上記手順2-2のnginx.confのlog_formatに基づいて、td-agent.confのsourceを設定します
※matchのcolumnsはClickhouseにあるターゲットテーブルのcolumnsと一致するようにします
<source>@type tailpath /var/log/nginx/access.logpos_file /var/log/td-agent/access.log.postag nginx.accessformat /^(?<remote_addr>[^ ]*) [^ ]* (?<remote_user>[^ ]*) \[(?<time_local>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<status>[^ ]*) (?<body_bytes_sent>[^ ]*)(?: "(?<http_referer>[^\"]*)" "(?<http_user_agent>[^\"]*)")? "(?<http_x_forwarded_for>[^ ]*)"$/time_format %d/%b/%Y:%H:%M:%S %z</source><match nginx.access>@type clickhousehost 172.16.0.74port 8123database defaultusername sbtestpassword Test1234columns remote_addr,remote_user,time_local,method,path,status,body_bytes_sent,http_referer,http_user_agent,http_x_forwarded_fortable fluent_accesslog_localflush_interval 10s</match>
※hostはClickHouseインスタンスのHostです。今回はVPC Intranetで接続するため、VPC EndpointのIPを設定します
※columnsはターゲットテーブルのcolumnsと一致するようにします
4-1.Clickhouseでターゲットテーブル作成
1)ローカルテーブルを作成します
①DMSでClickHouseをログインし、デフォルトDBで下記のテーブルを作成します
create table fluent_accesslog_local on cluster default(remote_addr String,remote_user Nullable(String),time_local String,method String,path String,status Int32,body_bytes_sent Nullable(Int32),http_referer Nullable(String),http_user_agent String,http_x_forwarded_for Nullable(String))engine = MergeTree()order by time_local;
2)分散テーブルを作成します
CREATE TABLE fluent_accesslog_distributed ON CLUSTER default as fluent_accesslog_local ENGINE = Distributed(default, default, fluent_accesslog_local, rand());
4-2.fluentd(td-agent)を実行し、NginxのアクセスログをClickhouseへ格納
1)nginxがすでに起動されていることを確認します
# systemctl status nginx
2)td-agentを再起動します
# systemctl restart td-agent# systemctl status td-agent
3)テストとして、nginx web page を10回アクセスします
4)nginxアクセスログを確認します
# cd /var/log/nginx# ll# tail -f -n 10 ./access.log
5)td-agent
# cd /var/log/td-agent# ll# tail -f -n 10 ./td-agent.log
4-3.ClickhouseでNginxのアクセスログデータを確認します
1)fluent_accesslog_localを確認します
select * from fluent_accesslog_local;select count(*) from fluent_accesslog_local;
2)fluent_accesslog_distributedを確認します
select * from fluent_accesslog_distributedselect count(*) from fluent_accesslog_distributed
最後に
ここまで、nginxアクセスログを Fluentd(td-agent) - ApsaraDB for ClickHouseへ連携する方法を紹介しました。
ApsaraDB for ClickHouseはFluentdとスムーズに連携できるので、例えば、WebサーバーのデータをFluentdで収集し、 ApsaraDB for ClickHouseへリアルタイムデータ連携しながら、ClickHouseでリアルタイム可視化、といったソリューションを構築することもできます。