【ClickHouse連載】nginxアクセスログを Fluentd(td-agent) - ClickHouseへデータ連携してみる

Hi, データエンジニアの大原です。
今回はタイトル通り、nginxアクセスログをFluentd(td-agent)- ClickHouseへデータ連携する方法をご紹介します。
ClickHouseはAlibaba Cloudの国際サイトで提供している ClickHouse を使用します。

f:id:sbc_ohara:20210714233458p:plain

ClickHouseとは

ClickHouseは非集計データを含む大量のデータを安定的かつ継続しながら集計といったリアルタイム分析を支える列指向の分散型データベースサービスです。 トラフィック分析、広告およびマーケティング分析、行動分析、リアルタイム監視などのビジネスシナリオで幅広く 使用されています。
ApsaraDB for ClickHouseの概要として、詳しいことはこの記事にてまとめています。

www.sbcloud.co.jp

clickhouse.tech

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として快挙です。

www.fluentd.org

ちなみに、2021年10月12日にfluentconらカンファレンスがあります。興味がある方は参加してみるといいでしょう。

events.linuxfoundation.org

また、Fluentdは元々Treasure Data, Incが開発したOSSですが、今後は株式会社クリアコードが担当し継続開発することになっています。

www.clear-code.com

本記事では、nginxアクセスログをFluentd(td-agent)- ClickHouseへデータ連携してみます。構成図で次の通りです。

f:id:sbc_ohara:20210823154316p:plain

利用環境:
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インスタンスを準備します

この手法は過去の記事でも記載していますが、再掲として記載します。

www.sbcloud.co.jp

1)まずはApsaraDB for ClickHouseインスタンスを作成します。
①VPCを作成

f:id:sbc_ohara:20210716155036p:plain

f:id:sbc_ohara:20210716155113p:plain

②ClickHouseインスタンスを作成
著者は以下のインスタンススペックでインスタンスを作成しています。

ClickHouse version:20.8.7.15
Edition:Single-replica Edition

f:id:sbc_ohara:20210716155212p:plain

f:id:sbc_ohara:20210716155220p:plain

f:id:sbc_ohara:20210716155231p:plain

2)ClickHouseの登録アカウントを作成 インスタンスをクリックし、左側にアカウント管理画面で、アカウントを作成します

f:id:sbc_ohara:20210716155256p:plain

3)ClickHouseクラスターにDMSで接続 ①ClickHouseのインスタンスをクリックし、トップメニューの「Log On to Database」をクリックします

f:id:sbc_ohara:20210716155315p:plain

② DBアカウントとパスワードを入力し、ClickHouseへログイン

f:id:sbc_ohara:20210716155334p:plain

③DMS画面でClickHouseのインスタンスが表示されます

f:id:sbc_ohara:20210716155401p:plain

2.ECSでNginxのインストール

2-1.ECS作成

1)Nginx導入のためのECSを作成します
①ECSコンソール画面でECS作成ボタンをクリックし、ECSを作成します
f:id:sbc_ohara:20210823135321p:plain

②ECS作成画面でSpec、課金方法を設定します
f:id:sbc_ohara:20210823135337p:plain

③CentOSを設定します
f:id:sbc_ohara:20210823135420p:plain

④VPCを選択します(ちなみに上記1 で作成したApsaraDB for Clickhouseと同じVPCを選定すると、Intranet経由で相互接続することができます) f:id:sbc_ohara:20210823135433p:plain

⑤ECSの登録パスワードを設定します
f:id:sbc_ohara:20210823135546p:plain

⑥ECS設定情報を確認します
f:id:sbc_ohara:20210823135603p:plain

⑦ECSを確認します
f:id:sbc_ohara:20210823135619p:plain

2-2 Nginxインストール

1)Nginxをインストールします
①ECSへログインします(この時、ECSで設定しているSecurity GroupのインバウンドPortとして、Port22と80を設定します) f:id:sbc_ohara:20210823135844p:plain

②下記コマンドでnginxをインストールします

# yum install nginx  -y

f:id:sbc_ohara:20210823135856p:plain

f:id:sbc_ohara:20210823135904p:plain

2)下記コマンドでNginxを起動します

# systemctl start nginx
# systemctl status nginx

f:id:sbc_ohara:20210823135921p:plain

3)テストとして、Nginxサーバーへアクセスします(数回)

f:id:sbc_ohara:20210823135935p:plain

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"';

f:id:sbc_ohara:20210823140012p:plain

5)Nginx logを確認します

# tail -f /var/log/nginx/access.log

f:id:sbc_ohara:20210823140026p:plain

3.ECSでFluentd(td-agent)インストール

3-1.fluentd前提条件を確認します

