【Docker環境】FluentdとMySQLのbulk insertを使用したログ収集【前編】

業務でFluentd(td-agent)とMySQLの連携をよく行っているのですが、今までAWSでしか環境構築する機会がありませんでした。

今回は、業務の関係上、Dockerで環境構築することになったので、躓いた点やその解決策も含めて構築方法をまとめてみることにしました。

目標

DockerのphpコンテナからFluentdにログを投げて、それをbulk insertでMySQLに投入するというシンプルなことをしたいと思います。

そのため、次の3つのDockerコンテナが必要になります。

  • Fluentdコンテナ
  • MySQLコンテナ
  • phpコンテナ

全て説明しようと思ったら記事の量がソコソコ多くなってしまったので、前編でFluentdコンテナ、後編でphpコンテナとMySQLコンテナについて説明しようと思います。

ディレクトリ構成

.
├── docker-compose.yml
└── fluentd
    ├── Dockerfile
    └── conf
        └── fluent.conf

※ Fluentd関連の設定のみ

docker-compose.yml

version: '3'

services:
  fluentd:
    build: ./fluentd
    volumes:
      - ./fluentd/conf/fluent.conf:/fluentd/etc/fluent.conf

Dockerコンテナの/fluentd/etcの下にFluentdの設定ファイルを設置する必要があります。

そのため、ホストOSにあるFluentdの設定ファイル(fluent.conf)を/fluentd/etcにマウントしています。

完成版のDockerfile

FROM fluent/fluentd:v1.10-1

USER root

RUN apk add --no-cache --virtual .build-deps \
    build-base \
    ruby-dev && \
    apk add --no-cache \
    mariadb-dev && \
    gem install fluent-plugin-mysql --no-document && \
    apk del .build-deps

USER fluent

今回は、2020年5月時点で最新のAlpineのDockerイメージを使用して、FluentdのMySQLプラグインであるfluent-plugin-mysqlをインストールしました。

Dockerfileですが、ビルド中に何回かエラーが出てしまったので、以降ではそのエラーと解決方法を述べたいと思います。

また、わたしは普段CentOSを使用することが多く、Alpineについては他所様のサイトを参考にしていたので全然理解できていませんでした。

ずっと知らないままだと流石にマズイので、ブログの記事を書くにあたってapkコマンドを勉強しました。

なので、apkコマンドについても可能な限り使い方をわかりやすく解説するようにしています。

最初のDockerfile

FROM fluent/fluentd:v1.10-1

RUN gem install fluent-plugin-mysql --no-document

最初はめちゃくちゃシンプルに上記のDockerfileでビルドしようとしました。

FluentdはRubyで実装されており、標準で幾つかのプラグインがインストールされていますが、それ以外にプラグインをインストールしたい場合は「gem install」を使用します。

ドキュメントをインストールすると、容量を喰ってしまい、インストールも遅くなるので「gem install」には「--no-document」(「-N」でもOK)のオプションを付けています。

「--no-document」ではなく「--no-ri」と「--no-rdoc」を付けているサイトもありましたが、現在その書き方は非推奨のようです。

しかし、このDockerfileでビルドしたら次のようなエラーが発生してしまいました。

ビルドエラー(1回目)

エラー内容

ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /usr/lib/ruby/gems/2.5.0 directory.
ERROR: Service 'fluentd' failed to build: The command '/bin/sh -c gem install fluent-plugin-mysql --no-document' returned a non-zero code: 1

解決策

権限がなくて書き込みできないようです。

どうやらデフォルトだとfluentユーザで実行してるようなので、rootユーザで実行する必要があるようです。

そこで次のようにDockerfileを修正したところ、このエラーは解消されました。

FROM fluent/fluentd:v1.10-1

USER root

RUN gem install fluent-plugin-mysql --no-document

USER fluent

しかし今度は次のようなエラーが、、、

ビルドエラー(2回目)

エラー内容

ERROR:  Error installing fluent-plugin-mysql:
        ERROR: Failed to build gem native extension.

    current directory: /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/ext/mysql2
/usr/bin/ruby -r ./siteconf20200502-1-1hskgc4.rb extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/include/ruby.h

extconf failed, exit code 1

Gem files will remain installed in /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3 for inspection.
Results logged to /usr/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/mysql2-0.5.3/gem_make.out
ERROR: Service 'fluentd' failed to build: The command '/bin/sh -c gem install fluent-plugin-mysql --no-document' returned a non-zero code: 1

解決策

mkmf.rbがヘッダーファイルを見つけられないとかなんとか、、、、

