Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

Fluentdを使ってNginxLogをMysqlにリアルタイムで格納する

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド

重要なデータはMysql

CentOSでNginxのログをFluentdを使ってMongodbにリアルタイムで格納する - Yuta.Kikuchiの日記 はてなブックマーク - CentOSでNginxのログをFluentdを使ってMongodbにリアルタイムで格納する - Yuta.Kikuchiの日記
MongoDBの集計機能が便利過ぎて泣けてくるお話し - Yuta.Kikuchiの日記 はてなブックマーク - MongoDBの集計機能が便利過ぎて泣けてくるお話し - Yuta.Kikuchiの日記
最近は大学生に良く間違われる現在30歳の@yutakikucです。今日はNginxLogの必要な項目をMysqlにリアルタイムで格納することを試してみます。重要なデータはどこに格納するの..? Mysqlでしょ!という人向けに書いてみます。過去にMongodbに格納して集計するエントリーを書いたのでそちらも参照してください。次回はFluentd-WebHDFSを使ってリアルタイムにHDFSに格納することに挑戦してみようと思います。

Fluent-Plugin-Mysql

plugin

Fluentd plugins はてなブックマーク - Fluentd plugins
tagomoris/fluent-plugin-mysql · GitHub はてなブックマーク - tagomoris/fluent-plugin-mysql · GitHub
fluentdの公開されているpluginを利用すると実現したいことが簡単に出来るかもしれません。Mysqlへのリアルタイム格納にはtagomorisさんが開発したfluent-plugin-mysqlを利用します。

fluentd install

まずはfluentdの本体をinstallします。fluentdのpackageを管理しているtresuredataをrepos.dに登録してyumにてinstallします。

$ sudo vim /etc/yum.repos.d/td.repo
[treasuredata]
name=TreasureData
baseurl=http://packages.treasure-data.com/redhat/$basearch
gpgcheck=0

$ sudo yum install td-agent -y

Installed:
  td-agent.x86_64 0:1.1.11-0                                                                                                

Dependency Installed:
  compat-libtermcap.x86_64 0:2.0.8-49.el6                         compat-readline5.x86_64 0:5.2-17.1.el6                    
  openssl098e.x86_64 0:0.9.8e-17.el6.centos.2                     td-libyaml.x86_64 0:0.1.4-1                               

Complete!
fluent-gem install fluent-plugin-mysql

次にfluent-gemコマンドを利用してfluent-plugin-mysqlをinstallします。

$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-mysql   
Successfully installed fluent-plugin-mysql-0.0.4
1 gem installed
Installing ri documentation for fluent-plugin-mysql-0.0.4...
Installing RDoc documentation for fluent-plugin-mysql-0.0.4...
td-agent.confの設定

Mysqlにリアルタイムでデータを格納する設定をtd-agent.confに記述します。Mongodbの時と同様にsourceのタグでaccesslogの記録について設定します。詳しく調べていませんがformatという項目が重要で、ここでmatchタグの中のkey_namesの指定できる名前が自動で決定しているように見えます。formatをapacheとしたのでkey_namesとして選択できる項目がcode,path,agent,refererのような内容になります。但しformatは正規表現を使って自由に設定する事ができるので、その場合はのように指定した項目名でkey_namesも扱うことが可能なようです。matchタグでは条件に一致したデータを格納する記述を書きます。typeにmysql、hostは今回localhostとし、databaseに後で定義するnginxを指定します。key_nameは先程の説明の通りでformatと関連して指定できる項目が決まります。sql INSERT INTO access_log (code,path,agent,referer) VALUES (?,?,?,?)の箇所でMysqlにデータを格納する命令を記述します。td-agent.confの設定を変更した場合はtd-agentのrestartを行なって下さい。

$ cat /etc/td-agent/td-agent.conf
<source>
  type tail
  format apache
  # format /^(?<host>[^ ]*) [^ ]* (?<user>[^ ]*) \[(?<time>[^\]]*)\] \[(?<strtime>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)")?$/
  path /var/log/nginx/access.log
  tag nginx.access
</source>

<match nginx.access>
  type mysql
  host localhost
  database nginx
  key_names code,path,agent,referer
  sql INSERT INTO access_log (code,path,agent,referer) VALUES (?,?,?,?)
  username root
  #password ""
  flush_interval 10s
</match>
$ sudo /etc/init.d/td-agent restart
Shutting down td-agent:                                    [  OK  ]
Starting td-agent:                                         [  OK  ]
Create table

NginxのLogを格納するTableを作成します。上のtd-agent.confで記述したcolumn内容を定義します。

drop table if exists nginx.access_log;
create table if not exists nginx.access_log (
   id int(10) NOT NULL AUTO_INCREMENT,
   code int(10) NOT NULL,
   path varchar(255) NOT NULL,
   agent varchar(255) NOT NULL,
   referer varchar(255) NOT NULL,
   PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Mysqlの確認

Nginxにアクセスします。そうするとリアルタイムでデータが流れているのが分かると思います。今日の目的はこれで達成とします。

mysql> select * from nginx.access_log;
+----+------+--------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------+
| id | code | path                                 | agent                                                                                                  | referer                |
+----+------+--------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------+
|  1 |  200 | /hello                               | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 | -                      |
|  2 |  304 | /assets/css/bootstrap.css?1368635404 | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 | http://localhost/hello |
|  3 |  404 | /favicon.ico                         | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 | -                      |
|  4 |  200 | /hello                               | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 | -                      |
|  5 |  404 | /favicon.ico                         | Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4 | -                      |
+----+------+--------------------------------------+--------------------------------------------------------------------------------------------------------+------------------------+
5 rows in set (0.01 sec)