1)下記のリンクでfluentd前提条件を確認します

(fluentd beforeinstall)https://docs.fluentd.org/installation/before-install

①ulimitを確認します(65535が必要)

# ulimit -n

f:id:sbc_ohara:20210823140057p:plain

②上記もしulimitが足りない場合、limits.confを設定します(今回のECSは65535であるため、設定しないでおきます)

/etc/security/limits.conf

f:id:sbc_ohara:20210823140145p:plain

③ Network Kernelを設定します
/etc/sysctl.confを開き、下記内容をsysctl.confに追加します  

net.core.somaxconn = 1024
net.core.netdev_max_backlog = 5000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_wmem = 4096 12582912 16777216
net.ipv4.tcp_rmem = 4096 12582912 16777216
net.ipv4.tcp_max_syn_backlog = 8096
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240 65535

f:id:sbc_ohara:20210823140203p:plain

3-2.fluentd(td-agent)をインストール

1)下記コマンドでtd-agentをインストールします

# curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent3.sh | sh

f:id:sbc_ohara:20210823140226p:plain

f:id:sbc_ohara:20210823140234p:plain

2)下記コマンドでtd-agentを起動し、ステータスを確認します

# systemctl start td-agent
# systemctl status td-agent

f:id:sbc_ohara:20210823140249p:plain

3-3.fluentd(td-agent)のClickhouseプラグインをインストールします

1)下記コマンドでClickhouseプラグインをインストールします

td-agent-gem install fluent-plugin-clickhouse

f:id:sbc_ohara:20210823140304p:plain

f:id:sbc_ohara:20210823140322p:plain

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

f:id:sbc_ohara:20210823151625p:plain

②sourceとmatchを正しく設定します
※上記手順2-2のnginx.confのlog_formatに基づいて、td-agent.confのsourceを設定します
※matchのcolumnsはClickhouseにあるターゲットテーブルのcolumnsと一致するようにします

<source>

@type tail
path /var/log/nginx/access.log

pos_file /var/log/td-agent/access.log.pos
tag nginx.access

format /^(?<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 clickhouse
host 172.16.0.74
port 8123
database default
username sbtest
password Test1234
columns remote_addr,remote_user,time_local,method,path,status,body_bytes_sent,http_referer,http_user_agent,http_x_forwarded_for
table fluent_accesslog_local
flush_interval 10s
</match>

f:id:sbc_ohara:20210823151701p:plain

f:id:sbc_ohara:20210823151709p:plain

※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;

f:id:sbc_ohara:20210823151815p:plain

2)分散テーブルを作成します

CREATE TABLE fluent_accesslog_distributed ON CLUSTER default as fluent_accesslog_local ENGINE = Distributed(default, default, fluent_accesslog_local, rand());

f:id:sbc_ohara:20210823151828p:plain

4-2.fluentd(td-agent)を実行し、NginxのアクセスログをClickhouseへ格納

1)nginxがすでに起動されていることを確認します

# systemctl status nginx

f:id:sbc_ohara:20210823151857p:plain

2)td-agentを再起動します

# systemctl restart td-agent
# systemctl status td-agent

f:id:sbc_ohara:20210823151911p:plain

3)テストとして、nginx web page を10回アクセスします

f:id:sbc_ohara:20210823151924p:plain

4)nginxアクセスログを確認します

# cd /var/log/nginx
# ll
# tail -f -n 10 ./access.log

f:id:sbc_ohara:20210823163522p:plain

5)td-agent

# cd /var/log/td-agent
# ll
# tail -f -n 10 ./td-agent.log

f:id:sbc_ohara:20210823152009p:plain

4-3.ClickhouseでNginxのアクセスログデータを確認します

1)fluent_accesslog_localを確認します

select * from fluent_accesslog_local;
select count(*) from fluent_accesslog_local;

f:id:sbc_ohara:20210823152118p:plain

f:id:sbc_ohara:20210823152129p:plain

2)fluent_accesslog_distributedを確認します

select * from fluent_accesslog_distributed
select count(*) from fluent_accesslog_distributed

f:id:sbc_ohara:20210823152151p:plain

f:id:sbc_ohara:20210823152203p:plain


最後に

ここまで、nginxアクセスログを Fluentd(td-agent) - ApsaraDB for ClickHouseへ連携する方法を紹介しました。
ApsaraDB for ClickHouseはFluentdとスムーズに連携できるので、例えば、WebサーバーのデータをFluentdで収集し、 ApsaraDB for ClickHouseへリアルタイムデータ連携しながら、ClickHouseでリアルタイム可視化、といったソリューションを構築することもできます。

Special Thanks, Nancy