ググったらruby-devをインストールしたら解決するという記事を見つけたのでので、以下のようにDockerfileを修正。

FROM fluent/fluentd:v1.10-1

USER root

RUN apk add --no-cache --virtual .build-deps \
    ruby-dev && \
    gem install fluent-plugin-mysql --no-document && \
    apk del .build-deps

USER fluent

一気に複雑になったように見えますが、ヽ(´Д`;≡;´Д`)丿あ、あ、あわ、、あわわわ、あわててはいけない!

本当に必要なのは次の部分だけです。

apk add ruby-dev

実は上記のコマンドだけでruby-devがインストールできるので、エラーは解消されます。

CentOS風に書くと「yum install ruby-dev」や「ndf install ruby-dev」と同じ意味です。

RUN apk add --no-cache --virtual .build-deps \

それでは上記の「--no-cache」と「--virtual .build-deps」は何なのでしょうか?

「--no-cache」

「--no-cache」を付けずにapk addを実行した場合は、インストール後に /var/cache/apk/ にキャッシュファイルが残ってしまいます。

# 「--no-cache」を付けなかった場合
/ $ ls /var/cache/apk/
APKINDEX.737f7e01.tar.gz  APKINDEX.b89edf6e.tar.gz

せっかくAlpineを使って軽量なコンテナを作ろうとしているので、これは邪魔物以外の何物でもありません!

「--no-cache」を付けるとキャッシュファイルが作成されなくなるので、apk addとセットで使うものと覚えておいたほうがよい!と思っています。

「--virtual」

「--virtual」は、「--virtual (名前)」のように名前を指定して使用します。

これは、「--virtual」の後に続けてインストールしたパッケージ(いまはruby-devしかありません)を、仮想的に一つのパッケージとしてみなすためのオプションになります。

今の場合だと、コマンド中に.build-depsを指定すると、ruby-devが指定されたことと同じ意味になります。

そのため、最後のコマンドでruby-devがアンインストールされることになります。

apk del .build-deps
# apk delでパッケージをアンインストールできます。
# 上記はapk del ruby-devと同じ意味です。

最後にruby-devをアンインストールしているのは、ruby-devがfluent-plugin-mysqlのインストール時のみ必要だからです。

せっかくAlpineを使用しているので、不要になったパッケージは最後にガンガン削除して軽量なコンテナを作りましょう!

「--update」

実は最初、「--no-cahce」と「--virtual」に加えて「--update」というオプションも使用していました。

いろんなサイトでお約束のように書かれてあったので、わたしも追加していたのですが、これを指定しなくても問題なく動作するようで、不思議に思ってググって調べてみたところ、次のサイト様で衝撃的なことが、、、、

apk --updateという引数はない https://qiita.com/mtgto/items/149248dac031a451be02

そういうことだったのか、、、、まぁ指定しないでおこう・・・

しかしこのDockerfileでビルドしたところ今度は別のエラーが、、、

ビルドエラー(3回目)

エラー内容

ERROR:  Error installing fluent-plugin-mysql:
        ERROR: Failed to build gem native extension.

    current directory: /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/ext/mysql2
/usr/bin/ruby -r ./siteconf20200502-9-17mcd15.rb extconf.rb
checking for rb_absint_size()... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/bin/$(RUBY_BASE_NAME)
/usr/lib/ruby/2.5.0/mkmf.rb:456:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
        from /usr/lib/ruby/2.5.0/mkmf.rb:541:in `try_link0'
        from /usr/lib/ruby/2.5.0/mkmf.rb:559:in `try_link'
        from /usr/lib/ruby/2.5.0/mkmf.rb:771:in `try_func'
        from /usr/lib/ruby/2.5.0/mkmf.rb:1058:in `block in have_func'
        from /usr/lib/ruby/2.5.0/mkmf.rb:948:in `block in checking_for'
        from /usr/lib/ruby/2.5.0/mkmf.rb:350:in `block (2 levels) in postpone'
        from /usr/lib/ruby/2.5.0/mkmf.rb:320:in `open'
        from /usr/lib/ruby/2.5.0/mkmf.rb:350:in `block in postpone'
        from /usr/lib/ruby/2.5.0/mkmf.rb:320:in `open'
        from /usr/lib/ruby/2.5.0/mkmf.rb:346:in `postpone'
        from /usr/lib/ruby/2.5.0/mkmf.rb:947:in `checking_for'
        from /usr/lib/ruby/2.5.0/mkmf.rb:1057:in `have_func'
        from extconf.rb:25:in `<main>'

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /usr/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/mysql2-0.5.3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3 for inspection.
Results logged to /usr/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/mysql2-0.5.3/gem_make.out
ERROR: Service 'fluentd' failed to build: The command '/bin/sh -c apk add --no-cache --virtual .build-deps     ruby-dev &&     gem install fluent-plugin-mysql --no-document &&     apk del .build-deps' returned a non-zero code: 1

解決策

(╬ಠ益ಠ)くそぉ!まだエラーが出とるが!!

Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers.

You have to install development tools first.

Makefileが作成できないと言われてるので、どうやらビルドに必要なコマンド群がインストールされていないのが原因っぽいです。

これに関してはググっても中々情報が出てこずに心が挫けかけていたところ、ほぼ同じ内容のエラーでドンピシャの回答をしている記事を見つけました!

https://github.com/docker-library/ruby/issues/221

build-baseをインストールしたらいける?ということらしいので、次のようにDockerfileを修正したところエラーが解消されました。

FROM fluent/fluentd:v1.10-1

USER root

RUN apk add --no-cache --virtual .build-deps \
    build-base \
    ruby-dev && \
    gem install fluent-plugin-mysql --no-document && \
    apk del .build-deps

USER fluent

build-baseもコンパイル時のみに必要なので、.build-depsに含めて最後にアンインストールしています。

流石にもうエラーは出ないだろうと思っていましたが、、、

ビルドエラー(4回目)

エラー内容

ERROR:  Error installing fluent-plugin-mysql:
        ERROR: Failed to build gem native extension.

    current directory: /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/ext/mysql2
/usr/bin/ruby -r ./siteconf20200502-9-gfmga7.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
checking for -lmysqlclient... no
-----
mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again.
-----
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

Provided configuration options:
        --with-opt-dir
        --without-opt-dir
        --with-opt-include
        --without-opt-include=${opt-dir}/include
        --with-opt-lib
        --without-opt-lib=${opt-dir}/lib
        --with-make-prog
        --without-make-prog
        --srcdir=.
        --curdir
        --ruby=/usr/bin/$(RUBY_BASE_NAME)
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysql-config
        --without-mysql-config
        --with-mysql-dir
        --without-mysql-dir
        --with-mysql-include
        --without-mysql-include=${mysql-dir}/include
        --with-mysql-lib
        --without-mysql-lib=${mysql-dir}/lib
        --with-mysqlclientlib
        --without-mysqlclientlib

To see why this extension failed to compile, please check the mkmf.log which can be found here:

  /usr/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/mysql2-0.5.3/mkmf.log

extconf failed, exit code 1

Gem files will remain installed in /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3 for inspection.
Results logged to /usr/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0/mysql2-0.5.3/gem_make.out
ERROR: Service 'fluentd' failed to build: The command '/bin/sh -c apk add --no-cache --virtual .build-deps     build-base     ruby-dev &&     gem install fluent-plugin-mysql --no-document &&     apk del .build-deps' returned a non-zero code: 1

解決策

( ゚д゚) ・・・ ←放心状態

(つд⊂)ゴシゴシ

(; ゚д゚) ・・・

(;;; ゚Д゚;;;) ぎゃ~~~~~~~~~~もうイヤだぁ!!むしろ今までで一番エラーが出てる!!!

ただし、さっきと違い大きなヒントが書かれています。

mysql client is missing. You may need to 'sudo apt-get install libmariadb-dev', 'sudo apt-get install libmysqlclient-dev' or 'sudo yum install mysql-devel', and try again.

上記はDebianとCentOSの解決策ですが、Alpineだとmariadb-devをインストールすれば良いらしいです。

それを反映して、ようやく完全版の出来上がりです!

# 完成版Dockerfile(再掲)
FROM fluent/fluentd:v1.10-1

USER root

RUN apk add --no-cache --virtual .build-deps \
    build-base \
    ruby-dev && \
    apk add --no-cache \
    mariadb-dev && \
    gem install fluent-plugin-mysql --no-document && \
    apk del .build-deps

USER fluent

ここで注意しないといけないのはmariadb-devは.build-depsに含めていないということです。

実は最初は調子にのって.build-depsにmariadb-devを含めていました。

それでもビルドはできたのですが、コンテナを起動するタイミングで次のようなエラーが出てしまい、mariadb-devはアンインストールしないという構成にしました。

Attaching to app-docker_fluentd_1
fluentd_1  | 2020-05-02 05:37:41 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
fluentd_1  | 2020-05-02 05:37:41 +0000 [info]: gem 'fluent-plugin-mysql' version '0.3.4'
fluentd_1  | 2020-05-02 05:37:41 +0000 [info]: gem 'fluentd' version '1.10.2'
fluentd_1  | /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require': Error loading shared library libmariadb.so.3: No such file or directory (needed by /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.so) - /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2/mysql2.so (LoadError)
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/mysql2-0.5.3/lib/mysql2.rb:36:in `<top (required)>'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/mysql2-cs-bind-0.0.7/lib/mysql2-cs-bind.rb:1:in `<top (required)>'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:135:in `require'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:135:in `rescue in require'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:39:in `require'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluent-plugin-mysql-0.3.4/lib/fluent/plugin/out_mysql_bulk.rb:61:in `initialize'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/plugin.rb:158:in `new'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/plugin.rb:158:in `new_impl'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/plugin.rb:109:in `new_output'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/agent.rb:130:in `add_match'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/agent.rb:74:in `block in configure'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/agent.rb:64:in `each'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/agent.rb:64:in `configure'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:146:in `configure'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/engine.rb:105:in `configure'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/engine.rb:80:in `run_configure'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/supervisor.rb:551:in `run_supervisor'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/command/fluentd.rb:330:in `<top (required)>'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |    from /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |    from /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/bin/fluentd:8:in `<top (required)>'
fluentd_1  |    from /usr/bin/fluentd:23:in `load'
fluentd_1  |    from /usr/bin/fluentd:23:in `<main>'

fluent.conf

()´д`()ふ~、長い、もう少しお付き合い下さい。。。

コンテナの設定は完了したので、次はFluentdの設定になります。

<source>
  @type forward
</source>

<match mysql.input>
  @type mysql_bulk
  host mysql
  database test_db
  username root
  password root_password
  column_names user_id,name,created
  table test_table
  <buffer>
    @type file
    path /fluentd/log/test_table
    flush_interval 5s
  </buffer>
</match>

fluent.confはFluentdの設定ファイルになります。

まず次の部分です。

<source>
  @type forward
</source>

これはFluentdがTCPソケットで待ち受けをする指定になります。

今回はphpコンテナからFluentdコンテナに対してTCPでログを送りつけるためにこのような設定にしています。

詳細は公式を参照して下さい。

https://docs.fluentd.org/input/forward

実務だと、EC2にアプリとFluentdを同居させてUNIXドメインソケット(この場合は@type unix)で連携したこともあります。

<match mysql.input>
  @type mysql_bulk
  host mysql
  database test_db
  username root
  password root_password
  column_names user_id,name,created
  table test_table
  <buffer>
    @type file
    path /fluentd/log/test_table
    flush_interval 5s
  </buffer>
</match>

これはFluentdからMySQLにログをinsertするための設定になります。

https://github.com/tagomoris/fluent-plugin-mysql

公式のサンプルをほとんど丸パクリしてます。host、database、usernameなどの項目は直感的にわかると思いますが、バッファ(buffer)は公式と異なる設定をしているため、少し言及しておきたいと思います。

バッファタイプ

公式ではmemoryを指定していますが、ここではfileを設定しています(@type fileの部分です)

https://docs.fluentd.org/buffer/file

理由はfileであれば、ログは一旦pathで指定したファイルに書き込まれるため、突然プロセスが死んでも、memoryと比較してログを欠損する可能性が少なくなるためです(ただし、今回はバッファファイルをホストOSにマウントして永続化していないのでコンテナを破棄するとバッファ中のログはなくなります)

このpathはデフォルトだと/fluentd/logの下であればどこに指定しても問題ありません。

もし/fluentd/log以外の場所を指定してしまうと、次のように権限のエラーが発生するので注意して下さい。

fluentd_1  | 2020-05-02 05:49:24 +0000 [error]: #0 unexpected error error_class=Errno::EACCES error="Permission denied @ dir_s_mkdir - /var/log/test_table"
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:229:in `mkdir'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:229:in `fu_mkdir'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:210:in `block (2 levels) in mkdir_p'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:208:in `reverse_each'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:208:in `block in mkdir_p'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:193:in `each'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/fileutils.rb:193:in `mkdir_p'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/plugin/buf_file.rb:122:in `start'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/plugin/output.rb:437:in `start'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:200:in `block in start'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:189:in `block (2 levels) in lifecycle'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:188:in `each'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:188:in `block in lifecycle'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:175:in `each'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:175:in `lifecycle'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/root_agent.rb:199:in `start'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/engine.rb:248:in `start'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/engine.rb:147:in `run'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/supervisor.rb:600:in `block in run_worker'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/supervisor.rb:837:in `main_process'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/supervisor.rb:594:in `run_worker'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/lib/fluent/command/fluentd.rb:350:in `<top (required)>'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:59:in `require'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/lib/ruby/gems/2.5.0/gems/fluentd-1.10.2/bin/fluentd:8:in `<top (required)>'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/bin/fluentd:23:in `load'
fluentd_1  |   2020-05-02 05:49:24 +0000 [error]: #0 /usr/bin/fluentd:23:in `<main>'

flush_interval

以前、flush_intervalの値を小さくしすぎてしまって、Aurora(MySQL)の負荷がめちゃくちゃ上がってしまったことがありました。

本番環境においては、大きめの値を設定したほうがよいかもしれません(その時は10s→30sにしました)

ただし、開発時は小さめの値にしないと、なかなかDBに反映されずにイライラすると思うんで、そこはうまいこと調整して下さい。

動作確認

ここまでで、次のようにビルドとコンテナ起動をして、エラーが出ていなければ問題ありません。

[admin@localhost fluentd]$ docker-compose build --no-cache
・・・

[admin@localhost fluentd]$ docker-compose up -d
・・・

[admin@localhost fluentd]$ docker-compose ps
        Name                      Command               State                 Ports               
--------------------------------------------------------------------------------------------------
app-docker_fluentd_1   tini -- /bin/entrypoint.sh ...   Up      24224/tcp, 5140/tcp

[admin@localhost fluentd]$ docker-compose logs fluentd
Attaching to app-docker_fluentd_1
fluentd_1  | 2020-05-02 05:51:45 +0000 [info]: parsing config file is succeeded path="/fluentd/etc/fluent.conf"
fluentd_1  | 2020-05-02 05:51:45 +0000 [info]: gem 'fluent-plugin-mysql' version '0.3.4'
fluentd_1  | 2020-05-02 05:51:45 +0000 [info]: gem 'fluentd' version '1.10.2'
fluentd_1  | 2020-05-02 05:51:45 +0000 [info]: using configuration file: <ROOT>
fluentd_1  |   <source>
fluentd_1  |     @type forward
fluentd_1  |   </source>
fluentd_1  |   <match mysql.input>
fluentd_1  |     @type mysql_bulk
fluentd_1  |     host "mysql"
fluentd_1  |     database "test_db"
fluentd_1  |     username "root"
fluentd_1  |     password xxxxxx
fluentd_1  |     column_names "user_id,name,created"
fluentd_1  |     table "test_table"
fluentd_1  |     <buffer>
fluentd_1  |       @type "file"
fluentd_1  |       path "/fluentd/log/test_table"
fluentd_1  |       flush_interval 5s
fluentd_1  |     </buffer>
fluentd_1  |   </match>
fluentd_1  | </ROOT>
fluentd_1  | 2020-05-02 05:51:45 +0000 [info]: starting fluentd-1.10.2 pid=6 ruby="2.5.8"
fluentd_1  | 2020-05-02 05:51:45 +0000 [info]: spawn command to main:  cmdline=["/usr/bin/ruby", "-Eascii-8bit:ascii-8bit", "/usr/bin/fluentd", "-c", "/fluentd/etc/fluent.conf", "-p", "/fluentd/plugins", "--under-supervisor"]
fluentd_1  | 2020-05-02 05:51:46 +0000 [info]: adding match pattern="mysql.input" type="mysql_bulk"
fluentd_1  | 2020-05-02 05:51:46 +0000 [info]: adding source type="forward"
fluentd_1  | 2020-05-02 05:51:46 +0000 [info]: #0 starting fluentd worker pid=20 ppid=6 worker=0
fluentd_1  | 2020-05-02 05:51:46 +0000 [info]: #0 listening port port=24224 bind="0.0.0.0"
fluentd_1  | 2020-05-02 05:51:46 +0000 [info]: #0 fluentd worker is now running worker=0

最後に、、、

記事が読みづらくてすみません。

この記事はMarkdownで書いており、GitHubだときちんと表示されるのですが、弊社HPのスタイルだと表示が崩れてしまうようです。

論理構造を一切無視して見た目だけを考えて記事を書けば多少は改善するんですが、それだとMarkdownで書いている意味がなく、SEO的にもあまりよろしくないと思うので困ったちゃんです。

ということで、今後書く記事もずっとこのような見た目になると思います、、、わざわざ見てくださってる方には申し訳ないですが我慢をお願いします。

(;´ Д`)ゴメンネ

Kitaru

Programmer

【Docker環境】FluentdとMySQLのbulk insertを使用したログ収集【前編】

お気軽に
お問い合わせください。

お問い合わせ